@memberjunction/ng-dashboards 5.11.0 → 5.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/agents/agent-configuration.component.d.ts +34 -2
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +586 -223
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +2 -2
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts +8 -0
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +85 -52
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
- package/dist/AI/components/charts/performance-heatmap.component.d.ts +1 -0
- package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -1
- package/dist/AI/components/charts/performance-heatmap.component.js +27 -5
- package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -1
- package/dist/AI/components/charts/time-series-chart.component.d.ts +5 -0
- package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -1
- package/dist/AI/components/charts/time-series-chart.component.js +23 -8
- package/dist/AI/components/charts/time-series-chart.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +2 -2
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +2 -2
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +2 -2
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +2 -2
- package/dist/AI/components/prompts/prompt-management.component.js +3 -3
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js +2 -2
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts +83 -0
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -0
- package/dist/AI/components/requests/agent-requests-resource.component.js +547 -0
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -0
- package/dist/AI/components/system/system-config-filter-panel.component.js +2 -2
- package/dist/AI/components/system/system-configuration.component.js +2 -2
- package/dist/AI/components/widgets/kpi-card.component.js +7 -7
- package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
- package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -1
- package/dist/AI/components/widgets/live-execution-widget.component.js +6 -6
- package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -1
- package/dist/AI/index.d.ts +1 -0
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +2 -0
- package/dist/AI/index.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +3 -3
- package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.js +3 -3
- package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-list.component.js +3 -3
- package/dist/APIKeys/api-key-list.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +1 -1
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.js +2 -2
- package/dist/APIKeys/api-usage-panel.component.js +2 -2
- package/dist/Actions/components/actions-overview.component.js +2 -2
- package/dist/Actions/components/execution-monitoring.component.js +2 -2
- package/dist/Actions/components/explorer/action-breadcrumb.component.js +2 -2
- package/dist/Actions/components/explorer/action-card.component.js +2 -2
- package/dist/Actions/components/explorer/action-explorer.component.js +2 -2
- package/dist/Actions/components/explorer/action-list-item.component.js +2 -2
- package/dist/Actions/components/explorer/action-toolbar.component.js +2 -2
- package/dist/Actions/components/explorer/action-tree-panel.component.js +2 -2
- package/dist/Actions/components/explorer/new-action-panel.component.js +2 -2
- package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.js +2 -2
- package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
- package/dist/Communication/communication-dashboard.component.js +2 -2
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +3 -3
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +5 -5
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +3 -3
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +3 -3
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +2 -2
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +2 -2
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +2 -2
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/browser/component-browser.component.js +2 -2
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +2 -2
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +2 -2
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js +2 -2
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/spec-editor.component.js +2 -2
- package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/text-import-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.js +2 -2
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +2 -2
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +9 -9
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +11 -3
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +2 -2
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +12 -11
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +9 -9
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.js +2 -2
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +2 -2
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js +2 -2
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +2 -2
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +2 -2
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +2 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.js +4 -4
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +2 -2
- package/dist/Integration/components/activity/activity.component.d.ts +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +5 -5
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts +31 -2
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +753 -412
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +3 -3
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts +0 -1
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +3 -6
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +3 -3
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.d.ts +20 -0
- package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +97 -5
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/components/visual-editor/visual-editor.component.js +2 -2
- package/dist/Integration/components/widgets/integration-card.component.d.ts.map +1 -1
- package/dist/Integration/components/widgets/integration-card.component.js +5 -1
- package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
- package/dist/Integration/components/widgets/run-history-panel.component.js +2 -2
- package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
- package/dist/Integration/integration.module.d.ts +2 -1
- package/dist/Integration/integration.module.d.ts.map +1 -1
- package/dist/Integration/integration.module.js +7 -3
- package/dist/Integration/integration.module.js.map +1 -1
- package/dist/Integration/services/integration-data.service.d.ts +27 -2
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +107 -4
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +25 -24
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +2 -2
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +26 -25
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +2 -2
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js +3 -3
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js +2 -2
- package/dist/MCP/components/mcp-log-detail-panel.component.js +2 -2
- package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
- package/dist/MCP/components/mcp-test-tool-dialog.component.js +2 -2
- package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +2 -2
- package/dist/MCP/mcp-filter-panel.component.js +2 -2
- package/dist/QueryBrowser/query-browser-resource.component.js +7 -7
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/index.d.ts +0 -1
- package/dist/Scheduling/components/index.d.ts.map +1 -1
- package/dist/Scheduling/components/index.js +0 -1
- package/dist/Scheduling/components/index.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +2 -2
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts +6 -9
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +118 -110
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +3 -3
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +2 -2
- package/dist/SystemDiagnostics/system-diagnostics.component.js +4 -4
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics.component.js +2 -2
- package/dist/Testing/components/testing-analytics.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.js +4 -4
- package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +2 -2
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review.component.js +5 -5
- package/dist/Testing/components/testing-review.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +2 -2
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/components/widgets/oracle-breakdown-table.component.js +2 -2
- package/dist/Testing/components/widgets/oracle-breakdown-table.component.js.map +1 -1
- package/dist/Testing/components/widgets/suite-tree.component.js +4 -4
- package/dist/Testing/components/widgets/suite-tree.component.js.map +1 -1
- package/dist/Testing/components/widgets/test-run-detail-panel.component.js +2 -2
- package/dist/Testing/components/widgets/test-run-detail-panel.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +2 -2
- package/dist/VersionHistory/components/diff-resource.component.js +2 -2
- package/dist/VersionHistory/components/graph-resource.component.js +2 -2
- package/dist/VersionHistory/components/labels-resource.component.js +3 -3
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +3 -3
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/__tests__/integration-data-service.test.js +1 -0
- package/dist/__tests__/integration-data-service.test.js.map +1 -1
- package/dist/module.d.ts +52 -49
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +25 -6
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +1 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +42 -40
- package/dist/Scheduling/components/job-slideout.component.d.ts +0 -45
- package/dist/Scheduling/components/job-slideout.component.d.ts.map +0 -1
- package/dist/Scheduling/components/job-slideout.component.js +0 -459
- package/dist/Scheduling/components/job-slideout.component.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-monitoring.component.js","sourceRoot":"","sources":["../../../src/AI/components/execution-monitoring.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { map, takeUntil, debounceTime } from 'rxjs/operators';\nimport {\n AIInstrumentationService,\n DashboardKPIs,\n TrendData,\n LiveExecution,\n ChartData,\n ExecutionDetails\n} from '../services/ai-instrumentation.service';\nimport { DataPointClickEvent } from './charts/time-series-chart.component';\nimport { KPICardData } from './widgets/kpi-card.component';\nimport { HeatmapData } from './charts/performance-heatmap.component';\nimport { RunView, CompositeKey } from '@memberjunction/core';\nimport { ResourceData } from \"@memberjunction/core-entities\";\nimport { MJAIPromptRunEntityExtended, MJAIAgentRunEntityExtended, MJAIModelEntityExtended } from '@memberjunction/ai-core-plus';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\n\nexport interface DrillDownTab {\n id: string;\n title: string;\n type: 'chart' | 'executions' | 'model-detail';\n data?: any;\n timestamp?: Date;\n metric?: string;\n closeable: boolean;\n}\n\nexport interface ExecutionRecord {\n id: string;\n type: 'prompt' | 'agent';\n name: string;\n model?: string;\n status: string;\n startTime: Date;\n endTime?: Date;\n duration: number;\n cost: number;\n tokens: number;\n errorMessage?: string;\n}\n\nexport interface ExecutionMonitoringState {\n selectedTimeRange: string;\n refreshInterval: number;\n panelStates: {\n cost: boolean;\n efficiency: boolean;\n executions: boolean;\n };\n drillDownTabs: Array<{\n id: string;\n title: string;\n type: string;\n timestamp?: string;\n metric?: string;\n }>;\n activeTabId: string;\n splitterSizes?: number[];\n}\n/**\n * AI Monitor Resource - displays AI execution monitoring and analytics\n * Extends BaseResourceComponent to work with the resource type system\n */\n@RegisterClass(BaseResourceComponent, 'AIMonitorResource')\n@Component({\n standalone: false,\n selector: 'app-execution-monitoring',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"execution-monitoring\" [class.loading]=\"isLoading\">\n <!-- Loading Overlay -->\n @if (isLoading) {\n <div class=\"loading-overlay\">\n <mj-loading text=\"Loading dashboard data...\" size=\"large\"></mj-loading>\n </div>\n }\n <!-- Header Controls -->\n <div class=\"monitoring-header\">\n <h2 class=\"monitoring-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n AI Execution Monitoring\n </h2>\n \n <div class=\"monitoring-controls\">\n <div class=\"time-range-control\">\n <label>Time Range:</label>\n <select [(ngModel)]=\"selectedTimeRange\" (change)=\"onTimeRangeChange()\" [disabled]=\"isLoading\">\n <option value=\"1h\">Last Hour</option>\n <option value=\"6h\">Last 6 Hours</option>\n <option value=\"24h\">Last 24 Hours</option>\n <option value=\"7d\">Last 7 Days</option>\n <option value=\"30d\">Last 30 Days</option>\n </select>\n </div>\n \n <button class=\"refresh-btn\" (click)=\"refreshData()\" [disabled]=\"isLoading\">\n <i class=\"fa-solid fa-refresh\" [class.spinning]=\"isLoading\"></i>\n Refresh\n </button>\n </div>\n </div>\n\n <!-- KPI Dashboard -->\n <div class=\"kpi-dashboard\">\n <div class=\"kpi-grid\">\n @for (kpi of kpiCards$ | async; track kpi.title) {\n <app-kpi-card \n [data]=\"kpi\"\n (click)=\"onKpiClick(kpi)\"\n [class.clickable]=\"isKpiClickable(kpi)\"\n ></app-kpi-card>\n }\n </div>\n </div>\n\n <!-- Main Dashboard with Kendo Splitter -->\n <kendo-splitter class=\"dashboard-splitter\" orientation=\"vertical\" (layoutChange)=\"onSplitterLayoutChange($event)\">\n <!-- Top Row: System Health and Trends Chart -->\n <kendo-splitter-pane size=\"45%\" [resizable]=\"true\" [collapsible]=\"false\">\n <kendo-splitter orientation=\"horizontal\" (layoutChange)=\"onSplitterLayoutChange($event)\">\n <!-- System Health -->\n <kendo-splitter-pane size=\"30%\" [resizable]=\"true\" [collapsible]=\"true\" [collapsed]=\"false\">\n <div class=\"dashboard-section system-status\">\n <div class=\"status-container\">\n <div class=\"chart-header\">\n <h4 class=\"chart-title\">\n <i class=\"fa-solid fa-heartbeat\"></i>\n System Health\n </h4>\n </div>\n @if (kpis$ | async; as kpis) {\n <div class=\"status-metrics\">\n <div class=\"status-metric\">\n <div class=\"status-icon status-icon--success\">\n <i class=\"fa-solid fa-check\"></i>\n </div>\n <div class=\"status-info\">\n <div class=\"status-label\">Success Rate</div>\n <div class=\"status-value\">{{ (kpis.successRate * 100).toFixed(1) }}%</div>\n <div class=\"status-subtitle\">Last {{ selectedTimeRange }}</div>\n </div>\n </div>\n \n <div class=\"status-metric\">\n <div class=\"status-icon status-icon--warning\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n </div>\n <div class=\"status-info\">\n <div class=\"status-label\">Error Rate</div>\n <div class=\"status-value\">{{ (kpis.errorRate * 100).toFixed(1) }}%</div>\n <div class=\"status-subtitle\">{{ kpis.totalExecutions }} total executions</div>\n </div>\n </div>\n \n <div class=\"status-metric\">\n <div class=\"status-icon status-icon--info\">\n <i class=\"fa-solid fa-clock\"></i>\n </div>\n <div class=\"status-info\">\n <div class=\"status-label\">Avg Response Time</div>\n <div class=\"status-value\">{{ (kpis.avgExecutionTime / 1000).toFixed(2) }}s</div>\n <div class=\"status-subtitle\">Across all models</div>\n </div>\n </div>\n \n <div class=\"status-metric\">\n <div class=\"status-icon status-icon--primary\">\n <i class=\"fa-solid fa-bolt\"></i>\n </div>\n <div class=\"status-info\">\n <div class=\"status-label\">Active Executions</div>\n <div class=\"status-value\">{{ kpis.activeExecutions }}</div>\n <div class=\"status-subtitle\">Currently running</div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </kendo-splitter-pane>\n \n <!-- Drill-down Tab Container -->\n <kendo-splitter-pane [resizable]=\"true\" [collapsible]=\"false\">\n <div class=\"dashboard-section drill-down-container\">\n <div class=\"drill-down-tabs\">\n <div class=\"tab-header\">\n @for (tab of drillDownTabs; track tab.id) {\n <div \n class=\"tab-item\"\n [class.active]=\"activeTabId === tab.id\"\n (click)=\"selectTab(tab.id)\"\n >\n <span class=\"tab-title\">{{ tab.title }}</span>\n @if (tab.closeable) {\n <button \n class=\"tab-close\"\n (click)=\"closeTab($event, tab.id)\"\n title=\"Close tab\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n }\n </div>\n \n <div class=\"tab-content\">\n @if (activeTab?.type === 'chart') {\n <div class=\"tab-pane trends-chart\">\n <app-time-series-chart\n [data]=\"(trends$ | async) ?? []\"\n title=\"Execution Trends\"\n [config]=\"timeSeriesConfig\"\n (dataPointClick)=\"onDataPointClick($event)\"\n (timeRangeChange)=\"onChartTimeRangeChange($event)\"\n ></app-time-series-chart>\n </div>\n }\n \n @if (activeTab?.type === 'executions') {\n <div class=\"tab-pane executions-drill-down\">\n <div class=\"drill-down-header\">\n <h4>\n <i class=\"fa-solid fa-list\"></i>\n {{ activeTab?.title }}\n </h4>\n <div class=\"drill-down-meta\">\n @if (activeTab?.timestamp) {\n <span class=\"timestamp\">{{ getFormattedTimestamp(activeTab) }}</span>\n }\n @if (activeTab?.metric) {\n <span class=\"metric-badge\">{{ getFormattedMetricLabel(activeTab) }}</span>\n }\n </div>\n </div>\n \n @if (loadingDrillDown) {\n <div class=\"loading-spinner\">\n <mj-loading text=\"Loading execution details...\" size=\"small\"></mj-loading>\n </div>\n } @else if (activeTab?.data?.length > 0) {\n <div class=\"executions-table\">\n <div class=\"table-header\">\n <div class=\"header-cell\">Type</div>\n <div class=\"header-cell\">Name</div>\n <div class=\"header-cell\">Model</div>\n <div class=\"header-cell\">Status</div>\n <div class=\"header-cell\">Duration</div>\n <div class=\"header-cell\">Cost</div>\n <div class=\"header-cell\">Tokens</div>\n <div class=\"header-cell\">Time</div>\n </div>\n @for (execution of activeTab?.data; track execution.id) {\n <div \n class=\"table-row\"\n (click)=\"viewExecutionDetail(execution)\"\n >\n <div class=\"table-cell\">\n <span class=\"type-badge\" [class]=\"'type-badge--' + execution.type\">\n {{ execution.type }}\n </span>\n </div>\n <div class=\"table-cell\">{{ execution.name }}</div>\n <div class=\"table-cell\">{{ execution.model || 'N/A' }}</div>\n <div class=\"table-cell\">\n <span class=\"status-badge\" [class]=\"'status-badge--' + execution.status\">\n {{ execution.status }}\n </span>\n </div>\n <div class=\"table-cell\">{{ formatDuration(execution.duration) }}</div>\n <div class=\"table-cell\">{{ formatCurrency(execution.cost) }}</div>\n <div class=\"table-cell\">{{ execution.tokens.toLocaleString() }}</div>\n <div class=\"table-cell\">{{ formatTime(execution.startTime) }}</div>\n </div>\n }\n </div>\n } @else {\n <div class=\"no-data\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No executions found for this time period</p>\n </div>\n }\n </div>\n }\n \n @if (activeTab?.type === 'model-detail') {\n <div class=\"tab-pane model-detail\">\n <div class=\"drill-down-header\">\n <h4>\n <i class=\"fa-solid fa-microchip\"></i>\n Model Details: {{ activeTab?.data?.name }}\n </h4>\n </div>\n \n @if (loadingDrillDown) {\n <div class=\"loading-spinner\">\n <mj-loading text=\"Loading model details...\" size=\"small\"></mj-loading>\n </div>\n } @else if (activeTab?.data) {\n <div class=\"model-details\">\n <div class=\"model-info-grid\">\n <div class=\"info-item\">\n <label>Model Name:</label>\n <span>{{ activeTab?.data?.name }}</span>\n </div>\n <div class=\"info-item\">\n <label>Vendor:</label>\n <span>{{ activeTab?.data?.vendor }}</span>\n </div>\n <div class=\"info-item\">\n <label>API Name:</label>\n <span>{{ activeTab?.data?.apiName }}</span>\n </div>\n <div class=\"info-item\">\n <label>Input Cost:</label>\n <span>\\${{ activeTab?.data?.inputTokenCost?.toFixed(6) || '0' }} per token</span>\n </div>\n <div class=\"info-item\">\n <label>Output Cost:</label>\n <span>\\${{ activeTab?.data?.outputTokenCost?.toFixed(6) || '0' }} per token</span>\n </div>\n <div class=\"info-item\">\n <label>Active:</label>\n <span class=\"status-indicator\" [class.active]=\"activeTab?.data?.isActive\">\n {{ activeTab?.data?.isActive ? 'Yes' : 'No' }}\n </span>\n </div>\n </div>\n \n @if (activeTab?.data?.description) {\n <div class=\"model-description\">\n <h5>Description</h5>\n <p>{{ activeTab?.data?.description }}</p>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n </kendo-splitter-pane>\n\n <!-- Bottom Row: Analysis Panels with Expansion Layout -->\n <kendo-splitter-pane [resizable]=\"true\" [collapsible]=\"false\">\n <kendo-splitter orientation=\"horizontal\" (layoutChange)=\"onSplitterLayoutChange($event)\">\n <!-- Left: Performance Heatmap -->\n <kendo-splitter-pane size=\"50%\" [resizable]=\"true\" [collapsible]=\"false\">\n <div class=\"dashboard-section performance-matrix\">\n <app-performance-heatmap\n [data]=\"(performanceMatrix$ | async) ?? []\"\n title=\"Agent vs Model Performance\"\n [config]=\"heatmapConfig\"\n ></app-performance-heatmap>\n </div>\n </kendo-splitter-pane>\n\n <!-- Right: Analysis Panels with Collapsible Sections -->\n <kendo-splitter-pane [resizable]=\"true\" [collapsible]=\"false\">\n <div class=\"dashboard-section analysis-panels\">\n \n <!-- Cost Analysis Panel -->\n <div class=\"analysis-panel\">\n <div class=\"panel-header\" (click)=\"togglePanel('cost')\">\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-dollar-sign\"></i>\n Cost Analysis\n </span>\n <i class=\"fa-solid panel-toggle-icon\" [class.fa-chevron-down]=\"!panelStates.cost\" [class.fa-chevron-up]=\"panelStates.cost\"></i>\n </div>\n @if (panelStates.cost) {\n <div class=\"panel-content\">\n @if (costData$ | async; as costData) {\n <div class=\"cost-bars\">\n @for (item of costData.slice(0, 8); track item.model) {\n <div class=\"cost-bar-item\">\n <div class=\"cost-bar-info\">\n <span class=\"model-name\">{{ item.model }}</span>\n <span class=\"cost-value\">{{ formatCurrency(item.cost) }}</span>\n </div>\n <div class=\"cost-bar-container\">\n <div \n class=\"cost-bar\"\n [style.width.%]=\"getCostBarWidth(item.cost, getMaxCost(costData))\"\n ></div>\n </div>\n <div class=\"token-info\">\n {{ formatTokens(item.tokens) }} tokens\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Token Efficiency Panel -->\n <div class=\"analysis-panel\">\n <div class=\"panel-header\" (click)=\"togglePanel('efficiency')\">\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-chart-pie\"></i>\n Token Efficiency\n </span>\n <i class=\"fa-solid panel-toggle-icon\" [class.fa-chevron-down]=\"!panelStates.efficiency\" [class.fa-chevron-up]=\"panelStates.efficiency\"></i>\n </div>\n @if (panelStates.efficiency) {\n <div class=\"panel-content\">\n @if (tokenEfficiency$ | async; as efficiencyData) {\n <div class=\"efficiency-items\">\n @for (item of efficiencyData.slice(0, 6); track item.model) {\n <div class=\"efficiency-item\">\n <div class=\"efficiency-header\">\n <span class=\"model-name\">{{ item.model }}</span>\n <span class=\"efficiency-ratio\">\n {{ getTokenRatio(item.inputTokens, item.outputTokens) }}\n </span>\n </div>\n <div class=\"token-breakdown\">\n <div class=\"token-bar\">\n <div \n class=\"token-segment token-segment--input\"\n [style.width.%]=\"getTokenPercentage(item.inputTokens, item.inputTokens + item.outputTokens)\"\n ></div>\n <div \n class=\"token-segment token-segment--output\"\n [style.width.%]=\"getTokenPercentage(item.outputTokens, item.inputTokens + item.outputTokens)\"\n ></div>\n </div>\n <div class=\"token-labels\">\n <span class=\"input-label\">Input: {{ formatTokens(item.inputTokens) }}</span>\n <span class=\"output-label\">Output: {{ formatTokens(item.outputTokens) }}</span>\n </div>\n </div>\n <div class=\"cost-per-token\">\n {{ formatCostPerToken(item.cost, item.inputTokens + item.outputTokens) }}\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Live Executions Panel -->\n <div class=\"analysis-panel\">\n <div class=\"panel-header\" (click)=\"togglePanel('executions')\">\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-bolt\"></i>\n Live Executions\n </span>\n <i class=\"fa-solid panel-toggle-icon\" [class.fa-chevron-down]=\"!panelStates.executions\" [class.fa-chevron-up]=\"panelStates.executions\"></i>\n </div>\n @if (panelStates.executions) {\n <div class=\"panel-content live-executions-panel\">\n <app-live-execution-widget\n [executions]=\"(liveExecutions$ | async) ?? []\"\n (executionClick)=\"onExecutionClick($event)\"\n ></app-live-execution-widget>\n </div>\n }\n </div>\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n </kendo-splitter-pane>\n </kendo-splitter>\n\n <!-- Execution Details Modal -->\n @if (selectedExecution) {\n <div class=\"execution-modal\" (click)=\"closeExecutionModal()\">\n <div class=\"execution-modal-content\" (click)=\"$event.stopPropagation()\">\n <div class=\"execution-modal-header\">\n <h3>Execution Details</h3>\n <div class=\"modal-header-actions\">\n <button class=\"open-record-btn\" (click)=\"openFullRecord()\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n Open\n </button>\n <button class=\"close-btn\" (click)=\"closeExecutionModal()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"execution-modal-body\">\n @if (executionDetails) {\n <div class=\"execution-details\">\n <div class=\"detail-section\">\n <h4>Basic Information</h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <label>Type:</label>\n <span>{{ executionDetails.type | titlecase }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Name:</label>\n <span>{{ executionDetails.name }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Status:</label>\n <span class=\"status-badge\" [class]=\"'status-badge--' + executionDetails.status\">\n {{ executionDetails.status | titlecase }}\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Started:</label>\n <span>{{ executionDetails.startTime | date:'medium' }}</span>\n </div>\n @if (executionDetails.endTime) {\n <div class=\"detail-item\">\n <label>Completed:</label>\n <span>{{ executionDetails.endTime | date:'medium' }}</span>\n </div>\n }\n <div class=\"detail-item\">\n <label>Duration:</label>\n <span>{{ formatDuration(getDuration(executionDetails)) }}</span>\n </div>\n </div>\n </div>\n \n <div class=\"detail-section\">\n <h4>Resource Usage</h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <label>Cost:</label>\n <span>{{ formatCurrency(executionDetails.cost, 6) }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Tokens:</label>\n <span>{{ executionDetails.tokens.toLocaleString() }}</span>\n </div>\n @if (executionDetails.model) {\n <div class=\"detail-item\">\n <label>Model:</label>\n <span>{{ executionDetails.model }}</span>\n </div>\n }\n </div>\n </div>\n \n @if (executionDetails.errorMessage) {\n <div class=\"detail-section\">\n <h4>Error Information</h4>\n <div class=\"error-message\">{{ executionDetails.errorMessage }}</div>\n </div>\n }\n \n @if (executionDetails.children.length > 0) {\n <div class=\"detail-section\">\n <h4>Child Executions ({{ executionDetails.children.length }})</h4>\n <div class=\"child-executions\">\n @for (child of executionDetails.children; track child.id) {\n <div class=\"child-execution\">\n <div class=\"child-info\">\n <span class=\"child-name\">{{ child.name }}</span>\n <span class=\"child-type\">{{ child.type }}</span>\n <span class=\"child-status\" [class]=\"'status-badge--' + child.status\">\n {{ child.status }}\n </span>\n </div>\n <div class=\"child-metrics\">\n <span>{{ formatCurrency(child.cost) }}</span>\n <span>{{ child.tokens.toLocaleString() }} tokens</span>\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n \n @if (loadingExecutionDetails) {\n <div class=\"loading-details\">\n <mj-loading text=\"Loading execution details...\" size=\"medium\"></mj-loading>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .execution-monitoring {\n padding: 0;\n background: linear-gradient(135deg, #f5f7fa 0%, #e4e8ed 100%);\n width: 100%;\n height: 100%;\n position: relative;\n overflow: auto;\n display: flex;\n flex-direction: column;\n }\n\n .execution-monitoring.loading {\n overflow: hidden;\n }\n\n /* Loading Overlay */\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.7);\n z-index: 999;\n display: flex;\n align-items: center;\n justify-content: center;\n backdrop-filter: blur(4px);\n }\n\n /* === Dashboard Header - Clean White Style === */\n .monitoring-header {\n background: white;\n padding: 16px 24px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n border-bottom: 1px solid #e0e6ed;\n position: relative;\n z-index: 10;\n }\n\n .monitoring-title {\n margin: 0;\n font-size: 20px;\n font-weight: 700;\n color: #1e293b;\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .monitoring-title i {\n color: #6366f1;\n font-size: 22px;\n }\n\n .monitoring-controls {\n display: flex;\n gap: 12px;\n align-items: center;\n flex-wrap: wrap;\n }\n\n .time-range-control {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n }\n\n .time-range-control label {\n color: #64748b;\n font-weight: 500;\n }\n\n .time-range-control select {\n padding: 8px 14px;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n font-size: 13px;\n background: #f8fafc;\n color: #1e293b;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .time-range-control select:hover:not(:disabled) {\n background: #f1f5f9;\n border-color: #cbd5e1;\n }\n\n .time-range-control select:focus {\n outline: none;\n border-color: #6366f1;\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);\n }\n\n .time-range-control select:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .time-range-control select option {\n background: white;\n color: #1e293b;\n }\n\n .refresh-btn {\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 8px;\n transition: all 0.2s ease;\n box-shadow: 0 2px 8px rgba(99, 102, 241, 0.25);\n }\n\n .refresh-btn:hover:not(:disabled) {\n background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.35);\n }\n\n .refresh-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n transform: none;\n }\n\n .refresh-btn i.spinning {\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .kpi-dashboard {\n padding: 20px;\n }\n\n .kpi-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 16px;\n }\n\n .dashboard-splitter {\n flex: 1;\n min-height: 500px;\n margin: 0 20px 20px 20px;\n }\n\n .dashboard-section {\n background: white;\n border-radius: 12px;\n box-shadow: 0 4px 16px rgba(99, 102, 241, 0.08);\n overflow: hidden;\n height: 100%;\n display: flex;\n flex-direction: column;\n border: 1px solid rgba(99, 102, 241, 0.08);\n transition: box-shadow 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .dashboard-section:hover {\n box-shadow: 0 8px 24px rgba(99, 102, 241, 0.12);\n }\n\n /* Ensure splitter panes take full height */\n :host ::ng-deep .k-splitter-pane {\n overflow: hidden;\n }\n\n :host ::ng-deep .k-splitter .k-splitter-pane {\n padding: 10px;\n }\n\n :host ::ng-deep .k-splitter-horizontal > .k-splitter-pane {\n padding: 10px 5px;\n }\n\n :host ::ng-deep .k-splitter-vertical > .k-splitter-pane {\n padding: 5px 10px;\n }\n\n /* Cost Analysis Styles */\n .cost-chart-container, .efficiency-chart-container, .status-container {\n padding: 20px;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .chart-header {\n margin-bottom: 16px;\n }\n\n .chart-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #1e293b;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .chart-title i {\n color: #6366f1;\n }\n\n .cost-bars, .efficiency-items {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .cost-bar-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 0;\n border-bottom: 1px solid #f0f0f0;\n }\n\n .cost-bar-item:last-child {\n border-bottom: none;\n }\n\n .cost-bar-info {\n min-width: 120px;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .model-name {\n font-size: 12px;\n font-weight: 500;\n color: #333;\n }\n\n .cost-value {\n font-size: 11px;\n color: #8b5cf6;\n font-weight: 600;\n }\n\n .cost-bar-container {\n flex: 1;\n height: 8px;\n background: linear-gradient(90deg, rgba(99, 102, 241, 0.1) 0%, rgba(139, 92, 246, 0.1) 100%);\n border-radius: 4px;\n overflow: hidden;\n }\n\n .cost-bar {\n height: 100%;\n background: linear-gradient(90deg, #6366f1 0%, #8b5cf6 50%, #a78bfa 100%);\n border-radius: 4px;\n transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .token-info {\n font-size: 10px;\n color: #666;\n min-width: 80px;\n text-align: right;\n }\n\n /* Token Efficiency Styles */\n .efficiency-item {\n padding: 12px 0;\n border-bottom: 1px solid #f0f0f0;\n }\n\n .efficiency-item:last-child {\n border-bottom: none;\n }\n\n .efficiency-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n }\n\n .efficiency-ratio {\n font-size: 11px;\n color: #6366f1;\n font-weight: 600;\n }\n\n .token-breakdown {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .token-bar {\n height: 8px;\n background: rgba(99, 102, 241, 0.1);\n border-radius: 4px;\n overflow: hidden;\n display: flex;\n }\n\n .token-segment {\n height: 100%;\n transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .token-segment--input {\n background: linear-gradient(90deg, #6366f1 0%, #818cf8 100%);\n }\n\n .token-segment--output {\n background: linear-gradient(90deg, #8b5cf6 0%, #a78bfa 100%);\n }\n\n .token-labels {\n display: flex;\n justify-content: space-between;\n font-size: 10px;\n color: #666;\n }\n\n .input-label {\n color: #6366f1;\n font-weight: 500;\n }\n\n .output-label {\n color: #8b5cf6;\n font-weight: 500;\n }\n\n .cost-per-token {\n font-size: 10px;\n color: #999;\n margin-top: 4px;\n }\n\n /* System Status Styles */\n .status-metrics {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n }\n\n .status-metric {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 6px;\n }\n\n .status-icon {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .status-icon--success {\n background: linear-gradient(135deg, rgba(16, 185, 129, 0.15) 0%, rgba(5, 150, 105, 0.15) 100%);\n color: #10b981;\n }\n\n .status-icon--warning {\n background: linear-gradient(135deg, rgba(245, 158, 11, 0.15) 0%, rgba(217, 119, 6, 0.15) 100%);\n color: #f59e0b;\n }\n\n .status-icon--info {\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.15) 0%, rgba(139, 92, 246, 0.15) 100%);\n color: #6366f1;\n }\n\n .status-icon--primary {\n background: linear-gradient(135deg, rgba(139, 92, 246, 0.15) 0%, rgba(167, 139, 250, 0.15) 100%);\n color: #8b5cf6;\n }\n\n .status-info {\n flex: 1;\n }\n\n .status-label {\n font-size: 12px;\n color: #666;\n font-weight: 500;\n }\n\n .status-value {\n font-size: 18px;\n font-weight: 700;\n color: #333;\n margin: 2px 0;\n }\n\n .status-subtitle {\n font-size: 10px;\n color: #999;\n }\n\n /* Execution Modal Styles */\n .execution-modal {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n padding: 20px;\n }\n\n .execution-modal-content {\n background: white;\n border-radius: 8px;\n max-width: 800px;\n width: 100%;\n max-height: 80vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .execution-modal-header {\n padding: 20px;\n border-bottom: 1px solid #f0f0f0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .execution-modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #333;\n }\n\n .modal-header-actions {\n display: flex;\n gap: 12px;\n align-items: center;\n }\n\n .open-record-btn {\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 0 2px 8px rgba(99, 102, 241, 0.25);\n }\n\n .open-record-btn:hover {\n background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.35);\n }\n\n .open-record-btn i {\n font-size: 12px;\n }\n\n .close-btn {\n background: none;\n border: none;\n font-size: 16px;\n color: #999;\n cursor: pointer;\n padding: 4px;\n }\n\n .close-btn:hover {\n color: #333;\n }\n\n .execution-modal-body {\n padding: 20px;\n overflow-y: auto;\n flex: 1;\n }\n\n .execution-details {\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n\n .detail-section h4 {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n border-bottom: 1px solid #f0f0f0;\n padding-bottom: 6px;\n }\n\n .detail-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n }\n\n .detail-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .detail-item label {\n font-size: 11px;\n color: #666;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .detail-item span {\n font-size: 13px;\n color: #333;\n }\n\n .status-badge {\n display: inline-block;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 10px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n .status-badge--completed {\n background: linear-gradient(135deg, rgba(16, 185, 129, 0.15) 0%, rgba(5, 150, 105, 0.15) 100%);\n color: #10b981;\n }\n\n .status-badge--running {\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.15) 0%, rgba(139, 92, 246, 0.15) 100%);\n color: #6366f1;\n }\n\n .status-badge--failed {\n background: linear-gradient(135deg, rgba(239, 68, 68, 0.15) 0%, rgba(220, 38, 38, 0.15) 100%);\n color: #ef4444;\n }\n\n .error-message {\n background: #fff3e0;\n border: 1px solid #ffcc02;\n border-radius: 4px;\n padding: 12px;\n font-size: 12px;\n color: #e65100;\n font-family: monospace;\n }\n\n .child-executions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .child-execution {\n background: #f8f9fa;\n border-radius: 4px;\n padding: 12px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .child-info {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .child-name {\n font-size: 12px;\n font-weight: 500;\n color: #333;\n }\n\n .child-type {\n font-size: 10px;\n background: #e0e0e0;\n padding: 2px 6px;\n border-radius: 3px;\n color: #666;\n }\n\n .child-status {\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 3px;\n }\n\n .child-metrics {\n display: flex;\n gap: 12px;\n font-size: 11px;\n color: #666;\n }\n\n .loading-details {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n gap: 12px;\n }\n\n /* Drill-down Tab Styles */\n .drill-down-container {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .drill-down-tabs {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .tab-header {\n display: flex;\n border-bottom: 1px solid rgba(99, 102, 241, 0.1);\n background: linear-gradient(180deg, #f8f9ff 0%, #f3f4f6 100%);\n min-height: 44px;\n overflow-x: auto;\n }\n\n .tab-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n background: transparent;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: #64748b;\n white-space: nowrap;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 120px;\n justify-content: space-between;\n }\n\n .tab-item:hover {\n background: rgba(99, 102, 241, 0.05);\n color: #6366f1;\n }\n\n .tab-item.active {\n background: white;\n color: #6366f1;\n border-bottom-color: #6366f1;\n font-weight: 600;\n }\n\n .tab-title {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .tab-close {\n background: none;\n border: none;\n color: #999;\n cursor: pointer;\n padding: 2px;\n border-radius: 2px;\n font-size: 10px;\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n }\n\n .tab-close:hover {\n background: rgba(0, 0, 0, 0.1);\n color: #333;\n }\n\n .tab-content {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .tab-pane {\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .trends-chart {\n padding: 0;\n }\n\n .trends-chart app-time-series-chart {\n height: 100%;\n display: block;\n overflow: hidden;\n }\n\n /* Ensure chart fits within tab pane */\n .tab-pane.trends-chart {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n /* Drill-down specific styles */\n .executions-drill-down {\n padding: 20px;\n overflow-y: auto;\n }\n\n .drill-down-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n padding-bottom: 12px;\n border-bottom: 1px solid #e0e0e0;\n }\n\n .drill-down-header h4 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .drill-down-meta {\n display: flex;\n gap: 12px;\n align-items: center;\n font-size: 12px;\n }\n\n .timestamp {\n color: #666;\n background: #f0f0f0;\n padding: 4px 8px;\n border-radius: 4px;\n }\n\n .metric-badge {\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n color: white;\n padding: 4px 10px;\n border-radius: 6px;\n font-weight: 600;\n box-shadow: 0 2px 4px rgba(99, 102, 241, 0.25);\n }\n\n .loading-spinner {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 40px;\n color: #666;\n gap: 12px;\n }\n\n .executions-table {\n display: flex;\n flex-direction: column;\n gap: 0;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n overflow: hidden;\n }\n\n .table-header {\n display: grid;\n grid-template-columns: 80px 1fr 120px 100px 100px 80px 100px 120px;\n gap: 12px;\n background: #f8f9fa;\n padding: 12px 16px;\n font-size: 11px;\n font-weight: 600;\n color: #666;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .table-row {\n display: grid;\n grid-template-columns: 80px 1fr 120px 100px 100px 80px 100px 120px;\n gap: 12px;\n padding: 12px 16px;\n border-top: 1px solid #f0f0f0;\n cursor: pointer;\n transition: background 0.2s ease;\n align-items: center;\n }\n\n .table-row:hover {\n background: #f8f9fa;\n }\n\n .table-cell {\n font-size: 12px;\n color: #333;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .type-badge {\n background: linear-gradient(135deg, rgba(100, 116, 139, 0.1) 0%, rgba(71, 85, 105, 0.1) 100%);\n color: #64748b;\n padding: 3px 8px;\n border-radius: 4px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n }\n\n .type-badge--prompt {\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.15) 0%, rgba(139, 92, 246, 0.15) 100%);\n color: #6366f1;\n }\n\n .type-badge--agent {\n background: linear-gradient(135deg, rgba(16, 185, 129, 0.15) 0%, rgba(5, 150, 105, 0.15) 100%);\n color: #10b981;\n }\n\n .no-data {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n color: #999;\n gap: 16px;\n }\n\n .no-data i {\n font-size: 48px;\n color: #ddd;\n }\n\n .no-data p {\n margin: 0;\n font-size: 14px;\n }\n\n /* Model detail styles */\n .model-detail {\n padding: 20px;\n overflow-y: auto;\n }\n\n .model-details {\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n .model-info-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 16px;\n }\n\n .info-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 16px;\n background: #f8f9fa;\n border-radius: 6px;\n }\n\n .info-item label {\n font-size: 11px;\n color: #666;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin: 0;\n }\n\n .info-item span {\n font-size: 14px;\n color: #333;\n font-weight: 500;\n }\n\n .status-indicator {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n }\n\n .status-indicator.active {\n color: #4caf50;\n }\n\n .status-indicator.active::before {\n content: '';\n width: 6px;\n height: 6px;\n background: #4caf50;\n border-radius: 50%;\n }\n\n .model-description {\n padding: 20px;\n background: #f8f9fa;\n border-radius: 8px;\n }\n\n .model-description h5 {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n }\n\n .model-description p {\n margin: 0;\n font-size: 13px;\n color: #666;\n line-height: 1.5;\n }\n\n /* Clickable KPI cards */\n .clickable {\n cursor: pointer;\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n\n .clickable:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n }\n\n /* Collapsible Panel Styles */\n .analysis-panels {\n padding: 12px;\n height: 100%;\n overflow-y: auto;\n background: linear-gradient(180deg, #f8f9ff 0%, #f3f4f6 100%);\n }\n\n .analysis-panel {\n margin-bottom: 12px;\n border-radius: 10px;\n box-shadow: 0 2px 8px rgba(99, 102, 241, 0.08);\n background: white;\n overflow: hidden;\n border: 1px solid rgba(99, 102, 241, 0.08);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .analysis-panel:hover {\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.12);\n }\n\n .analysis-panel:last-child {\n margin-bottom: 0;\n }\n\n .panel-header {\n padding: 14px 18px;\n background: linear-gradient(180deg, #fafbff 0%, #f8f9fc 100%);\n border-bottom: 1px solid rgba(99, 102, 241, 0.08);\n cursor: pointer;\n display: flex;\n justify-content: space-between;\n align-items: center;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .panel-header:hover {\n background: linear-gradient(180deg, #f0f1ff 0%, #e8e9ff 100%);\n }\n\n .panel-title {\n display: flex;\n align-items: center;\n gap: 10px;\n font-weight: 600;\n color: #1e293b;\n font-size: 14px;\n }\n\n .panel-title i {\n color: #6366f1;\n width: 18px;\n }\n\n .panel-toggle-icon {\n color: #6366f1;\n font-size: 12px;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .panel-content {\n padding: 18px;\n border-top: 1px solid rgba(99, 102, 241, 0.05);\n animation: slideDown 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n @keyframes slideDown {\n from {\n opacity: 0;\n max-height: 0;\n }\n to {\n opacity: 1;\n max-height: 500px;\n }\n }\n\n .live-executions-panel {\n padding: 0;\n }\n\n .live-executions-panel app-live-execution-widget {\n height: 300px;\n display: block;\n }\n\n /* Responsive Design */\n @media (max-width: 1200px) {\n .dashboard-splitter {\n min-height: 400px;\n }\n \n .table-header,\n .table-row {\n grid-template-columns: 60px 1fr 100px 80px 80px 60px 80px 100px;\n gap: 8px;\n }\n \n .model-info-grid {\n grid-template-columns: 1fr;\n }\n \n .analysis-panels {\n padding: 8px;\n }\n \n .analysis-panel {\n margin-bottom: 8px;\n }\n }\n\n @media (max-width: 768px) {\n .execution-monitoring {\n padding: 12px;\n }\n \n .monitoring-header {\n flex-direction: column;\n align-items: flex-start;\n }\n \n .monitoring-controls {\n width: 100%;\n justify-content: flex-start;\n }\n \n .dashboard-splitter {\n min-height: 350px;\n }\n \n .kpi-grid {\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n }\n\n /* Reduce padding on smaller screens */\n :host ::ng-deep .k-splitter .k-splitter-pane {\n padding: 5px;\n }\n\n :host ::ng-deep .k-splitter-horizontal > .k-splitter-pane {\n padding: 5px 2px;\n }\n\n :host ::ng-deep .k-splitter-vertical > .k-splitter-pane {\n padding: 2px 5px;\n }\n \n .tab-header {\n overflow-x: auto;\n }\n \n .tab-item {\n min-width: 100px;\n padding: 6px 12px;\n }\n \n .table-header,\n .table-row {\n grid-template-columns: 1fr;\n gap: 4px;\n text-align: left;\n }\n \n .table-row {\n display: block;\n padding: 16px;\n }\n \n .table-cell {\n display: block;\n margin-bottom: 8px;\n }\n \n .table-cell:before {\n content: attr(data-label) ': ';\n font-weight: 600;\n color: #666;\n font-size: 11px;\n text-transform: uppercase;\n }\n \n .executions-drill-down,\n .model-detail {\n padding: 12px;\n }\n \n .panel-content {\n padding: 12px;\n }\n \n .panel-header {\n padding: 10px 12px;\n }\n \n .panel-title {\n font-size: 13px;\n }\n }\n `]\n})\nexport class ExecutionMonitoringComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n private destroy$ = new Subject<void>();\n private stateChangeSubject$ = new Subject<ExecutionMonitoringState>();\n\n // Configuration\n selectedTimeRange = '24h';\n isLoading = false;\n\n // Chart configurations\n timeSeriesConfig = {\n showGrid: true,\n showTooltip: true,\n animationDuration: 500,\n useDualAxis: true\n };\n\n heatmapConfig = {\n height: 350,\n showTooltip: true,\n animationDuration: 300\n };\n\n // Data streams\n kpis$: Observable<DashboardKPIs>;\n trends$: Observable<TrendData[]>;\n liveExecutions$: Observable<LiveExecution[]>;\n chartData$: Observable<ChartData>;\n\n // Derived data streams\n kpiCards$: Observable<KPICardData[]>;\n performanceMatrix$: Observable<HeatmapData[]>;\n costData$: Observable<{ model: string; cost: number; tokens: number }[]>;\n tokenEfficiency$: Observable<{ inputTokens: number; outputTokens: number; cost: number; model: string }[]>;\n\n // Modal state\n selectedExecution: LiveExecution | null = null;\n executionDetails: ExecutionDetails | null = null;\n loadingExecutionDetails = false;\n\n // Drill-down tab state\n drillDownTabs: DrillDownTab[] = [];\n activeTabId: string = 'main-chart';\n loadingDrillDown = false;\n\n // Panel state for collapsible sections\n panelStates = {\n cost: true,\n efficiency: true, // Expanded by default\n executions: false\n };\n\n get activeTab(): DrillDownTab | undefined {\n return this.drillDownTabs.find(tab => tab.id === this.activeTabId);\n }\n\n constructor(\n private instrumentationService: AIInstrumentationService,\n private navigationService: NavigationService,\n private cdr: ChangeDetectorRef\n ) {\n super();\n // Initialize data streams\n this.kpis$ = this.instrumentationService.kpis$;\n this.trends$ = this.instrumentationService.trends$;\n this.liveExecutions$ = this.instrumentationService.liveExecutions$;\n this.chartData$ = this.instrumentationService.chartData$;\n\n // Subscribe to loading state from service\n this.instrumentationService.isLoading$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(loading => {\n this.isLoading = loading;\n this.cdr.markForCheck();\n });\n\n // Derived streams\n this.kpiCards$ = this.kpis$.pipe(\n map(kpis => this.createKPICards(kpis))\n );\n\n this.performanceMatrix$ = this.chartData$.pipe(\n map(data => data.performanceMatrix.map(item => ({\n agent: item.agent,\n model: item.model,\n avgTime: item.avgTime,\n successRate: item.successRate\n })))\n );\n\n this.costData$ = this.chartData$.pipe(\n map(data => data.costByModel)\n );\n\n this.tokenEfficiency$ = this.chartData$.pipe(\n map(data => data.tokenEfficiency)\n );\n }\n\n ngOnInit() {\n // Load initial state if provided from resource configuration\n if (this.Data?.Configuration) {\n this.loadUserState(this.Data.Configuration);\n } else {\n // Default initialization\n this.setTimeRange(this.selectedTimeRange);\n \n // Initialize with main chart tab\n this.drillDownTabs = [\n {\n id: 'main-chart',\n title: 'Execution Trends',\n type: 'chart',\n closeable: false\n }\n ];\n \n // Trigger initial data load\n this.instrumentationService.refresh();\n }\n \n // Set up debounced state change - could be used for persistence in the future\n this.stateChangeSubject$.pipe(\n debounceTime(2000), // 2 second debounce\n takeUntil(this.destroy$)\n ).subscribe(_state => {\n // State change handling placeholder\n });\n\n // Notify that the resource has finished loading\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n this.stateChangeSubject$.complete();\n }\n\n private getCurrentState(): ExecutionMonitoringState {\n return {\n selectedTimeRange: this.selectedTimeRange,\n refreshInterval: 0, // Always manual refresh now\n panelStates: { ...this.panelStates },\n drillDownTabs: this.drillDownTabs.map(tab => ({\n id: tab.id,\n title: tab.title,\n type: tab.type,\n timestamp: tab.timestamp?.toISOString(),\n metric: tab.metric\n })),\n activeTabId: this.activeTabId\n };\n }\n\n private emitStateChange(): void {\n const currentState = this.getCurrentState();\n this.stateChangeSubject$.next(currentState);\n }\n\n public loadUserState(state: Partial<ExecutionMonitoringState>): void {\n \n if (state.selectedTimeRange) {\n this.selectedTimeRange = state.selectedTimeRange;\n this.setTimeRange(state.selectedTimeRange);\n }\n \n // No longer need to handle refreshInterval since we removed auto-refresh\n \n if (state.panelStates) {\n // Only override if state has explicit panel states, otherwise keep defaults\n this.panelStates = { ...this.panelStates, ...state.panelStates };\n }\n \n if (state.drillDownTabs && state.drillDownTabs.length > 0) {\n this.drillDownTabs = state.drillDownTabs.map(tab => ({\n ...tab,\n type: tab.type as 'chart' | 'executions' | 'model-detail',\n timestamp: tab.timestamp ? new Date(tab.timestamp) : undefined,\n closeable: tab.id !== 'main-chart'\n }));\n } else {\n // Initialize with default tab if not provided\n this.drillDownTabs = [\n {\n id: 'main-chart',\n title: 'Execution Trends',\n type: 'chart',\n closeable: false\n }\n ];\n }\n \n if (state.activeTabId) {\n this.activeTabId = state.activeTabId;\n }\n }\n\n private createKPICards(kpis: DashboardKPIs): KPICardData[] {\n return [\n {\n title: 'Total Executions',\n value: kpis.totalExecutions,\n icon: 'fa-chart-bar',\n color: 'primary',\n subtitle: `${kpis.activeExecutions} active`\n },\n {\n title: 'Total Cost',\n value: `$${kpis.totalCost.toFixed(4)}`,\n icon: 'fa-dollar-sign',\n color: 'warning',\n subtitle: `${kpis.costCurrency} • $${kpis.dailyCostBurn.toFixed(2)}/day`\n },\n {\n title: 'Success Rate',\n value: `${(kpis.successRate * 100).toFixed(1)}%`,\n icon: 'fa-check-circle',\n color: 'success',\n subtitle: `${(kpis.errorRate * 100).toFixed(1)}% errors`\n },\n {\n title: 'Avg Response Time',\n value: `${(kpis.avgExecutionTime / 1000).toFixed(2)}s`,\n icon: 'fa-clock',\n color: 'info',\n subtitle: 'All models average'\n },\n {\n title: 'Token Usage',\n value: this.formatTokens(kpis.totalTokens),\n icon: 'fa-coins',\n color: 'primary',\n subtitle: `$${kpis.costPerToken.toFixed(6)}/token`\n },\n {\n title: 'Top Model',\n value: kpis.topModel,\n icon: 'fa-microchip',\n color: 'info',\n subtitle: 'Most used'\n }\n ];\n }\n\n onTimeRangeChange(): void {\n // Simply change time range - loading state is managed by the service\n this.setTimeRange(this.selectedTimeRange);\n this.emitStateChange();\n }\n\n private setTimeRange(range: string): void {\n const { start, end } = this.getTimeRangeFromSelection(range);\n this.instrumentationService.setDateRange(start, end);\n }\n \n private getTimeRangeFromSelection(range?: string): { start: Date; end: Date } {\n const now = new Date();\n const selectedRange = range || this.selectedTimeRange;\n let start: Date;\n\n switch (selectedRange) {\n case '1h':\n start = new Date(now.getTime() - 60 * 60 * 1000);\n break;\n case '6h':\n start = new Date(now.getTime() - 6 * 60 * 60 * 1000);\n break;\n case '24h':\n start = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n break;\n case '7d':\n start = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case '30d':\n start = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n default:\n start = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n }\n\n return { start, end: now };\n }\n\n refreshData(): void {\n // Simply trigger refresh - loading state is managed by the service\n this.instrumentationService.refresh();\n }\n\n onExecutionClick(execution: LiveExecution): void {\n this.selectedExecution = execution;\n this.loadExecutionDetails(execution);\n }\n\n onDataPointClick(event: DataPointClickEvent): void {\n const timestamp = event.data.timestamp;\n const metric = event.metric;\n \n // Create new drill-down tab\n const tabId = `drill-down-${timestamp.getTime()}-${metric}`;\n const tabTitle = `${this.getMetricDisplayLabel(metric)} - ${this.formatTimestamp(timestamp)}`;\n \n const newTab: DrillDownTab = {\n id: tabId,\n title: tabTitle,\n type: 'executions',\n timestamp: timestamp,\n metric: metric,\n closeable: true\n };\n \n // Add tab if it doesn't exist\n if (!this.drillDownTabs.find(tab => tab.id === tabId)) {\n this.drillDownTabs.push(newTab);\n this.emitStateChange(); // Emit state when new tab is added\n this.cdr.markForCheck();\n }\n \n // Switch to the new tab\n this.selectTab(tabId);\n \n // Load drill-down data\n this.loadDrillDownData(newTab);\n }\n\n onChartTimeRangeChange(range: string): void {\n this.selectedTimeRange = range;\n this.setTimeRange(range);\n }\n\n private getMetricValue(data: TrendData, metric: string): number {\n switch (metric) {\n case 'executions': return data.executions;\n case 'cost': return data.cost;\n case 'tokens': return data.tokens;\n case 'avgTime': return data.avgTime;\n case 'errors': return data.errors;\n default: return 0;\n }\n }\n\n private formatMetricValue(metric: string, value: number): string {\n switch (metric) {\n case 'executions': return value.toLocaleString();\n case 'cost': return `$${value.toFixed(4)}`;\n case 'tokens': return value.toLocaleString();\n case 'avgTime': return `${(value / 1000).toFixed(1)}s`;\n case 'errors': return value.toString();\n default: return value.toString();\n }\n }\n\n private async loadExecutionDetails(execution: LiveExecution): Promise<void> {\n this.loadingExecutionDetails = true;\n this.executionDetails = null;\n\n try {\n const details = await this.instrumentationService.getExecutionDetails(\n execution.id,\n execution.type\n );\n this.executionDetails = details;\n } catch (error) {\n console.error('Error loading execution details:', error);\n } finally {\n this.loadingExecutionDetails = false;\n }\n }\n\n closeExecutionModal(): void {\n this.selectedExecution = null;\n this.executionDetails = null;\n this.loadingExecutionDetails = false;\n }\n\n openFullRecord(): void {\n if (this.selectedExecution) {\n // Determine the entity name based on the execution type\n const entityName = this.selectedExecution.type === 'prompt'\n ? 'MJ: AI Prompt Runs'\n : 'MJ: AI Agent Runs';\n\n // Open the record using NavigationService\n const compositeKey = new CompositeKey([{ FieldName: 'ID', Value: this.selectedExecution.id }]);\n this.navigationService.OpenEntityRecord(entityName, compositeKey);\n\n // Close the modal\n this.closeExecutionModal();\n }\n }\n\n // Utility methods for templates\n trackByKpiTitle(index: number, kpi: KPICardData): string {\n return kpi.title;\n }\n\n trackByCostModel(index: number, item: { model: string; cost: number; tokens: number }): string {\n return item.model;\n }\n\n trackByEfficiencyModel(index: number, item: { model: string; inputTokens: number; outputTokens: number; cost: number }): string {\n return item.model;\n }\n\n formatTokens(tokens: number): string {\n if (tokens >= 1000000) {\n return `${(tokens / 1000000).toFixed(1)}M`;\n } else if (tokens >= 1000) {\n return `${(tokens / 1000).toFixed(1)}K`;\n }\n return tokens.toString();\n }\n\n formatCurrency(amount: number, decimals: number = 4): string {\n return `$${amount.toFixed(decimals)}`;\n }\n\n formatCostPerToken(cost: number, tokens: number): string {\n const costPer1K = tokens > 0 ? (cost / tokens) * 1000 : 0;\n return `$${costPer1K.toFixed(4)}/1K tokens`;\n }\n\n getCostBarWidth(cost: number, maxCost: number): number {\n return maxCost > 0 ? (cost / maxCost) * 100 : 0;\n }\n\n getMaxCost(costData: { cost: number }[]): number {\n return Math.max(...costData.map(item => item.cost));\n }\n\n getTokenRatio(input: number, output: number): string {\n const total = input + output;\n if (total === 0) return '0:0';\n const ratio = output / input;\n return `1:${ratio.toFixed(1)}`;\n }\n\n getTokenPercentage(tokens: number, total: number): number {\n return total > 0 ? (tokens / total) * 100 : 0;\n }\n\n getCostPerToken(cost: number, tokens: number): string {\n const costPer1K = tokens > 0 ? (cost / tokens) * 1000 : 0;\n return costPer1K.toFixed(4);\n }\n\n // Tab management methods\n selectTab(tabId: string): void {\n this.activeTabId = tabId;\n // Trigger chart resize after tab switch to fix chart rendering\n setTimeout(() => {\n window.dispatchEvent(new Event('resize'));\n }, 100);\n this.emitStateChange();\n this.cdr.markForCheck();\n }\n\n closeTab(event: MouseEvent, tabId: string): void {\n event.stopPropagation();\n \n const tabIndex = this.drillDownTabs.findIndex(tab => tab.id === tabId);\n if (tabIndex === -1) return;\n \n // Remove the tab\n this.drillDownTabs.splice(tabIndex, 1);\n \n // If we closed the active tab, switch to another tab\n if (this.activeTabId === tabId) {\n if (this.drillDownTabs.length > 0) {\n // Switch to the previous tab or first tab\n const newActiveIndex = Math.max(0, tabIndex - 1);\n this.activeTabId = this.drillDownTabs[newActiveIndex].id;\n // Trigger resize after tab switch\n setTimeout(() => {\n window.dispatchEvent(new Event('resize'));\n }, 100);\n } else {\n // No tabs left, this shouldn't happen as main chart is not closeable\n this.activeTabId = 'main-chart';\n }\n }\n \n this.emitStateChange();\n }\n\n // KPI click handling\n onKpiClick(kpi: KPICardData): void {\n if (kpi.title === 'Top Model' && kpi.value !== 'N/A') {\n this.openModelDrillDown(String(kpi.value));\n }\n // Add other KPI drill-downs as needed\n }\n\n isKpiClickable(kpi: KPICardData): boolean {\n return kpi.title === 'Top Model' && kpi.value !== 'N/A';\n }\n\n private async openModelDrillDown(modelName: string): Promise<void> {\n const tabId = `model-detail-${modelName.replace(/[^a-zA-Z0-9]/g, '-')}`;\n const tabTitle = `Model: ${modelName}`;\n \n // Check if tab already exists\n if (this.drillDownTabs.find(tab => tab.id === tabId)) {\n this.selectTab(tabId);\n return;\n }\n \n // Create new model detail tab\n const newTab: DrillDownTab = {\n id: tabId,\n title: tabTitle,\n type: 'model-detail',\n closeable: true\n };\n \n this.drillDownTabs.push(newTab);\n this.selectTab(tabId);\n \n // Load model details\n this.loadModelDetails(newTab, modelName);\n }\n\n private async loadDrillDownData(tab: DrillDownTab): Promise<void> {\n if (!tab.timestamp) return;\n \n this.loadingDrillDown = true;\n \n try {\n // Determine bucket size based on selected time range\n const { start, end } = this.getTimeRangeFromSelection();\n const duration = end.getTime() - start.getTime();\n const hours = duration / (1000 * 60 * 60);\n \n let windowSizeMs: number;\n let alignToDay = false;\n \n if (hours <= 24) {\n // For up to 24 hours, use 1 hour window (30 min before and after)\n windowSizeMs = 30 * 60 * 1000;\n } else if (hours <= 24 * 7) {\n // For up to 7 days, use full day window\n // Since data is aggregated into 4-hour buckets, we need to capture the full day\n windowSizeMs = 12 * 60 * 60 * 1000; // 12 hours before/after = 24 hour window\n alignToDay = true;\n } else {\n // For more than 7 days, use full day window\n windowSizeMs = 12 * 60 * 60 * 1000; // 12 hours before/after = 24 hour window\n alignToDay = true;\n }\n \n // Create time window around the clicked point\n let startTime = new Date(tab.timestamp.getTime() - windowSizeMs);\n let endTime = new Date(tab.timestamp.getTime() + windowSizeMs);\n \n // For day-aligned queries, expand to full day boundaries\n if (alignToDay) {\n // Set start to beginning of the day\n startTime = new Date(tab.timestamp);\n startTime.setHours(0, 0, 0, 0);\n \n // Set end to end of the day\n endTime = new Date(tab.timestamp);\n endTime.setHours(23, 59, 59, 999);\n }\n \n // Load executions for this time period\n const [promptResults, agentResults] = await Promise.all([\n new RunView().RunView<MJAIPromptRunEntityExtended>({\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `RunAt >= '${startTime.toISOString()}' AND RunAt <= '${endTime.toISOString()}'`,\n OrderBy: 'RunAt DESC' \n }),\n new RunView().RunView<MJAIAgentRunEntityExtended>({\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `StartedAt >= '${startTime.toISOString()}' AND StartedAt <= '${endTime.toISOString()}'`,\n OrderBy: 'StartedAt DESC' \n })\n ]);\n \n // Convert to ExecutionRecord format\n const executions: ExecutionRecord[] = [];\n \n // Add prompt executions\n for (const run of promptResults.Results) {\n const duration = run.CompletedAt ? \n new Date(run.CompletedAt).getTime() - new Date(run.RunAt).getTime() : \n Date.now() - new Date(run.RunAt).getTime();\n \n executions.push({\n id: run.ID,\n type: 'prompt',\n name: run.Prompt || 'Unnamed Prompt',\n model: run.Model || undefined,\n status: run.Success ? 'completed' : (run.Success === false ? 'failed' : 'running'),\n startTime: new Date(run.RunAt),\n endTime: run.CompletedAt ? new Date(run.CompletedAt) : undefined,\n duration: duration,\n cost: run.Cost || 0,\n tokens: run.TokensUsed || 0,\n errorMessage: run.ErrorMessage || undefined\n });\n }\n \n // Add agent executions\n for (const run of agentResults.Results) {\n const duration = run.CompletedAt ? \n new Date(run.CompletedAt).getTime() - new Date(run.StartedAt).getTime() : \n Date.now() - new Date(run.StartedAt).getTime();\n \n executions.push({\n id: run.ID,\n type: 'agent',\n name: run.Agent || 'Unnamed Agent',\n status: run.Status.toLowerCase(),\n startTime: new Date(run.StartedAt),\n endTime: run.CompletedAt ? new Date(run.CompletedAt) : undefined,\n duration: duration,\n cost: run.TotalCost || 0,\n tokens: run.TotalTokensUsed || 0,\n errorMessage: run.ErrorMessage || undefined\n });\n }\n \n // Sort by start time (most recent first)\n executions.sort((a, b) => b.startTime.getTime() - a.startTime.getTime());\n \n // Update tab data\n tab.data = executions;\n this.cdr.markForCheck();\n \n } catch (error) {\n console.error('Error loading drill-down data:', error);\n tab.data = [];\n this.cdr.markForCheck();\n } finally {\n this.loadingDrillDown = false;\n this.cdr.markForCheck();\n }\n }\n\n private async loadModelDetails(tab: DrillDownTab, modelName: string): Promise<void> {\n this.loadingDrillDown = true;\n \n try {\n // Find model by name\n const rv = new RunView();\n const result = await rv.RunView<MJAIModelEntityExtended>({\n EntityName: 'MJ: AI Models',\n ExtraFilter: `Name = '${modelName.replace(/'/g, \"''\")}'` \n });\n \n const model = result.Results[0];\n if (model) {\n tab.data = {\n name: model.Name,\n vendor: model.Vendor,\n apiName: model.APIName,\n inputTokenCost: 0, // Not available in current model\n outputTokenCost: 0, // Not available in current model \n isActive: model.IsActive,\n description: model.Description\n };\n } else {\n tab.data = null;\n }\n \n } catch (error) {\n console.error('Error loading model details:', error);\n tab.data = null;\n } finally {\n this.loadingDrillDown = false;\n }\n }\n\n // Helper methods for drill-down\n\n formatTimestamp(timestamp: Date): string {\n return timestamp.toLocaleString();\n }\n\n formatTime(time: Date): string {\n return time.toLocaleTimeString();\n }\n\n getMetricDisplayLabel(metric: string): string {\n const labels: { [key: string]: string } = {\n executions: 'Executions',\n cost: 'Cost',\n tokens: 'Tokens',\n avgTime: 'Avg Time',\n errors: 'Errors'\n };\n return labels[metric] || metric;\n }\n\n getFormattedTimestamp(tab: DrillDownTab | undefined): string {\n return tab?.timestamp ? this.formatTimestamp(tab.timestamp) : '';\n }\n\n getFormattedMetricLabel(tab: DrillDownTab | undefined): string {\n return tab?.metric ? this.getMetricDisplayLabel(tab.metric) : '';\n }\n\n // Panel management methods\n togglePanel(panelName: 'cost' | 'efficiency' | 'executions'): void {\n this.panelStates[panelName] = !this.panelStates[panelName];\n this.emitStateChange();\n }\n\n viewExecutionDetail(execution: ExecutionRecord): void {\n // Convert ExecutionRecord to LiveExecution format for the modal\n const liveExecution: LiveExecution = {\n id: execution.id,\n type: execution.type,\n name: execution.name,\n status: execution.status as 'running' | 'completed' | 'failed',\n startTime: execution.startTime,\n duration: execution.duration,\n cost: execution.cost,\n tokens: execution.tokens\n };\n \n this.onExecutionClick(liveExecution);\n }\n\n formatDuration(milliseconds: number): string {\n const seconds = Math.floor(milliseconds / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m ${seconds % 60}s`;\n } else if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n } else {\n return `${seconds}s`;\n }\n }\n\n getDuration(details: ExecutionDetails): number {\n const start = details.startTime.getTime();\n const end = details.endTime ? details.endTime.getTime() : Date.now();\n return end - start;\n }\n\n onSplitterLayoutChange(event: any): void {\n // Trigger window resize event to force charts to recalculate dimensions\n setTimeout(() => {\n window.dispatchEvent(new Event('resize'));\n }, 100);\n\n // Emit state change when splitter changes\n this.emitStateChange();\n }\n\n // === BaseResourceComponent Required Methods ===\n\n /**\n * Get the display name for this resource\n */\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Monitor';\n }\n\n /**\n * Get the icon class for this resource\n */\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-chart-line';\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"execution-monitoring.component.js","sourceRoot":"","sources":["../../../src/AI/components/execution-monitoring.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { map, takeUntil, debounceTime } from 'rxjs/operators';\nimport {\n AIInstrumentationService,\n DashboardKPIs,\n TrendData,\n LiveExecution,\n ChartData,\n ExecutionDetails\n} from '../services/ai-instrumentation.service';\nimport { DataPointClickEvent } from './charts/time-series-chart.component';\nimport { KPICardData } from './widgets/kpi-card.component';\nimport { HeatmapData } from './charts/performance-heatmap.component';\nimport { RunView, CompositeKey } from '@memberjunction/core';\nimport { ResourceData } from \"@memberjunction/core-entities\";\nimport { MJAIPromptRunEntityExtended, MJAIAgentRunEntityExtended, MJAIModelEntityExtended } from '@memberjunction/ai-core-plus';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\n\nexport interface DrillDownTab {\n id: string;\n title: string;\n type: 'chart' | 'executions' | 'model-detail';\n data?: any;\n timestamp?: Date;\n metric?: string;\n closeable: boolean;\n}\n\nexport interface ExecutionRecord {\n id: string;\n type: 'prompt' | 'agent';\n name: string;\n model?: string;\n status: string;\n startTime: Date;\n endTime?: Date;\n duration: number;\n cost: number;\n tokens: number;\n errorMessage?: string;\n}\n\nexport interface ExecutionMonitoringState {\n selectedTimeRange: string;\n refreshInterval: number;\n panelStates: {\n cost: boolean;\n efficiency: boolean;\n executions: boolean;\n };\n drillDownTabs: Array<{\n id: string;\n title: string;\n type: string;\n timestamp?: string;\n metric?: string;\n }>;\n activeTabId: string;\n splitterSizes?: number[];\n}\n/**\n * AI Monitor Resource - displays AI execution monitoring and analytics\n * Extends BaseResourceComponent to work with the resource type system\n */\n@RegisterClass(BaseResourceComponent, 'AIMonitorResource')\n@Component({\n standalone: false,\n selector: 'app-execution-monitoring',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"execution-monitoring\" [class.loading]=\"isLoading\">\n <!-- Loading Overlay -->\n @if (isLoading) {\n <div class=\"loading-overlay\">\n <mj-loading text=\"Loading dashboard data...\" size=\"large\"></mj-loading>\n </div>\n }\n <!-- Header Controls -->\n <div class=\"monitoring-header\">\n <h2 class=\"monitoring-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n AI Execution Monitoring\n </h2>\n \n <div class=\"monitoring-controls\">\n <div class=\"time-range-control\">\n <label>Time Range:</label>\n <select [(ngModel)]=\"selectedTimeRange\" (change)=\"onTimeRangeChange()\" [disabled]=\"isLoading\">\n <option value=\"1h\">Last Hour</option>\n <option value=\"6h\">Last 6 Hours</option>\n <option value=\"24h\">Last 24 Hours</option>\n <option value=\"7d\">Last 7 Days</option>\n <option value=\"30d\">Last 30 Days</option>\n </select>\n </div>\n \n <button class=\"refresh-btn\" (click)=\"refreshData()\" [disabled]=\"isLoading\">\n <i class=\"fa-solid fa-refresh\" [class.spinning]=\"isLoading\"></i>\n Refresh\n </button>\n </div>\n </div>\n\n <!-- KPI Dashboard -->\n <div class=\"kpi-dashboard\">\n <div class=\"kpi-grid\">\n @for (kpi of kpiCards$ | async; track kpi.title) {\n <app-kpi-card \n [data]=\"kpi\"\n (click)=\"onKpiClick(kpi)\"\n [class.clickable]=\"isKpiClickable(kpi)\"\n ></app-kpi-card>\n }\n </div>\n </div>\n\n <!-- Main Dashboard with Kendo Splitter -->\n <kendo-splitter class=\"dashboard-splitter\" orientation=\"vertical\" (layoutChange)=\"onSplitterLayoutChange($event)\">\n <!-- Top Row: System Health and Trends Chart -->\n <kendo-splitter-pane size=\"45%\" [resizable]=\"true\" [collapsible]=\"false\">\n <kendo-splitter orientation=\"horizontal\" (layoutChange)=\"onSplitterLayoutChange($event)\">\n <!-- System Health -->\n <kendo-splitter-pane size=\"30%\" [resizable]=\"true\" [collapsible]=\"true\" [collapsed]=\"false\">\n <div class=\"dashboard-section system-status\">\n <div class=\"status-container\">\n <div class=\"chart-header\">\n <h4 class=\"chart-title\">\n <i class=\"fa-solid fa-heartbeat\"></i>\n System Health\n </h4>\n </div>\n @if (kpis$ | async; as kpis) {\n <div class=\"status-metrics\">\n <div class=\"status-metric\">\n <div class=\"status-icon status-icon--success\">\n <i class=\"fa-solid fa-check\"></i>\n </div>\n <div class=\"status-info\">\n <div class=\"status-label\">Success Rate</div>\n <div class=\"status-value\">{{ (kpis.successRate * 100).toFixed(1) }}%</div>\n <div class=\"status-subtitle\">Last {{ selectedTimeRange }}</div>\n </div>\n </div>\n \n <div class=\"status-metric\">\n <div class=\"status-icon status-icon--warning\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n </div>\n <div class=\"status-info\">\n <div class=\"status-label\">Error Rate</div>\n <div class=\"status-value\">{{ (kpis.errorRate * 100).toFixed(1) }}%</div>\n <div class=\"status-subtitle\">{{ kpis.totalExecutions }} total executions</div>\n </div>\n </div>\n \n <div class=\"status-metric\">\n <div class=\"status-icon status-icon--info\">\n <i class=\"fa-solid fa-clock\"></i>\n </div>\n <div class=\"status-info\">\n <div class=\"status-label\">Avg Response Time</div>\n <div class=\"status-value\">{{ (kpis.avgExecutionTime / 1000).toFixed(2) }}s</div>\n <div class=\"status-subtitle\">Across all models</div>\n </div>\n </div>\n \n <div class=\"status-metric\">\n <div class=\"status-icon status-icon--primary\">\n <i class=\"fa-solid fa-bolt\"></i>\n </div>\n <div class=\"status-info\">\n <div class=\"status-label\">Active Executions</div>\n <div class=\"status-value\">{{ kpis.activeExecutions }}</div>\n <div class=\"status-subtitle\">Currently running</div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </kendo-splitter-pane>\n \n <!-- Drill-down Tab Container -->\n <kendo-splitter-pane [resizable]=\"true\" [collapsible]=\"false\">\n <div class=\"dashboard-section drill-down-container\">\n <div class=\"drill-down-tabs\">\n <div class=\"tab-header\">\n @for (tab of drillDownTabs; track tab.id) {\n <div \n class=\"tab-item\"\n [class.active]=\"activeTabId === tab.id\"\n (click)=\"selectTab(tab.id)\"\n >\n <span class=\"tab-title\">{{ tab.title }}</span>\n @if (tab.closeable) {\n <button \n class=\"tab-close\"\n (click)=\"closeTab($event, tab.id)\"\n title=\"Close tab\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n }\n </div>\n \n <div class=\"tab-content\">\n @if (activeTab?.type === 'chart') {\n <div class=\"tab-pane trends-chart\">\n <app-time-series-chart\n [data]=\"(trends$ | async) ?? []\"\n title=\"Execution Trends\"\n [config]=\"timeSeriesConfig\"\n (dataPointClick)=\"onDataPointClick($event)\"\n (timeRangeChange)=\"onChartTimeRangeChange($event)\"\n ></app-time-series-chart>\n </div>\n }\n \n @if (activeTab?.type === 'executions') {\n <div class=\"tab-pane executions-drill-down\">\n <div class=\"drill-down-header\">\n <h4>\n <i class=\"fa-solid fa-list\"></i>\n {{ activeTab?.title }}\n </h4>\n <div class=\"drill-down-meta\">\n @if (activeTab?.timestamp) {\n <span class=\"timestamp\">{{ getFormattedTimestamp(activeTab) }}</span>\n }\n @if (activeTab?.metric) {\n <span class=\"metric-badge\">{{ getFormattedMetricLabel(activeTab) }}</span>\n }\n </div>\n </div>\n \n @if (loadingDrillDown) {\n <div class=\"loading-spinner\">\n <mj-loading text=\"Loading execution details...\" size=\"small\"></mj-loading>\n </div>\n } @else if (activeTab?.data?.length > 0) {\n <div class=\"executions-table\">\n <div class=\"table-header\">\n <div class=\"header-cell\">Type</div>\n <div class=\"header-cell\">Name</div>\n <div class=\"header-cell\">Model</div>\n <div class=\"header-cell\">Status</div>\n <div class=\"header-cell\">Duration</div>\n <div class=\"header-cell\">Cost</div>\n <div class=\"header-cell\">Tokens</div>\n <div class=\"header-cell\">Time</div>\n </div>\n @for (execution of activeTab?.data; track execution.id) {\n <div \n class=\"table-row\"\n (click)=\"viewExecutionDetail(execution)\"\n >\n <div class=\"table-cell\">\n <span class=\"type-badge\" [class]=\"'type-badge--' + execution.type\">\n {{ execution.type }}\n </span>\n </div>\n <div class=\"table-cell\">{{ execution.name }}</div>\n <div class=\"table-cell\">{{ execution.model || 'N/A' }}</div>\n <div class=\"table-cell\">\n <span class=\"status-badge\" [class]=\"'status-badge--' + execution.status\">\n {{ execution.status }}\n </span>\n </div>\n <div class=\"table-cell\">{{ formatDuration(execution.duration) }}</div>\n <div class=\"table-cell\">{{ formatCurrency(execution.cost) }}</div>\n <div class=\"table-cell\">{{ execution.tokens.toLocaleString() }}</div>\n <div class=\"table-cell\">{{ formatTime(execution.startTime) }}</div>\n </div>\n }\n </div>\n } @else {\n <div class=\"no-data\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No executions found for this time period</p>\n </div>\n }\n </div>\n }\n \n @if (activeTab?.type === 'model-detail') {\n <div class=\"tab-pane model-detail\">\n <div class=\"drill-down-header\">\n <h4>\n <i class=\"fa-solid fa-microchip\"></i>\n Model Details: {{ activeTab?.data?.name }}\n </h4>\n </div>\n \n @if (loadingDrillDown) {\n <div class=\"loading-spinner\">\n <mj-loading text=\"Loading model details...\" size=\"small\"></mj-loading>\n </div>\n } @else if (activeTab?.data) {\n <div class=\"model-details\">\n <div class=\"model-info-grid\">\n <div class=\"info-item\">\n <label>Model Name:</label>\n <span>{{ activeTab?.data?.name }}</span>\n </div>\n <div class=\"info-item\">\n <label>Vendor:</label>\n <span>{{ activeTab?.data?.vendor }}</span>\n </div>\n <div class=\"info-item\">\n <label>API Name:</label>\n <span>{{ activeTab?.data?.apiName }}</span>\n </div>\n <div class=\"info-item\">\n <label>Input Cost:</label>\n <span>\\${{ activeTab?.data?.inputTokenCost?.toFixed(6) || '0' }} per token</span>\n </div>\n <div class=\"info-item\">\n <label>Output Cost:</label>\n <span>\\${{ activeTab?.data?.outputTokenCost?.toFixed(6) || '0' }} per token</span>\n </div>\n <div class=\"info-item\">\n <label>Active:</label>\n <span class=\"status-indicator\" [class.active]=\"activeTab?.data?.isActive\">\n {{ activeTab?.data?.isActive ? 'Yes' : 'No' }}\n </span>\n </div>\n </div>\n \n @if (activeTab?.data?.description) {\n <div class=\"model-description\">\n <h5>Description</h5>\n <p>{{ activeTab?.data?.description }}</p>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n </kendo-splitter-pane>\n\n <!-- Bottom Row: Analysis Panels with Expansion Layout -->\n <kendo-splitter-pane [resizable]=\"true\" [collapsible]=\"false\">\n <kendo-splitter orientation=\"horizontal\" (layoutChange)=\"onSplitterLayoutChange($event)\">\n <!-- Left: Performance Heatmap -->\n <kendo-splitter-pane size=\"50%\" [resizable]=\"true\" [collapsible]=\"false\">\n <div class=\"dashboard-section performance-matrix\">\n <app-performance-heatmap\n [data]=\"(performanceMatrix$ | async) ?? []\"\n title=\"Agent vs Model Performance\"\n [config]=\"heatmapConfig\"\n ></app-performance-heatmap>\n </div>\n </kendo-splitter-pane>\n\n <!-- Right: Analysis Panels with Collapsible Sections -->\n <kendo-splitter-pane [resizable]=\"true\" [collapsible]=\"false\">\n <div class=\"dashboard-section analysis-panels\">\n \n <!-- Cost Analysis Panel -->\n <div class=\"analysis-panel\">\n <div class=\"panel-header\" (click)=\"togglePanel('cost')\">\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-dollar-sign\"></i>\n Cost Analysis\n </span>\n <i class=\"fa-solid panel-toggle-icon\" [class.fa-chevron-down]=\"!panelStates.cost\" [class.fa-chevron-up]=\"panelStates.cost\"></i>\n </div>\n @if (panelStates.cost) {\n <div class=\"panel-content\">\n @if (costData$ | async; as costData) {\n <div class=\"cost-bars\">\n @for (item of costData.slice(0, 8); track item.model) {\n <div class=\"cost-bar-item\">\n <div class=\"cost-bar-info\">\n <span class=\"model-name\">{{ item.model }}</span>\n <span class=\"cost-value\">{{ formatCurrency(item.cost) }}</span>\n </div>\n <div class=\"cost-bar-container\">\n <div \n class=\"cost-bar\"\n [style.width.%]=\"getCostBarWidth(item.cost, getMaxCost(costData))\"\n ></div>\n </div>\n <div class=\"token-info\">\n {{ formatTokens(item.tokens) }} tokens\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Token Efficiency Panel -->\n <div class=\"analysis-panel\">\n <div class=\"panel-header\" (click)=\"togglePanel('efficiency')\">\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-chart-pie\"></i>\n Token Efficiency\n </span>\n <i class=\"fa-solid panel-toggle-icon\" [class.fa-chevron-down]=\"!panelStates.efficiency\" [class.fa-chevron-up]=\"panelStates.efficiency\"></i>\n </div>\n @if (panelStates.efficiency) {\n <div class=\"panel-content\">\n @if (tokenEfficiency$ | async; as efficiencyData) {\n <div class=\"efficiency-items\">\n @for (item of efficiencyData.slice(0, 6); track item.model) {\n <div class=\"efficiency-item\">\n <div class=\"efficiency-header\">\n <span class=\"model-name\">{{ item.model }}</span>\n <span class=\"efficiency-ratio\">\n {{ getTokenRatio(item.inputTokens, item.outputTokens) }}\n </span>\n </div>\n <div class=\"token-breakdown\">\n <div class=\"token-bar\">\n <div \n class=\"token-segment token-segment--input\"\n [style.width.%]=\"getTokenPercentage(item.inputTokens, item.inputTokens + item.outputTokens)\"\n ></div>\n <div \n class=\"token-segment token-segment--output\"\n [style.width.%]=\"getTokenPercentage(item.outputTokens, item.inputTokens + item.outputTokens)\"\n ></div>\n </div>\n <div class=\"token-labels\">\n <span class=\"input-label\">Input: {{ formatTokens(item.inputTokens) }}</span>\n <span class=\"output-label\">Output: {{ formatTokens(item.outputTokens) }}</span>\n </div>\n </div>\n <div class=\"cost-per-token\">\n {{ formatCostPerToken(item.cost, item.inputTokens + item.outputTokens) }}\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Live Executions Panel -->\n <div class=\"analysis-panel\">\n <div class=\"panel-header\" (click)=\"togglePanel('executions')\">\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-bolt\"></i>\n Live Executions\n </span>\n <i class=\"fa-solid panel-toggle-icon\" [class.fa-chevron-down]=\"!panelStates.executions\" [class.fa-chevron-up]=\"panelStates.executions\"></i>\n </div>\n @if (panelStates.executions) {\n <div class=\"panel-content live-executions-panel\">\n <app-live-execution-widget\n [executions]=\"(liveExecutions$ | async) ?? []\"\n (executionClick)=\"onExecutionClick($event)\"\n ></app-live-execution-widget>\n </div>\n }\n </div>\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n </kendo-splitter-pane>\n </kendo-splitter>\n\n <!-- Execution Details Modal -->\n @if (selectedExecution) {\n <div class=\"execution-modal\" (click)=\"closeExecutionModal()\">\n <div class=\"execution-modal-content\" (click)=\"$event.stopPropagation()\">\n <div class=\"execution-modal-header\">\n <h3>Execution Details</h3>\n <div class=\"modal-header-actions\">\n <button class=\"open-record-btn\" (click)=\"openFullRecord()\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n Open\n </button>\n <button class=\"close-btn\" (click)=\"closeExecutionModal()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"execution-modal-body\">\n @if (executionDetails) {\n <div class=\"execution-details\">\n <div class=\"detail-section\">\n <h4>Basic Information</h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <label>Type:</label>\n <span>{{ executionDetails.type | titlecase }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Name:</label>\n <span>{{ executionDetails.name }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Status:</label>\n <span class=\"status-badge\" [class]=\"'status-badge--' + executionDetails.status\">\n {{ executionDetails.status | titlecase }}\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Started:</label>\n <span>{{ executionDetails.startTime | date:'medium' }}</span>\n </div>\n @if (executionDetails.endTime) {\n <div class=\"detail-item\">\n <label>Completed:</label>\n <span>{{ executionDetails.endTime | date:'medium' }}</span>\n </div>\n }\n <div class=\"detail-item\">\n <label>Duration:</label>\n <span>{{ formatDuration(getDuration(executionDetails)) }}</span>\n </div>\n </div>\n </div>\n \n <div class=\"detail-section\">\n <h4>Resource Usage</h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <label>Cost:</label>\n <span>{{ formatCurrency(executionDetails.cost, 6) }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Tokens:</label>\n <span>{{ executionDetails.tokens.toLocaleString() }}</span>\n </div>\n @if (executionDetails.model) {\n <div class=\"detail-item\">\n <label>Model:</label>\n <span>{{ executionDetails.model }}</span>\n </div>\n }\n </div>\n </div>\n \n @if (executionDetails.errorMessage) {\n <div class=\"detail-section\">\n <h4>Error Information</h4>\n <div class=\"error-message\">{{ executionDetails.errorMessage }}</div>\n </div>\n }\n \n @if (executionDetails.children.length > 0) {\n <div class=\"detail-section\">\n <h4>Child Executions ({{ executionDetails.children.length }})</h4>\n <div class=\"child-executions\">\n @for (child of executionDetails.children; track child.id) {\n <div class=\"child-execution\">\n <div class=\"child-info\">\n <span class=\"child-name\">{{ child.name }}</span>\n <span class=\"child-type\">{{ child.type }}</span>\n <span class=\"child-status\" [class]=\"'status-badge--' + child.status\">\n {{ child.status }}\n </span>\n </div>\n <div class=\"child-metrics\">\n <span>{{ formatCurrency(child.cost) }}</span>\n <span>{{ child.tokens.toLocaleString() }} tokens</span>\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n \n @if (loadingExecutionDetails) {\n <div class=\"loading-details\">\n <mj-loading text=\"Loading execution details...\" size=\"medium\"></mj-loading>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .execution-monitoring {\n padding: 0;\n background: var(--mj-bg-surface-card);\n width: 100%;\n height: 100%;\n position: relative;\n overflow: auto;\n display: flex;\n flex-direction: column;\n }\n\n .execution-monitoring.loading {\n overflow: hidden;\n }\n\n /* Loading Overlay */\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: color-mix(in srgb, var(--mj-bg-surface) 70%, transparent);\n z-index: 999;\n display: flex;\n align-items: center;\n justify-content: center;\n backdrop-filter: blur(4px);\n }\n\n /* === Dashboard Header - Clean White Style === */\n .monitoring-header {\n background: var(--mj-bg-surface);\n padding: 16px 24px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n border-bottom: 1px solid var(--mj-border-default);\n position: relative;\n z-index: 10;\n }\n\n .monitoring-title {\n margin: 0;\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .monitoring-title i {\n color: var(--mj-brand-primary);\n font-size: 22px;\n }\n\n .monitoring-controls {\n display: flex;\n gap: 12px;\n align-items: center;\n flex-wrap: wrap;\n }\n\n .time-range-control {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n }\n\n .time-range-control label {\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n\n .time-range-control select {\n padding: 8px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 13px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .time-range-control select:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n }\n\n .time-range-control select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .time-range-control select:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .time-range-control select option {\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n }\n\n .refresh-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 8px 16px;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 8px;\n transition: all 0.2s ease;\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n }\n\n .refresh-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 35%, transparent);\n }\n\n .refresh-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n transform: none;\n }\n\n .refresh-btn i.spinning {\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .kpi-dashboard {\n padding: 20px;\n }\n\n .kpi-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 16px;\n }\n\n .dashboard-splitter {\n flex: 1;\n min-height: 500px;\n margin: 0 20px 20px 20px;\n }\n\n .dashboard-section {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 4px 16px color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n overflow: hidden;\n height: 100%;\n display: flex;\n flex-direction: column;\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n transition: box-shadow 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .dashboard-section:hover {\n box-shadow: 0 8px 24px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n }\n\n /* Ensure splitter panes take full height */\n :host ::ng-deep .k-splitter-pane {\n overflow: hidden;\n }\n\n :host ::ng-deep .k-splitter .k-splitter-pane {\n padding: 10px;\n }\n\n :host ::ng-deep .k-splitter-horizontal > .k-splitter-pane {\n padding: 10px 5px;\n }\n\n :host ::ng-deep .k-splitter-vertical > .k-splitter-pane {\n padding: 5px 10px;\n }\n\n /* Cost Analysis Styles */\n .cost-chart-container, .efficiency-chart-container, .status-container {\n padding: 20px;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .chart-header {\n margin-bottom: 16px;\n }\n\n .chart-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .chart-title i {\n color: var(--mj-brand-primary);\n }\n\n .cost-bars, .efficiency-items {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .cost-bar-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .cost-bar-item:last-child {\n border-bottom: none;\n }\n\n .cost-bar-info {\n min-width: 120px;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .model-name {\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .cost-value {\n font-size: 11px;\n color: var(--mj-brand-primary);\n font-weight: 600;\n }\n\n .cost-bar-container {\n flex: 1;\n height: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-radius: 4px;\n overflow: hidden;\n }\n\n .cost-bar {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 4px;\n transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .token-info {\n font-size: 10px;\n color: var(--mj-text-muted);\n min-width: 80px;\n text-align: right;\n }\n\n /* Token Efficiency Styles */\n .efficiency-item {\n padding: 12px 0;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .efficiency-item:last-child {\n border-bottom: none;\n }\n\n .efficiency-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n }\n\n .efficiency-ratio {\n font-size: 11px;\n color: var(--mj-brand-primary);\n font-weight: 600;\n }\n\n .token-breakdown {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .token-bar {\n height: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-radius: 4px;\n overflow: hidden;\n display: flex;\n }\n\n .token-segment {\n height: 100%;\n transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .token-segment--input {\n background: var(--mj-brand-primary);\n }\n\n .token-segment--output {\n background: var(--mj-brand-accent);\n }\n\n .token-labels {\n display: flex;\n justify-content: space-between;\n font-size: 10px;\n color: var(--mj-text-muted);\n }\n\n .input-label {\n color: var(--mj-brand-primary);\n font-weight: 500;\n }\n\n .output-label {\n color: var(--mj-brand-accent);\n font-weight: 500;\n }\n\n .cost-per-token {\n font-size: 10px;\n color: var(--mj-text-disabled);\n margin-top: 4px;\n }\n\n /* System Status Styles */\n .status-metrics {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n }\n\n .status-metric {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n background: var(--mj-bg-surface-card);\n border-radius: 6px;\n }\n\n .status-icon {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .status-icon--success {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .status-icon--warning {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n .status-icon--info {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .status-icon--primary {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .status-info {\n flex: 1;\n }\n\n .status-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n\n .status-value {\n font-size: 18px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 2px 0;\n }\n\n .status-subtitle {\n font-size: 10px;\n color: var(--mj-text-disabled);\n }\n\n /* Execution Modal Styles */\n .execution-modal {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n padding: 20px;\n }\n\n .execution-modal-content {\n background: var(--mj-bg-surface);\n border-radius: 8px;\n max-width: 800px;\n width: 100%;\n max-height: 80vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .execution-modal-header {\n padding: 20px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .execution-modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .modal-header-actions {\n display: flex;\n gap: 12px;\n align-items: center;\n }\n\n .open-record-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 8px 16px;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n }\n\n .open-record-btn:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 35%, transparent);\n }\n\n .open-record-btn i {\n font-size: 12px;\n }\n\n .close-btn {\n background: none;\n border: none;\n font-size: 16px;\n color: var(--mj-text-disabled);\n cursor: pointer;\n padding: 4px;\n }\n\n .close-btn:hover {\n color: var(--mj-text-primary);\n }\n\n .execution-modal-body {\n padding: 20px;\n overflow-y: auto;\n flex: 1;\n }\n\n .execution-details {\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n\n .detail-section h4 {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-default);\n padding-bottom: 6px;\n }\n\n .detail-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n }\n\n .detail-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .detail-item label {\n font-size: 11px;\n color: var(--mj-text-muted);\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .detail-item span {\n font-size: 13px;\n color: var(--mj-text-primary);\n }\n\n .status-badge {\n display: inline-block;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 10px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n .status-badge--completed {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .status-badge--running {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .status-badge--failed {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .error-message {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-warning);\n border-radius: 4px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-status-error);\n font-family: monospace;\n }\n\n .child-executions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .child-execution {\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n padding: 12px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .child-info {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .child-name {\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .child-type {\n font-size: 10px;\n background: var(--mj-border-default);\n padding: 2px 6px;\n border-radius: 3px;\n color: var(--mj-text-muted);\n }\n\n .child-status {\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 3px;\n }\n\n .child-metrics {\n display: flex;\n gap: 12px;\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .loading-details {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n gap: 12px;\n }\n\n /* Drill-down Tab Styles */\n .drill-down-container {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .drill-down-tabs {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .tab-header {\n display: flex;\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n background: var(--mj-bg-surface-card);\n min-height: 44px;\n overflow-x: auto;\n }\n\n .tab-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n background: transparent;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-muted);\n white-space: nowrap;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 120px;\n justify-content: space-between;\n }\n\n .tab-item:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, transparent);\n color: var(--mj-brand-primary);\n }\n\n .tab-item.active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n font-weight: 600;\n }\n\n .tab-title {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .tab-close {\n background: none;\n border: none;\n color: var(--mj-text-disabled);\n cursor: pointer;\n padding: 2px;\n border-radius: 2px;\n font-size: 10px;\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n }\n\n .tab-close:hover {\n background: rgba(0, 0, 0, 0.1);\n color: var(--mj-text-primary);\n }\n\n .tab-content {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .tab-pane {\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .trends-chart {\n padding: 0;\n }\n\n .trends-chart app-time-series-chart {\n height: 100%;\n display: block;\n overflow: hidden;\n }\n\n /* Ensure chart fits within tab pane */\n .tab-pane.trends-chart {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n /* Drill-down specific styles */\n .executions-drill-down {\n padding: 20px;\n overflow-y: auto;\n }\n\n .drill-down-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n padding-bottom: 12px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .drill-down-header h4 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .drill-down-meta {\n display: flex;\n gap: 12px;\n align-items: center;\n font-size: 12px;\n }\n\n .timestamp {\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 4px 8px;\n border-radius: 4px;\n }\n\n .metric-badge {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n padding: 4px 10px;\n border-radius: 6px;\n font-weight: 600;\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n }\n\n .loading-spinner {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 40px;\n color: var(--mj-text-muted);\n gap: 12px;\n }\n\n .executions-table {\n display: flex;\n flex-direction: column;\n gap: 0;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n }\n\n .table-header {\n display: grid;\n grid-template-columns: 80px 1fr 120px 100px 100px 80px 100px 120px;\n gap: 12px;\n background: var(--mj-bg-surface-card);\n padding: 12px 16px;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .table-row {\n display: grid;\n grid-template-columns: 80px 1fr 120px 100px 100px 80px 100px 120px;\n gap: 12px;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-bg-surface-sunken);\n cursor: pointer;\n transition: background 0.2s ease;\n align-items: center;\n }\n\n .table-row:hover {\n background: var(--mj-bg-surface-card);\n }\n\n .table-cell {\n font-size: 12px;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .type-badge {\n background: color-mix(in srgb, var(--mj-text-muted) 10%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n padding: 3px 8px;\n border-radius: 4px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n }\n\n .type-badge--prompt {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .type-badge--agent {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .no-data {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n color: var(--mj-text-disabled);\n gap: 16px;\n }\n\n .no-data i {\n font-size: 48px;\n color: var(--mj-border-default);\n }\n\n .no-data p {\n margin: 0;\n font-size: 14px;\n }\n\n /* Model detail styles */\n .model-detail {\n padding: 20px;\n overflow-y: auto;\n }\n\n .model-details {\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n .model-info-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 16px;\n }\n\n .info-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 16px;\n background: var(--mj-bg-surface-card);\n border-radius: 6px;\n }\n\n .info-item label {\n font-size: 11px;\n color: var(--mj-text-muted);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin: 0;\n }\n\n .info-item span {\n font-size: 14px;\n color: var(--mj-text-primary);\n font-weight: 500;\n }\n\n .status-indicator {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n }\n\n .status-indicator.active {\n color: var(--mj-status-success);\n }\n\n .status-indicator.active::before {\n content: '';\n width: 6px;\n height: 6px;\n background: var(--mj-status-success);\n border-radius: 50%;\n }\n\n .model-description {\n padding: 20px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n }\n\n .model-description h5 {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .model-description p {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.5;\n }\n\n /* Clickable KPI cards */\n .clickable {\n cursor: pointer;\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n\n .clickable:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n }\n\n /* Collapsible Panel Styles */\n .analysis-panels {\n padding: 12px;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n }\n\n .analysis-panel {\n margin-bottom: 12px;\n border-radius: 10px;\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n background: var(--mj-bg-surface);\n overflow: hidden;\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .analysis-panel:hover {\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n }\n\n .analysis-panel:last-child {\n margin-bottom: 0;\n }\n\n .panel-header {\n padding: 14px 18px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n cursor: pointer;\n display: flex;\n justify-content: space-between;\n align-items: center;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .panel-header:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .panel-title {\n display: flex;\n align-items: center;\n gap: 10px;\n font-weight: 600;\n color: var(--mj-text-primary);\n font-size: 14px;\n }\n\n .panel-title i {\n color: var(--mj-brand-primary);\n width: 18px;\n }\n\n .panel-toggle-icon {\n color: var(--mj-brand-primary);\n font-size: 12px;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .panel-content {\n padding: 18px;\n border-top: 1px solid color-mix(in srgb, var(--mj-brand-primary) 5%, transparent);\n animation: slideDown 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n @keyframes slideDown {\n from {\n opacity: 0;\n max-height: 0;\n }\n to {\n opacity: 1;\n max-height: 500px;\n }\n }\n\n .live-executions-panel {\n padding: 0;\n }\n\n .live-executions-panel app-live-execution-widget {\n height: 300px;\n display: block;\n }\n\n /* Responsive Design */\n @media (max-width: 1200px) {\n .dashboard-splitter {\n min-height: 400px;\n }\n \n .table-header,\n .table-row {\n grid-template-columns: 60px 1fr 100px 80px 80px 60px 80px 100px;\n gap: 8px;\n }\n \n .model-info-grid {\n grid-template-columns: 1fr;\n }\n \n .analysis-panels {\n padding: 8px;\n }\n \n .analysis-panel {\n margin-bottom: 8px;\n }\n }\n\n @media (max-width: 768px) {\n .execution-monitoring {\n padding: 12px;\n }\n \n .monitoring-header {\n flex-direction: column;\n align-items: flex-start;\n }\n \n .monitoring-controls {\n width: 100%;\n justify-content: flex-start;\n }\n \n .dashboard-splitter {\n min-height: 350px;\n }\n \n .kpi-grid {\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n }\n\n /* Reduce padding on smaller screens */\n :host ::ng-deep .k-splitter .k-splitter-pane {\n padding: 5px;\n }\n\n :host ::ng-deep .k-splitter-horizontal > .k-splitter-pane {\n padding: 5px 2px;\n }\n\n :host ::ng-deep .k-splitter-vertical > .k-splitter-pane {\n padding: 2px 5px;\n }\n \n .tab-header {\n overflow-x: auto;\n }\n \n .tab-item {\n min-width: 100px;\n padding: 6px 12px;\n }\n \n .table-header,\n .table-row {\n grid-template-columns: 1fr;\n gap: 4px;\n text-align: left;\n }\n \n .table-row {\n display: block;\n padding: 16px;\n }\n \n .table-cell {\n display: block;\n margin-bottom: 8px;\n }\n \n .table-cell:before {\n content: attr(data-label) ': ';\n font-weight: 600;\n color: var(--mj-text-muted);\n font-size: 11px;\n text-transform: uppercase;\n }\n \n .executions-drill-down,\n .model-detail {\n padding: 12px;\n }\n \n .panel-content {\n padding: 12px;\n }\n \n .panel-header {\n padding: 10px 12px;\n }\n \n .panel-title {\n font-size: 13px;\n }\n }\n `]\n})\nexport class ExecutionMonitoringComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n private destroy$ = new Subject<void>();\n private stateChangeSubject$ = new Subject<ExecutionMonitoringState>();\n\n // Configuration\n selectedTimeRange = '24h';\n isLoading = false;\n\n // Chart configurations\n timeSeriesConfig = {\n showGrid: true,\n showTooltip: true,\n animationDuration: 500,\n useDualAxis: true\n };\n\n heatmapConfig = {\n height: 350,\n showTooltip: true,\n animationDuration: 300\n };\n\n // Data streams\n kpis$: Observable<DashboardKPIs>;\n trends$: Observable<TrendData[]>;\n liveExecutions$: Observable<LiveExecution[]>;\n chartData$: Observable<ChartData>;\n\n // Derived data streams\n kpiCards$: Observable<KPICardData[]>;\n performanceMatrix$: Observable<HeatmapData[]>;\n costData$: Observable<{ model: string; cost: number; tokens: number }[]>;\n tokenEfficiency$: Observable<{ inputTokens: number; outputTokens: number; cost: number; model: string }[]>;\n\n // Modal state\n selectedExecution: LiveExecution | null = null;\n executionDetails: ExecutionDetails | null = null;\n loadingExecutionDetails = false;\n\n // Drill-down tab state\n drillDownTabs: DrillDownTab[] = [];\n activeTabId: string = 'main-chart';\n loadingDrillDown = false;\n\n // Panel state for collapsible sections\n panelStates = {\n cost: true,\n efficiency: true, // Expanded by default\n executions: false\n };\n\n get activeTab(): DrillDownTab | undefined {\n return this.drillDownTabs.find(tab => tab.id === this.activeTabId);\n }\n\n constructor(\n private instrumentationService: AIInstrumentationService,\n private navigationService: NavigationService,\n private cdr: ChangeDetectorRef\n ) {\n super();\n // Initialize data streams\n this.kpis$ = this.instrumentationService.kpis$;\n this.trends$ = this.instrumentationService.trends$;\n this.liveExecutions$ = this.instrumentationService.liveExecutions$;\n this.chartData$ = this.instrumentationService.chartData$;\n\n // Subscribe to loading state from service\n this.instrumentationService.isLoading$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(loading => {\n this.isLoading = loading;\n this.cdr.markForCheck();\n });\n\n // Derived streams\n this.kpiCards$ = this.kpis$.pipe(\n map(kpis => this.createKPICards(kpis))\n );\n\n this.performanceMatrix$ = this.chartData$.pipe(\n map(data => data.performanceMatrix.map(item => ({\n agent: item.agent,\n model: item.model,\n avgTime: item.avgTime,\n successRate: item.successRate\n })))\n );\n\n this.costData$ = this.chartData$.pipe(\n map(data => data.costByModel)\n );\n\n this.tokenEfficiency$ = this.chartData$.pipe(\n map(data => data.tokenEfficiency)\n );\n }\n\n ngOnInit() {\n // Load initial state if provided from resource configuration\n if (this.Data?.Configuration) {\n this.loadUserState(this.Data.Configuration);\n } else {\n // Default initialization\n this.setTimeRange(this.selectedTimeRange);\n \n // Initialize with main chart tab\n this.drillDownTabs = [\n {\n id: 'main-chart',\n title: 'Execution Trends',\n type: 'chart',\n closeable: false\n }\n ];\n \n // Trigger initial data load\n this.instrumentationService.refresh();\n }\n \n // Set up debounced state change - could be used for persistence in the future\n this.stateChangeSubject$.pipe(\n debounceTime(2000), // 2 second debounce\n takeUntil(this.destroy$)\n ).subscribe(_state => {\n // State change handling placeholder\n });\n\n // Notify that the resource has finished loading\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n this.stateChangeSubject$.complete();\n }\n\n private getCurrentState(): ExecutionMonitoringState {\n return {\n selectedTimeRange: this.selectedTimeRange,\n refreshInterval: 0, // Always manual refresh now\n panelStates: { ...this.panelStates },\n drillDownTabs: this.drillDownTabs.map(tab => ({\n id: tab.id,\n title: tab.title,\n type: tab.type,\n timestamp: tab.timestamp?.toISOString(),\n metric: tab.metric\n })),\n activeTabId: this.activeTabId\n };\n }\n\n private emitStateChange(): void {\n const currentState = this.getCurrentState();\n this.stateChangeSubject$.next(currentState);\n }\n\n public loadUserState(state: Partial<ExecutionMonitoringState>): void {\n \n if (state.selectedTimeRange) {\n this.selectedTimeRange = state.selectedTimeRange;\n this.setTimeRange(state.selectedTimeRange);\n }\n \n // No longer need to handle refreshInterval since we removed auto-refresh\n \n if (state.panelStates) {\n // Only override if state has explicit panel states, otherwise keep defaults\n this.panelStates = { ...this.panelStates, ...state.panelStates };\n }\n \n if (state.drillDownTabs && state.drillDownTabs.length > 0) {\n this.drillDownTabs = state.drillDownTabs.map(tab => ({\n ...tab,\n type: tab.type as 'chart' | 'executions' | 'model-detail',\n timestamp: tab.timestamp ? new Date(tab.timestamp) : undefined,\n closeable: tab.id !== 'main-chart'\n }));\n } else {\n // Initialize with default tab if not provided\n this.drillDownTabs = [\n {\n id: 'main-chart',\n title: 'Execution Trends',\n type: 'chart',\n closeable: false\n }\n ];\n }\n \n if (state.activeTabId) {\n this.activeTabId = state.activeTabId;\n }\n }\n\n private createKPICards(kpis: DashboardKPIs): KPICardData[] {\n return [\n {\n title: 'Total Executions',\n value: kpis.totalExecutions,\n icon: 'fa-chart-bar',\n color: 'primary',\n subtitle: `${kpis.activeExecutions} active`\n },\n {\n title: 'Total Cost',\n value: `$${kpis.totalCost.toFixed(4)}`,\n icon: 'fa-dollar-sign',\n color: 'warning',\n subtitle: `${kpis.costCurrency} • $${kpis.dailyCostBurn.toFixed(2)}/day`\n },\n {\n title: 'Success Rate',\n value: `${(kpis.successRate * 100).toFixed(1)}%`,\n icon: 'fa-check-circle',\n color: 'success',\n subtitle: `${(kpis.errorRate * 100).toFixed(1)}% errors`\n },\n {\n title: 'Avg Response Time',\n value: `${(kpis.avgExecutionTime / 1000).toFixed(2)}s`,\n icon: 'fa-clock',\n color: 'info',\n subtitle: 'All models average'\n },\n {\n title: 'Token Usage',\n value: this.formatTokens(kpis.totalTokens),\n icon: 'fa-coins',\n color: 'primary',\n subtitle: `$${kpis.costPerToken.toFixed(6)}/token`\n },\n {\n title: 'Top Model',\n value: kpis.topModel,\n icon: 'fa-microchip',\n color: 'info',\n subtitle: 'Most used'\n }\n ];\n }\n\n onTimeRangeChange(): void {\n // Simply change time range - loading state is managed by the service\n this.setTimeRange(this.selectedTimeRange);\n this.emitStateChange();\n }\n\n private setTimeRange(range: string): void {\n const { start, end } = this.getTimeRangeFromSelection(range);\n this.instrumentationService.setDateRange(start, end);\n }\n \n private getTimeRangeFromSelection(range?: string): { start: Date; end: Date } {\n const now = new Date();\n const selectedRange = range || this.selectedTimeRange;\n let start: Date;\n\n switch (selectedRange) {\n case '1h':\n start = new Date(now.getTime() - 60 * 60 * 1000);\n break;\n case '6h':\n start = new Date(now.getTime() - 6 * 60 * 60 * 1000);\n break;\n case '24h':\n start = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n break;\n case '7d':\n start = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case '30d':\n start = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n default:\n start = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n }\n\n return { start, end: now };\n }\n\n refreshData(): void {\n // Simply trigger refresh - loading state is managed by the service\n this.instrumentationService.refresh();\n }\n\n onExecutionClick(execution: LiveExecution): void {\n this.selectedExecution = execution;\n this.loadExecutionDetails(execution);\n }\n\n onDataPointClick(event: DataPointClickEvent): void {\n const timestamp = event.data.timestamp;\n const metric = event.metric;\n \n // Create new drill-down tab\n const tabId = `drill-down-${timestamp.getTime()}-${metric}`;\n const tabTitle = `${this.getMetricDisplayLabel(metric)} - ${this.formatTimestamp(timestamp)}`;\n \n const newTab: DrillDownTab = {\n id: tabId,\n title: tabTitle,\n type: 'executions',\n timestamp: timestamp,\n metric: metric,\n closeable: true\n };\n \n // Add tab if it doesn't exist\n if (!this.drillDownTabs.find(tab => tab.id === tabId)) {\n this.drillDownTabs.push(newTab);\n this.emitStateChange(); // Emit state when new tab is added\n this.cdr.markForCheck();\n }\n \n // Switch to the new tab\n this.selectTab(tabId);\n \n // Load drill-down data\n this.loadDrillDownData(newTab);\n }\n\n onChartTimeRangeChange(range: string): void {\n this.selectedTimeRange = range;\n this.setTimeRange(range);\n }\n\n private getMetricValue(data: TrendData, metric: string): number {\n switch (metric) {\n case 'executions': return data.executions;\n case 'cost': return data.cost;\n case 'tokens': return data.tokens;\n case 'avgTime': return data.avgTime;\n case 'errors': return data.errors;\n default: return 0;\n }\n }\n\n private formatMetricValue(metric: string, value: number): string {\n switch (metric) {\n case 'executions': return value.toLocaleString();\n case 'cost': return `$${value.toFixed(4)}`;\n case 'tokens': return value.toLocaleString();\n case 'avgTime': return `${(value / 1000).toFixed(1)}s`;\n case 'errors': return value.toString();\n default: return value.toString();\n }\n }\n\n private async loadExecutionDetails(execution: LiveExecution): Promise<void> {\n this.loadingExecutionDetails = true;\n this.executionDetails = null;\n\n try {\n const details = await this.instrumentationService.getExecutionDetails(\n execution.id,\n execution.type\n );\n this.executionDetails = details;\n } catch (error) {\n console.error('Error loading execution details:', error);\n } finally {\n this.loadingExecutionDetails = false;\n }\n }\n\n closeExecutionModal(): void {\n this.selectedExecution = null;\n this.executionDetails = null;\n this.loadingExecutionDetails = false;\n }\n\n openFullRecord(): void {\n if (this.selectedExecution) {\n // Determine the entity name based on the execution type\n const entityName = this.selectedExecution.type === 'prompt'\n ? 'MJ: AI Prompt Runs'\n : 'MJ: AI Agent Runs';\n\n // Open the record using NavigationService\n const compositeKey = new CompositeKey([{ FieldName: 'ID', Value: this.selectedExecution.id }]);\n this.navigationService.OpenEntityRecord(entityName, compositeKey);\n\n // Close the modal\n this.closeExecutionModal();\n }\n }\n\n // Utility methods for templates\n trackByKpiTitle(index: number, kpi: KPICardData): string {\n return kpi.title;\n }\n\n trackByCostModel(index: number, item: { model: string; cost: number; tokens: number }): string {\n return item.model;\n }\n\n trackByEfficiencyModel(index: number, item: { model: string; inputTokens: number; outputTokens: number; cost: number }): string {\n return item.model;\n }\n\n formatTokens(tokens: number): string {\n if (tokens >= 1000000) {\n return `${(tokens / 1000000).toFixed(1)}M`;\n } else if (tokens >= 1000) {\n return `${(tokens / 1000).toFixed(1)}K`;\n }\n return tokens.toString();\n }\n\n formatCurrency(amount: number, decimals: number = 4): string {\n return `$${amount.toFixed(decimals)}`;\n }\n\n formatCostPerToken(cost: number, tokens: number): string {\n const costPer1K = tokens > 0 ? (cost / tokens) * 1000 : 0;\n return `$${costPer1K.toFixed(4)}/1K tokens`;\n }\n\n getCostBarWidth(cost: number, maxCost: number): number {\n return maxCost > 0 ? (cost / maxCost) * 100 : 0;\n }\n\n getMaxCost(costData: { cost: number }[]): number {\n return Math.max(...costData.map(item => item.cost));\n }\n\n getTokenRatio(input: number, output: number): string {\n const total = input + output;\n if (total === 0) return '0:0';\n const ratio = output / input;\n return `1:${ratio.toFixed(1)}`;\n }\n\n getTokenPercentage(tokens: number, total: number): number {\n return total > 0 ? (tokens / total) * 100 : 0;\n }\n\n getCostPerToken(cost: number, tokens: number): string {\n const costPer1K = tokens > 0 ? (cost / tokens) * 1000 : 0;\n return costPer1K.toFixed(4);\n }\n\n // Tab management methods\n selectTab(tabId: string): void {\n this.activeTabId = tabId;\n // Trigger chart resize after tab switch to fix chart rendering\n setTimeout(() => {\n window.dispatchEvent(new Event('resize'));\n }, 100);\n this.emitStateChange();\n this.cdr.markForCheck();\n }\n\n closeTab(event: MouseEvent, tabId: string): void {\n event.stopPropagation();\n \n const tabIndex = this.drillDownTabs.findIndex(tab => tab.id === tabId);\n if (tabIndex === -1) return;\n \n // Remove the tab\n this.drillDownTabs.splice(tabIndex, 1);\n \n // If we closed the active tab, switch to another tab\n if (this.activeTabId === tabId) {\n if (this.drillDownTabs.length > 0) {\n // Switch to the previous tab or first tab\n const newActiveIndex = Math.max(0, tabIndex - 1);\n this.activeTabId = this.drillDownTabs[newActiveIndex].id;\n // Trigger resize after tab switch\n setTimeout(() => {\n window.dispatchEvent(new Event('resize'));\n }, 100);\n } else {\n // No tabs left, this shouldn't happen as main chart is not closeable\n this.activeTabId = 'main-chart';\n }\n }\n \n this.emitStateChange();\n }\n\n // KPI click handling\n onKpiClick(kpi: KPICardData): void {\n if (kpi.title === 'Top Model' && kpi.value !== 'N/A') {\n this.openModelDrillDown(String(kpi.value));\n }\n // Add other KPI drill-downs as needed\n }\n\n isKpiClickable(kpi: KPICardData): boolean {\n return kpi.title === 'Top Model' && kpi.value !== 'N/A';\n }\n\n private async openModelDrillDown(modelName: string): Promise<void> {\n const tabId = `model-detail-${modelName.replace(/[^a-zA-Z0-9]/g, '-')}`;\n const tabTitle = `Model: ${modelName}`;\n \n // Check if tab already exists\n if (this.drillDownTabs.find(tab => tab.id === tabId)) {\n this.selectTab(tabId);\n return;\n }\n \n // Create new model detail tab\n const newTab: DrillDownTab = {\n id: tabId,\n title: tabTitle,\n type: 'model-detail',\n closeable: true\n };\n \n this.drillDownTabs.push(newTab);\n this.selectTab(tabId);\n \n // Load model details\n this.loadModelDetails(newTab, modelName);\n }\n\n private async loadDrillDownData(tab: DrillDownTab): Promise<void> {\n if (!tab.timestamp) return;\n \n this.loadingDrillDown = true;\n \n try {\n // Determine bucket size based on selected time range\n const { start, end } = this.getTimeRangeFromSelection();\n const duration = end.getTime() - start.getTime();\n const hours = duration / (1000 * 60 * 60);\n \n let windowSizeMs: number;\n let alignToDay = false;\n \n if (hours <= 24) {\n // For up to 24 hours, use 1 hour window (30 min before and after)\n windowSizeMs = 30 * 60 * 1000;\n } else if (hours <= 24 * 7) {\n // For up to 7 days, use full day window\n // Since data is aggregated into 4-hour buckets, we need to capture the full day\n windowSizeMs = 12 * 60 * 60 * 1000; // 12 hours before/after = 24 hour window\n alignToDay = true;\n } else {\n // For more than 7 days, use full day window\n windowSizeMs = 12 * 60 * 60 * 1000; // 12 hours before/after = 24 hour window\n alignToDay = true;\n }\n \n // Create time window around the clicked point\n let startTime = new Date(tab.timestamp.getTime() - windowSizeMs);\n let endTime = new Date(tab.timestamp.getTime() + windowSizeMs);\n \n // For day-aligned queries, expand to full day boundaries\n if (alignToDay) {\n // Set start to beginning of the day\n startTime = new Date(tab.timestamp);\n startTime.setHours(0, 0, 0, 0);\n \n // Set end to end of the day\n endTime = new Date(tab.timestamp);\n endTime.setHours(23, 59, 59, 999);\n }\n \n // Load executions for this time period\n const [promptResults, agentResults] = await Promise.all([\n new RunView().RunView<MJAIPromptRunEntityExtended>({\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `RunAt >= '${startTime.toISOString()}' AND RunAt <= '${endTime.toISOString()}'`,\n OrderBy: 'RunAt DESC' \n }),\n new RunView().RunView<MJAIAgentRunEntityExtended>({\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `StartedAt >= '${startTime.toISOString()}' AND StartedAt <= '${endTime.toISOString()}'`,\n OrderBy: 'StartedAt DESC' \n })\n ]);\n \n // Convert to ExecutionRecord format\n const executions: ExecutionRecord[] = [];\n \n // Add prompt executions\n for (const run of promptResults.Results) {\n const duration = run.CompletedAt ? \n new Date(run.CompletedAt).getTime() - new Date(run.RunAt).getTime() : \n Date.now() - new Date(run.RunAt).getTime();\n \n executions.push({\n id: run.ID,\n type: 'prompt',\n name: run.Prompt || 'Unnamed Prompt',\n model: run.Model || undefined,\n status: run.Success ? 'completed' : (run.Success === false ? 'failed' : 'running'),\n startTime: new Date(run.RunAt),\n endTime: run.CompletedAt ? new Date(run.CompletedAt) : undefined,\n duration: duration,\n cost: run.Cost || 0,\n tokens: run.TokensUsed || 0,\n errorMessage: run.ErrorMessage || undefined\n });\n }\n \n // Add agent executions\n for (const run of agentResults.Results) {\n const duration = run.CompletedAt ? \n new Date(run.CompletedAt).getTime() - new Date(run.StartedAt).getTime() : \n Date.now() - new Date(run.StartedAt).getTime();\n \n executions.push({\n id: run.ID,\n type: 'agent',\n name: run.Agent || 'Unnamed Agent',\n status: run.Status.toLowerCase(),\n startTime: new Date(run.StartedAt),\n endTime: run.CompletedAt ? new Date(run.CompletedAt) : undefined,\n duration: duration,\n cost: run.TotalCost || 0,\n tokens: run.TotalTokensUsed || 0,\n errorMessage: run.ErrorMessage || undefined\n });\n }\n \n // Sort by start time (most recent first)\n executions.sort((a, b) => b.startTime.getTime() - a.startTime.getTime());\n \n // Update tab data\n tab.data = executions;\n this.cdr.markForCheck();\n \n } catch (error) {\n console.error('Error loading drill-down data:', error);\n tab.data = [];\n this.cdr.markForCheck();\n } finally {\n this.loadingDrillDown = false;\n this.cdr.markForCheck();\n }\n }\n\n private async loadModelDetails(tab: DrillDownTab, modelName: string): Promise<void> {\n this.loadingDrillDown = true;\n \n try {\n // Find model by name\n const rv = new RunView();\n const result = await rv.RunView<MJAIModelEntityExtended>({\n EntityName: 'MJ: AI Models',\n ExtraFilter: `Name = '${modelName.replace(/'/g, \"''\")}'` \n });\n \n const model = result.Results[0];\n if (model) {\n tab.data = {\n name: model.Name,\n vendor: model.Vendor,\n apiName: model.APIName,\n inputTokenCost: 0, // Not available in current model\n outputTokenCost: 0, // Not available in current model \n isActive: model.IsActive,\n description: model.Description\n };\n } else {\n tab.data = null;\n }\n \n } catch (error) {\n console.error('Error loading model details:', error);\n tab.data = null;\n } finally {\n this.loadingDrillDown = false;\n }\n }\n\n // Helper methods for drill-down\n\n formatTimestamp(timestamp: Date): string {\n return timestamp.toLocaleString();\n }\n\n formatTime(time: Date): string {\n return time.toLocaleTimeString();\n }\n\n getMetricDisplayLabel(metric: string): string {\n const labels: { [key: string]: string } = {\n executions: 'Executions',\n cost: 'Cost',\n tokens: 'Tokens',\n avgTime: 'Avg Time',\n errors: 'Errors'\n };\n return labels[metric] || metric;\n }\n\n getFormattedTimestamp(tab: DrillDownTab | undefined): string {\n return tab?.timestamp ? this.formatTimestamp(tab.timestamp) : '';\n }\n\n getFormattedMetricLabel(tab: DrillDownTab | undefined): string {\n return tab?.metric ? this.getMetricDisplayLabel(tab.metric) : '';\n }\n\n // Panel management methods\n togglePanel(panelName: 'cost' | 'efficiency' | 'executions'): void {\n this.panelStates[panelName] = !this.panelStates[panelName];\n this.emitStateChange();\n }\n\n viewExecutionDetail(execution: ExecutionRecord): void {\n // Convert ExecutionRecord to LiveExecution format for the modal\n const liveExecution: LiveExecution = {\n id: execution.id,\n type: execution.type,\n name: execution.name,\n status: execution.status as 'running' | 'completed' | 'failed',\n startTime: execution.startTime,\n duration: execution.duration,\n cost: execution.cost,\n tokens: execution.tokens\n };\n \n this.onExecutionClick(liveExecution);\n }\n\n formatDuration(milliseconds: number): string {\n const seconds = Math.floor(milliseconds / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m ${seconds % 60}s`;\n } else if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n } else {\n return `${seconds}s`;\n }\n }\n\n getDuration(details: ExecutionDetails): number {\n const start = details.startTime.getTime();\n const end = details.endTime ? details.endTime.getTime() : Date.now();\n return end - start;\n }\n\n onSplitterLayoutChange(event: any): void {\n // Trigger window resize event to force charts to recalculate dimensions\n setTimeout(() => {\n window.dispatchEvent(new Event('resize'));\n }, 100);\n\n // Emit state change when splitter changes\n this.emitStateChange();\n }\n\n // === BaseResourceComponent Required Methods ===\n\n /**\n * Get the display name for this resource\n */\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Monitor';\n }\n\n /**\n * Get the icon class for this resource\n */\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-chart-line';\n }\n}"]}
|