@memberjunction/ng-dashboards 6.2.0-edge.5 → 6.2.0-edge.7
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/README.md +35 -0
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +2 -2
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-management.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-management.component.js +3 -1
- package/dist/AI/components/analytics/realtime/realtime-management.component.js.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-overview.component.d.ts +1 -1
- package/dist/AI/components/analytics/realtime/realtime-overview.component.js +3 -3
- package/dist/AI/components/analytics/realtime/realtime-overview.component.js.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-session-data.d.ts +6 -4
- package/dist/AI/components/analytics/realtime/realtime-session-data.d.ts.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-session-data.js +8 -2
- package/dist/AI/components/analytics/realtime/realtime-session-data.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +21 -13
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js +1 -1
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -1
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +1 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -1
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -1
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +7 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +210 -57
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts +12 -11
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.js +15 -15
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +28 -16
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +1 -0
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +32 -8
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +18 -9
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/sensitive-fields.d.ts +9 -4
- package/dist/AI/components/vectors/sensitive-fields.d.ts.map +1 -1
- package/dist/AI/components/vectors/sensitive-fields.js +39 -14
- package/dist/AI/components/vectors/sensitive-fields.js.map +1 -1
- package/dist/AI/components/vectors/vector-document-rules.d.ts +13 -0
- package/dist/AI/components/vectors/vector-document-rules.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-document-rules.js +14 -0
- package/dist/AI/components/vectors/vector-document-rules.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +34 -14
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +134 -51
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-store-selection.d.ts +32 -0
- package/dist/AI/components/vectors/vector-store-selection.d.ts.map +1 -0
- package/dist/AI/components/vectors/vector-store-selection.js +57 -0
- package/dist/AI/components/vectors/vector-store-selection.js.map +1 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js +4 -2
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/Actions/action-result-code.d.ts +80 -0
- package/dist/Actions/action-result-code.d.ts.map +1 -0
- package/dist/Actions/action-result-code.js +163 -0
- package/dist/Actions/action-result-code.js.map +1 -0
- package/dist/Actions/components/actions-overview.component.d.ts +8 -0
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +12 -9
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +29 -9
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +65 -42
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.js +5 -4
- package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts +198 -0
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.js +289 -0
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-approvals.component.d.ts +29 -0
- package/dist/ChiefOfStaff/chief-of-staff-approvals.component.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-approvals.component.js +666 -0
- package/dist/ChiefOfStaff/chief-of-staff-approvals.component.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-governance.component.d.ts +56 -0
- package/dist/ChiefOfStaff/chief-of-staff-governance.component.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-governance.component.js +515 -0
- package/dist/ChiefOfStaff/chief-of-staff-governance.component.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-live-refresh.d.ts +14 -0
- package/dist/ChiefOfStaff/chief-of-staff-live-refresh.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-live-refresh.js +39 -0
- package/dist/ChiefOfStaff/chief-of-staff-live-refresh.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-overview.component.d.ts +17 -0
- package/dist/ChiefOfStaff/chief-of-staff-overview.component.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-overview.component.js +485 -0
- package/dist/ChiefOfStaff/chief-of-staff-overview.component.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-page-base.d.ts +139 -0
- package/dist/ChiefOfStaff/chief-of-staff-page-base.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-page-base.js +602 -0
- package/dist/ChiefOfStaff/chief-of-staff-page-base.js.map +1 -0
- package/dist/ChiefOfStaff/index.d.ts +6 -0
- package/dist/ChiefOfStaff/index.d.ts.map +1 -0
- package/dist/ChiefOfStaff/index.js +6 -0
- package/dist/ChiefOfStaff/index.js.map +1 -0
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +2 -1
- 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 +26 -21
- package/dist/Communication/communication-monitor-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 +14 -13
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +2 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/services/component-version.service.d.ts.map +1 -1
- package/dist/ComponentStudio/services/component-version.service.js +3 -0
- package/dist/ComponentStudio/services/component-version.service.js.map +1 -1
- package/dist/DashboardEditor/dashboard-editor.component.d.ts +17 -2
- package/dist/DashboardEditor/dashboard-editor.component.d.ts.map +1 -1
- package/dist/DashboardEditor/dashboard-editor.component.js +94 -43
- package/dist/DashboardEditor/dashboard-editor.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +45 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +178 -55
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.d.ts +2 -0
- package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +2 -2
- package/dist/DevTools/lazy-module-status.component.js +2 -2
- package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.js +5 -0
- package/dist/FormBuilder/form-builder-resource.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +2 -2
- package/dist/Integration/services/integration-data.service.d.ts +1 -1
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +4 -3
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/LoginStudio/login-studio-resource.component.d.ts +10 -2
- package/dist/LoginStudio/login-studio-resource.component.d.ts.map +1 -1
- package/dist/LoginStudio/login-studio-resource.component.js +111 -77
- package/dist/LoginStudio/login-studio-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +24 -4
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +118 -65
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/PredictiveStudio/business-predictions.view-models.d.ts +1 -1
- package/dist/PredictiveStudio/business-predictions.view-models.d.ts.map +1 -1
- package/dist/PredictiveStudio/business-predictions.view-models.js +3 -3
- package/dist/PredictiveStudio/business-predictions.view-models.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-experiments.component.d.ts +6 -63
- package/dist/PredictiveStudio/components/ps-experiments.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-experiments.component.js +257 -521
- package/dist/PredictiveStudio/components/ps-experiments.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.d.ts +0 -18
- package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js +124 -251
- package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts +5 -9
- package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipelines.component.js +98 -130
- package/dist/PredictiveStudio/components/ps-pipelines.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts +53 -4
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.js +338 -326
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-row-drivers.component.d.ts +19 -0
- package/dist/PredictiveStudio/components/ps-row-drivers.component.d.ts.map +1 -0
- package/dist/PredictiveStudio/components/ps-row-drivers.component.js +85 -0
- package/dist/PredictiveStudio/components/ps-row-drivers.component.js.map +1 -0
- package/dist/PredictiveStudio/engine/predictive-studio.engine.d.ts +19 -1
- package/dist/PredictiveStudio/engine/predictive-studio.engine.d.ts.map +1 -1
- package/dist/PredictiveStudio/engine/predictive-studio.engine.js +52 -2
- package/dist/PredictiveStudio/engine/predictive-studio.engine.js.map +1 -1
- package/dist/PredictiveStudio/predictive-studio-agent-context.d.ts +3 -1
- package/dist/PredictiveStudio/predictive-studio-agent-context.d.ts.map +1 -1
- package/dist/PredictiveStudio/predictive-studio-agent-context.js +3 -0
- package/dist/PredictiveStudio/predictive-studio-agent-context.js.map +1 -1
- package/dist/PredictiveStudio/predictive-studio-score-history.service.d.ts +27 -4
- package/dist/PredictiveStudio/predictive-studio-score-history.service.d.ts.map +1 -1
- package/dist/PredictiveStudio/predictive-studio-score-history.service.js +94 -61
- package/dist/PredictiveStudio/predictive-studio-score-history.service.js.map +1 -1
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts +29 -5
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js +186 -103
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js.map +1 -1
- package/dist/PredictiveStudio/resources/ps-studio-resource.component.js +1 -1
- package/dist/PredictiveStudio/resources/ps-studio-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +26 -0
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +375 -252
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/UserRoutines/user-routines-resource.component.d.ts +8 -1
- package/dist/UserRoutines/user-routines-resource.component.d.ts.map +1 -1
- package/dist/UserRoutines/user-routines-resource.component.js +22 -4
- package/dist/UserRoutines/user-routines-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +1 -0
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VideoStudio/components/vs-archetype-editor.component.d.ts +162 -0
- package/dist/VideoStudio/components/vs-archetype-editor.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-archetype-editor.component.js +1105 -0
- package/dist/VideoStudio/components/vs-archetype-editor.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-audio-options.component.d.ts +27 -0
- package/dist/VideoStudio/components/vs-audio-options.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-audio-options.component.js +119 -0
- package/dist/VideoStudio/components/vs-audio-options.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-copilot-panel.component.d.ts +105 -0
- package/dist/VideoStudio/components/vs-copilot-panel.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-copilot-panel.component.js +560 -0
- package/dist/VideoStudio/components/vs-copilot-panel.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-production-brief.component.d.ts +163 -0
- package/dist/VideoStudio/components/vs-production-brief.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-production-brief.component.js +1054 -0
- package/dist/VideoStudio/components/vs-production-brief.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-setup-health-card.component.d.ts +43 -0
- package/dist/VideoStudio/components/vs-setup-health-card.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-setup-health-card.component.js +412 -0
- package/dist/VideoStudio/components/vs-setup-health-card.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-studio-slide-in.component.d.ts +73 -0
- package/dist/VideoStudio/components/vs-studio-slide-in.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-studio-slide-in.component.js +271 -0
- package/dist/VideoStudio/components/vs-studio-slide-in.component.js.map +1 -0
- package/dist/VideoStudio/index.d.ts +12 -0
- package/dist/VideoStudio/index.d.ts.map +1 -0
- package/dist/VideoStudio/index.js +12 -0
- package/dist/VideoStudio/index.js.map +1 -0
- package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.d.ts +118 -0
- package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.d.ts.map +1 -0
- package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.js +964 -0
- package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.js.map +1 -0
- package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.d.ts +70 -0
- package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.d.ts.map +1 -0
- package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.js +600 -0
- package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.js.map +1 -0
- package/dist/VideoStudio/resources/video-studio-productions-resource.component.d.ts +182 -0
- package/dist/VideoStudio/resources/video-studio-productions-resource.component.d.ts.map +1 -0
- package/dist/VideoStudio/resources/video-studio-productions-resource.component.js +1481 -0
- package/dist/VideoStudio/resources/video-studio-productions-resource.component.js.map +1 -0
- package/dist/VideoStudio/services/vs-studio-slide-in-state.service.d.ts +102 -0
- package/dist/VideoStudio/services/vs-studio-slide-in-state.service.d.ts.map +1 -0
- package/dist/VideoStudio/services/vs-studio-slide-in-state.service.js +240 -0
- package/dist/VideoStudio/services/vs-studio-slide-in-state.service.js.map +1 -0
- package/dist/VideoStudio/video-studio-agent-context.d.ts +495 -0
- package/dist/VideoStudio/video-studio-agent-context.d.ts.map +1 -0
- package/dist/VideoStudio/video-studio-agent-context.js +992 -0
- package/dist/VideoStudio/video-studio-agent-context.js.map +1 -0
- package/dist/ai-dashboards.module.d.ts +25 -21
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +25 -3
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/module.d.ts +13 -12
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +7 -0
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +8 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +10 -0
- package/dist/public-api.js.map +1 -1
- package/dist/shared/action-scheduled-job.d.ts.map +1 -1
- package/dist/shared/action-scheduled-job.js +2 -0
- package/dist/shared/action-scheduled-job.js.map +1 -1
- package/dist/video-studio-dashboards.module.d.ts +40 -0
- package/dist/video-studio-dashboards.module.d.ts.map +1 -0
- package/dist/video-studio-dashboards.module.js +159 -0
- package/dist/video-studio-dashboards.module.js.map +1 -0
- package/package.json +77 -71
- package/dist/PredictiveStudio/at-risk.view-models.d.ts +0 -120
- package/dist/PredictiveStudio/at-risk.view-models.d.ts.map +0 -1
- package/dist/PredictiveStudio/at-risk.view-models.js +0 -261
- package/dist/PredictiveStudio/at-risk.view-models.js.map +0 -1
- package/dist/PredictiveStudio/components/ps-confirm-modal.component.d.ts +0 -109
- package/dist/PredictiveStudio/components/ps-confirm-modal.component.d.ts.map +0 -1
- package/dist/PredictiveStudio/components/ps-confirm-modal.component.js +0 -323
- package/dist/PredictiveStudio/components/ps-confirm-modal.component.js.map +0 -1
- package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.d.ts +0 -137
- package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.d.ts.map +0 -1
- package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.js +0 -826
- package/dist/PredictiveStudio/components/ps-run-experiment-modal.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 { ComputeCoveragePercent, GetBucketSizeMs } from '../services/ai-usage-analytics.compute';\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 { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\n\nexport interface DrillDownTab {\n id: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n title: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n type: 'chart' | 'executions' | 'model-detail'; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n data?: any; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n timestamp?: Date; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n metric?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n closeable: boolean; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n}\n\nexport interface ExecutionRecord {\n id: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n type: 'prompt' | 'agent'; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n name: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n model?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n status: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n startTime: Date; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n endTime?: Date; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n duration: number; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n cost: number; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n tokens: number; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n errorMessage?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n}\n\nexport interface ExecutionMonitoringState {\n selectedTimeRange: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n refreshInterval: number; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n panelStates: { // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n cost: boolean;\n efficiency: boolean;\n executions: boolean;\n };\n drillDownTabs: Array<{ // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n id: string;\n title: string;\n type: string;\n timestamp?: string;\n metric?: string;\n }>;\n activeTabId: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n splitterSizes?: number[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\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 removed — AIOverviewHubComponent now registers as '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 Splitter -->\n <as-split direction=\"vertical\" class=\"dashboard-splitter\">\n <!-- Top Row: System Health and Trends Chart -->\n <as-split-area [size]=\"45\">\n <as-split direction=\"horizontal\">\n <!-- System Health -->\n <as-split-area [size]=\"30\">\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 </as-split-area>\n\n <!-- Drill-down Tab Container -->\n <as-split-area [size]=\"70\">\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 [BucketSizeMs]=\"TrendBucketMs\"\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 <mj-empty-state Size=\"compact\" Icon=\"fa-solid fa-inbox\"\n Title=\"No executions found for this time period\" />\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 </as-split-area>\n </as-split>\n </as-split-area>\n\n <!-- Bottom Row: Analysis Panels with Expansion Layout -->\n <as-split-area [size]=\"55\">\n <as-split direction=\"horizontal\">\n <!-- Left: Performance Heatmap -->\n <as-split-area [size]=\"50\">\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 </as-split-area>\n\n <!-- Right: Analysis Panels with Collapsible Sections -->\n <as-split-area [size]=\"50\">\n <div class=\"dashboard-section analysis-panels\">\n \n <!-- Cost Analysis Panel -->\n <mj-accordion-panel Size=\"sm\" [FlushBody]=\"true\" [Expanded]=\"panelStates.cost\" (ExpandedChange)=\"onPanelExpandedChange('cost', $event)\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-dollar-sign\"></i>\n Cost Analysis\n </span>\n </ng-template>\n <ng-template mjAccordionBody>\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 </ng-template>\n </mj-accordion-panel>\n\n <!-- Token Efficiency Panel -->\n <mj-accordion-panel Size=\"sm\" [FlushBody]=\"true\" [Expanded]=\"panelStates.efficiency\" (ExpandedChange)=\"onPanelExpandedChange('efficiency', $event)\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-chart-pie\"></i>\n Token Efficiency\n </span>\n </ng-template>\n <ng-template mjAccordionBody>\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 </ng-template>\n </mj-accordion-panel>\n\n <!-- Live Executions Panel -->\n <mj-accordion-panel Size=\"sm\" [FlushBody]=\"true\" [Expanded]=\"panelStates.executions\" (ExpandedChange)=\"onPanelExpandedChange('executions', $event)\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-bolt\"></i>\n Live Executions\n </span>\n </ng-template>\n <ng-template mjAccordionBody>\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 </ng-template>\n </mj-accordion-panel>\n </div>\n </as-split-area>\n </as-split>\n </as-split-area>\n </as-split>\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 areas take full height */\n :host ::ng-deep as-split-area > .as-split-area-content {\n overflow: hidden;\n padding: 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 /* 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 chrome (wrapper/header/toggle-icon) now owned by <mj-accordion-panel>. */\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-content {\n padding: 18px;\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\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 as-split-area > .as-split-area-content {\n padding: 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-title {\n font-size: 13px;\n }\n }\n `]\n})\nexport class ExecutionMonitoringComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n protected override destroy$ = new Subject<void>();\n private stateChangeSubject$ = new Subject<ExecutionMonitoringState>();\n\n // Configuration\n SelectedTimeRange = '24h';\n\n /** @deprecated Use {@link SelectedTimeRange}. */\n get selectedTimeRange() {\n return this.SelectedTimeRange;\n }\n /** @deprecated Use {@link SelectedTimeRange}. */\n set selectedTimeRange(value) {\n this.SelectedTimeRange = value;\n }\n isLoading = false;\n\n // Chart configurations\n TimeSeriesConfig = {\n showGrid: true,\n showTooltip: true,\n animationDuration: 500,\n useDualAxis: true\n };\n\n /** @deprecated Use {@link TimeSeriesConfig}. */\n get timeSeriesConfig() {\n return this.TimeSeriesConfig;\n }\n /** @deprecated Use {@link TimeSeriesConfig}. */\n set timeSeriesConfig(value) {\n this.TimeSeriesConfig = value;\n }\n\n HeatmapConfig = {\n height: 350,\n showTooltip: true,\n animationDuration: 300\n };\n\n /** @deprecated Use {@link HeatmapConfig}. */\n get heatmapConfig() {\n return this.HeatmapConfig;\n }\n /** @deprecated Use {@link HeatmapConfig}. */\n set heatmapConfig(value) {\n this.HeatmapConfig = value;\n }\n\n // Data streams\n Kpis$: Observable<DashboardKPIs>;\n\n /** @deprecated Use {@link Kpis$}. */\n get kpis$(): Observable<DashboardKPIs> {\n return this.Kpis$;\n }\n /** @deprecated Use {@link Kpis$}. */\n set kpis$(value: Observable<DashboardKPIs>) {\n this.Kpis$ = value;\n }\n Trends$: Observable<TrendData[]>;\n\n /** @deprecated Use {@link Trends$}. */\n get trends$(): Observable<TrendData[]> {\n return this.Trends$;\n }\n /** @deprecated Use {@link Trends$}. */\n set trends$(value: Observable<TrendData[]>) {\n this.Trends$ = value;\n }\n LiveExecutions$: Observable<LiveExecution[]>;\n\n /** @deprecated Use {@link LiveExecutions$}. */\n get liveExecutions$(): Observable<LiveExecution[]> {\n return this.LiveExecutions$;\n }\n /** @deprecated Use {@link LiveExecutions$}. */\n set liveExecutions$(value: Observable<LiveExecution[]>) {\n this.LiveExecutions$ = value;\n }\n ChartData$: Observable<ChartData>;\n\n /** @deprecated Use {@link ChartData$}. */\n get chartData$(): Observable<ChartData> {\n return this.ChartData$;\n }\n /** @deprecated Use {@link ChartData$}. */\n set chartData$(value: Observable<ChartData>) {\n this.ChartData$ = value;\n }\n\n // Derived data streams\n KpiCards$: Observable<KPICardData[]>;\n\n /** @deprecated Use {@link KpiCards$}. */\n get kpiCards$(): Observable<KPICardData[]> {\n return this.KpiCards$;\n }\n /** @deprecated Use {@link KpiCards$}. */\n set kpiCards$(value: Observable<KPICardData[]>) {\n this.KpiCards$ = value;\n }\n PerformanceMatrix$: Observable<HeatmapData[]>;\n\n /** @deprecated Use {@link PerformanceMatrix$}. */\n get performanceMatrix$(): Observable<HeatmapData[]> {\n return this.PerformanceMatrix$;\n }\n /** @deprecated Use {@link PerformanceMatrix$}. */\n set performanceMatrix$(value: Observable<HeatmapData[]>) {\n this.PerformanceMatrix$ = value;\n }\n CostData$: Observable<{ model: string; cost: number | null; tokens: number }[]>;\n\n /** @deprecated Use {@link CostData$}. */\n get costData$(): Observable<{ model: string; cost: number | null; tokens: number }[]> {\n return this.CostData$;\n }\n /** @deprecated Use {@link CostData$}. */\n set costData$(value: Observable<{ model: string; cost: number | null; tokens: number }[]>) {\n this.CostData$ = value;\n }\n TokenEfficiency$: Observable<{ inputTokens: number; outputTokens: number; cost: number | null; model: string }[]>;\n\n /** @deprecated Use {@link TokenEfficiency$}. */\n get tokenEfficiency$(): Observable<{ inputTokens: number; outputTokens: number; cost: number | null; model: string }[]> {\n return this.TokenEfficiency$;\n }\n /** @deprecated Use {@link TokenEfficiency$}. */\n set tokenEfficiency$(value: Observable<{ inputTokens: number; outputTokens: number; cost: number | null; model: string }[]>) {\n this.TokenEfficiency$ = value;\n }\n\n // Modal state\n SelectedExecution: LiveExecution | null = null;\n\n /** @deprecated Use {@link SelectedExecution}. */\n get selectedExecution(): LiveExecution | null {\n return this.SelectedExecution;\n }\n /** @deprecated Use {@link SelectedExecution}. */\n set selectedExecution(value: LiveExecution | null) {\n this.SelectedExecution = value;\n }\n ExecutionDetails: ExecutionDetails | null = null;\n\n /** @deprecated Use {@link ExecutionDetails}. */\n get executionDetails(): ExecutionDetails | null {\n return this.ExecutionDetails;\n }\n /** @deprecated Use {@link ExecutionDetails}. */\n set executionDetails(value: ExecutionDetails | null) {\n this.ExecutionDetails = value;\n }\n LoadingExecutionDetails = false;\n\n /** @deprecated Use {@link LoadingExecutionDetails}. */\n get loadingExecutionDetails() {\n return this.LoadingExecutionDetails;\n }\n /** @deprecated Use {@link LoadingExecutionDetails}. */\n set loadingExecutionDetails(value) {\n this.LoadingExecutionDetails = value;\n }\n\n // Drill-down tab state\n DrillDownTabs: DrillDownTab[] = [];\n\n /** @deprecated Use {@link DrillDownTabs}. */\n get drillDownTabs(): DrillDownTab[] {\n return this.DrillDownTabs;\n }\n /** @deprecated Use {@link DrillDownTabs}. */\n set drillDownTabs(value: DrillDownTab[]) {\n this.DrillDownTabs = value;\n }\n ActiveTabId: string = 'main-chart';\n\n /** @deprecated Use {@link ActiveTabId}. */\n get activeTabId(): string {\n return this.ActiveTabId;\n }\n /** @deprecated Use {@link ActiveTabId}. */\n set activeTabId(value: string) {\n this.ActiveTabId = value;\n }\n LoadingDrillDown = false;\n\n /** @deprecated Use {@link LoadingDrillDown}. */\n get loadingDrillDown() {\n return this.LoadingDrillDown;\n }\n /** @deprecated Use {@link LoadingDrillDown}. */\n set loadingDrillDown(value) {\n this.LoadingDrillDown = value;\n }\n\n // Panel state for collapsible sections\n PanelStates = {\n cost: true,\n efficiency: true, // Expanded by default\n executions: false\n };\n\n /** @deprecated Use {@link PanelStates}. */\n get panelStates() {\n return this.PanelStates;\n }\n /** @deprecated Use {@link PanelStates}. */\n set panelStates(value) {\n this.PanelStates = value;\n }\n\n get ActiveTab(): DrillDownTab | undefined {\n return this.DrillDownTabs.find(tab => tab.id === this.ActiveTabId);\n }\n\n /** @deprecated Use {@link ActiveTab}. */\n get activeTab(): DrillDownTab | undefined {\n return this.ActiveTab;\n }\n\n constructor(\n private instrumentationService: AIInstrumentationService,\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 super.ngOnInit();\n this.instrumentationService.Provider = this.ProviderToUse;\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 super.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 /** @deprecated Use {@link LoadUserState}. */\n public loadUserState(state: Partial<ExecutionMonitoringState>): void {\n return this.LoadUserState(state);\n }\n\n private createKPICards(kpis: DashboardKPIs): KPICardData[] {\n const covPriced = kpis.Coverage?.PricedRuns ?? 0;\n const covUnpriced = kpis.Coverage?.UnpricedRuns ?? 0;\n const covTotal = covPriced + covUnpriced;\n const coveragePct = Math.round(ComputeCoveragePercent(kpis.Coverage));\n\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 !== null\n ? `${kpis.costCurrency === 'USD' ? '$' : kpis.costCurrency + ' '}${kpis.totalCost.toFixed(4)}`\n : '\\u2014',\n icon: 'fa-dollar-sign',\n color: 'warning',\n // Mixed currencies: the total is in one of them; the others are left out rather than added at 1:1.\n subtitle: `covers ${coveragePct}% of runs` + (kpis.IsMixedCurrency ? ` \\u00b7 ${kpis.costCurrency} only` : '')\n },\n {\n title: 'Coverage',\n value: `${coveragePct}%`,\n icon: 'fa-shield-halved',\n color: coveragePct >= 90 ? 'success' : coveragePct >= 70 ? 'warning' : 'danger',\n subtitle: `${covPriced} of ${covTotal} runs priced`\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 !== null ? `$${kpis.costPerToken.toFixed(6)}/token` : '\\u2014'\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 /** @deprecated Use {@link OnTimeRangeChange}. */\n onTimeRangeChange(): void {\n return this.OnTimeRangeChange();\n }\n\n /** Width of each trend bucket, the same rule the service buckets by. */\n public TrendBucketMs: number | null = null;\n\n private setTimeRange(range: string): void {\n const { start, end } = this.getTimeRangeFromSelection(range);\n this.TrendBucketMs = GetBucketSizeMs(start, end);\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 /** @deprecated Use {@link RefreshData}. */\n refreshData(): void {\n return this.RefreshData();\n }\n\n OnExecutionClick(execution: LiveExecution): void {\n this.SelectedExecution = execution;\n this.loadExecutionDetails(execution);\n }\n\n /** @deprecated Use {@link OnExecutionClick}. */\n onExecutionClick(execution: LiveExecution): void {\n return this.OnExecutionClick(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 /** @deprecated Use {@link OnDataPointClick}. */\n onDataPointClick(event: DataPointClickEvent): void {\n return this.OnDataPointClick(event);\n }\n\n OnChartTimeRangeChange(range: string): void {\n this.SelectedTimeRange = range;\n this.setTimeRange(range);\n }\n\n /** @deprecated Use {@link OnChartTimeRangeChange}. */\n onChartTimeRangeChange(range: string): void {\n return this.OnChartTimeRangeChange(range);\n }\n\n private getMetricValue(data: TrendData, metric: string): number | null {\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 null;\n }\n }\n\n private formatMetricValue(metric: string, value: number | null): string {\n if (value === null || value === undefined) {\n return '\\u2014';\n }\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 String(value);\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 /** @deprecated Use {@link CloseExecutionModal}. */\n closeExecutionModal(): void {\n return this.CloseExecutionModal();\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 = CompositeKey.FromID(this.SelectedExecution.id);\n this.navigationService.OpenEntityRecord(entityName, compositeKey);\n\n // Close the modal\n this.CloseExecutionModal();\n }\n }\n\n /** @deprecated Use {@link OpenFullRecord}. */\n openFullRecord(): void {\n return this.OpenFullRecord();\n }\n\n // Utility methods for templates\n TrackByKpiTitle(index: number, kpi: KPICardData): string {\n return kpi.title;\n }\n\n /** @deprecated Use {@link TrackByKpiTitle}. */\n trackByKpiTitle(index: number, kpi: KPICardData): string {\n return this.TrackByKpiTitle(index, kpi);\n }\n\n TrackByCostModel(index: number, item: { model: string; cost: number; tokens: number }): string {\n return item.model;\n }\n\n /** @deprecated Use {@link TrackByCostModel}. */\n trackByCostModel(index: number, item: { model: string; cost: number; tokens: number }): string {\n return this.TrackByCostModel(index, item);\n }\n\n TrackByEfficiencyModel(index: number, item: { model: string; inputTokens: number; outputTokens: number; cost: number | null }): string {\n return item.model;\n }\n\n /** @deprecated Use {@link TrackByEfficiencyModel}. */\n trackByEfficiencyModel(index: number, item: { model: string; inputTokens: number; outputTokens: number; cost: number | null }): string {\n return this.TrackByEfficiencyModel(index, item);\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 /** @deprecated Use {@link FormatTokens}. */\n formatTokens(tokens: number): string {\n return this.FormatTokens(tokens);\n }\n\n formatCurrency(amount: number | null | undefined, decimals: number = 4): string {\n if (amount === null || amount === undefined) {\n return '\\u2014';\n }\n return `$${amount.toFixed(decimals)}`;\n }\n\n FormatCostPerToken(cost: number | null | undefined, tokens: number): string {\n if (cost === null || cost === undefined || tokens <= 0) {\n return '\\u2014';\n }\n const costPer1K = (cost / tokens) * 1000;\n return `$${costPer1K.toFixed(4)}/1K tokens`;\n }\n\n /** @deprecated Use {@link FormatCostPerToken}. */\n formatCostPerToken(cost: number | null | undefined, tokens: number): string {\n return this.FormatCostPerToken(cost, tokens);\n }\n\n GetCostBarWidth(cost: number | null | undefined, maxCost: number): number {\n if (cost === null || cost === undefined || maxCost <= 0) {\n return 0;\n }\n return (cost / maxCost) * 100;\n }\n\n /** @deprecated Use {@link GetCostBarWidth}. */\n getCostBarWidth(cost: number | null | undefined, maxCost: number): number {\n return this.GetCostBarWidth(cost, maxCost);\n }\n\n GetMaxCost(costData: { cost: number | null }[]): number {\n const priced = costData.map(item => item.cost).filter((c): c is number => c !== null && c !== undefined);\n return priced.length > 0 ? Math.max(...priced) : 0;\n }\n\n /** @deprecated Use {@link GetMaxCost}. */\n getMaxCost(costData: { cost: number | null }[]): number {\n return this.GetMaxCost(costData);\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 /** @deprecated Use {@link GetTokenRatio}. */\n getTokenRatio(input: number, output: number): string {\n return this.GetTokenRatio(input, output);\n }\n\n GetTokenPercentage(tokens: number, total: number): number {\n return total > 0 ? (tokens / total) * 100 : 0;\n }\n\n /** @deprecated Use {@link GetTokenPercentage}. */\n getTokenPercentage(tokens: number, total: number): number {\n return this.GetTokenPercentage(tokens, total);\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 /** @deprecated Use {@link GetCostPerToken}. */\n getCostPerToken(cost: number, tokens: number): string {\n return this.GetCostPerToken(cost, tokens);\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 /** @deprecated Use {@link SelectTab}. */\n selectTab(tabId: string): void {\n return this.SelectTab(tabId);\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 /** @deprecated Use {@link CloseTab}. */\n closeTab(event: MouseEvent, tabId: string): void {\n return this.CloseTab(event, tabId);\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 /** @deprecated Use {@link OnKpiClick}. */\n onKpiClick(kpi: KPICardData): void {\n return this.OnKpiClick(kpi);\n }\n\n IsKpiClickable(kpi: KPICardData): boolean {\n return kpi.title === 'Top Model' && kpi.value !== 'N/A';\n }\n\n /** @deprecated Use {@link IsKpiClickable}. */\n isKpiClickable(kpi: KPICardData): boolean {\n return this.IsKpiClickable(kpi);\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 RunView.FromMetadataProvider(this.ProviderToUse).RunView<MJAIPromptRunEntityExtended>({\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `RunAt >= '${startTime.toISOString()}' AND RunAt <= '${endTime.toISOString()}'`,\n OrderBy: 'RunAt DESC',\n MaxRows: 500\n }),\n RunView.FromMetadataProvider(this.ProviderToUse).RunView<MJAIAgentRunEntityExtended>({\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `StartedAt >= '${startTime.toISOString()}' AND StartedAt <= '${endTime.toISOString()}'`,\n OrderBy: 'StartedAt DESC',\n MaxRows: 500\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 = RunView.FromMetadataProvider(this.ProviderToUse);\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 /** @deprecated Use {@link FormatTimestamp}. */\n formatTimestamp(timestamp: Date): string {\n return this.FormatTimestamp(timestamp);\n }\n\n FormatTime(time: Date): string {\n return time.toLocaleTimeString();\n }\n\n /** @deprecated Use {@link FormatTime}. */\n formatTime(time: Date): string {\n return this.FormatTime(time);\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 /** @deprecated Use {@link GetMetricDisplayLabel}. */\n getMetricDisplayLabel(metric: string): string {\n return this.GetMetricDisplayLabel(metric);\n }\n\n GetFormattedTimestamp(tab: DrillDownTab | undefined): string {\n return tab?.timestamp ? this.FormatTimestamp(tab.timestamp) : '';\n }\n\n /** @deprecated Use {@link GetFormattedTimestamp}. */\n getFormattedTimestamp(tab: DrillDownTab | undefined): string {\n return this.GetFormattedTimestamp(tab);\n }\n\n GetFormattedMetricLabel(tab: DrillDownTab | undefined): string {\n return tab?.metric ? this.GetMetricDisplayLabel(tab.metric) : '';\n }\n\n /** @deprecated Use {@link GetFormattedMetricLabel}. */\n getFormattedMetricLabel(tab: DrillDownTab | undefined): string {\n return this.GetFormattedMetricLabel(tab);\n }\n\n // Panel management methods\n OnPanelExpandedChange(panelName: 'cost' | 'efficiency' | 'executions', expanded: boolean): void {\n this.PanelStates[panelName] = expanded;\n this.emitStateChange();\n }\n\n /** @deprecated Use {@link OnPanelExpandedChange}. */\n onPanelExpandedChange(panelName: 'cost' | 'efficiency' | 'executions', expanded: boolean): void {\n return this.OnPanelExpandedChange(panelName, expanded);\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 /** @deprecated Use {@link ViewExecutionDetail}. */\n viewExecutionDetail(execution: ExecutionRecord): void {\n return this.ViewExecutionDetail(execution);\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 /** @deprecated Use {@link GetDuration}. */\n getDuration(details: ExecutionDetails): number {\n return this.GetDuration(details);\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 /** @deprecated Use {@link OnSplitterLayoutChange}. */\n onSplitterLayoutChange(event: any): void {\n return this.OnSplitterLayoutChange(event);\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 { ComputeCoveragePercent, GetBucketSizeMs } from '../services/ai-usage-analytics.compute';\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 { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\n\nexport interface DrillDownTab {\n id: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n title: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n type: 'chart' | 'executions' | 'model-detail'; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n data?: any; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n timestamp?: Date; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n metric?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n closeable: boolean; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n}\n\nexport interface ExecutionRecord {\n id: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n type: 'prompt' | 'agent'; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n name: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n model?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n status: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n startTime: Date; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n endTime?: Date; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n duration: number; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n cost: number; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n tokens: number; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n errorMessage?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n}\n\nexport interface ExecutionMonitoringState {\n selectedTimeRange: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n refreshInterval: number; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n panelStates: { // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n cost: boolean;\n efficiency: boolean;\n executions: boolean;\n };\n drillDownTabs: Array<{ // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n id: string;\n title: string;\n type: string;\n timestamp?: string;\n metric?: string;\n }>;\n activeTabId: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n splitterSizes?: number[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\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 removed — AIOverviewHubComponent now registers as '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 Splitter -->\n <as-split direction=\"vertical\" class=\"dashboard-splitter\">\n <!-- Top Row: System Health and Trends Chart -->\n <as-split-area [size]=\"45\">\n <as-split direction=\"horizontal\">\n <!-- System Health -->\n <as-split-area [size]=\"30\">\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 </as-split-area>\n\n <!-- Drill-down Tab Container -->\n <as-split-area [size]=\"70\">\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 [BucketSizeMs]=\"TrendBucketMs\"\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 <mj-empty-state Size=\"compact\" Icon=\"fa-solid fa-inbox\"\n Title=\"No executions found for this time period\" />\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 </as-split-area>\n </as-split>\n </as-split-area>\n\n <!-- Bottom Row: Analysis Panels with Expansion Layout -->\n <as-split-area [size]=\"55\">\n <as-split direction=\"horizontal\">\n <!-- Left: Performance Heatmap -->\n <as-split-area [size]=\"50\">\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 </as-split-area>\n\n <!-- Right: Analysis Panels with Collapsible Sections -->\n <as-split-area [size]=\"50\">\n <div class=\"dashboard-section analysis-panels\">\n \n <!-- Cost Analysis Panel -->\n <mj-accordion-panel Size=\"sm\" [FlushBody]=\"true\" [Expanded]=\"panelStates.cost\" (ExpandedChange)=\"onPanelExpandedChange('cost', $event)\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-dollar-sign\"></i>\n Cost Analysis\n </span>\n </ng-template>\n <ng-template mjAccordionBody>\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 </ng-template>\n </mj-accordion-panel>\n\n <!-- Token Efficiency Panel -->\n <mj-accordion-panel Size=\"sm\" [FlushBody]=\"true\" [Expanded]=\"panelStates.efficiency\" (ExpandedChange)=\"onPanelExpandedChange('efficiency', $event)\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-chart-pie\"></i>\n Token Efficiency\n </span>\n </ng-template>\n <ng-template mjAccordionBody>\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 </ng-template>\n </mj-accordion-panel>\n\n <!-- Live Executions Panel -->\n <mj-accordion-panel Size=\"sm\" [FlushBody]=\"true\" [Expanded]=\"panelStates.executions\" (ExpandedChange)=\"onPanelExpandedChange('executions', $event)\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-bolt\"></i>\n Live Executions\n </span>\n </ng-template>\n <ng-template mjAccordionBody>\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 </ng-template>\n </mj-accordion-panel>\n </div>\n </as-split-area>\n </as-split>\n </as-split-area>\n </as-split>\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 areas take full height */\n :host ::ng-deep as-split-area > .as-split-area-content {\n overflow: hidden;\n padding: 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 /* 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 chrome (wrapper/header/toggle-icon) now owned by <mj-accordion-panel>. */\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-content {\n padding: 18px;\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\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 as-split-area > .as-split-area-content {\n padding: 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-title {\n font-size: 13px;\n }\n }\n `]\n})\nexport class ExecutionMonitoringComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n protected override destroy$ = new Subject<void>();\n private stateChangeSubject$ = new Subject<ExecutionMonitoringState>();\n\n // Configuration\n SelectedTimeRange = '24h';\n\n /** @deprecated Use {@link SelectedTimeRange}. */\n get selectedTimeRange() {\n return this.SelectedTimeRange;\n }\n /** @deprecated Use {@link SelectedTimeRange}. */\n set selectedTimeRange(value) {\n this.SelectedTimeRange = value;\n }\n isLoading = false;\n\n // Chart configurations\n TimeSeriesConfig = {\n showGrid: true,\n showTooltip: true,\n animationDuration: 500,\n useDualAxis: true\n };\n\n /** @deprecated Use {@link TimeSeriesConfig}. */\n get timeSeriesConfig() {\n return this.TimeSeriesConfig;\n }\n /** @deprecated Use {@link TimeSeriesConfig}. */\n set timeSeriesConfig(value) {\n this.TimeSeriesConfig = value;\n }\n\n HeatmapConfig = {\n height: 350,\n showTooltip: true,\n animationDuration: 300\n };\n\n /** @deprecated Use {@link HeatmapConfig}. */\n get heatmapConfig() {\n return this.HeatmapConfig;\n }\n /** @deprecated Use {@link HeatmapConfig}. */\n set heatmapConfig(value) {\n this.HeatmapConfig = value;\n }\n\n // Data streams\n Kpis$: Observable<DashboardKPIs>;\n\n /** @deprecated Use {@link Kpis$}. */\n get kpis$(): Observable<DashboardKPIs> {\n return this.Kpis$;\n }\n /** @deprecated Use {@link Kpis$}. */\n set kpis$(value: Observable<DashboardKPIs>) {\n this.Kpis$ = value;\n }\n Trends$: Observable<TrendData[]>;\n\n /** @deprecated Use {@link Trends$}. */\n get trends$(): Observable<TrendData[]> {\n return this.Trends$;\n }\n /** @deprecated Use {@link Trends$}. */\n set trends$(value: Observable<TrendData[]>) {\n this.Trends$ = value;\n }\n LiveExecutions$: Observable<LiveExecution[]>;\n\n /** @deprecated Use {@link LiveExecutions$}. */\n get liveExecutions$(): Observable<LiveExecution[]> {\n return this.LiveExecutions$;\n }\n /** @deprecated Use {@link LiveExecutions$}. */\n set liveExecutions$(value: Observable<LiveExecution[]>) {\n this.LiveExecutions$ = value;\n }\n ChartData$: Observable<ChartData>;\n\n /** @deprecated Use {@link ChartData$}. */\n get chartData$(): Observable<ChartData> {\n return this.ChartData$;\n }\n /** @deprecated Use {@link ChartData$}. */\n set chartData$(value: Observable<ChartData>) {\n this.ChartData$ = value;\n }\n\n // Derived data streams\n KpiCards$: Observable<KPICardData[]>;\n\n /** @deprecated Use {@link KpiCards$}. */\n get kpiCards$(): Observable<KPICardData[]> {\n return this.KpiCards$;\n }\n /** @deprecated Use {@link KpiCards$}. */\n set kpiCards$(value: Observable<KPICardData[]>) {\n this.KpiCards$ = value;\n }\n PerformanceMatrix$: Observable<HeatmapData[]>;\n\n /** @deprecated Use {@link PerformanceMatrix$}. */\n get performanceMatrix$(): Observable<HeatmapData[]> {\n return this.PerformanceMatrix$;\n }\n /** @deprecated Use {@link PerformanceMatrix$}. */\n set performanceMatrix$(value: Observable<HeatmapData[]>) {\n this.PerformanceMatrix$ = value;\n }\n CostData$: Observable<{ model: string; cost: number | null; tokens: number }[]>;\n\n /** @deprecated Use {@link CostData$}. */\n get costData$(): Observable<{ model: string; cost: number | null; tokens: number }[]> {\n return this.CostData$;\n }\n /** @deprecated Use {@link CostData$}. */\n set costData$(value: Observable<{ model: string; cost: number | null; tokens: number }[]>) {\n this.CostData$ = value;\n }\n TokenEfficiency$: Observable<{ inputTokens: number; outputTokens: number; cost: number | null; model: string }[]>;\n\n /** @deprecated Use {@link TokenEfficiency$}. */\n get tokenEfficiency$(): Observable<{ inputTokens: number; outputTokens: number; cost: number | null; model: string }[]> {\n return this.TokenEfficiency$;\n }\n /** @deprecated Use {@link TokenEfficiency$}. */\n set tokenEfficiency$(value: Observable<{ inputTokens: number; outputTokens: number; cost: number | null; model: string }[]>) {\n this.TokenEfficiency$ = value;\n }\n\n // Modal state\n SelectedExecution: LiveExecution | null = null;\n\n /** @deprecated Use {@link SelectedExecution}. */\n get selectedExecution(): LiveExecution | null {\n return this.SelectedExecution;\n }\n /** @deprecated Use {@link SelectedExecution}. */\n set selectedExecution(value: LiveExecution | null) {\n this.SelectedExecution = value;\n }\n ExecutionDetails: ExecutionDetails | null = null;\n\n /** @deprecated Use {@link ExecutionDetails}. */\n get executionDetails(): ExecutionDetails | null {\n return this.ExecutionDetails;\n }\n /** @deprecated Use {@link ExecutionDetails}. */\n set executionDetails(value: ExecutionDetails | null) {\n this.ExecutionDetails = value;\n }\n LoadingExecutionDetails = false;\n\n /** @deprecated Use {@link LoadingExecutionDetails}. */\n get loadingExecutionDetails() {\n return this.LoadingExecutionDetails;\n }\n /** @deprecated Use {@link LoadingExecutionDetails}. */\n set loadingExecutionDetails(value) {\n this.LoadingExecutionDetails = value;\n }\n\n // Drill-down tab state\n DrillDownTabs: DrillDownTab[] = [];\n\n /** @deprecated Use {@link DrillDownTabs}. */\n get drillDownTabs(): DrillDownTab[] {\n return this.DrillDownTabs;\n }\n /** @deprecated Use {@link DrillDownTabs}. */\n set drillDownTabs(value: DrillDownTab[]) {\n this.DrillDownTabs = value;\n }\n ActiveTabId: string = 'main-chart';\n\n /** @deprecated Use {@link ActiveTabId}. */\n get activeTabId(): string {\n return this.ActiveTabId;\n }\n /** @deprecated Use {@link ActiveTabId}. */\n set activeTabId(value: string) {\n this.ActiveTabId = value;\n }\n LoadingDrillDown = false;\n\n /** @deprecated Use {@link LoadingDrillDown}. */\n get loadingDrillDown() {\n return this.LoadingDrillDown;\n }\n /** @deprecated Use {@link LoadingDrillDown}. */\n set loadingDrillDown(value) {\n this.LoadingDrillDown = value;\n }\n\n // Panel state for collapsible sections\n PanelStates = {\n cost: true,\n efficiency: true, // Expanded by default\n executions: false\n };\n\n /** @deprecated Use {@link PanelStates}. */\n get panelStates() {\n return this.PanelStates;\n }\n /** @deprecated Use {@link PanelStates}. */\n set panelStates(value) {\n this.PanelStates = value;\n }\n\n get ActiveTab(): DrillDownTab | undefined {\n return this.DrillDownTabs.find(tab => tab.id === this.ActiveTabId);\n }\n\n /** @deprecated Use {@link ActiveTab}. */\n get activeTab(): DrillDownTab | undefined {\n return this.ActiveTab;\n }\n\n constructor(\n private instrumentationService: AIInstrumentationService,\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 super.ngOnInit();\n this.instrumentationService.Provider = this.ProviderToUse;\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 super.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 /** @deprecated Use {@link LoadUserState}. */\n public loadUserState(state: Partial<ExecutionMonitoringState>): void {\n return this.LoadUserState(state);\n }\n\n private createKPICards(kpis: DashboardKPIs): KPICardData[] {\n const covPriced = kpis.Coverage?.PricedRuns ?? 0;\n const covUnpriced = kpis.Coverage?.UnpricedRuns ?? 0;\n const covTotal = covPriced + covUnpriced;\n const coveragePct = Math.round(ComputeCoveragePercent(kpis.Coverage));\n\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 !== null\n ? `${kpis.costCurrency === 'USD' ? '$' : kpis.costCurrency + ' '}${kpis.totalCost.toFixed(4)}`\n : '\\u2014',\n icon: 'fa-dollar-sign',\n color: 'warning',\n // Mixed currencies: the total is in one of them; the others are left out rather than added at 1:1.\n subtitle: `covers ${coveragePct}% of runs` + (kpis.IsMixedCurrency ? ` \\u00b7 ${kpis.costCurrency} only` : '')\n },\n {\n title: 'Coverage',\n value: `${coveragePct}%`,\n icon: 'fa-shield-halved',\n color: coveragePct >= 90 ? 'success' : coveragePct >= 70 ? 'warning' : 'danger',\n subtitle: `${covPriced} of ${covTotal} runs priced`\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 !== null ? `$${kpis.costPerToken.toFixed(6)}/token` : '\\u2014'\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 /** @deprecated Use {@link OnTimeRangeChange}. */\n onTimeRangeChange(): void {\n return this.OnTimeRangeChange();\n }\n\n /** Width of each trend bucket, the same rule the service buckets by. */\n public TrendBucketMs: number | null = null;\n\n private setTimeRange(range: string): void {\n const { start, end } = this.getTimeRangeFromSelection(range);\n this.TrendBucketMs = GetBucketSizeMs(start, end);\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 /** @deprecated Use {@link RefreshData}. */\n refreshData(): void {\n return this.RefreshData();\n }\n\n OnExecutionClick(execution: LiveExecution): void {\n this.SelectedExecution = execution;\n this.loadExecutionDetails(execution);\n }\n\n /** @deprecated Use {@link OnExecutionClick}. */\n onExecutionClick(execution: LiveExecution): void {\n return this.OnExecutionClick(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 /** @deprecated Use {@link OnDataPointClick}. */\n onDataPointClick(event: DataPointClickEvent): void {\n return this.OnDataPointClick(event);\n }\n\n OnChartTimeRangeChange(range: string): void {\n this.SelectedTimeRange = range;\n this.setTimeRange(range);\n }\n\n /** @deprecated Use {@link OnChartTimeRangeChange}. */\n onChartTimeRangeChange(range: string): void {\n return this.OnChartTimeRangeChange(range);\n }\n\n private getMetricValue(data: TrendData, metric: string): number | null {\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 null;\n }\n }\n\n private formatMetricValue(metric: string, value: number | null): string {\n if (value === null || value === undefined) {\n return '\\u2014';\n }\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 String(value);\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 /** @deprecated Use {@link CloseExecutionModal}. */\n closeExecutionModal(): void {\n return this.CloseExecutionModal();\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 = CompositeKey.FromID(this.SelectedExecution.id);\n this.navigationService.OpenEntityRecord(entityName, compositeKey);\n\n // Close the modal\n this.CloseExecutionModal();\n }\n }\n\n /** @deprecated Use {@link OpenFullRecord}. */\n openFullRecord(): void {\n return this.OpenFullRecord();\n }\n\n // Utility methods for templates\n TrackByKpiTitle(index: number, kpi: KPICardData): string {\n return kpi.title;\n }\n\n /** @deprecated Use {@link TrackByKpiTitle}. */\n trackByKpiTitle(index: number, kpi: KPICardData): string {\n return this.TrackByKpiTitle(index, kpi);\n }\n\n TrackByCostModel(index: number, item: { model: string; cost: number; tokens: number }): string {\n return item.model;\n }\n\n /** @deprecated Use {@link TrackByCostModel}. */\n trackByCostModel(index: number, item: { model: string; cost: number; tokens: number }): string {\n return this.TrackByCostModel(index, item);\n }\n\n TrackByEfficiencyModel(index: number, item: { model: string; inputTokens: number; outputTokens: number; cost: number | null }): string {\n return item.model;\n }\n\n /** @deprecated Use {@link TrackByEfficiencyModel}. */\n trackByEfficiencyModel(index: number, item: { model: string; inputTokens: number; outputTokens: number; cost: number | null }): string {\n return this.TrackByEfficiencyModel(index, item);\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 /** @deprecated Use {@link FormatTokens}. */\n formatTokens(tokens: number): string {\n return this.FormatTokens(tokens);\n }\n\n formatCurrency(amount: number | null | undefined, decimals: number = 4): string {\n if (amount === null || amount === undefined) {\n return '\\u2014';\n }\n return `$${amount.toFixed(decimals)}`;\n }\n\n FormatCostPerToken(cost: number | null | undefined, tokens: number): string {\n if (cost === null || cost === undefined || tokens <= 0) {\n return '\\u2014';\n }\n const costPer1K = (cost / tokens) * 1000;\n return `$${costPer1K.toFixed(4)}/1K tokens`;\n }\n\n /** @deprecated Use {@link FormatCostPerToken}. */\n formatCostPerToken(cost: number | null | undefined, tokens: number): string {\n return this.FormatCostPerToken(cost, tokens);\n }\n\n GetCostBarWidth(cost: number | null | undefined, maxCost: number): number {\n if (cost === null || cost === undefined || maxCost <= 0) {\n return 0;\n }\n return (cost / maxCost) * 100;\n }\n\n /** @deprecated Use {@link GetCostBarWidth}. */\n getCostBarWidth(cost: number | null | undefined, maxCost: number): number {\n return this.GetCostBarWidth(cost, maxCost);\n }\n\n GetMaxCost(costData: { cost: number | null }[]): number {\n const priced = costData.map(item => item.cost).filter((c): c is number => c !== null && c !== undefined);\n return priced.length > 0 ? Math.max(...priced) : 0;\n }\n\n /** @deprecated Use {@link GetMaxCost}. */\n getMaxCost(costData: { cost: number | null }[]): number {\n return this.GetMaxCost(costData);\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 /** @deprecated Use {@link GetTokenRatio}. */\n getTokenRatio(input: number, output: number): string {\n return this.GetTokenRatio(input, output);\n }\n\n GetTokenPercentage(tokens: number, total: number): number {\n return total > 0 ? (tokens / total) * 100 : 0;\n }\n\n /** @deprecated Use {@link GetTokenPercentage}. */\n getTokenPercentage(tokens: number, total: number): number {\n return this.GetTokenPercentage(tokens, total);\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 /** @deprecated Use {@link GetCostPerToken}. */\n getCostPerToken(cost: number, tokens: number): string {\n return this.GetCostPerToken(cost, tokens);\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 /** @deprecated Use {@link SelectTab}. */\n selectTab(tabId: string): void {\n return this.SelectTab(tabId);\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 /** @deprecated Use {@link CloseTab}. */\n closeTab(event: MouseEvent, tabId: string): void {\n return this.CloseTab(event, tabId);\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 /** @deprecated Use {@link OnKpiClick}. */\n onKpiClick(kpi: KPICardData): void {\n return this.OnKpiClick(kpi);\n }\n\n IsKpiClickable(kpi: KPICardData): boolean {\n return kpi.title === 'Top Model' && kpi.value !== 'N/A';\n }\n\n /** @deprecated Use {@link IsKpiClickable}. */\n isKpiClickable(kpi: KPICardData): boolean {\n return this.IsKpiClickable(kpi);\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 in a single batched RunViews call with lightweight scalar projections\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [promptResults, agentResults] = await rv.RunViews([\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `RunAt >= '${startTime.toISOString()}' AND RunAt <= '${endTime.toISOString()}'`,\n OrderBy: 'RunAt DESC',\n MaxRows: 500,\n Fields: ['ID', 'Prompt', 'Model', 'Success', 'RunAt', 'CompletedAt', 'Cost', 'TokensUsed', 'ErrorMessage'],\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `StartedAt >= '${startTime.toISOString()}' AND StartedAt <= '${endTime.toISOString()}'`,\n OrderBy: 'StartedAt DESC',\n MaxRows: 500,\n Fields: ['ID', 'Agent', 'Status', 'StartedAt', 'CompletedAt', 'TotalCost', 'TotalTokensUsed', 'ErrorMessage'],\n ResultType: 'simple'\n }\n ]);\n \n // Convert to ExecutionRecord format\n const executions: ExecutionRecord[] = [];\n \n // Add prompt executions\n for (const run of promptResults.Results as MJAIPromptRunEntityExtended[]) {\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 as MJAIAgentRunEntityExtended[]) {\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 // Consult AIEngineBase in-memory cache first before issuing a network RunView\n await AIEngineBase.Instance.Config(false);\n let model: MJAIModelEntityExtended | undefined = AIEngineBase.Instance.Models.find(m => m.Name === modelName);\n if (!model) {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJAIModelEntityExtended>({\n EntityName: 'MJ: AI Models',\n ExtraFilter: `Name = '${modelName.replace(/'/g, \"''\")}'`,\n Fields: ['ID', 'Name', 'Vendor', 'APIName', 'IsActive', 'Description'],\n ResultType: 'simple'\n });\n model = result.Results[0];\n }\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 /** @deprecated Use {@link FormatTimestamp}. */\n formatTimestamp(timestamp: Date): string {\n return this.FormatTimestamp(timestamp);\n }\n\n FormatTime(time: Date): string {\n return time.toLocaleTimeString();\n }\n\n /** @deprecated Use {@link FormatTime}. */\n formatTime(time: Date): string {\n return this.FormatTime(time);\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 /** @deprecated Use {@link GetMetricDisplayLabel}. */\n getMetricDisplayLabel(metric: string): string {\n return this.GetMetricDisplayLabel(metric);\n }\n\n GetFormattedTimestamp(tab: DrillDownTab | undefined): string {\n return tab?.timestamp ? this.FormatTimestamp(tab.timestamp) : '';\n }\n\n /** @deprecated Use {@link GetFormattedTimestamp}. */\n getFormattedTimestamp(tab: DrillDownTab | undefined): string {\n return this.GetFormattedTimestamp(tab);\n }\n\n GetFormattedMetricLabel(tab: DrillDownTab | undefined): string {\n return tab?.metric ? this.GetMetricDisplayLabel(tab.metric) : '';\n }\n\n /** @deprecated Use {@link GetFormattedMetricLabel}. */\n getFormattedMetricLabel(tab: DrillDownTab | undefined): string {\n return this.GetFormattedMetricLabel(tab);\n }\n\n // Panel management methods\n OnPanelExpandedChange(panelName: 'cost' | 'efficiency' | 'executions', expanded: boolean): void {\n this.PanelStates[panelName] = expanded;\n this.emitStateChange();\n }\n\n /** @deprecated Use {@link OnPanelExpandedChange}. */\n onPanelExpandedChange(panelName: 'cost' | 'efficiency' | 'executions', expanded: boolean): void {\n return this.OnPanelExpandedChange(panelName, expanded);\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 /** @deprecated Use {@link ViewExecutionDetail}. */\n viewExecutionDetail(execution: ExecutionRecord): void {\n return this.ViewExecutionDetail(execution);\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 /** @deprecated Use {@link GetDuration}. */\n getDuration(details: ExecutionDetails): number {\n return this.GetDuration(details);\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 /** @deprecated Use {@link OnSplitterLayoutChange}. */\n onSplitterLayoutChange(event: any): void {\n return this.OnSplitterLayoutChange(event);\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}"]}
|