@memberjunction/ng-dashboards 5.26.0 → 5.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +96 -0
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +710 -0
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +52 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +356 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +52 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.js +306 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +81 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +744 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -0
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +61 -0
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +490 -0
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -0
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts +77 -0
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +673 -0
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +65 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.js +537 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -0
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +131 -0
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +1030 -0
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +78 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +569 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -0
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +4 -14
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/overview/ai-overview-hub.component.d.ts +58 -0
- package/dist/AI/components/overview/ai-overview-hub.component.d.ts.map +1 -0
- package/dist/AI/components/overview/ai-overview-hub.component.js +315 -0
- package/dist/AI/components/overview/ai-overview-hub.component.js.map +1 -0
- package/dist/AI/components/prompts/prompt-management.component.js +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/index.d.ts +11 -0
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +13 -0
- package/dist/AI/index.js.map +1 -1
- package/dist/AI/interfaces/analytics-preferences.interface.d.ts +50 -0
- package/dist/AI/interfaces/analytics-preferences.interface.d.ts.map +1 -0
- package/dist/AI/interfaces/analytics-preferences.interface.js +9 -0
- package/dist/AI/interfaces/analytics-preferences.interface.js.map +1 -0
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +2 -2
- package/dist/MCP/index.d.ts +1 -0
- package/dist/MCP/index.d.ts.map +1 -1
- package/dist/MCP/index.js +2 -0
- package/dist/MCP/index.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +1 -0
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +5 -4
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp-resource.component.d.ts +6 -5
- package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
- package/dist/MCP/mcp-resource.component.js +7 -8
- package/dist/MCP/mcp-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +27 -17
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +66 -3
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +1 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +48 -48
- package/dist/__tests__/analytics-resource.test.d.ts +0 -2
- package/dist/__tests__/analytics-resource.test.d.ts.map +0 -1
- package/dist/__tests__/analytics-resource.test.js +0 -181
- package/dist/__tests__/analytics-resource.test.js.map +0 -1
- package/dist/__tests__/dashboards.test.d.ts +0 -2
- package/dist/__tests__/dashboards.test.d.ts.map +0 -1
- package/dist/__tests__/dashboards.test.js +0 -40
- package/dist/__tests__/dashboards.test.js.map +0 -1
- package/dist/__tests__/integration-data-service.test.d.ts +0 -2
- package/dist/__tests__/integration-data-service.test.d.ts.map +0 -1
- package/dist/__tests__/integration-data-service.test.js +0 -132
- package/dist/__tests__/integration-data-service.test.js.map +0 -1
- package/dist/__tests__/mapping-validation.test.d.ts +0 -2
- package/dist/__tests__/mapping-validation.test.d.ts.map +0 -1
- package/dist/__tests__/mapping-validation.test.js +0 -170
- package/dist/__tests__/mapping-validation.test.js.map +0 -1
- package/dist/__tests__/scheduling.test.d.ts +0 -2
- package/dist/__tests__/scheduling.test.d.ts.map +0 -1
- package/dist/__tests__/scheduling.test.js +0 -205
- package/dist/__tests__/scheduling.test.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-monitoring.component.js","sourceRoot":"","sources":["../../../src/AI/components/execution-monitoring.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { map, takeUntil, debounceTime } from 'rxjs/operators';\nimport {\n AIInstrumentationService,\n DashboardKPIs,\n TrendData,\n LiveExecution,\n ChartData,\n ExecutionDetails\n} from '../services/ai-instrumentation.service';\nimport { DataPointClickEvent } from './charts/time-series-chart.component';\nimport { KPICardData } from './widgets/kpi-card.component';\nimport { HeatmapData } from './charts/performance-heatmap.component';\nimport { RunView, CompositeKey } from '@memberjunction/core';\nimport { ResourceData } from \"@memberjunction/core-entities\";\nimport { MJAIPromptRunEntityExtended, MJAIAgentRunEntityExtended, MJAIModelEntityExtended } from '@memberjunction/ai-core-plus';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\n\nexport interface DrillDownTab {\n id: string;\n title: string;\n type: 'chart' | 'executions' | 'model-detail';\n data?: any;\n timestamp?: Date;\n metric?: string;\n closeable: boolean;\n}\n\nexport interface ExecutionRecord {\n id: string;\n type: 'prompt' | 'agent';\n name: string;\n model?: string;\n status: string;\n startTime: Date;\n endTime?: Date;\n duration: number;\n cost: number;\n tokens: number;\n errorMessage?: string;\n}\n\nexport interface ExecutionMonitoringState {\n selectedTimeRange: string;\n refreshInterval: number;\n panelStates: {\n cost: boolean;\n efficiency: boolean;\n executions: boolean;\n };\n drillDownTabs: Array<{\n id: string;\n title: string;\n type: string;\n timestamp?: string;\n metric?: string;\n }>;\n activeTabId: string;\n splitterSizes?: number[];\n}\n/**\n * AI Monitor Resource - displays AI execution monitoring and analytics\n * Extends BaseResourceComponent to work with the resource type system\n */\n@RegisterClass(BaseResourceComponent, 'AIMonitorResource')\n@Component({\n standalone: false,\n selector: 'app-execution-monitoring',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"execution-monitoring\" [class.loading]=\"isLoading\">\n <!-- Loading Overlay -->\n @if (isLoading) {\n <div class=\"loading-overlay\">\n <mj-loading text=\"Loading dashboard data...\" size=\"large\"></mj-loading>\n </div>\n }\n <!-- Header Controls -->\n <div class=\"monitoring-header\">\n <h2 class=\"monitoring-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n AI Execution Monitoring\n </h2>\n \n <div class=\"monitoring-controls\">\n <div class=\"time-range-control\">\n <label>Time Range:</label>\n <select [(ngModel)]=\"selectedTimeRange\" (change)=\"onTimeRangeChange()\" [disabled]=\"isLoading\">\n <option value=\"1h\">Last Hour</option>\n <option value=\"6h\">Last 6 Hours</option>\n <option value=\"24h\">Last 24 Hours</option>\n <option value=\"7d\">Last 7 Days</option>\n <option value=\"30d\">Last 30 Days</option>\n </select>\n </div>\n \n <button class=\"refresh-btn\" (click)=\"refreshData()\" [disabled]=\"isLoading\">\n <i class=\"fa-solid fa-refresh\" [class.spinning]=\"isLoading\"></i>\n Refresh\n </button>\n </div>\n </div>\n\n <!-- KPI Dashboard -->\n <div class=\"kpi-dashboard\">\n <div class=\"kpi-grid\">\n @for (kpi of kpiCards$ | async; track kpi.title) {\n <app-kpi-card \n [data]=\"kpi\"\n (click)=\"onKpiClick(kpi)\"\n [class.clickable]=\"isKpiClickable(kpi)\"\n ></app-kpi-card>\n }\n </div>\n </div>\n\n <!-- Main Dashboard with Kendo Splitter -->\n <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 (dataPointClick)=\"onDataPointClick($event)\"\n (timeRangeChange)=\"onChartTimeRangeChange($event)\"\n ></app-time-series-chart>\n </div>\n }\n \n @if (activeTab?.type === 'executions') {\n <div class=\"tab-pane executions-drill-down\">\n <div class=\"drill-down-header\">\n <h4>\n <i class=\"fa-solid fa-list\"></i>\n {{ activeTab?.title }}\n </h4>\n <div class=\"drill-down-meta\">\n @if (activeTab?.timestamp) {\n <span class=\"timestamp\">{{ getFormattedTimestamp(activeTab) }}</span>\n }\n @if (activeTab?.metric) {\n <span class=\"metric-badge\">{{ getFormattedMetricLabel(activeTab) }}</span>\n }\n </div>\n </div>\n \n @if (loadingDrillDown) {\n <div class=\"loading-spinner\">\n <mj-loading text=\"Loading execution details...\" size=\"small\"></mj-loading>\n </div>\n } @else if (activeTab?.data?.length > 0) {\n <div class=\"executions-table\">\n <div class=\"table-header\">\n <div class=\"header-cell\">Type</div>\n <div class=\"header-cell\">Name</div>\n <div class=\"header-cell\">Model</div>\n <div class=\"header-cell\">Status</div>\n <div class=\"header-cell\">Duration</div>\n <div class=\"header-cell\">Cost</div>\n <div class=\"header-cell\">Tokens</div>\n <div class=\"header-cell\">Time</div>\n </div>\n @for (execution of activeTab?.data; track execution.id) {\n <div \n class=\"table-row\"\n (click)=\"viewExecutionDetail(execution)\"\n >\n <div class=\"table-cell\">\n <span class=\"type-badge\" [class]=\"'type-badge--' + execution.type\">\n {{ execution.type }}\n </span>\n </div>\n <div class=\"table-cell\">{{ execution.name }}</div>\n <div class=\"table-cell\">{{ execution.model || 'N/A' }}</div>\n <div class=\"table-cell\">\n <span class=\"status-badge\" [class]=\"'status-badge--' + execution.status\">\n {{ execution.status }}\n </span>\n </div>\n <div class=\"table-cell\">{{ formatDuration(execution.duration) }}</div>\n <div class=\"table-cell\">{{ formatCurrency(execution.cost) }}</div>\n <div class=\"table-cell\">{{ execution.tokens.toLocaleString() }}</div>\n <div class=\"table-cell\">{{ formatTime(execution.startTime) }}</div>\n </div>\n }\n </div>\n } @else {\n <div class=\"no-data\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No executions found for this time period</p>\n </div>\n }\n </div>\n }\n \n @if (activeTab?.type === 'model-detail') {\n <div class=\"tab-pane model-detail\">\n <div class=\"drill-down-header\">\n <h4>\n <i class=\"fa-solid fa-microchip\"></i>\n Model Details: {{ activeTab?.data?.name }}\n </h4>\n </div>\n \n @if (loadingDrillDown) {\n <div class=\"loading-spinner\">\n <mj-loading text=\"Loading model details...\" size=\"small\"></mj-loading>\n </div>\n } @else if (activeTab?.data) {\n <div class=\"model-details\">\n <div class=\"model-info-grid\">\n <div class=\"info-item\">\n <label>Model Name:</label>\n <span>{{ activeTab?.data?.name }}</span>\n </div>\n <div class=\"info-item\">\n <label>Vendor:</label>\n <span>{{ activeTab?.data?.vendor }}</span>\n </div>\n <div class=\"info-item\">\n <label>API Name:</label>\n <span>{{ activeTab?.data?.apiName }}</span>\n </div>\n <div class=\"info-item\">\n <label>Input Cost:</label>\n <span>\\${{ activeTab?.data?.inputTokenCost?.toFixed(6) || '0' }} per token</span>\n </div>\n <div class=\"info-item\">\n <label>Output Cost:</label>\n <span>\\${{ activeTab?.data?.outputTokenCost?.toFixed(6) || '0' }} per token</span>\n </div>\n <div class=\"info-item\">\n <label>Active:</label>\n <span class=\"status-indicator\" [class.active]=\"activeTab?.data?.isActive\">\n {{ activeTab?.data?.isActive ? 'Yes' : 'No' }}\n </span>\n </div>\n </div>\n \n @if (activeTab?.data?.description) {\n <div class=\"model-description\">\n <h5>Description</h5>\n <p>{{ activeTab?.data?.description }}</p>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n </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 <div class=\"analysis-panel\">\n <div class=\"panel-header\" (click)=\"togglePanel('cost')\">\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-dollar-sign\"></i>\n Cost Analysis\n </span>\n <i class=\"fa-solid panel-toggle-icon\" [class.fa-chevron-down]=\"!panelStates.cost\" [class.fa-chevron-up]=\"panelStates.cost\"></i>\n </div>\n @if (panelStates.cost) {\n <div class=\"panel-content\">\n @if (costData$ | async; as costData) {\n <div class=\"cost-bars\">\n @for (item of costData.slice(0, 8); track item.model) {\n <div class=\"cost-bar-item\">\n <div class=\"cost-bar-info\">\n <span class=\"model-name\">{{ item.model }}</span>\n <span class=\"cost-value\">{{ formatCurrency(item.cost) }}</span>\n </div>\n <div class=\"cost-bar-container\">\n <div \n class=\"cost-bar\"\n [style.width.%]=\"getCostBarWidth(item.cost, getMaxCost(costData))\"\n ></div>\n </div>\n <div class=\"token-info\">\n {{ formatTokens(item.tokens) }} tokens\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Token Efficiency Panel -->\n <div class=\"analysis-panel\">\n <div class=\"panel-header\" (click)=\"togglePanel('efficiency')\">\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-chart-pie\"></i>\n Token Efficiency\n </span>\n <i class=\"fa-solid panel-toggle-icon\" [class.fa-chevron-down]=\"!panelStates.efficiency\" [class.fa-chevron-up]=\"panelStates.efficiency\"></i>\n </div>\n @if (panelStates.efficiency) {\n <div class=\"panel-content\">\n @if (tokenEfficiency$ | async; as efficiencyData) {\n <div class=\"efficiency-items\">\n @for (item of efficiencyData.slice(0, 6); track item.model) {\n <div class=\"efficiency-item\">\n <div class=\"efficiency-header\">\n <span class=\"model-name\">{{ item.model }}</span>\n <span class=\"efficiency-ratio\">\n {{ getTokenRatio(item.inputTokens, item.outputTokens) }}\n </span>\n </div>\n <div class=\"token-breakdown\">\n <div class=\"token-bar\">\n <div \n class=\"token-segment token-segment--input\"\n [style.width.%]=\"getTokenPercentage(item.inputTokens, item.inputTokens + item.outputTokens)\"\n ></div>\n <div \n class=\"token-segment token-segment--output\"\n [style.width.%]=\"getTokenPercentage(item.outputTokens, item.inputTokens + item.outputTokens)\"\n ></div>\n </div>\n <div class=\"token-labels\">\n <span class=\"input-label\">Input: {{ formatTokens(item.inputTokens) }}</span>\n <span class=\"output-label\">Output: {{ formatTokens(item.outputTokens) }}</span>\n </div>\n </div>\n <div class=\"cost-per-token\">\n {{ formatCostPerToken(item.cost, item.inputTokens + item.outputTokens) }}\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Live Executions Panel -->\n <div class=\"analysis-panel\">\n <div class=\"panel-header\" (click)=\"togglePanel('executions')\">\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-bolt\"></i>\n Live Executions\n </span>\n <i class=\"fa-solid panel-toggle-icon\" [class.fa-chevron-down]=\"!panelStates.executions\" [class.fa-chevron-up]=\"panelStates.executions\"></i>\n </div>\n @if (panelStates.executions) {\n <div class=\"panel-content live-executions-panel\">\n <app-live-execution-widget\n [executions]=\"(liveExecutions$ | async) ?? []\"\n (executionClick)=\"onExecutionClick($event)\"\n ></app-live-execution-widget>\n </div>\n }\n </div>\n </div>\n </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 .no-data {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n color: var(--mj-text-disabled);\n gap: 16px;\n }\n\n .no-data i {\n font-size: 48px;\n color: var(--mj-border-default);\n }\n\n .no-data p {\n margin: 0;\n font-size: 14px;\n }\n\n /* Model detail styles */\n .model-detail {\n padding: 20px;\n overflow-y: auto;\n }\n\n .model-details {\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n .model-info-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 16px;\n }\n\n .info-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 16px;\n background: var(--mj-bg-surface-card);\n border-radius: 6px;\n }\n\n .info-item label {\n font-size: 11px;\n color: var(--mj-text-muted);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin: 0;\n }\n\n .info-item span {\n font-size: 14px;\n color: var(--mj-text-primary);\n font-weight: 500;\n }\n\n .status-indicator {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n }\n\n .status-indicator.active {\n color: var(--mj-status-success);\n }\n\n .status-indicator.active::before {\n content: '';\n width: 6px;\n height: 6px;\n background: var(--mj-status-success);\n border-radius: 50%;\n }\n\n .model-description {\n padding: 20px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n }\n\n .model-description h5 {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .model-description p {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.5;\n }\n\n /* Clickable KPI cards */\n .clickable {\n cursor: pointer;\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n\n .clickable:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n }\n\n /* Collapsible Panel Styles */\n .analysis-panels {\n padding: 12px;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n }\n\n .analysis-panel {\n margin-bottom: 12px;\n border-radius: 10px;\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n background: var(--mj-bg-surface);\n overflow: hidden;\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .analysis-panel:hover {\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n }\n\n .analysis-panel:last-child {\n margin-bottom: 0;\n }\n\n .panel-header {\n padding: 14px 18px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n cursor: pointer;\n display: flex;\n justify-content: space-between;\n align-items: center;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .panel-header:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .panel-title {\n display: flex;\n align-items: center;\n gap: 10px;\n font-weight: 600;\n color: var(--mj-text-primary);\n font-size: 14px;\n }\n\n .panel-title i {\n color: var(--mj-brand-primary);\n width: 18px;\n }\n\n .panel-toggle-icon {\n color: var(--mj-brand-primary);\n font-size: 12px;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .panel-content {\n padding: 18px;\n border-top: 1px solid color-mix(in srgb, var(--mj-brand-primary) 5%, transparent);\n animation: slideDown 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n @keyframes slideDown {\n from {\n opacity: 0;\n max-height: 0;\n }\n to {\n opacity: 1;\n max-height: 500px;\n }\n }\n\n .live-executions-panel {\n padding: 0;\n }\n\n .live-executions-panel app-live-execution-widget {\n height: 300px;\n display: block;\n }\n\n /* Responsive Design */\n @media (max-width: 1200px) {\n .dashboard-splitter {\n min-height: 400px;\n }\n \n .table-header,\n .table-row {\n grid-template-columns: 60px 1fr 100px 80px 80px 60px 80px 100px;\n gap: 8px;\n }\n \n .model-info-grid {\n grid-template-columns: 1fr;\n }\n \n .analysis-panels {\n padding: 8px;\n }\n \n .analysis-panel {\n margin-bottom: 8px;\n }\n }\n\n @media (max-width: 768px) {\n .execution-monitoring {\n padding: 12px;\n }\n \n .monitoring-header {\n flex-direction: column;\n align-items: flex-start;\n }\n \n .monitoring-controls {\n width: 100%;\n justify-content: flex-start;\n }\n \n .dashboard-splitter {\n min-height: 350px;\n }\n \n .kpi-grid {\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n }\n\n /* Reduce padding on smaller screens */\n :host ::ng-deep 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-header {\n padding: 10px 12px;\n }\n \n .panel-title {\n font-size: 13px;\n }\n }\n `]\n})\nexport class ExecutionMonitoringComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n protected override destroy$ = new Subject<void>();\n private stateChangeSubject$ = new Subject<ExecutionMonitoringState>();\n\n // Configuration\n selectedTimeRange = '24h';\n isLoading = false;\n\n // Chart configurations\n timeSeriesConfig = {\n showGrid: true,\n showTooltip: true,\n animationDuration: 500,\n useDualAxis: true\n };\n\n heatmapConfig = {\n height: 350,\n showTooltip: true,\n animationDuration: 300\n };\n\n // Data streams\n kpis$: Observable<DashboardKPIs>;\n trends$: Observable<TrendData[]>;\n liveExecutions$: Observable<LiveExecution[]>;\n chartData$: Observable<ChartData>;\n\n // Derived data streams\n kpiCards$: Observable<KPICardData[]>;\n performanceMatrix$: Observable<HeatmapData[]>;\n costData$: Observable<{ model: string; cost: number; tokens: number }[]>;\n tokenEfficiency$: Observable<{ inputTokens: number; outputTokens: number; cost: number; model: string }[]>;\n\n // Modal state\n selectedExecution: LiveExecution | null = null;\n executionDetails: ExecutionDetails | null = null;\n loadingExecutionDetails = false;\n\n // Drill-down tab state\n drillDownTabs: DrillDownTab[] = [];\n activeTabId: string = 'main-chart';\n loadingDrillDown = false;\n\n // Panel state for collapsible sections\n panelStates = {\n cost: true,\n efficiency: true, // Expanded by default\n executions: false\n };\n\n get activeTab(): DrillDownTab | undefined {\n return this.drillDownTabs.find(tab => tab.id === this.activeTabId);\n }\n\n constructor(\n private instrumentationService: AIInstrumentationService,\n private 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 // 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 private createKPICards(kpis: DashboardKPIs): KPICardData[] {\n return [\n {\n title: 'Total Executions',\n value: kpis.totalExecutions,\n icon: 'fa-chart-bar',\n color: 'primary',\n subtitle: `${kpis.activeExecutions} active`\n },\n {\n title: 'Total Cost',\n value: `$${kpis.totalCost.toFixed(4)}`,\n icon: 'fa-dollar-sign',\n color: 'warning',\n subtitle: `${kpis.costCurrency} • $${kpis.dailyCostBurn.toFixed(2)}/day`\n },\n {\n title: 'Success Rate',\n value: `${(kpis.successRate * 100).toFixed(1)}%`,\n icon: 'fa-check-circle',\n color: 'success',\n subtitle: `${(kpis.errorRate * 100).toFixed(1)}% errors`\n },\n {\n title: 'Avg Response Time',\n value: `${(kpis.avgExecutionTime / 1000).toFixed(2)}s`,\n icon: 'fa-clock',\n color: 'info',\n subtitle: 'All models average'\n },\n {\n title: 'Token Usage',\n value: this.formatTokens(kpis.totalTokens),\n icon: 'fa-coins',\n color: 'primary',\n subtitle: `$${kpis.costPerToken.toFixed(6)}/token`\n },\n {\n title: 'Top Model',\n value: kpis.topModel,\n icon: 'fa-microchip',\n color: 'info',\n subtitle: 'Most used'\n }\n ];\n }\n\n onTimeRangeChange(): void {\n // Simply change time range - loading state is managed by the service\n this.setTimeRange(this.selectedTimeRange);\n this.emitStateChange();\n }\n\n private setTimeRange(range: string): void {\n const { start, end } = this.getTimeRangeFromSelection(range);\n this.instrumentationService.setDateRange(start, end);\n }\n \n private getTimeRangeFromSelection(range?: string): { start: Date; end: Date } {\n const now = new Date();\n const selectedRange = range || this.selectedTimeRange;\n let start: Date;\n\n switch (selectedRange) {\n case '1h':\n start = new Date(now.getTime() - 60 * 60 * 1000);\n break;\n case '6h':\n start = new Date(now.getTime() - 6 * 60 * 60 * 1000);\n break;\n case '24h':\n start = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n break;\n case '7d':\n start = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case '30d':\n start = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n default:\n start = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n }\n\n return { start, end: now };\n }\n\n refreshData(): void {\n // Simply trigger refresh - loading state is managed by the service\n this.instrumentationService.refresh();\n }\n\n onExecutionClick(execution: LiveExecution): void {\n this.selectedExecution = execution;\n this.loadExecutionDetails(execution);\n }\n\n onDataPointClick(event: DataPointClickEvent): void {\n const timestamp = event.data.timestamp;\n const metric = event.metric;\n \n // Create new drill-down tab\n const tabId = `drill-down-${timestamp.getTime()}-${metric}`;\n const tabTitle = `${this.getMetricDisplayLabel(metric)} - ${this.formatTimestamp(timestamp)}`;\n \n const newTab: DrillDownTab = {\n id: tabId,\n title: tabTitle,\n type: 'executions',\n timestamp: timestamp,\n metric: metric,\n closeable: true\n };\n \n // Add tab if it doesn't exist\n if (!this.drillDownTabs.find(tab => tab.id === tabId)) {\n this.drillDownTabs.push(newTab);\n this.emitStateChange(); // Emit state when new tab is added\n this.cdr.markForCheck();\n }\n \n // Switch to the new tab\n this.selectTab(tabId);\n \n // Load drill-down data\n this.loadDrillDownData(newTab);\n }\n\n onChartTimeRangeChange(range: string): void {\n this.selectedTimeRange = range;\n this.setTimeRange(range);\n }\n\n private getMetricValue(data: TrendData, metric: string): number {\n switch (metric) {\n case 'executions': return data.executions;\n case 'cost': return data.cost;\n case 'tokens': return data.tokens;\n case 'avgTime': return data.avgTime;\n case 'errors': return data.errors;\n default: return 0;\n }\n }\n\n private formatMetricValue(metric: string, value: number): string {\n switch (metric) {\n case 'executions': return value.toLocaleString();\n case 'cost': return `$${value.toFixed(4)}`;\n case 'tokens': return value.toLocaleString();\n case 'avgTime': return `${(value / 1000).toFixed(1)}s`;\n case 'errors': return value.toString();\n default: return value.toString();\n }\n }\n\n private async loadExecutionDetails(execution: LiveExecution): Promise<void> {\n this.loadingExecutionDetails = true;\n this.executionDetails = null;\n\n try {\n const details = await this.instrumentationService.getExecutionDetails(\n execution.id,\n execution.type\n );\n this.executionDetails = details;\n } catch (error) {\n console.error('Error loading execution details:', error);\n } finally {\n this.loadingExecutionDetails = false;\n }\n }\n\n closeExecutionModal(): void {\n this.selectedExecution = null;\n this.executionDetails = null;\n this.loadingExecutionDetails = false;\n }\n\n openFullRecord(): void {\n if (this.selectedExecution) {\n // Determine the entity name based on the execution type\n const entityName = this.selectedExecution.type === 'prompt'\n ? 'MJ: AI Prompt Runs'\n : 'MJ: AI Agent Runs';\n\n // Open the record using NavigationService\n const compositeKey = new CompositeKey([{ FieldName: 'ID', Value: this.selectedExecution.id }]);\n this.navigationService.OpenEntityRecord(entityName, compositeKey);\n\n // Close the modal\n this.closeExecutionModal();\n }\n }\n\n // Utility methods for templates\n trackByKpiTitle(index: number, kpi: KPICardData): string {\n return kpi.title;\n }\n\n trackByCostModel(index: number, item: { model: string; cost: number; tokens: number }): string {\n return item.model;\n }\n\n trackByEfficiencyModel(index: number, item: { model: string; inputTokens: number; outputTokens: number; cost: number }): string {\n return item.model;\n }\n\n formatTokens(tokens: number): string {\n if (tokens >= 1000000) {\n return `${(tokens / 1000000).toFixed(1)}M`;\n } else if (tokens >= 1000) {\n return `${(tokens / 1000).toFixed(1)}K`;\n }\n return tokens.toString();\n }\n\n formatCurrency(amount: number, decimals: number = 4): string {\n return `$${amount.toFixed(decimals)}`;\n }\n\n formatCostPerToken(cost: number, tokens: number): string {\n const costPer1K = tokens > 0 ? (cost / tokens) * 1000 : 0;\n return `$${costPer1K.toFixed(4)}/1K tokens`;\n }\n\n getCostBarWidth(cost: number, maxCost: number): number {\n return maxCost > 0 ? (cost / maxCost) * 100 : 0;\n }\n\n getMaxCost(costData: { cost: number }[]): number {\n return Math.max(...costData.map(item => item.cost));\n }\n\n getTokenRatio(input: number, output: number): string {\n const total = input + output;\n if (total === 0) return '0:0';\n const ratio = output / input;\n return `1:${ratio.toFixed(1)}`;\n }\n\n getTokenPercentage(tokens: number, total: number): number {\n return total > 0 ? (tokens / total) * 100 : 0;\n }\n\n getCostPerToken(cost: number, tokens: number): string {\n const costPer1K = tokens > 0 ? (cost / tokens) * 1000 : 0;\n return costPer1K.toFixed(4);\n }\n\n // Tab management methods\n selectTab(tabId: string): void {\n this.activeTabId = tabId;\n // Trigger chart resize after tab switch to fix chart rendering\n setTimeout(() => {\n window.dispatchEvent(new Event('resize'));\n }, 100);\n this.emitStateChange();\n this.cdr.markForCheck();\n }\n\n closeTab(event: MouseEvent, tabId: string): void {\n event.stopPropagation();\n \n const tabIndex = this.drillDownTabs.findIndex(tab => tab.id === tabId);\n if (tabIndex === -1) return;\n \n // Remove the tab\n this.drillDownTabs.splice(tabIndex, 1);\n \n // If we closed the active tab, switch to another tab\n if (this.activeTabId === tabId) {\n if (this.drillDownTabs.length > 0) {\n // Switch to the previous tab or first tab\n const newActiveIndex = Math.max(0, tabIndex - 1);\n this.activeTabId = this.drillDownTabs[newActiveIndex].id;\n // Trigger resize after tab switch\n setTimeout(() => {\n window.dispatchEvent(new Event('resize'));\n }, 100);\n } else {\n // No tabs left, this shouldn't happen as main chart is not closeable\n this.activeTabId = 'main-chart';\n }\n }\n \n this.emitStateChange();\n }\n\n // KPI click handling\n onKpiClick(kpi: KPICardData): void {\n if (kpi.title === 'Top Model' && kpi.value !== 'N/A') {\n this.openModelDrillDown(String(kpi.value));\n }\n // Add other KPI drill-downs as needed\n }\n\n isKpiClickable(kpi: KPICardData): boolean {\n return kpi.title === 'Top Model' && kpi.value !== 'N/A';\n }\n\n private async openModelDrillDown(modelName: string): Promise<void> {\n const tabId = `model-detail-${modelName.replace(/[^a-zA-Z0-9]/g, '-')}`;\n const tabTitle = `Model: ${modelName}`;\n \n // Check if tab already exists\n if (this.drillDownTabs.find(tab => tab.id === tabId)) {\n this.selectTab(tabId);\n return;\n }\n \n // Create new model detail tab\n const newTab: DrillDownTab = {\n id: tabId,\n title: tabTitle,\n type: 'model-detail',\n closeable: true\n };\n \n this.drillDownTabs.push(newTab);\n this.selectTab(tabId);\n \n // Load model details\n this.loadModelDetails(newTab, modelName);\n }\n\n private async loadDrillDownData(tab: DrillDownTab): Promise<void> {\n if (!tab.timestamp) return;\n \n this.loadingDrillDown = true;\n \n try {\n // Determine bucket size based on selected time range\n const { start, end } = this.getTimeRangeFromSelection();\n const duration = end.getTime() - start.getTime();\n const hours = duration / (1000 * 60 * 60);\n \n let windowSizeMs: number;\n let alignToDay = false;\n \n if (hours <= 24) {\n // For up to 24 hours, use 1 hour window (30 min before and after)\n windowSizeMs = 30 * 60 * 1000;\n } else if (hours <= 24 * 7) {\n // For up to 7 days, use full day window\n // Since data is aggregated into 4-hour buckets, we need to capture the full day\n windowSizeMs = 12 * 60 * 60 * 1000; // 12 hours before/after = 24 hour window\n alignToDay = true;\n } else {\n // For more than 7 days, use full day window\n windowSizeMs = 12 * 60 * 60 * 1000; // 12 hours before/after = 24 hour window\n alignToDay = true;\n }\n \n // Create time window around the clicked point\n let startTime = new Date(tab.timestamp.getTime() - windowSizeMs);\n let endTime = new Date(tab.timestamp.getTime() + windowSizeMs);\n \n // For day-aligned queries, expand to full day boundaries\n if (alignToDay) {\n // Set start to beginning of the day\n startTime = new Date(tab.timestamp);\n startTime.setHours(0, 0, 0, 0);\n \n // Set end to end of the day\n endTime = new Date(tab.timestamp);\n endTime.setHours(23, 59, 59, 999);\n }\n \n // Load executions for this time period\n const [promptResults, agentResults] = await Promise.all([\n new RunView().RunView<MJAIPromptRunEntityExtended>({\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `RunAt >= '${startTime.toISOString()}' AND RunAt <= '${endTime.toISOString()}'`,\n OrderBy: 'RunAt DESC' \n }),\n new RunView().RunView<MJAIAgentRunEntityExtended>({\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `StartedAt >= '${startTime.toISOString()}' AND StartedAt <= '${endTime.toISOString()}'`,\n OrderBy: 'StartedAt DESC' \n })\n ]);\n \n // Convert to ExecutionRecord format\n const executions: ExecutionRecord[] = [];\n \n // Add prompt executions\n for (const run of promptResults.Results) {\n const duration = run.CompletedAt ? \n new Date(run.CompletedAt).getTime() - new Date(run.RunAt).getTime() : \n Date.now() - new Date(run.RunAt).getTime();\n \n executions.push({\n id: run.ID,\n type: 'prompt',\n name: run.Prompt || 'Unnamed Prompt',\n model: run.Model || undefined,\n status: run.Success ? 'completed' : (run.Success === false ? 'failed' : 'running'),\n startTime: new Date(run.RunAt),\n endTime: run.CompletedAt ? new Date(run.CompletedAt) : undefined,\n duration: duration,\n cost: run.Cost || 0,\n tokens: run.TokensUsed || 0,\n errorMessage: run.ErrorMessage || undefined\n });\n }\n \n // Add agent executions\n for (const run of agentResults.Results) {\n const duration = run.CompletedAt ? \n new Date(run.CompletedAt).getTime() - new Date(run.StartedAt).getTime() : \n Date.now() - new Date(run.StartedAt).getTime();\n \n executions.push({\n id: run.ID,\n type: 'agent',\n name: run.Agent || 'Unnamed Agent',\n status: run.Status.toLowerCase(),\n startTime: new Date(run.StartedAt),\n endTime: run.CompletedAt ? new Date(run.CompletedAt) : undefined,\n duration: duration,\n cost: run.TotalCost || 0,\n tokens: run.TotalTokensUsed || 0,\n errorMessage: run.ErrorMessage || undefined\n });\n }\n \n // Sort by start time (most recent first)\n executions.sort((a, b) => b.startTime.getTime() - a.startTime.getTime());\n \n // Update tab data\n tab.data = executions;\n this.cdr.markForCheck();\n \n } catch (error) {\n console.error('Error loading drill-down data:', error);\n tab.data = [];\n this.cdr.markForCheck();\n } finally {\n this.loadingDrillDown = false;\n this.cdr.markForCheck();\n }\n }\n\n private async loadModelDetails(tab: DrillDownTab, modelName: string): Promise<void> {\n this.loadingDrillDown = true;\n \n try {\n // Find model by name\n const rv = new RunView();\n const result = await rv.RunView<MJAIModelEntityExtended>({\n EntityName: 'MJ: AI Models',\n ExtraFilter: `Name = '${modelName.replace(/'/g, \"''\")}'` \n });\n \n const model = result.Results[0];\n if (model) {\n tab.data = {\n name: model.Name,\n vendor: model.Vendor,\n apiName: model.APIName,\n inputTokenCost: 0, // Not available in current model\n outputTokenCost: 0, // Not available in current model \n isActive: model.IsActive,\n description: model.Description\n };\n } else {\n tab.data = null;\n }\n \n } catch (error) {\n console.error('Error loading model details:', error);\n tab.data = null;\n } finally {\n this.loadingDrillDown = false;\n }\n }\n\n // Helper methods for drill-down\n\n formatTimestamp(timestamp: Date): string {\n return timestamp.toLocaleString();\n }\n\n formatTime(time: Date): string {\n return time.toLocaleTimeString();\n }\n\n getMetricDisplayLabel(metric: string): string {\n const labels: { [key: string]: string } = {\n executions: 'Executions',\n cost: 'Cost',\n tokens: 'Tokens',\n avgTime: 'Avg Time',\n errors: 'Errors'\n };\n return labels[metric] || metric;\n }\n\n getFormattedTimestamp(tab: DrillDownTab | undefined): string {\n return tab?.timestamp ? this.formatTimestamp(tab.timestamp) : '';\n }\n\n getFormattedMetricLabel(tab: DrillDownTab | undefined): string {\n return tab?.metric ? this.getMetricDisplayLabel(tab.metric) : '';\n }\n\n // Panel management methods\n togglePanel(panelName: 'cost' | 'efficiency' | 'executions'): void {\n this.panelStates[panelName] = !this.panelStates[panelName];\n this.emitStateChange();\n }\n\n viewExecutionDetail(execution: ExecutionRecord): void {\n // Convert ExecutionRecord to LiveExecution format for the modal\n const liveExecution: LiveExecution = {\n id: execution.id,\n type: execution.type,\n name: execution.name,\n status: execution.status as 'running' | 'completed' | 'failed',\n startTime: execution.startTime,\n duration: execution.duration,\n cost: execution.cost,\n tokens: execution.tokens\n };\n \n this.onExecutionClick(liveExecution);\n }\n\n formatDuration(milliseconds: number): string {\n const seconds = Math.floor(milliseconds / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m ${seconds % 60}s`;\n } else if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n } else {\n return `${seconds}s`;\n }\n }\n\n getDuration(details: ExecutionDetails): number {\n const start = details.startTime.getTime();\n const end = details.endTime ? details.endTime.getTime() : Date.now();\n return end - start;\n }\n\n onSplitterLayoutChange(event: any): void {\n // Trigger window resize event to force charts to recalculate dimensions\n setTimeout(() => {\n window.dispatchEvent(new Event('resize'));\n }, 100);\n\n // Emit state change when splitter changes\n this.emitStateChange();\n }\n\n // === BaseResourceComponent Required Methods ===\n\n /**\n * Get the display name for this resource\n */\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Monitor';\n }\n\n /**\n * Get the icon class for this resource\n */\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-chart-line';\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"execution-monitoring.component.js","sourceRoot":"","sources":["../../../src/AI/components/execution-monitoring.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAwC,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACzG,OAAO,EAAc,OAAO,EAAE,MAAM,MAAM,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAY9D,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAG7D,OAAO,EAAE,qBAAqB,EAAqB,MAAM,2BAA2B,CAAC;;;;;;;;;;;;;;;;IAyD7E,8BAA6B;IAC3B,iCAAuE;IACzE,iBAAM;;;;IAgCF,wCAIC;IAFC,wNAAS,yBAAe,KAAC;IAE1B,iBAAe;;;;IADd,0DAAuC;IAFvC,6BAAY;;;IA0BF,AADF,AADF,+BAA4B,cACC,cACqB;IAC5C,wBAAiC;IACnC,iBAAM;IAEJ,AADF,+BAAyB,cACG;IAAA,4BAAY;IAAA,iBAAM;IAC5C,+BAA0B;IAAA,YAA0C;IAAA,iBAAM;IAC1E,+BAA6B;IAAA,aAA4B;IAE7D,AADE,AAD2D,iBAAM,EAC3D,EACF;IAGJ,AADF,gCAA2B,eACqB;IAC5C,yBAAgD;IAClD,iBAAM;IAEJ,AADF,gCAAyB,eACG;IAAA,2BAAU;IAAA,iBAAM;IAC1C,gCAA0B;IAAA,aAAwC;IAAA,iBAAM;IACxE,gCAA6B;IAAA,aAA2C;IAE5E,AADE,AAD0E,iBAAM,EAC1E,EACF;IAGJ,AADF,gCAA2B,eACkB;IACzC,yBAAiC;IACnC,iBAAM;IAEJ,AADF,gCAAyB,eACG;IAAA,kCAAiB;IAAA,iBAAM;IACjD,gCAA0B;IAAA,aAAgD;IAAA,iBAAM;IAChF,gCAA6B;IAAA,kCAAiB;IAElD,AADE,AADgD,iBAAM,EAChD,EACF;IAGJ,AADF,gCAA2B,eACqB;IAC5C,yBAAgC;IAClC,iBAAM;IAEJ,AADF,gCAAyB,eACG;IAAA,kCAAiB;IAAA,iBAAM;IACjD,gCAA0B;IAAA,aAA2B;IAAA,iBAAM;IAC3D,gCAA6B;IAAA,kCAAiB;IAGpD,AADE,AADE,AADgD,iBAAM,EAChD,EACF,EACF;;;;IArC0B,eAA0C;IAA1C,sEAA0C;IACvC,eAA4B;IAA5B,wDAA4B;IAU/B,eAAwC;IAAxC,oEAAwC;IACrC,eAA2C;IAA3C,uEAA2C;IAU9C,eAAgD;IAAhD,4EAAgD;IAWhD,gBAA2B;IAA3B,8CAA2B;;;;IAuBrD,kCAIC;IAFC,0PAAS,kCAAwB,KAAC;IAGlC,wBAAiC;IACnC,iBAAS;;;;IAbb,+BAIC;IADC,+MAAS,2BAAiB,KAAC;IAE3B,gCAAwB;IAAA,YAAe;IAAA,iBAAO;IAC9C,yGAAqB;IASvB,iBAAM;;;;IAbJ,0DAAuC;IAGf,eAAe;IAAf,kCAAe;IACvC,cAQC;IARD,2CAQC;;;;IAQD,AADF,+BAAmC,gCAOhC;;IADC,AADA,wOAAkB,+BAAwB,KAAC,6NACxB,qCAA8B,KAAC;IAEtD,AADG,iBAAwB,EACrB;;;IANF,cAAgC;IAEhC,AAFA,yFAAgC,mCAEL;;;IAgBvB,gCAAwB;IAAA,YAAsC;IAAA,iBAAO;;;IAA7C,cAAsC;IAAtC,oEAAsC;;;IAG9D,gCAA2B;IAAA,YAAwC;IAAA,iBAAO;;;IAA/C,cAAwC;IAAxC,sEAAwC;;;IAMvE,+BAA6B;IAC3B,iCAA0E;IAC5E,iBAAM;;;;IAcF,+BAGC;IADC,oPAAS,yCAA8B,KAAC;IAGtC,AADF,+BAAwB,eAC6C;IACjE,YACF;IACF,AADE,iBAAO,EACH;IACN,+BAAwB;IAAA,YAAoB;IAAA,iBAAM;IAClD,+BAAwB;IAAA,YAA8B;IAAA,iBAAM;IAE1D,AADF,+BAAwB,eACmD;IACvE,aACF;IACF,AADE,iBAAO,EACH;IACN,gCAAwB;IAAA,aAAwC;IAAA,iBAAM;IACtE,gCAAwB;IAAA,aAAoC;IAAA,iBAAM;IAClE,gCAAwB;IAAA,aAAuC;IAAA,iBAAM;IACrE,gCAAwB;IAAA,aAAqC;IAC/D,AAD+D,iBAAM,EAC/D;;;;IAfuB,eAAyC;IAAzC,kDAAyC;IAChE,cACF;IADE,mDACF;IAEsB,eAAoB;IAApB,wCAAoB;IACpB,eAA8B;IAA9B,kDAA8B;IAEzB,eAA6C;IAA7C,sDAA6C;IACtE,cACF;IADE,qDACF;IAEsB,eAAwC;IAAxC,mEAAwC;IACxC,eAAoC;IAApC,+DAAoC;IACpC,eAAuC;IAAvC,2DAAuC;IACvC,eAAqC;IAArC,gEAAqC;;;IA7B/D,AADF,AADF,+BAA8B,cACF,cACC;IAAA,oBAAI;IAAA,iBAAM;IACnC,+BAAyB;IAAA,oBAAI;IAAA,iBAAM;IACnC,+BAAyB;IAAA,qBAAK;IAAA,iBAAM;IACpC,+BAAyB;IAAA,sBAAM;IAAA,iBAAM;IACrC,gCAAyB;IAAA,yBAAQ;IAAA,iBAAM;IACvC,gCAAyB;IAAA,qBAAI;IAAA,iBAAM;IACnC,gCAAyB;IAAA,uBAAM;IAAA,iBAAM;IACrC,gCAAyB;IAAA,qBAAI;IAC/B,AAD+B,iBAAM,EAC/B;IACN,iIAsBC;IACH,iBAAM;;;IAvBJ,gBAsBC;IAtBD,sEAsBC;;;IAGH,+BAAqB;IACnB,wBAAiC;IACjC,yBAAG;IAAA,wDAAwC;IAC7C,AAD6C,iBAAI,EAC3C;;;IA1DN,AADF,AADF,+BAA4C,cACX,SACzB;IACF,wBAAgC;IAChC,YACF;IAAA,iBAAK;IACL,+BAA6B;IAC3B,+GAA4B;IAG5B,+GAAyB;IAI7B,AADE,iBAAM,EACF;IA0CJ,AApCA,AAJF,8GAAwB,yFAIkB,0FAoCjC;IAMX,iBAAM;;;IA1DA,eACF;IADE,yFACF;IAEE,eAEC;IAFD,yFAEC;IACD,cAEC;IAFD,sFAEC;IAIL,cA6CC;IA7CD,oKA6CC;;;IAcC,+BAA6B;IAC3B,iCAAsE;IACxE,iBAAM;;;IAkCA,AADF,+BAA+B,SACzB;IAAA,2BAAW;IAAA,iBAAK;IACpB,yBAAG;IAAA,YAAkC;IACvC,AADuC,iBAAI,EACrC;;;IADD,eAAkC;IAAlC,gIAAkC;;;IA9BrC,AADF,AADF,AADF,+BAA2B,cACI,cACJ,YACd;IAAA,2BAAW;IAAA,iBAAQ;IAC1B,4BAAM;IAAA,YAA2B;IACnC,AADmC,iBAAO,EACpC;IAEJ,AADF,+BAAuB,YACd;IAAA,uBAAO;IAAA,iBAAQ;IACtB,6BAAM;IAAA,aAA6B;IACrC,AADqC,iBAAO,EACtC;IAEJ,AADF,gCAAuB,aACd;IAAA,0BAAS;IAAA,iBAAQ;IACxB,6BAAM;IAAA,aAA8B;IACtC,AADsC,iBAAO,EACvC;IAEJ,AADF,gCAAuB,aACd;IAAA,4BAAW;IAAA,iBAAQ;IAC1B,6BAAM;IAAA,aAAoE;IAC5E,AAD4E,iBAAO,EAC7E;IAEJ,AADF,gCAAuB,aACd;IAAA,6BAAY;IAAA,iBAAQ;IAC3B,6BAAM;IAAA,aAAqE;IAC7E,AAD6E,iBAAO,EAC9E;IAEJ,AADF,gCAAuB,aACd;IAAA,wBAAO;IAAA,iBAAQ;IACtB,iCAA0E;IACxE,aACF;IAEJ,AADE,AADE,iBAAO,EACH,EACF;IAEN,8HAAoC;IAMtC,iBAAM;;;IAhCM,eAA2B;IAA3B,yHAA2B;IAI3B,eAA6B;IAA7B,2HAA6B;IAI7B,eAA8B;IAA9B,4HAA8B;IAI9B,eAAoE;IAApE,iOAAoE;IAIpE,eAAqE;IAArE,mOAAqE;IAI5C,eAA0C;IAA1C,iIAA0C;IACvE,cACF;IADE,yJACF;IAIJ,cAKC;IALD,wIAKC;;;IA9CH,AADF,AADF,+BAAmC,cACF,SACzB;IACF,wBAAqC;IACrC,YACF;IACF,AADE,iBAAK,EACD;IAMJ,AAJF,8GAAwB,yFAIM;IAuChC,iBAAM;;;IA/CA,eACF;IADE,mJACF;IAGF,cA0CC;IA1CD,kHA0CC;;;IA4CO,AADF,AADF,+BAA2B,cACE,eACA;IAAA,YAAgB;IAAA,iBAAO;IAChD,gCAAyB;IAAA,YAA+B;IAC1D,AAD0D,iBAAO,EAC3D;IACN,+BAAgC;IAC9B,0BAGO;IACT,iBAAM;IACN,+BAAwB;IACtB,YACF;IACF,AADE,iBAAM,EACF;;;;;IAZuB,eAAgB;IAAhB,oCAAgB;IAChB,eAA+B;IAA/B,0DAA+B;IAKtD,eAAkE;IAAlE,oGAAkE;IAIpE,eACF;IADE,4EACF;;;IAfN,+BAAuB;IACrB,8HAgBC;IACH,iBAAM;;IAjBJ,cAgBC;IAhBD,cAAA,UAAe,CAAC,EAAE,CAAC,CAAC,CAgBnB;;;IAnBP,+BAA2B;IACzB,8GAAsC;;IAqBxC,iBAAM;;;;IArBJ,cAoBC;IApBD,sFAoBC;;;IAqBS,AADF,AADF,gCAA6B,eACI,eACJ;IAAA,YAAgB;IAAA,iBAAO;IAChD,iCAA+B;IAC7B,YACF;IACF,AADE,iBAAO,EACH;IAEJ,AADF,gCAA6B,eACJ;IAKrB,AAJA,2BAGO,eAIA;IACT,iBAAM;IAEJ,AADF,iCAA0B,iBACE;IAAA,aAA2C;IAAA,iBAAO;IAC5E,kCAA2B;IAAA,aAA6C;IAE5E,AADE,AAD0E,iBAAO,EAC3E,EACF;IACN,iCAA4B;IAC1B,aACF;IACF,AADE,iBAAM,EACF;;;;IAxBuB,eAAgB;IAAhB,oCAAgB;IAEvC,eACF;IADE,kGACF;IAMI,eAA4F;IAA5F,2HAA4F;IAI5F,cAA6F;IAA7F,4HAA6F;IAIrE,eAA2C;IAA3C,2EAA2C;IAC1C,eAA6C;IAA7C,6EAA6C;IAI1E,eACF;IADE,uHACF;;;IA3BN,gCAA8B;IAC5B,+HA4BC;IACH,iBAAM;;IA7BJ,cA4BC;IA5BD,cAAA,UAAqB,CAAC,EAAE,CAAC,CAAC,CA4BzB;;;IA/BP,+BAA2B;IACzB,+GAAmD;;IAiCrD,iBAAM;;;;IAjCJ,cAgCC;IAhCD,6FAgCC;;;;IAgBD,AADF,+BAAiD,qCAI9C;;IADC,6OAAkB,+BAAwB,KAAC;IAE/C,AADG,iBAA4B,EACzB;;;IAHF,cAA8C;IAA9C,uGAA8C;;;IAsDhD,AADF,gCAAyB,YAChB;IAAA,0BAAU;IAAA,iBAAQ;IACzB,4BAAM;IAAA,YAA8C;;IACtD,AADsD,iBAAO,EACvD;;;IADE,eAA8C;IAA9C,qFAA8C;;;IAuBpD,AADF,gCAAyB,YAChB;IAAA,sBAAM;IAAA,iBAAQ;IACrB,4BAAM;IAAA,YAA4B;IACpC,AADoC,iBAAO,EACrC;;;IADE,eAA4B;IAA5B,mDAA4B;;;IAQtC,AADF,gCAA4B,SACtB;IAAA,iCAAiB;IAAA,iBAAK;IAC1B,gCAA2B;IAAA,YAAmC;IAChE,AADgE,iBAAM,EAChE;;;IADuB,eAAmC;IAAnC,0DAAmC;;;IAW1D,AADF,AADE,gCAA6B,eACP,gBACG;IAAA,YAAgB;IAAA,iBAAO;IAChD,iCAAyB;IAAA,YAAgB;IAAA,iBAAO;IAChD,iCAAqE;IACnE,YACF;IACF,AADE,iBAAO,EACH;IAEF,AADJ,gCAA2B,WACjB;IAAA,aAAgC;IAAA,iBAAO;IAC7C,6BAAM;IAAA,aAA0C;IAElD,AADA,AADkD,iBAAO,EACnD,EACA;;;;IAVmB,eAAgB;IAAhB,oCAAgB;IAChB,eAAgB;IAAhB,oCAAgB;IACd,cAAyC;IAAzC,kDAAyC;IAClE,cACF;IADE,iDACF;IAGQ,eAAgC;IAAhC,2DAAgC;IAChC,eAA0C;IAA1C,uEAA0C;;;IAbtD,AADF,gCAA4B,SACtB;IAAA,YAAyD;IAAA,iBAAK;IAClE,gCAA8B;IAC5B,+IAcC;IAEL,AADE,iBAAM,EACF;;;IAlBA,eAAyD;IAAzD,yFAAyD;IAE3D,eAcC;IAdD,+CAcC;;;IA9EL,AADF,AADA,gCAA+B,eACH,SACtB;IAAA,iCAAiB;IAAA,iBAAK;IAGtB,AADF,AADF,gCAAyB,eACE,YAChB;IAAA,qBAAK;IAAA,iBAAQ;IACpB,4BAAM;IAAA,YAAuC;;IAC/C,AAD+C,iBAAO,EAChD;IAEJ,AADF,iCAAyB,aAChB;IAAA,sBAAK;IAAA,iBAAQ;IACpB,6BAAM;IAAA,aAA2B;IACnC,AADmC,iBAAO,EACpC;IAEJ,AADF,iCAAyB,aAChB;IAAA,wBAAO;IAAA,iBAAQ;IACtB,iCAAgF;IAC9E,aACF;;IACF,AADE,iBAAO,EACH;IAEJ,AADF,iCAAyB,aAChB;IAAA,yBAAQ;IAAA,iBAAQ;IACvB,6BAAM;IAAA,aAAgD;;IACxD,AADwD,iBAAO,EACzD;IACN,gIAAgC;IAO9B,AADF,iCAAyB,aAChB;IAAA,0BAAS;IAAA,iBAAQ;IACxB,6BAAM;IAAA,aAAmD;IAG/D,AADE,AADE,AAD2D,iBAAO,EAC5D,EACF,EACF;IAGJ,AADF,iCAA4B,UACtB;IAAA,+BAAc;IAAA,iBAAK;IAGnB,AADF,AADF,iCAAyB,gBACE,aAChB;IAAA,sBAAK;IAAA,iBAAQ;IACpB,6BAAM;IAAA,aAA8C;IACtD,AADsD,iBAAO,EACvD;IAEJ,AADF,iCAAyB,aAChB;IAAA,wBAAO;IAAA,iBAAQ;IACtB,6BAAM;IAAA,aAA8C;IACtD,AADsD,iBAAO,EACvD;IACN,gIAA8B;IAOlC,AADE,iBAAM,EACF;IAEN,gIAAqC;IAOrC,gIAA4C;IAsB5C,iBAAM;;;IA9EM,eAAuC;IAAvC,0EAAuC;IAIvC,eAA2B;IAA3B,kDAA2B;IAIN,eAAoD;IAApD,gEAAoD;IAC7E,cACF;IADE,uFACF;IAIM,eAAgD;IAAhD,yFAAgD;IAExD,eAKC;IALD,2DAKC;IAGO,eAAmD;IAAnD,wFAAmD;IAUnD,eAA8C;IAA9C,4EAA8C;IAI9C,eAA8C;IAA9C,qEAA8C;IAEtD,cAKC;IALD,yDAKC;IAIL,cAKC;IALD,gEAKC;IAED,cAqBC;IArBD,uEAqBC;;;IAKD,gCAA6B;IAC3B,kCAA2E;IAC7E,iBAAM;;;;IA1GZ,gCAA6D;IAAhC,+LAAS,4BAAqB,KAAC;IAC5D,gCAAwE;IAAnC,kKAAS,wBAAwB,KAAC;IAEnE,AADF,gCAAoC,SAC9B;IAAA,iCAAiB;IAAA,iBAAK;IAExB,AADF,gCAAkC,kBAC2B;IAA3B,kMAAS,uBAAgB,KAAC;IACxD,yBAA6C;IAC7C,sBACF;IAAA,iBAAS;IACT,mCAA0D;IAAhC,kMAAS,4BAAqB,KAAC;IACvD,yBAAiC;IAGvC,AADE,AADE,iBAAS,EACL,EACF;IACN,iCAAkC;IAChC,mHAAwB;IAwFxB,iHAA+B;IAOnC,AADA,AADE,iBAAM,EACF,EACA;;;IA/FF,gBAsFC;IAtFD,mDAsFC;IAED,cAIC;IAJD,0DAIC;;AA1gBb;;;GAGG;AACH,uFAAuF;AAoqDvF,MAAM,OAAO,4BAA6B,SAAQ,qBAAqB;IAwD3D;IACA;IAxDS,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;IAC1C,mBAAmB,GAAG,IAAI,OAAO,EAA4B,CAAC;IAEtE,gBAAgB;IAChB,iBAAiB,GAAG,KAAK,CAAC;IAC1B,SAAS,GAAG,KAAK,CAAC;IAElB,uBAAuB;IACvB,gBAAgB,GAAG;QACjB,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,IAAI;QACjB,iBAAiB,EAAE,GAAG;QACtB,WAAW,EAAE,IAAI;KAClB,CAAC;IAEF,aAAa,GAAG;QACd,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,IAAI;QACjB,iBAAiB,EAAE,GAAG;KACvB,CAAC;IAEF,eAAe;IACf,KAAK,CAA4B;IACjC,OAAO,CAA0B;IACjC,eAAe,CAA8B;IAC7C,UAAU,CAAwB;IAElC,uBAAuB;IACvB,SAAS,CAA4B;IACrC,kBAAkB,CAA4B;IAC9C,SAAS,CAAgE;IACzE,gBAAgB,CAA2F;IAE3G,cAAc;IACd,iBAAiB,GAAyB,IAAI,CAAC;IAC/C,gBAAgB,GAA4B,IAAI,CAAC;IACjD,uBAAuB,GAAG,KAAK,CAAC;IAEhC,uBAAuB;IACvB,aAAa,GAAmB,EAAE,CAAC;IACnC,WAAW,GAAW,YAAY,CAAC;IACnC,gBAAgB,GAAG,KAAK,CAAC;IAEzB,uCAAuC;IACvC,WAAW,GAAG;QACZ,IAAI,EAAE,IAAI;QACV,UAAU,EAAE,IAAI,EAAG,sBAAsB;QACzC,UAAU,EAAE,KAAK;KAClB,CAAC;IAEF,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC;IACrE,CAAC;IAED,YACU,sBAAgD,EAChD,GAAsB;QAE9B,KAAK,EAAE,CAAC;QAHA,2BAAsB,GAAtB,sBAAsB,CAA0B;QAChD,QAAG,GAAH,GAAG,CAAmB;QAG9B,0BAA0B;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;QAC/C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC;QACnD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC;QACnE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC;QAEzD,0CAA0C;QAC1C,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,IAAI,CACzC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;YACpB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,kBAAkB;QAClB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAC9B,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CACvC,CAAC;QAEF,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAC5C,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC9C,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC,CAAC,CAAC,CACL,CAAC;QAEF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CACnC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAC9B,CAAC;QAEF,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAC1C,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAClC,CAAC;IACJ,CAAC;IAED,QAAQ;QACN,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjB,6DAA6D;QAC7D,IAAI,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC;YAC7B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,yBAAyB;YACzB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAE1C,iCAAiC;YACjC,IAAI,CAAC,aAAa,GAAG;gBACnB;oBACE,EAAE,EAAE,YAAY;oBAChB,KAAK,EAAE,kBAAkB;oBACzB,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE,KAAK;iBACjB;aACF,CAAC;YAEF,4BAA4B;YAC5B,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,CAAC;QACxC,CAAC;QAED,8EAA8E;QAC9E,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAC3B,YAAY,CAAC,IAAI,CAAC,EAAE,oBAAoB;QACxC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;YACnB,oCAAoC;QACtC,CAAC,CAAC,CAAC;QAEH,gDAAgD;QAChD,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED,WAAW;QACT,KAAK,CAAC,WAAW,EAAE,CAAC;QACpB,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAC;IACtC,CAAC;IAEO,eAAe;QACrB,OAAO;YACL,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,eAAe,EAAE,CAAC,EAAE,4BAA4B;YAChD,WAAW,EAAE,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE;YACpC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC5C,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE;gBACvC,MAAM,EAAE,GAAG,CAAC,MAAM;aACnB,CAAC,CAAC;YACH,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;IACJ,CAAC;IAEO,eAAe;QACrB,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC;IAEM,aAAa,CAAC,KAAwC;QAE3D,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC;YACjD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC7C,CAAC;QAED,yEAAyE;QAEzE,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,4EAA4E;YAC5E,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACnE,CAAC;QAED,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1D,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACnD,GAAG,GAAG;gBACN,IAAI,EAAE,GAAG,CAAC,IAA+C;gBACzD,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC9D,SAAS,EAAE,GAAG,CAAC,EAAE,KAAK,YAAY;aACnC,CAAC,CAAC,CAAC;QACN,CAAC;aAAM,CAAC;YACN,8CAA8C;YAC9C,IAAI,CAAC,aAAa,GAAG;gBACnB;oBACE,EAAE,EAAE,YAAY;oBAChB,KAAK,EAAE,kBAAkB;oBACzB,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE,KAAK;iBACjB;aACF,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACvC,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,IAAmB;QACxC,OAAO;YACL;gBACE,KAAK,EAAE,kBAAkB;gBACzB,KAAK,EAAE,IAAI,CAAC,eAAe;gBAC3B,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE,GAAG,IAAI,CAAC,gBAAgB,SAAS;aAC5C;YACD;gBACE,KAAK,EAAE,YAAY;gBACnB,KAAK,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBACtC,IAAI,EAAE,gBAAgB;gBACtB,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE,GAAG,IAAI,CAAC,YAAY,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;aACzE;YACD;gBACE,KAAK,EAAE,cAAc;gBACrB,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;gBAChD,IAAI,EAAE,iBAAiB;gBACvB,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU;aACzD;YACD;gBACE,KAAK,EAAE,mBAAmB;gBAC1B,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;gBACtD,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,MAAM;gBACb,QAAQ,EAAE,oBAAoB;aAC/B;YACD;gBACE,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC1C,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;aACnD;YACD;gBACE,KAAK,EAAE,WAAW;gBAClB,KAAK,EAAE,IAAI,CAAC,QAAQ;gBACpB,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE,MAAM;gBACb,QAAQ,EAAE,WAAW;aACtB;SACF,CAAC;IACJ,CAAC;IAED,iBAAiB;QACf,qEAAqE;QACrE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC1C,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAEO,YAAY,CAAC,KAAa;QAChC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC;QAC7D,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvD,CAAC;IAEO,yBAAyB,CAAC,KAAc;QAC9C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,aAAa,GAAG,KAAK,IAAI,IAAI,CAAC,iBAAiB,CAAC;QACtD,IAAI,KAAW,CAAC;QAEhB,QAAQ,aAAa,EAAE,CAAC;YACtB,KAAK,IAAI;gBACP,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;gBACjD,MAAM;YACR,KAAK,IAAI;gBACP,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;gBACrD,MAAM;YACR,KAAK,KAAK;gBACR,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;gBACtD,MAAM;YACR,KAAK,IAAI;gBACP,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;gBAC1D,MAAM;YACR,KAAK,KAAK;gBACR,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;gBAC3D,MAAM;YACR;gBACE,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC7B,CAAC;IAED,WAAW;QACT,mEAAmE;QACnE,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,CAAC;IACxC,CAAC;IAED,gBAAgB,CAAC,SAAwB;QACvC,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;QACnC,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED,gBAAgB,CAAC,KAA0B;QACzC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;QACvC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAE5B,4BAA4B;QAC5B,MAAM,KAAK,GAAG,cAAc,SAAS,CAAC,OAAO,EAAE,IAAI,MAAM,EAAE,CAAC;QAC5D,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;QAE9F,MAAM,MAAM,GAAiB;YAC3B,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,YAAY;YAClB,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,IAAI;SAChB,CAAC;QAEF,8BAA8B;QAC9B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,mCAAmC;YAC3D,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;QAED,wBAAwB;QACxB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAEtB,uBAAuB;QACvB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,sBAAsB,CAAC,KAAa;QAClC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAEO,cAAc,CAAC,IAAe,EAAE,MAAc;QACpD,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC;YAC1C,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC;YAC9B,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC;YAClC,KAAK,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC;YACpC,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC;YAClC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,MAAc,EAAE,KAAa;QACrD,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,YAAY,CAAC,CAAC,OAAO,KAAK,CAAC,cAAc,EAAE,CAAC;YACjD,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,KAAK,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC,cAAc,EAAE,CAAC;YAC7C,KAAK,SAAS,CAAC,CAAC,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;YACvD,KAAK,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;YACvC,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,SAAwB;QACzD,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;QACpC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAE7B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,mBAAmB,CACnE,SAAS,CAAC,EAAE,EACZ,SAAS,CAAC,IAAI,CACf,CAAC;YACF,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;QACvC,CAAC;IACH,CAAC;IAED,mBAAmB;QACjB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;IACvC,CAAC;IAED,cAAc;QACZ,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,wDAAwD;YACxD,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,KAAK,QAAQ;gBACzD,CAAC,CAAC,oBAAoB;gBACtB,CAAC,CAAC,mBAAmB,CAAC;YAExB,0CAA0C;YAC1C,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC/F,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YAElE,kBAAkB;YAClB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,eAAe,CAAC,KAAa,EAAE,GAAgB;QAC7C,OAAO,GAAG,CAAC,KAAK,CAAC;IACnB,CAAC;IAED,gBAAgB,CAAC,KAAa,EAAE,IAAqD;QACnF,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,sBAAsB,CAAC,KAAa,EAAE,IAAgF;QACpH,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,YAAY,CAAC,MAAc;QACzB,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;YACtB,OAAO,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QAC7C,CAAC;aAAM,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YAC1B,OAAO,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QAC1C,CAAC;QACD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAED,cAAc,CAAC,MAAc,EAAE,WAAmB,CAAC;QACjD,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;IACxC,CAAC;IAED,kBAAkB,CAAC,IAAY,EAAE,MAAc;QAC7C,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;IAC9C,CAAC;IAED,eAAe,CAAC,IAAY,EAAE,OAAe;QAC3C,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,UAAU,CAAC,QAA4B;QACrC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,aAAa,CAAC,KAAa,EAAE,MAAc;QACzC,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;QAC7B,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;QAC7B,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACjC,CAAC;IAED,kBAAkB,CAAC,MAAc,EAAE,KAAa;QAC9C,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,eAAe,CAAC,IAAY,EAAE,MAAc;QAC1C,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,yBAAyB;IACzB,SAAS,CAAC,KAAa;QACrB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,+DAA+D;QAC/D,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5C,CAAC,EAAE,GAAG,CAAC,CAAC;QACR,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,QAAQ,CAAC,KAAiB,EAAE,KAAa;QACvC,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;QACvE,IAAI,QAAQ,KAAK,CAAC,CAAC;YAAE,OAAO;QAE5B,iBAAiB;QACjB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAEvC,qDAAqD;QACrD,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClC,0CAA0C;gBAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;gBACjD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;gBACzD,kCAAkC;gBAClC,UAAU,CAAC,GAAG,EAAE;oBACd,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC5C,CAAC,EAAE,GAAG,CAAC,CAAC;YACV,CAAC;iBAAM,CAAC;gBACN,qEAAqE;gBACrE,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC;YAClC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,qBAAqB;IACrB,UAAU,CAAC,GAAgB;QACzB,IAAI,GAAG,CAAC,KAAK,KAAK,WAAW,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACrD,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,sCAAsC;IACxC,CAAC;IAED,cAAc,CAAC,GAAgB;QAC7B,OAAO,GAAG,CAAC,KAAK,KAAK,WAAW,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC;IAC1D,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,SAAiB;QAChD,MAAM,KAAK,GAAG,gBAAgB,SAAS,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,EAAE,CAAC;QACxE,MAAM,QAAQ,GAAG,UAAU,SAAS,EAAE,CAAC;QAEvC,8BAA8B;QAC9B,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QAED,8BAA8B;QAC9B,MAAM,MAAM,GAAiB;YAC3B,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,cAAc;YACpB,SAAS,EAAE,IAAI;SAChB,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAEtB,qBAAqB;QACrB,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3C,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,GAAiB;QAC/C,IAAI,CAAC,GAAG,CAAC,SAAS;YAAE,OAAO;QAE3B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAE7B,IAAI,CAAC;YACH,qDAAqD;YACrD,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACxD,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;YACjD,MAAM,KAAK,GAAG,QAAQ,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YAE1C,IAAI,YAAoB,CAAC;YACzB,IAAI,UAAU,GAAG,KAAK,CAAC;YAEvB,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;gBAChB,kEAAkE;gBAClE,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;YAChC,CAAC;iBAAM,IAAI,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;gBAC3B,wCAAwC;gBACxC,gFAAgF;gBAChF,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,yCAAyC;gBAC7E,UAAU,GAAG,IAAI,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,4CAA4C;gBAC5C,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,yCAAyC;gBAC7E,UAAU,GAAG,IAAI,CAAC;YACpB,CAAC;YAED,8CAA8C;YAC9C,IAAI,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC,CAAC;YACjE,IAAI,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC,CAAC;YAE/D,yDAAyD;YACzD,IAAI,UAAU,EAAE,CAAC;gBACf,oCAAoC;gBACpC,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACpC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAE/B,4BAA4B;gBAC5B,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAClC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YACpC,CAAC;YAED,uCAAuC;YACvC,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACtD,IAAI,OAAO,EAAE,CAAC,OAAO,CAA8B;oBACjD,UAAU,EAAE,oBAAoB;oBAChC,WAAW,EAAE,aAAa,SAAS,CAAC,WAAW,EAAE,mBAAmB,OAAO,CAAC,WAAW,EAAE,GAAG;oBAC5F,OAAO,EAAE,YAAY;iBACtB,CAAC;gBACF,IAAI,OAAO,EAAE,CAAC,OAAO,CAA6B;oBAChD,UAAU,EAAE,mBAAmB;oBAC/B,WAAW,EAAE,iBAAiB,SAAS,CAAC,WAAW,EAAE,uBAAuB,OAAO,CAAC,WAAW,EAAE,GAAG;oBACpG,OAAO,EAAE,gBAAgB;iBAC1B,CAAC;aACH,CAAC,CAAC;YAEH,oCAAoC;YACpC,MAAM,UAAU,GAAsB,EAAE,CAAC;YAEzC,wBAAwB;YACxB,KAAK,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;gBACxC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;oBAChC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;oBACrE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;gBAE7C,UAAU,CAAC,IAAI,CAAC;oBACd,EAAE,EAAE,GAAG,CAAC,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,GAAG,CAAC,MAAM,IAAI,gBAAgB;oBACpC,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,SAAS;oBAC7B,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;oBAClF,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;oBAC9B,OAAO,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;oBAChE,QAAQ,EAAE,QAAQ;oBAClB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC;oBACnB,MAAM,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC;oBAC3B,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS;iBAC5C,CAAC,CAAC;YACL,CAAC;YAED,uBAAuB;YACvB,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;gBACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;oBAChC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;oBACzE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;gBAEjD,UAAU,CAAC,IAAI,CAAC;oBACd,EAAE,EAAE,GAAG,CAAC,EAAE;oBACV,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,GAAG,CAAC,KAAK,IAAI,eAAe;oBAClC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE;oBAChC,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;oBAClC,OAAO,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;oBAChE,QAAQ,EAAE,QAAQ;oBAClB,IAAI,EAAE,GAAG,CAAC,SAAS,IAAI,CAAC;oBACxB,MAAM,EAAE,GAAG,CAAC,eAAe,IAAI,CAAC;oBAChC,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS;iBAC5C,CAAC,CAAC;YACL,CAAC;YAED,yCAAyC;YACzC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;YAEzE,kBAAkB;YAClB,GAAG,CAAC,IAAI,GAAG,UAAU,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAE1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YACvD,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,GAAiB,EAAE,SAAiB;QACjE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAE7B,IAAI,CAAC;YACH,qBAAqB;YACrB,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAA0B;gBACvD,UAAU,EAAE,eAAe;gBAC3B,WAAW,EAAE,WAAW,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG;aACzD,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,KAAK,EAAE,CAAC;gBACV,GAAG,CAAC,IAAI,GAAG;oBACT,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,cAAc,EAAE,CAAC,EAAE,iCAAiC;oBACpD,eAAe,EAAE,CAAC,EAAE,mCAAmC;oBACvD,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,WAAW,EAAE,KAAK,CAAC,WAAW;iBAC/B,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;YAClB,CAAC;QAEH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACrD,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAClB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAChC,CAAC;IACH,CAAC;IAED,gCAAgC;IAEhC,eAAe,CAAC,SAAe;QAC7B,OAAO,SAAS,CAAC,cAAc,EAAE,CAAC;IACpC,CAAC;IAED,UAAU,CAAC,IAAU;QACnB,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC;IACnC,CAAC;IAED,qBAAqB,CAAC,MAAc;QAClC,MAAM,MAAM,GAA8B;YACxC,UAAU,EAAE,YAAY;YACxB,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,UAAU;YACnB,MAAM,EAAE,QAAQ;SACjB,CAAC;QACF,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;IAClC,CAAC;IAED,qBAAqB,CAAC,GAA6B;QACjD,OAAO,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,CAAC;IAED,uBAAuB,CAAC,GAA6B;QACnD,OAAO,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,CAAC;IAED,2BAA2B;IAC3B,WAAW,CAAC,SAA+C;QACzD,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC3D,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,mBAAmB,CAAC,SAA0B;QAC5C,gEAAgE;QAChE,MAAM,aAAa,GAAkB;YACnC,EAAE,EAAE,SAAS,CAAC,EAAE;YAChB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,MAAM,EAAE,SAAS,CAAC,MAA4C;YAC9D,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,MAAM,EAAE,SAAS,CAAC,MAAM;SACzB,CAAC;QAEF,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACvC,CAAC;IAED,cAAc,CAAC,YAAoB;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QAEvC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,OAAO,GAAG,KAAK,KAAK,OAAO,GAAG,EAAE,KAAK,OAAO,GAAG,EAAE,GAAG,CAAC;QACvD,CAAC;aAAM,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,GAAG,OAAO,KAAK,OAAO,GAAG,EAAE,GAAG,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,OAAO,GAAG,CAAC;QACvB,CAAC;IACH,CAAC;IAED,WAAW,CAAC,OAAyB;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACrE,OAAO,GAAG,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,sBAAsB,CAAC,KAAU;QAC/B,wEAAwE;QACxE,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5C,CAAC,EAAE,GAAG,CAAC,CAAC;QAER,0CAA0C;QAC1C,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,iDAAiD;IAEjD;;OAEG;IACH,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QAC7C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CAAC,IAAkB;QAC3C,OAAO,wBAAwB,CAAC;IAClC,CAAC;sHAjwBU,4BAA4B;6DAA5B,4BAA4B;YA9pDrC,8BAA8D;YAE5D,8FAAiB;YAOf,AADF,8BAA+B,YACA;YAC3B,uBAAsC;YACtC,yCACF;YAAA,iBAAK;YAID,AADF,AADF,8BAAiC,aACC,YACvB;YAAA,2BAAW;YAAA,iBAAQ;YAC1B,kCAA8F;YAAtF,0OAA+B;YAAC,4GAAU,uBAAmB,IAAC;YACpE,kCAAmB;YAAA,0BAAS;YAAA,iBAAS;YACrC,kCAAmB;YAAA,6BAAY;YAAA,iBAAS;YACxC,mCAAoB;YAAA,8BAAa;YAAA,iBAAS;YAC1C,mCAAmB;YAAA,4BAAW;YAAA,iBAAS;YACvC,mCAAoB;YAAA,6BAAY;YAEpC,AADE,AADkC,iBAAS,EAClC,EACL;YAEN,mCAA2E;YAA/C,0GAAS,iBAAa,IAAC;YACjD,yBAAgE;YAChE,0BACF;YAEJ,AADE,AADE,iBAAS,EACL,EACF;YAIJ,AADF,gCAA2B,eACH;YACpB,2GAMC;;YAEL,AADE,iBAAM,EACF;YAYQ,AADF,AADF,AADF,AADF,AAFF,AADF,AAFF,qCAA0D,yBAE7B,oBACQ,yBAEJ,eACoB,eACb,eACF,cACA;YACtB,yBAAqC;YACrC,gCACF;YACF,AADE,iBAAK,EACD;YACN,kGAA8B;;YAiDpC,AADE,AADE,iBAAM,EACF,EACQ;YAMV,AADF,AADF,AADF,0CAA2B,eAC2B,eACrB,eACH;YACtB,kGAiBC;YACH,iBAAM;YAEN,gCAAyB;YACvB,iGAAmC;YAYnC,kGAAwC;YAkExC,iGAA0C;YA2DtD,AADE,AADE,AADE,AADE,AADE,iBAAM,EACF,EACF,EACQ,EACP,EACG;YAOV,AADF,AAFF,AADF,0CAA2B,oBACQ,yBAEJ,eACyB;YAChD,+CAI2B;;YAE/B,AADE,iBAAM,EACQ;YAQV,AADF,AAHF,AADF,0CAA2B,eACsB,eAGjB,eAC8B;YAA9B,uGAAS,gBAAY,MAAM,CAAC,IAAC;YACrD,iCAA0B;YACxB,yBAAuC;YACvC,gCACF;YAAA,iBAAO;YACP,yBAA+H;YACjI,iBAAM;YACN,iGAAwB;YAyB1B,iBAAM;YAIJ,AADF,gCAA4B,eACoC;YAApC,uGAAS,gBAAY,YAAY,CAAC,IAAC;YAC3D,iCAA0B;YACxB,yBAAqC;YACrC,mCACF;YAAA,iBAAO;YACP,yBAA2I;YAC7I,iBAAM;YACN,iGAA8B;YAqChC,iBAAM;YAIJ,AADF,gCAA4B,eACoC;YAApC,uGAAS,gBAAY,YAAY,CAAC,IAAC;YAC3D,iCAA0B;YACxB,yBAAgC;YAChC,kCACF;YAAA,iBAAO;YACP,yBAA2I;YAC7I,iBAAM;YACN,iGAA8B;YAa1C,AADE,AADE,AADE,AADE,AADE,iBAAM,EACF,EACQ,EACP,EACG,EACP;YAGX,kGAAyB;YAiH3B,iBAAM;;;YArgB4B,wCAA2B;YAE3D,cAIC;YAJD,wCAIC;YAWa,eAA+B;YAA/B,qDAA+B;YAAgC,wCAAsB;YAS3C,gBAAsB;YAAtB,wCAAsB;YACzC,cAA4B;YAA5B,yCAA4B;YAS7D,eAMC;YAND,oDAMC;YAOY,eAAW;YAAX,yBAAW;YAGP,eAAW;YAAX,yBAAW;YASpB,eA8CC;YA9CD,kFA8CC;YAMQ,eAAW;YAAX,yBAAW;YAIlB,eAiBC;YAjBD,gCAiBC;YAID,eAUC;YAVD,2FAUC;YAED,cAgEC;YAhED,gGAgEC;YAED,cAqDC;YArDD,kGAqDC;YASE,cAAW;YAAX,yBAAW;YAGP,eAAW;YAAX,yBAAW;YAGpB,eAA2C;YAE3C,AAFA,oGAA2C,6BAEnB;YAMf,eAAW;YAAX,yBAAW;YAUoB,eAA2C;YAAC,AAA5C,wDAA2C,uCAAyC;YAE5H,cAwBC;YAxBD,gDAwBC;YAUuC,eAAiD;YAAC,AAAlD,8DAAiD,6CAA+C;YAExI,cAoCC;YApCD,sDAoCC;YAUuC,eAAiD;YAAC,AAAlD,8DAAiD,6CAA+C;YAExI,cAOC;YAPD,sDAOC;YASb,cAgHC;YAhHD,iDAgHC;;;iFA0pCM,4BAA4B;cAnqDxC,SAAS;6BACI,KAAK,YACP,0BAA0B,mBACnB,uBAAuB,CAAC,MAAM,YACrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAugBT;;kFAwpCU,4BAA4B","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { map, takeUntil, debounceTime } from 'rxjs/operators';\nimport {\n AIInstrumentationService,\n DashboardKPIs,\n TrendData,\n LiveExecution,\n ChartData,\n ExecutionDetails\n} from '../services/ai-instrumentation.service';\nimport { DataPointClickEvent } from './charts/time-series-chart.component';\nimport { KPICardData } from './widgets/kpi-card.component';\nimport { HeatmapData } from './charts/performance-heatmap.component';\nimport { RunView, CompositeKey } from '@memberjunction/core';\nimport { ResourceData } from \"@memberjunction/core-entities\";\nimport { MJAIPromptRunEntityExtended, MJAIAgentRunEntityExtended, MJAIModelEntityExtended } from '@memberjunction/ai-core-plus';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\n\nexport interface DrillDownTab {\n id: string;\n title: string;\n type: 'chart' | 'executions' | 'model-detail';\n data?: any;\n timestamp?: Date;\n metric?: string;\n closeable: boolean;\n}\n\nexport interface ExecutionRecord {\n id: string;\n type: 'prompt' | 'agent';\n name: string;\n model?: string;\n status: string;\n startTime: Date;\n endTime?: Date;\n duration: number;\n cost: number;\n tokens: number;\n errorMessage?: string;\n}\n\nexport interface ExecutionMonitoringState {\n selectedTimeRange: string;\n refreshInterval: number;\n panelStates: {\n cost: boolean;\n efficiency: boolean;\n executions: boolean;\n };\n drillDownTabs: Array<{\n id: string;\n title: string;\n type: string;\n timestamp?: string;\n metric?: string;\n }>;\n activeTabId: string;\n splitterSizes?: number[];\n}\n/**\n * AI Monitor Resource - displays AI execution monitoring and analytics\n * Extends BaseResourceComponent to work with the resource type system\n */\n// @RegisterClass 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 Kendo 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 (dataPointClick)=\"onDataPointClick($event)\"\n (timeRangeChange)=\"onChartTimeRangeChange($event)\"\n ></app-time-series-chart>\n </div>\n }\n \n @if (activeTab?.type === 'executions') {\n <div class=\"tab-pane executions-drill-down\">\n <div class=\"drill-down-header\">\n <h4>\n <i class=\"fa-solid fa-list\"></i>\n {{ activeTab?.title }}\n </h4>\n <div class=\"drill-down-meta\">\n @if (activeTab?.timestamp) {\n <span class=\"timestamp\">{{ getFormattedTimestamp(activeTab) }}</span>\n }\n @if (activeTab?.metric) {\n <span class=\"metric-badge\">{{ getFormattedMetricLabel(activeTab) }}</span>\n }\n </div>\n </div>\n \n @if (loadingDrillDown) {\n <div class=\"loading-spinner\">\n <mj-loading text=\"Loading execution details...\" size=\"small\"></mj-loading>\n </div>\n } @else if (activeTab?.data?.length > 0) {\n <div class=\"executions-table\">\n <div class=\"table-header\">\n <div class=\"header-cell\">Type</div>\n <div class=\"header-cell\">Name</div>\n <div class=\"header-cell\">Model</div>\n <div class=\"header-cell\">Status</div>\n <div class=\"header-cell\">Duration</div>\n <div class=\"header-cell\">Cost</div>\n <div class=\"header-cell\">Tokens</div>\n <div class=\"header-cell\">Time</div>\n </div>\n @for (execution of activeTab?.data; track execution.id) {\n <div \n class=\"table-row\"\n (click)=\"viewExecutionDetail(execution)\"\n >\n <div class=\"table-cell\">\n <span class=\"type-badge\" [class]=\"'type-badge--' + execution.type\">\n {{ execution.type }}\n </span>\n </div>\n <div class=\"table-cell\">{{ execution.name }}</div>\n <div class=\"table-cell\">{{ execution.model || 'N/A' }}</div>\n <div class=\"table-cell\">\n <span class=\"status-badge\" [class]=\"'status-badge--' + execution.status\">\n {{ execution.status }}\n </span>\n </div>\n <div class=\"table-cell\">{{ formatDuration(execution.duration) }}</div>\n <div class=\"table-cell\">{{ formatCurrency(execution.cost) }}</div>\n <div class=\"table-cell\">{{ execution.tokens.toLocaleString() }}</div>\n <div class=\"table-cell\">{{ formatTime(execution.startTime) }}</div>\n </div>\n }\n </div>\n } @else {\n <div class=\"no-data\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No executions found for this time period</p>\n </div>\n }\n </div>\n }\n \n @if (activeTab?.type === 'model-detail') {\n <div class=\"tab-pane model-detail\">\n <div class=\"drill-down-header\">\n <h4>\n <i class=\"fa-solid fa-microchip\"></i>\n Model Details: {{ activeTab?.data?.name }}\n </h4>\n </div>\n \n @if (loadingDrillDown) {\n <div class=\"loading-spinner\">\n <mj-loading text=\"Loading model details...\" size=\"small\"></mj-loading>\n </div>\n } @else if (activeTab?.data) {\n <div class=\"model-details\">\n <div class=\"model-info-grid\">\n <div class=\"info-item\">\n <label>Model Name:</label>\n <span>{{ activeTab?.data?.name }}</span>\n </div>\n <div class=\"info-item\">\n <label>Vendor:</label>\n <span>{{ activeTab?.data?.vendor }}</span>\n </div>\n <div class=\"info-item\">\n <label>API Name:</label>\n <span>{{ activeTab?.data?.apiName }}</span>\n </div>\n <div class=\"info-item\">\n <label>Input Cost:</label>\n <span>\\${{ activeTab?.data?.inputTokenCost?.toFixed(6) || '0' }} per token</span>\n </div>\n <div class=\"info-item\">\n <label>Output Cost:</label>\n <span>\\${{ activeTab?.data?.outputTokenCost?.toFixed(6) || '0' }} per token</span>\n </div>\n <div class=\"info-item\">\n <label>Active:</label>\n <span class=\"status-indicator\" [class.active]=\"activeTab?.data?.isActive\">\n {{ activeTab?.data?.isActive ? 'Yes' : 'No' }}\n </span>\n </div>\n </div>\n \n @if (activeTab?.data?.description) {\n <div class=\"model-description\">\n <h5>Description</h5>\n <p>{{ activeTab?.data?.description }}</p>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n </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 <div class=\"analysis-panel\">\n <div class=\"panel-header\" (click)=\"togglePanel('cost')\">\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-dollar-sign\"></i>\n Cost Analysis\n </span>\n <i class=\"fa-solid panel-toggle-icon\" [class.fa-chevron-down]=\"!panelStates.cost\" [class.fa-chevron-up]=\"panelStates.cost\"></i>\n </div>\n @if (panelStates.cost) {\n <div class=\"panel-content\">\n @if (costData$ | async; as costData) {\n <div class=\"cost-bars\">\n @for (item of costData.slice(0, 8); track item.model) {\n <div class=\"cost-bar-item\">\n <div class=\"cost-bar-info\">\n <span class=\"model-name\">{{ item.model }}</span>\n <span class=\"cost-value\">{{ formatCurrency(item.cost) }}</span>\n </div>\n <div class=\"cost-bar-container\">\n <div \n class=\"cost-bar\"\n [style.width.%]=\"getCostBarWidth(item.cost, getMaxCost(costData))\"\n ></div>\n </div>\n <div class=\"token-info\">\n {{ formatTokens(item.tokens) }} tokens\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Token Efficiency Panel -->\n <div class=\"analysis-panel\">\n <div class=\"panel-header\" (click)=\"togglePanel('efficiency')\">\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-chart-pie\"></i>\n Token Efficiency\n </span>\n <i class=\"fa-solid panel-toggle-icon\" [class.fa-chevron-down]=\"!panelStates.efficiency\" [class.fa-chevron-up]=\"panelStates.efficiency\"></i>\n </div>\n @if (panelStates.efficiency) {\n <div class=\"panel-content\">\n @if (tokenEfficiency$ | async; as efficiencyData) {\n <div class=\"efficiency-items\">\n @for (item of efficiencyData.slice(0, 6); track item.model) {\n <div class=\"efficiency-item\">\n <div class=\"efficiency-header\">\n <span class=\"model-name\">{{ item.model }}</span>\n <span class=\"efficiency-ratio\">\n {{ getTokenRatio(item.inputTokens, item.outputTokens) }}\n </span>\n </div>\n <div class=\"token-breakdown\">\n <div class=\"token-bar\">\n <div \n class=\"token-segment token-segment--input\"\n [style.width.%]=\"getTokenPercentage(item.inputTokens, item.inputTokens + item.outputTokens)\"\n ></div>\n <div \n class=\"token-segment token-segment--output\"\n [style.width.%]=\"getTokenPercentage(item.outputTokens, item.inputTokens + item.outputTokens)\"\n ></div>\n </div>\n <div class=\"token-labels\">\n <span class=\"input-label\">Input: {{ formatTokens(item.inputTokens) }}</span>\n <span class=\"output-label\">Output: {{ formatTokens(item.outputTokens) }}</span>\n </div>\n </div>\n <div class=\"cost-per-token\">\n {{ formatCostPerToken(item.cost, item.inputTokens + item.outputTokens) }}\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Live Executions Panel -->\n <div class=\"analysis-panel\">\n <div class=\"panel-header\" (click)=\"togglePanel('executions')\">\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-bolt\"></i>\n Live Executions\n </span>\n <i class=\"fa-solid panel-toggle-icon\" [class.fa-chevron-down]=\"!panelStates.executions\" [class.fa-chevron-up]=\"panelStates.executions\"></i>\n </div>\n @if (panelStates.executions) {\n <div class=\"panel-content live-executions-panel\">\n <app-live-execution-widget\n [executions]=\"(liveExecutions$ | async) ?? []\"\n (executionClick)=\"onExecutionClick($event)\"\n ></app-live-execution-widget>\n </div>\n }\n </div>\n </div>\n </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 .no-data {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n color: var(--mj-text-disabled);\n gap: 16px;\n }\n\n .no-data i {\n font-size: 48px;\n color: var(--mj-border-default);\n }\n\n .no-data p {\n margin: 0;\n font-size: 14px;\n }\n\n /* Model detail styles */\n .model-detail {\n padding: 20px;\n overflow-y: auto;\n }\n\n .model-details {\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n .model-info-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 16px;\n }\n\n .info-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 16px;\n background: var(--mj-bg-surface-card);\n border-radius: 6px;\n }\n\n .info-item label {\n font-size: 11px;\n color: var(--mj-text-muted);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin: 0;\n }\n\n .info-item span {\n font-size: 14px;\n color: var(--mj-text-primary);\n font-weight: 500;\n }\n\n .status-indicator {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n }\n\n .status-indicator.active {\n color: var(--mj-status-success);\n }\n\n .status-indicator.active::before {\n content: '';\n width: 6px;\n height: 6px;\n background: var(--mj-status-success);\n border-radius: 50%;\n }\n\n .model-description {\n padding: 20px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n }\n\n .model-description h5 {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .model-description p {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.5;\n }\n\n /* Clickable KPI cards */\n .clickable {\n cursor: pointer;\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n\n .clickable:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n }\n\n /* Collapsible Panel Styles */\n .analysis-panels {\n padding: 12px;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n }\n\n .analysis-panel {\n margin-bottom: 12px;\n border-radius: 10px;\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n background: var(--mj-bg-surface);\n overflow: hidden;\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .analysis-panel:hover {\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n }\n\n .analysis-panel:last-child {\n margin-bottom: 0;\n }\n\n .panel-header {\n padding: 14px 18px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n cursor: pointer;\n display: flex;\n justify-content: space-between;\n align-items: center;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .panel-header:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .panel-title {\n display: flex;\n align-items: center;\n gap: 10px;\n font-weight: 600;\n color: var(--mj-text-primary);\n font-size: 14px;\n }\n\n .panel-title i {\n color: var(--mj-brand-primary);\n width: 18px;\n }\n\n .panel-toggle-icon {\n color: var(--mj-brand-primary);\n font-size: 12px;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .panel-content {\n padding: 18px;\n border-top: 1px solid color-mix(in srgb, var(--mj-brand-primary) 5%, transparent);\n animation: slideDown 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n @keyframes slideDown {\n from {\n opacity: 0;\n max-height: 0;\n }\n to {\n opacity: 1;\n max-height: 500px;\n }\n }\n\n .live-executions-panel {\n padding: 0;\n }\n\n .live-executions-panel app-live-execution-widget {\n height: 300px;\n display: block;\n }\n\n /* Responsive Design */\n @media (max-width: 1200px) {\n .dashboard-splitter {\n min-height: 400px;\n }\n \n .table-header,\n .table-row {\n grid-template-columns: 60px 1fr 100px 80px 80px 60px 80px 100px;\n gap: 8px;\n }\n \n .model-info-grid {\n grid-template-columns: 1fr;\n }\n \n .analysis-panels {\n padding: 8px;\n }\n \n .analysis-panel {\n margin-bottom: 8px;\n }\n }\n\n @media (max-width: 768px) {\n .execution-monitoring {\n padding: 12px;\n }\n \n .monitoring-header {\n flex-direction: column;\n align-items: flex-start;\n }\n \n .monitoring-controls {\n width: 100%;\n justify-content: flex-start;\n }\n \n .dashboard-splitter {\n min-height: 350px;\n }\n \n .kpi-grid {\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n }\n\n /* Reduce padding on smaller screens */\n :host ::ng-deep 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-header {\n padding: 10px 12px;\n }\n \n .panel-title {\n font-size: 13px;\n }\n }\n `]\n})\nexport class ExecutionMonitoringComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n protected override destroy$ = new Subject<void>();\n private stateChangeSubject$ = new Subject<ExecutionMonitoringState>();\n\n // Configuration\n selectedTimeRange = '24h';\n isLoading = false;\n\n // Chart configurations\n timeSeriesConfig = {\n showGrid: true,\n showTooltip: true,\n animationDuration: 500,\n useDualAxis: true\n };\n\n heatmapConfig = {\n height: 350,\n showTooltip: true,\n animationDuration: 300\n };\n\n // Data streams\n kpis$: Observable<DashboardKPIs>;\n trends$: Observable<TrendData[]>;\n liveExecutions$: Observable<LiveExecution[]>;\n chartData$: Observable<ChartData>;\n\n // Derived data streams\n kpiCards$: Observable<KPICardData[]>;\n performanceMatrix$: Observable<HeatmapData[]>;\n costData$: Observable<{ model: string; cost: number; tokens: number }[]>;\n tokenEfficiency$: Observable<{ inputTokens: number; outputTokens: number; cost: number; model: string }[]>;\n\n // Modal state\n selectedExecution: LiveExecution | null = null;\n executionDetails: ExecutionDetails | null = null;\n loadingExecutionDetails = false;\n\n // Drill-down tab state\n drillDownTabs: DrillDownTab[] = [];\n activeTabId: string = 'main-chart';\n loadingDrillDown = false;\n\n // Panel state for collapsible sections\n panelStates = {\n cost: true,\n efficiency: true, // Expanded by default\n executions: false\n };\n\n get activeTab(): DrillDownTab | undefined {\n return this.drillDownTabs.find(tab => tab.id === this.activeTabId);\n }\n\n constructor(\n private instrumentationService: AIInstrumentationService,\n private 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 // 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 private createKPICards(kpis: DashboardKPIs): KPICardData[] {\n return [\n {\n title: 'Total Executions',\n value: kpis.totalExecutions,\n icon: 'fa-chart-bar',\n color: 'primary',\n subtitle: `${kpis.activeExecutions} active`\n },\n {\n title: 'Total Cost',\n value: `$${kpis.totalCost.toFixed(4)}`,\n icon: 'fa-dollar-sign',\n color: 'warning',\n subtitle: `${kpis.costCurrency} • $${kpis.dailyCostBurn.toFixed(2)}/day`\n },\n {\n title: 'Success Rate',\n value: `${(kpis.successRate * 100).toFixed(1)}%`,\n icon: 'fa-check-circle',\n color: 'success',\n subtitle: `${(kpis.errorRate * 100).toFixed(1)}% errors`\n },\n {\n title: 'Avg Response Time',\n value: `${(kpis.avgExecutionTime / 1000).toFixed(2)}s`,\n icon: 'fa-clock',\n color: 'info',\n subtitle: 'All models average'\n },\n {\n title: 'Token Usage',\n value: this.formatTokens(kpis.totalTokens),\n icon: 'fa-coins',\n color: 'primary',\n subtitle: `$${kpis.costPerToken.toFixed(6)}/token`\n },\n {\n title: 'Top Model',\n value: kpis.topModel,\n icon: 'fa-microchip',\n color: 'info',\n subtitle: 'Most used'\n }\n ];\n }\n\n onTimeRangeChange(): void {\n // Simply change time range - loading state is managed by the service\n this.setTimeRange(this.selectedTimeRange);\n this.emitStateChange();\n }\n\n private setTimeRange(range: string): void {\n const { start, end } = this.getTimeRangeFromSelection(range);\n this.instrumentationService.setDateRange(start, end);\n }\n \n private getTimeRangeFromSelection(range?: string): { start: Date; end: Date } {\n const now = new Date();\n const selectedRange = range || this.selectedTimeRange;\n let start: Date;\n\n switch (selectedRange) {\n case '1h':\n start = new Date(now.getTime() - 60 * 60 * 1000);\n break;\n case '6h':\n start = new Date(now.getTime() - 6 * 60 * 60 * 1000);\n break;\n case '24h':\n start = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n break;\n case '7d':\n start = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case '30d':\n start = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n default:\n start = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n }\n\n return { start, end: now };\n }\n\n refreshData(): void {\n // Simply trigger refresh - loading state is managed by the service\n this.instrumentationService.refresh();\n }\n\n onExecutionClick(execution: LiveExecution): void {\n this.selectedExecution = execution;\n this.loadExecutionDetails(execution);\n }\n\n onDataPointClick(event: DataPointClickEvent): void {\n const timestamp = event.data.timestamp;\n const metric = event.metric;\n \n // Create new drill-down tab\n const tabId = `drill-down-${timestamp.getTime()}-${metric}`;\n const tabTitle = `${this.getMetricDisplayLabel(metric)} - ${this.formatTimestamp(timestamp)}`;\n \n const newTab: DrillDownTab = {\n id: tabId,\n title: tabTitle,\n type: 'executions',\n timestamp: timestamp,\n metric: metric,\n closeable: true\n };\n \n // Add tab if it doesn't exist\n if (!this.drillDownTabs.find(tab => tab.id === tabId)) {\n this.drillDownTabs.push(newTab);\n this.emitStateChange(); // Emit state when new tab is added\n this.cdr.markForCheck();\n }\n \n // Switch to the new tab\n this.selectTab(tabId);\n \n // Load drill-down data\n this.loadDrillDownData(newTab);\n }\n\n onChartTimeRangeChange(range: string): void {\n this.selectedTimeRange = range;\n this.setTimeRange(range);\n }\n\n private getMetricValue(data: TrendData, metric: string): number {\n switch (metric) {\n case 'executions': return data.executions;\n case 'cost': return data.cost;\n case 'tokens': return data.tokens;\n case 'avgTime': return data.avgTime;\n case 'errors': return data.errors;\n default: return 0;\n }\n }\n\n private formatMetricValue(metric: string, value: number): string {\n switch (metric) {\n case 'executions': return value.toLocaleString();\n case 'cost': return `$${value.toFixed(4)}`;\n case 'tokens': return value.toLocaleString();\n case 'avgTime': return `${(value / 1000).toFixed(1)}s`;\n case 'errors': return value.toString();\n default: return value.toString();\n }\n }\n\n private async loadExecutionDetails(execution: LiveExecution): Promise<void> {\n this.loadingExecutionDetails = true;\n this.executionDetails = null;\n\n try {\n const details = await this.instrumentationService.getExecutionDetails(\n execution.id,\n execution.type\n );\n this.executionDetails = details;\n } catch (error) {\n console.error('Error loading execution details:', error);\n } finally {\n this.loadingExecutionDetails = false;\n }\n }\n\n closeExecutionModal(): void {\n this.selectedExecution = null;\n this.executionDetails = null;\n this.loadingExecutionDetails = false;\n }\n\n openFullRecord(): void {\n if (this.selectedExecution) {\n // Determine the entity name based on the execution type\n const entityName = this.selectedExecution.type === 'prompt'\n ? 'MJ: AI Prompt Runs'\n : 'MJ: AI Agent Runs';\n\n // Open the record using NavigationService\n const compositeKey = new CompositeKey([{ FieldName: 'ID', Value: this.selectedExecution.id }]);\n this.navigationService.OpenEntityRecord(entityName, compositeKey);\n\n // Close the modal\n this.closeExecutionModal();\n }\n }\n\n // Utility methods for templates\n trackByKpiTitle(index: number, kpi: KPICardData): string {\n return kpi.title;\n }\n\n trackByCostModel(index: number, item: { model: string; cost: number; tokens: number }): string {\n return item.model;\n }\n\n trackByEfficiencyModel(index: number, item: { model: string; inputTokens: number; outputTokens: number; cost: number }): string {\n return item.model;\n }\n\n formatTokens(tokens: number): string {\n if (tokens >= 1000000) {\n return `${(tokens / 1000000).toFixed(1)}M`;\n } else if (tokens >= 1000) {\n return `${(tokens / 1000).toFixed(1)}K`;\n }\n return tokens.toString();\n }\n\n formatCurrency(amount: number, decimals: number = 4): string {\n return `$${amount.toFixed(decimals)}`;\n }\n\n formatCostPerToken(cost: number, tokens: number): string {\n const costPer1K = tokens > 0 ? (cost / tokens) * 1000 : 0;\n return `$${costPer1K.toFixed(4)}/1K tokens`;\n }\n\n getCostBarWidth(cost: number, maxCost: number): number {\n return maxCost > 0 ? (cost / maxCost) * 100 : 0;\n }\n\n getMaxCost(costData: { cost: number }[]): number {\n return Math.max(...costData.map(item => item.cost));\n }\n\n getTokenRatio(input: number, output: number): string {\n const total = input + output;\n if (total === 0) return '0:0';\n const ratio = output / input;\n return `1:${ratio.toFixed(1)}`;\n }\n\n getTokenPercentage(tokens: number, total: number): number {\n return total > 0 ? (tokens / total) * 100 : 0;\n }\n\n getCostPerToken(cost: number, tokens: number): string {\n const costPer1K = tokens > 0 ? (cost / tokens) * 1000 : 0;\n return costPer1K.toFixed(4);\n }\n\n // Tab management methods\n selectTab(tabId: string): void {\n this.activeTabId = tabId;\n // Trigger chart resize after tab switch to fix chart rendering\n setTimeout(() => {\n window.dispatchEvent(new Event('resize'));\n }, 100);\n this.emitStateChange();\n this.cdr.markForCheck();\n }\n\n closeTab(event: MouseEvent, tabId: string): void {\n event.stopPropagation();\n \n const tabIndex = this.drillDownTabs.findIndex(tab => tab.id === tabId);\n if (tabIndex === -1) return;\n \n // Remove the tab\n this.drillDownTabs.splice(tabIndex, 1);\n \n // If we closed the active tab, switch to another tab\n if (this.activeTabId === tabId) {\n if (this.drillDownTabs.length > 0) {\n // Switch to the previous tab or first tab\n const newActiveIndex = Math.max(0, tabIndex - 1);\n this.activeTabId = this.drillDownTabs[newActiveIndex].id;\n // Trigger resize after tab switch\n setTimeout(() => {\n window.dispatchEvent(new Event('resize'));\n }, 100);\n } else {\n // No tabs left, this shouldn't happen as main chart is not closeable\n this.activeTabId = 'main-chart';\n }\n }\n \n this.emitStateChange();\n }\n\n // KPI click handling\n onKpiClick(kpi: KPICardData): void {\n if (kpi.title === 'Top Model' && kpi.value !== 'N/A') {\n this.openModelDrillDown(String(kpi.value));\n }\n // Add other KPI drill-downs as needed\n }\n\n isKpiClickable(kpi: KPICardData): boolean {\n return kpi.title === 'Top Model' && kpi.value !== 'N/A';\n }\n\n private async openModelDrillDown(modelName: string): Promise<void> {\n const tabId = `model-detail-${modelName.replace(/[^a-zA-Z0-9]/g, '-')}`;\n const tabTitle = `Model: ${modelName}`;\n \n // Check if tab already exists\n if (this.drillDownTabs.find(tab => tab.id === tabId)) {\n this.selectTab(tabId);\n return;\n }\n \n // Create new model detail tab\n const newTab: DrillDownTab = {\n id: tabId,\n title: tabTitle,\n type: 'model-detail',\n closeable: true\n };\n \n this.drillDownTabs.push(newTab);\n this.selectTab(tabId);\n \n // Load model details\n this.loadModelDetails(newTab, modelName);\n }\n\n private async loadDrillDownData(tab: DrillDownTab): Promise<void> {\n if (!tab.timestamp) return;\n \n this.loadingDrillDown = true;\n \n try {\n // Determine bucket size based on selected time range\n const { start, end } = this.getTimeRangeFromSelection();\n const duration = end.getTime() - start.getTime();\n const hours = duration / (1000 * 60 * 60);\n \n let windowSizeMs: number;\n let alignToDay = false;\n \n if (hours <= 24) {\n // For up to 24 hours, use 1 hour window (30 min before and after)\n windowSizeMs = 30 * 60 * 1000;\n } else if (hours <= 24 * 7) {\n // For up to 7 days, use full day window\n // Since data is aggregated into 4-hour buckets, we need to capture the full day\n windowSizeMs = 12 * 60 * 60 * 1000; // 12 hours before/after = 24 hour window\n alignToDay = true;\n } else {\n // For more than 7 days, use full day window\n windowSizeMs = 12 * 60 * 60 * 1000; // 12 hours before/after = 24 hour window\n alignToDay = true;\n }\n \n // Create time window around the clicked point\n let startTime = new Date(tab.timestamp.getTime() - windowSizeMs);\n let endTime = new Date(tab.timestamp.getTime() + windowSizeMs);\n \n // For day-aligned queries, expand to full day boundaries\n if (alignToDay) {\n // Set start to beginning of the day\n startTime = new Date(tab.timestamp);\n startTime.setHours(0, 0, 0, 0);\n \n // Set end to end of the day\n endTime = new Date(tab.timestamp);\n endTime.setHours(23, 59, 59, 999);\n }\n \n // Load executions for this time period\n const [promptResults, agentResults] = await Promise.all([\n new RunView().RunView<MJAIPromptRunEntityExtended>({\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `RunAt >= '${startTime.toISOString()}' AND RunAt <= '${endTime.toISOString()}'`,\n OrderBy: 'RunAt DESC' \n }),\n new RunView().RunView<MJAIAgentRunEntityExtended>({\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `StartedAt >= '${startTime.toISOString()}' AND StartedAt <= '${endTime.toISOString()}'`,\n OrderBy: 'StartedAt DESC' \n })\n ]);\n \n // Convert to ExecutionRecord format\n const executions: ExecutionRecord[] = [];\n \n // Add prompt executions\n for (const run of promptResults.Results) {\n const duration = run.CompletedAt ? \n new Date(run.CompletedAt).getTime() - new Date(run.RunAt).getTime() : \n Date.now() - new Date(run.RunAt).getTime();\n \n executions.push({\n id: run.ID,\n type: 'prompt',\n name: run.Prompt || 'Unnamed Prompt',\n model: run.Model || undefined,\n status: run.Success ? 'completed' : (run.Success === false ? 'failed' : 'running'),\n startTime: new Date(run.RunAt),\n endTime: run.CompletedAt ? new Date(run.CompletedAt) : undefined,\n duration: duration,\n cost: run.Cost || 0,\n tokens: run.TokensUsed || 0,\n errorMessage: run.ErrorMessage || undefined\n });\n }\n \n // Add agent executions\n for (const run of agentResults.Results) {\n const duration = run.CompletedAt ? \n new Date(run.CompletedAt).getTime() - new Date(run.StartedAt).getTime() : \n Date.now() - new Date(run.StartedAt).getTime();\n \n executions.push({\n id: run.ID,\n type: 'agent',\n name: run.Agent || 'Unnamed Agent',\n status: run.Status.toLowerCase(),\n startTime: new Date(run.StartedAt),\n endTime: run.CompletedAt ? new Date(run.CompletedAt) : undefined,\n duration: duration,\n cost: run.TotalCost || 0,\n tokens: run.TotalTokensUsed || 0,\n errorMessage: run.ErrorMessage || undefined\n });\n }\n \n // Sort by start time (most recent first)\n executions.sort((a, b) => b.startTime.getTime() - a.startTime.getTime());\n \n // Update tab data\n tab.data = executions;\n this.cdr.markForCheck();\n \n } catch (error) {\n console.error('Error loading drill-down data:', error);\n tab.data = [];\n this.cdr.markForCheck();\n } finally {\n this.loadingDrillDown = false;\n this.cdr.markForCheck();\n }\n }\n\n private async loadModelDetails(tab: DrillDownTab, modelName: string): Promise<void> {\n this.loadingDrillDown = true;\n \n try {\n // Find model by name\n const rv = new RunView();\n const result = await rv.RunView<MJAIModelEntityExtended>({\n EntityName: 'MJ: AI Models',\n ExtraFilter: `Name = '${modelName.replace(/'/g, \"''\")}'` \n });\n \n const model = result.Results[0];\n if (model) {\n tab.data = {\n name: model.Name,\n vendor: model.Vendor,\n apiName: model.APIName,\n inputTokenCost: 0, // Not available in current model\n outputTokenCost: 0, // Not available in current model \n isActive: model.IsActive,\n description: model.Description\n };\n } else {\n tab.data = null;\n }\n \n } catch (error) {\n console.error('Error loading model details:', error);\n tab.data = null;\n } finally {\n this.loadingDrillDown = false;\n }\n }\n\n // Helper methods for drill-down\n\n formatTimestamp(timestamp: Date): string {\n return timestamp.toLocaleString();\n }\n\n formatTime(time: Date): string {\n return time.toLocaleTimeString();\n }\n\n getMetricDisplayLabel(metric: string): string {\n const labels: { [key: string]: string } = {\n executions: 'Executions',\n cost: 'Cost',\n tokens: 'Tokens',\n avgTime: 'Avg Time',\n errors: 'Errors'\n };\n return labels[metric] || metric;\n }\n\n getFormattedTimestamp(tab: DrillDownTab | undefined): string {\n return tab?.timestamp ? this.formatTimestamp(tab.timestamp) : '';\n }\n\n getFormattedMetricLabel(tab: DrillDownTab | undefined): string {\n return tab?.metric ? this.getMetricDisplayLabel(tab.metric) : '';\n }\n\n // Panel management methods\n togglePanel(panelName: 'cost' | 'efficiency' | 'executions'): void {\n this.panelStates[panelName] = !this.panelStates[panelName];\n this.emitStateChange();\n }\n\n viewExecutionDetail(execution: ExecutionRecord): void {\n // Convert ExecutionRecord to LiveExecution format for the modal\n const liveExecution: LiveExecution = {\n id: execution.id,\n type: execution.type,\n name: execution.name,\n status: execution.status as 'running' | 'completed' | 'failed',\n startTime: execution.startTime,\n duration: execution.duration,\n cost: execution.cost,\n tokens: execution.tokens\n };\n \n this.onExecutionClick(liveExecution);\n }\n\n formatDuration(milliseconds: number): string {\n const seconds = Math.floor(milliseconds / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m ${seconds % 60}s`;\n } else if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n } else {\n return `${seconds}s`;\n }\n }\n\n getDuration(details: ExecutionDetails): number {\n const start = details.startTime.getTime();\n const end = details.endTime ? details.endTime.getTime() : Date.now();\n return end - start;\n }\n\n onSplitterLayoutChange(event: any): void {\n // Trigger window resize event to force charts to recalculate dimensions\n setTimeout(() => {\n window.dispatchEvent(new Event('resize'));\n }, 100);\n\n // Emit state change when splitter changes\n this.emitStateChange();\n }\n\n // === BaseResourceComponent Required Methods ===\n\n /**\n * Get the display name for this resource\n */\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Monitor';\n }\n\n /**\n * Get the icon class for this resource\n */\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-chart-line';\n }\n}"]}
|