/** * ds-metrics-panel.js * Universal metrics panel showing tool execution stats and activity */ import toolBridge from '../../services/tool-bridge.js'; class DSMetricsPanel extends HTMLElement { constructor() { super(); this.metrics = { totalExecutions: 0, successCount: 0, errorCount: 0, recentActivity: [] }; this.refreshInterval = null; } connectedCallback() { this.render(); this.startAutoRefresh(); } disconnectedCallback() { this.stopAutoRefresh(); } render() { const successRate = this.metrics.totalExecutions > 0 ? Math.round((this.metrics.successCount / this.metrics.totalExecutions) * 100) : 0; this.innerHTML = `
TOTAL EXECUTIONS
${this.metrics.totalExecutions}
SUCCESS RATE
${successRate}%
ERRORS
${this.metrics.errorCount}
Recent Activity
${this.metrics.recentActivity.length === 0 ? `
No recent activity
` : this.metrics.recentActivity.map(activity => `
${activity.success ? '✓' : '✗'} ${activity.toolName}
${activity.timestamp}
`).join('')}
`; } recordExecution(toolName, success = true) { this.metrics.totalExecutions++; if (success) { this.metrics.successCount++; } else { this.metrics.errorCount++; } // Add to recent activity const now = new Date(); const timestamp = now.toLocaleTimeString(); this.metrics.recentActivity.unshift({ toolName, success, timestamp }); // Keep only last 10 activities if (this.metrics.recentActivity.length > 10) { this.metrics.recentActivity = this.metrics.recentActivity.slice(0, 10); } this.render(); } startAutoRefresh() { // Refresh metrics every 5 seconds this.refreshInterval = setInterval(() => { this.render(); }, 5000); } stopAutoRefresh() { if (this.refreshInterval) { clearInterval(this.refreshInterval); this.refreshInterval = null; } } reset() { this.metrics = { totalExecutions: 0, successCount: 0, errorCount: 0, recentActivity: [] }; this.render(); } } customElements.define('ds-metrics-panel', DSMetricsPanel); export default DSMetricsPanel;