@memberjunction/ng-core-entity-forms 5.39.0 → 5.40.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.
Files changed (122) hide show
  1. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  2. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +14 -7
  3. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  4. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +7 -0
  5. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
  6. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +583 -559
  7. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  8. package/dist/lib/custom/Actions/action-execution-log-form.component.js +2 -2
  9. package/dist/lib/custom/Actions/action-form.component.js +2 -2
  10. package/dist/lib/custom/Entities/entity-form.component.js +4 -4
  11. package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
  12. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +117 -97
  13. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
  14. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js +2 -2
  15. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js.map +1 -1
  16. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.d.ts.map +1 -1
  17. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +59 -51
  18. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
  19. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.d.ts.map +1 -1
  20. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js +28 -10
  21. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
  22. package/dist/lib/generated/Entities/MJAPIKey/mjapikey.form.component.d.ts.map +1 -1
  23. package/dist/lib/generated/Entities/MJAPIKey/mjapikey.form.component.js +29 -21
  24. package/dist/lib/generated/Entities/MJAPIKey/mjapikey.form.component.js.map +1 -1
  25. package/dist/lib/generated/Entities/MJApplication/mjapplication.form.component.d.ts.map +1 -1
  26. package/dist/lib/generated/Entities/MJApplication/mjapplication.form.component.js +47 -11
  27. package/dist/lib/generated/Entities/MJApplication/mjapplication.form.component.js.map +1 -1
  28. package/dist/lib/generated/Entities/MJArtifact/mjartifact.form.component.d.ts.map +1 -1
  29. package/dist/lib/generated/Entities/MJArtifact/mjartifact.form.component.js +24 -6
  30. package/dist/lib/generated/Entities/MJArtifact/mjartifact.form.component.js.map +1 -1
  31. package/dist/lib/generated/Entities/MJArtifactVersion/mjartifactversion.form.component.d.ts.map +1 -1
  32. package/dist/lib/generated/Entities/MJArtifactVersion/mjartifactversion.form.component.js +27 -9
  33. package/dist/lib/generated/Entities/MJArtifactVersion/mjartifactversion.form.component.js.map +1 -1
  34. package/dist/lib/generated/Entities/MJClusterAnalysis/mjclusteranalysis.form.component.d.ts +10 -0
  35. package/dist/lib/generated/Entities/MJClusterAnalysis/mjclusteranalysis.form.component.d.ts.map +1 -0
  36. package/dist/lib/generated/Entities/MJClusterAnalysis/mjclusteranalysis.form.component.js +93 -0
  37. package/dist/lib/generated/Entities/MJClusterAnalysis/mjclusteranalysis.form.component.js.map +1 -0
  38. package/dist/lib/generated/Entities/MJClusterAnalysisCluster/mjclusteranalysiscluster.form.component.d.ts +10 -0
  39. package/dist/lib/generated/Entities/MJClusterAnalysisCluster/mjclusteranalysiscluster.form.component.d.ts.map +1 -0
  40. package/dist/lib/generated/Entities/MJClusterAnalysisCluster/mjclusteranalysiscluster.form.component.js +66 -0
  41. package/dist/lib/generated/Entities/MJClusterAnalysisCluster/mjclusteranalysiscluster.form.component.js.map +1 -0
  42. package/dist/lib/generated/Entities/MJCompany/mjcompany.form.component.d.ts.map +1 -1
  43. package/dist/lib/generated/Entities/MJCompany/mjcompany.form.component.js +27 -9
  44. package/dist/lib/generated/Entities/MJCompany/mjcompany.form.component.js.map +1 -1
  45. package/dist/lib/generated/Entities/MJContentItemTag/mjcontentitemtag.form.component.d.ts.map +1 -1
  46. package/dist/lib/generated/Entities/MJContentItemTag/mjcontentitemtag.form.component.js +13 -3
  47. package/dist/lib/generated/Entities/MJContentItemTag/mjcontentitemtag.form.component.js.map +1 -1
  48. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.d.ts.map +1 -1
  49. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js +29 -11
  50. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js.map +1 -1
  51. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
  52. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +100 -64
  53. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
  54. package/dist/lib/generated/Entities/MJMagicLinkInvite/mjmagiclinkinvite.form.component.d.ts +10 -0
  55. package/dist/lib/generated/Entities/MJMagicLinkInvite/mjmagiclinkinvite.form.component.d.ts.map +1 -0
  56. package/dist/lib/generated/Entities/MJMagicLinkInvite/mjmagiclinkinvite.form.component.js +173 -0
  57. package/dist/lib/generated/Entities/MJMagicLinkInvite/mjmagiclinkinvite.form.component.js.map +1 -0
  58. package/dist/lib/generated/Entities/MJMagicLinkInviteAllowedDomain/mjmagiclinkinvitealloweddomain.form.component.d.ts +10 -0
  59. package/dist/lib/generated/Entities/MJMagicLinkInviteAllowedDomain/mjmagiclinkinvitealloweddomain.form.component.d.ts.map +1 -0
  60. package/dist/lib/generated/Entities/MJMagicLinkInviteAllowedDomain/mjmagiclinkinvitealloweddomain.form.component.js +58 -0
  61. package/dist/lib/generated/Entities/MJMagicLinkInviteAllowedDomain/mjmagiclinkinvitealloweddomain.form.component.js.map +1 -0
  62. package/dist/lib/generated/Entities/MJMagicLinkInviteAllowedPath/mjmagiclinkinviteallowedpath.form.component.d.ts +10 -0
  63. package/dist/lib/generated/Entities/MJMagicLinkInviteAllowedPath/mjmagiclinkinviteallowedpath.form.component.d.ts.map +1 -0
  64. package/dist/lib/generated/Entities/MJMagicLinkInviteAllowedPath/mjmagiclinkinviteallowedpath.form.component.js +58 -0
  65. package/dist/lib/generated/Entities/MJMagicLinkInviteAllowedPath/mjmagiclinkinviteallowedpath.form.component.js.map +1 -0
  66. package/dist/lib/generated/Entities/MJMagicLinkInviteApplication/mjmagiclinkinviteapplication.form.component.d.ts +10 -0
  67. package/dist/lib/generated/Entities/MJMagicLinkInviteApplication/mjmagiclinkinviteapplication.form.component.d.ts.map +1 -0
  68. package/dist/lib/generated/Entities/MJMagicLinkInviteApplication/mjmagiclinkinviteapplication.form.component.js +58 -0
  69. package/dist/lib/generated/Entities/MJMagicLinkInviteApplication/mjmagiclinkinviteapplication.form.component.js.map +1 -0
  70. package/dist/lib/generated/Entities/MJMagicLinkInviteRole/mjmagiclinkinviterole.form.component.d.ts +10 -0
  71. package/dist/lib/generated/Entities/MJMagicLinkInviteRole/mjmagiclinkinviterole.form.component.d.ts.map +1 -0
  72. package/dist/lib/generated/Entities/MJMagicLinkInviteRole/mjmagiclinkinviterole.form.component.js +58 -0
  73. package/dist/lib/generated/Entities/MJMagicLinkInviteRole/mjmagiclinkinviterole.form.component.js.map +1 -0
  74. package/dist/lib/generated/Entities/MJMagicLinkRedemption/mjmagiclinkredemption.form.component.d.ts +10 -0
  75. package/dist/lib/generated/Entities/MJMagicLinkRedemption/mjmagiclinkredemption.form.component.d.ts.map +1 -0
  76. package/dist/lib/generated/Entities/MJMagicLinkRedemption/mjmagiclinkredemption.form.component.js +68 -0
  77. package/dist/lib/generated/Entities/MJMagicLinkRedemption/mjmagiclinkredemption.form.component.js.map +1 -0
  78. package/dist/lib/generated/Entities/MJResourceType/mjresourcetype.form.component.d.ts.map +1 -1
  79. package/dist/lib/generated/Entities/MJResourceType/mjresourcetype.form.component.js +26 -8
  80. package/dist/lib/generated/Entities/MJResourceType/mjresourcetype.form.component.js.map +1 -1
  81. package/dist/lib/generated/Entities/MJRole/mjrole.form.component.d.ts.map +1 -1
  82. package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js +52 -16
  83. package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js.map +1 -1
  84. package/dist/lib/generated/Entities/MJSignatureAccount/mjsignatureaccount.form.component.d.ts +10 -0
  85. package/dist/lib/generated/Entities/MJSignatureAccount/mjsignatureaccount.form.component.d.ts.map +1 -0
  86. package/dist/lib/generated/Entities/MJSignatureAccount/mjsignatureaccount.form.component.js +115 -0
  87. package/dist/lib/generated/Entities/MJSignatureAccount/mjsignatureaccount.form.component.js.map +1 -0
  88. package/dist/lib/generated/Entities/MJSignatureProvider/mjsignatureprovider.form.component.d.ts +10 -0
  89. package/dist/lib/generated/Entities/MJSignatureProvider/mjsignatureprovider.form.component.d.ts.map +1 -0
  90. package/dist/lib/generated/Entities/MJSignatureProvider/mjsignatureprovider.form.component.js +101 -0
  91. package/dist/lib/generated/Entities/MJSignatureProvider/mjsignatureprovider.form.component.js.map +1 -0
  92. package/dist/lib/generated/Entities/MJSignatureRequest/mjsignaturerequest.form.component.d.ts +10 -0
  93. package/dist/lib/generated/Entities/MJSignatureRequest/mjsignaturerequest.form.component.d.ts.map +1 -0
  94. package/dist/lib/generated/Entities/MJSignatureRequest/mjsignaturerequest.form.component.js +153 -0
  95. package/dist/lib/generated/Entities/MJSignatureRequest/mjsignaturerequest.form.component.js.map +1 -0
  96. package/dist/lib/generated/Entities/MJSignatureRequestDocument/mjsignaturerequestdocument.form.component.d.ts +10 -0
  97. package/dist/lib/generated/Entities/MJSignatureRequestDocument/mjsignaturerequestdocument.form.component.d.ts.map +1 -0
  98. package/dist/lib/generated/Entities/MJSignatureRequestDocument/mjsignaturerequestdocument.form.component.js +78 -0
  99. package/dist/lib/generated/Entities/MJSignatureRequestDocument/mjsignaturerequestdocument.form.component.js.map +1 -0
  100. package/dist/lib/generated/Entities/MJSignatureRequestLog/mjsignaturerequestlog.form.component.d.ts +10 -0
  101. package/dist/lib/generated/Entities/MJSignatureRequestLog/mjsignaturerequestlog.form.component.d.ts.map +1 -0
  102. package/dist/lib/generated/Entities/MJSignatureRequestLog/mjsignaturerequestlog.form.component.js +84 -0
  103. package/dist/lib/generated/Entities/MJSignatureRequestLog/mjsignaturerequestlog.form.component.js.map +1 -0
  104. package/dist/lib/generated/Entities/MJSignatureRequestRecipient/mjsignaturerequestrecipient.form.component.d.ts +10 -0
  105. package/dist/lib/generated/Entities/MJSignatureRequestRecipient/mjsignaturerequestrecipient.form.component.d.ts.map +1 -0
  106. package/dist/lib/generated/Entities/MJSignatureRequestRecipient/mjsignaturerequestrecipient.form.component.js +88 -0
  107. package/dist/lib/generated/Entities/MJSignatureRequestRecipient/mjsignaturerequestrecipient.form.component.js.map +1 -0
  108. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  109. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +156 -102
  110. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  111. package/dist/lib/generated/Entities/MJUserView/mjuserview.form.component.d.ts.map +1 -1
  112. package/dist/lib/generated/Entities/MJUserView/mjuserview.form.component.js +34 -26
  113. package/dist/lib/generated/Entities/MJUserView/mjuserview.form.component.js.map +1 -1
  114. package/dist/lib/generated/Entities/MJViewType/mjviewtype.form.component.d.ts +10 -0
  115. package/dist/lib/generated/Entities/MJViewType/mjviewtype.form.component.d.ts.map +1 -0
  116. package/dist/lib/generated/Entities/MJViewType/mjviewtype.form.component.js +91 -0
  117. package/dist/lib/generated/Entities/MJViewType/mjviewtype.form.component.js.map +1 -0
  118. package/dist/lib/generated/generated-forms.module.d.ts +265 -250
  119. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  120. package/dist/lib/generated/generated-forms.module.js +224 -179
  121. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  122. package/package.json +36 -36
@@ -1 +1 @@
1
- {"version":3,"file":"ai-agent-run-analytics.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-analytics.component.ts","../../../../src/lib/custom/ai-agent-run/ai-agent-run-analytics.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnInit, OnDestroy, ViewChild, ElementRef, ChangeDetectorRef, AfterViewInit, ChangeDetectionStrategy } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { RunView } from '@memberjunction/core';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\nimport { MJAIPromptRunEntity } from '@memberjunction/core-entities';\nimport * as d3 from 'd3';\nimport { AIAgentRunCostService } from './ai-agent-run-cost.service';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\ninterface PromptMetrics {\n totalCount: number;\n totalExecutionTime: number;\n averageExecutionTime: number;\n byModel: Map<string, { count: number; totalTime: number; avgTime: number }>;\n byVendor: Map<string, { count: number; totalTime: number; avgTime: number }>;\n byPrompt: Map<string, { count: number; totalTime: number; avgTime: number }>;\n statusBreakdown: { success: number; failed: number; timeout: number };\n costBreakdown: {\n totalCost: number;\n byModel: Map<string, number>;\n byVendor: Map<string, number>;\n // Rate-derived dollar split (computed from AIModelCost rates). inputCost folds uncached + cache\n // read + cache write; savings = what it would have cost with no caching minus actual.\n inputCost: number;\n outputCost: number;\n savings: number;\n unratedCost: number; // stored cost of runs whose model+vendor had no rate row (breakdown excludes them)\n };\n tokenUsage: { totalInput: number; totalOutput: number; totalCacheRead: number; totalCacheWrite: number; byModel: Map<string, { input: number; output: number }> };\n}\n\ninterface ActionMetrics {\n totalCount: number;\n totalExecutionTime: number;\n averageExecutionTime: number;\n byAction: Map<string, { count: number; totalTime: number; avgTime: number; successRate: number }>;\n byType: Map<string, { count: number; totalTime: number; avgTime: number }>;\n statusBreakdown: { success: number; failed: number; timeout: number };\n errorAnalysis: Map<string, number>; // Error message to count\n}\n\ninterface TimelineMetrics {\n totalSteps: number;\n stepsByType: Map<string, number>;\n parallelExecutions: number;\n deepestNesting: number;\n criticalPath: { steps: string[]; totalTime: number };\n}\n\ninterface SimpleAgentRun {\n ID: string;\n AgentID?: string;\n Status?: string;\n // Add other fields as needed\n}\n\ninterface SimpleAgentRunStep {\n ID: string;\n StepType: string;\n TargetLogID?: string;\n // Add other fields as needed\n}\n\ninterface SimpleActionLog {\n ID: string;\n Action: string | null;\n StartedAt: Date | null;\n EndedAt: Date | null;\n ResultCode: string | null;\n Message: string | null;\n // Add other fields as needed\n}\n\n@Component({\n standalone: false,\n selector: 'mj-ai-agent-run-analytics',\n templateUrl: './ai-agent-run-analytics.component.html',\n styleUrls: ['./ai-agent-run-analytics.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AIAgentRunAnalyticsComponent extends BaseAngularComponent implements OnInit, OnDestroy, AfterViewInit {\n @Input() agentRunId!: string;\n \n private destroy$ = new Subject<void>();\n \n /** Track active timeouts for cleanup */\n private activeTimeouts: number[] = [];\n \n /** Helper method to create tracked setTimeout calls */\n private setTrackedTimeout(callback: () => void, delay: number = 0): number {\n const timeoutId = setTimeout(() => {\n // Remove from tracking array when timeout executes\n this.removeTimeoutFromTracking(timeoutId);\n callback();\n }, delay) as any as number;\n \n this.activeTimeouts.push(timeoutId);\n return timeoutId;\n }\n \n /** Remove timeout from tracking array */\n private removeTimeoutFromTracking(timeoutId: number): void {\n const index = this.activeTimeouts.indexOf(timeoutId);\n if (index > -1) {\n this.activeTimeouts.splice(index, 1);\n }\n }\n \n // Chart expansion states\n expandedCharts: { [key: string]: boolean } = {\n modelDistribution: false,\n executionTime: false,\n costByVendor: false,\n tokenUsage: false,\n promptTime: false,\n promptToken: false,\n promptCost: false,\n promptCount: false,\n actionSuccess: false,\n stepType: false\n };\n \n viewMode: 'grid' | 'expanded' = 'grid';\n \n // Loading state\n isLoading = true;\n error: string | null = null;\n \n // Data\n agentRun: SimpleAgentRun | null = null;\n allPromptRuns: MJAIPromptRunEntity[] = [];\n\n // Per model+vendor cache pricing (currency-per-token), loaded from AIModelCost for the cost split.\n private cacheRates = new Map<string, { inputRate: number; outputRate: number; cacheReadRate: number; cacheWriteRate: number }>();\n private static readonly UNIT_DIVISORS: Record<string, number> = {\n 'Per Million Tokens': 1_000_000, 'Per Hundred Thousand Tokens': 100_000, 'Per Thousand Tokens': 1_000\n };\n allActionLogs: SimpleActionLog[] = [];\n allSteps: SimpleAgentRunStep[] = [];\n subAgentRuns: SimpleAgentRun[] = [];\n \n // Metrics\n promptMetrics: PromptMetrics = this.initializePromptMetrics();\n actionMetrics: ActionMetrics = this.initializeActionMetrics();\n timelineMetrics: TimelineMetrics = this.initializeTimelineMetrics();\n \n // Chart configurations\n modelDistributionChartData: any;\n executionTimeChartData: any;\n costByVendorChartData: any;\n tokenUsageChartData: any;\n actionSuccessRateChartData: any;\n stepTypeDistributionChartData: any;\n \n // Expanded sections\n promptDetailsExpanded = false;\n actionDetailsExpanded = false;\n \n // Expansion panel states\n panelStates = {\n summary: true,\n prompts: true,\n actions: true,\n models: true,\n timeline: true\n };\n \n // Chart element references\n @ViewChild('modelDistributionChart', { static: false }) modelDistributionChart!: ElementRef;\n @ViewChild('executionTimeChart', { static: false }) executionTimeChart!: ElementRef;\n @ViewChild('costByVendorChart', { static: false }) costByVendorChart!: ElementRef;\n @ViewChild('tokenUsageChart', { static: false }) tokenUsageChart!: ElementRef;\n @ViewChild('actionSuccessRateChart', { static: false }) actionSuccessRateChart!: ElementRef;\n @ViewChild('stepTypeChart', { static: false }) stepTypeChart!: ElementRef;\n @ViewChild('promptTimeDistributionChart', { static: false }) promptTimeDistributionChart!: ElementRef;\n @ViewChild('promptTokenDistributionChart', { static: false }) promptTokenDistributionChart!: ElementRef;\n @ViewChild('promptCostDistributionChart', { static: false }) promptCostDistributionChart!: ElementRef;\n @ViewChild('promptCountByNameChart', { static: false }) promptCountByNameChart!: ElementRef;\n \n constructor(\n private cdr: ChangeDetectorRef,\n private costService: AIAgentRunCostService\n ) {\n super();}\n \n ngOnInit() {\n if (this.agentRunId) {\n this.loadData();\n }\n }\n \n ngOnDestroy() {\n // Signal all subscriptions to complete\n this.destroy$.next();\n this.destroy$.complete();\n \n // Clear all active timeouts\n this.activeTimeouts.forEach(timeoutId => {\n clearTimeout(timeoutId);\n });\n this.activeTimeouts.length = 0;\n \n // Clean up all D3 charts (must be done last)\n this.cleanupAllCharts();\n \n console.log('AI Agent Run Analytics component destroyed and cleaned up');\n }\n \n private cleanupAllCharts() {\n // List of all chart element refs\n const chartRefs = [\n this.modelDistributionChart,\n this.executionTimeChart,\n this.costByVendorChart,\n this.tokenUsageChart,\n this.actionSuccessRateChart,\n this.stepTypeChart,\n this.promptTimeDistributionChart,\n this.promptTokenDistributionChart,\n this.promptCostDistributionChart,\n this.promptCountByNameChart\n ];\n \n // More comprehensive D3 cleanup\n chartRefs.forEach(chartRef => {\n if (chartRef?.nativeElement) {\n const element = chartRef.nativeElement;\n const d3Element = d3.select(element);\n \n // Remove ALL possible event listeners (comprehensive list)\n const allEventTypes = [\n 'click', 'dblclick', 'mousedown', 'mouseup', 'mouseover', 'mouseout', \n 'mousemove', 'mouseenter', 'mouseleave', 'contextmenu',\n 'touchstart', 'touchend', 'touchmove', 'touchcancel',\n 'wheel', 'scroll', 'resize', 'focus', 'blur',\n 'keydown', 'keyup', 'keypress',\n 'drag', 'dragstart', 'dragend', 'dragover', 'dragenter', 'dragleave', 'drop'\n ];\n \n // Remove event listeners from all child elements\n d3Element.selectAll('*').each(function() {\n const node = d3.select(this);\n allEventTypes.forEach(eventType => {\n node.on(eventType, null);\n });\n });\n \n // Remove event listeners from the main element too\n allEventTypes.forEach(eventType => {\n d3Element.on(eventType, null);\n });\n \n // Cancel any ongoing transitions\n d3Element.selectAll('*').interrupt();\n \n // Remove all SVG elements and clear the container\n d3Element.selectAll('*').remove();\n \n // Clear innerHTML as final cleanup\n element.innerHTML = '';\n }\n });\n \n // Clear any tooltips that might be attached to body or other elements\n d3.selectAll('.d3-tooltip, .tooltip, .chart-tooltip').remove();\n \n // Clear any D3 selections that might be cached globally\n // Note: This is more aggressive but necessary for preventing leaks\n try {\n d3.selectAll('[data-chart-element=\"true\"]').remove();\n d3.selectAll('.d3-tooltip').remove();\n d3.selectAll('.chart-tooltip').remove();\n } catch (error) {\n console.warn('D3 global cleanup had issues:', error);\n }\n }\n \n ngAfterViewInit() {\n // Charts will be rendered after data is loaded\n }\n \n async loadData() {\n this.isLoading = true;\n this.error = null;\n \n try {\n // Load all data including nested sub-agent runs\n await this.loadAllRunData();\n \n // Calculate metrics\n this.calculatePromptMetrics();\n this.calculateActionMetrics();\n this.calculateTimelineMetrics();\n \n // Prepare chart data\n this.prepareChartData();\n \n // Render charts after view updates\n this.cdr.detectChanges();\n this.setTrackedTimeout(() => {\n this.renderCharts();\n });\n \n } catch (error) {\n console.error('Error loading analytics data:', error);\n this.error = 'Failed to load analytics data';\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n \n private async loadAllRunData() {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n \n // Get all agent run IDs in hierarchy (including root and children)\n const agentRunIds = await this.getAllAgentRunIds(this.agentRunId);\n \n // Batch load all data (except prompt runs which we'll load via shared service)\n const results = await rv.RunViews([\n // Main agent run\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ID = '${this.agentRunId}'`,\n },\n // All sub-agent runs\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: agentRunIds.length > 1 ? `ID IN ('${agentRunIds.slice(1).join(\"','\")}')` : `ID = '00000000-0000-0000-0000-000000000000'`,\n },\n // All action logs - need to get via steps\n {\n EntityName: 'MJ: AI Agent Run Steps',\n ExtraFilter: `AgentRunID IN ('${agentRunIds.join(\"','\")}') AND StepType = 'Actions'`,\n },\n // All steps for timeline analysis - only need basic fields like StepType\n {\n EntityName: 'MJ: AI Agent Run Steps',\n ExtraFilter: `AgentRunID IN ('${agentRunIds.join(\"','\")}')`,\n }\n ]);\n \n // Process results\n \n if (results[0].Success && results[0].Results && results[0].Results.length > 0) {\n this.agentRun = results[0].Results[0];\n }\n \n if (results[1].Success) {\n this.subAgentRuns = results[1].Results || [];\n }\n \n // Load all prompt runs for the agent run hierarchy\n this.allPromptRuns = await this.loadAllPromptRuns(agentRunIds);\n\n // Load cache pricing so cost can be split (input/output) and cache savings computed\n await this.loadCacheRates();\n \n if (results[2].Success) {\n const actionSteps = results[2].Results || [];\n // Now load the actual action logs\n if (actionSteps.length > 0) {\n const actionLogIds = actionSteps\n .map(s => s.TargetLogID)\n .filter(id => id != null);\n \n if (actionLogIds.length > 0) {\n const actionResult = await rv.RunView({\n EntityName: 'MJ: Action Execution Logs',\n ExtraFilter: `ID IN ('${actionLogIds.join(\"','\")}')`\n });\n \n if (actionResult.Success) {\n this.allActionLogs = actionResult.Results || [];\n }\n }\n }\n }\n \n if (results[3].Success) {\n this.allSteps = results[3].Results || [];\n }\n }\n \n \n private initializePromptMetrics(): PromptMetrics {\n return {\n totalCount: 0,\n totalExecutionTime: 0,\n averageExecutionTime: 0,\n byModel: new Map(),\n byVendor: new Map(),\n byPrompt: new Map(),\n statusBreakdown: { success: 0, failed: 0, timeout: 0 },\n costBreakdown: { totalCost: 0, byModel: new Map(), byVendor: new Map(), inputCost: 0, outputCost: 0, savings: 0, unratedCost: 0 },\n tokenUsage: { totalInput: 0, totalOutput: 0, totalCacheRead: 0, totalCacheWrite: 0, byModel: new Map() }\n };\n }\n \n private initializeActionMetrics(): ActionMetrics {\n return {\n totalCount: 0,\n totalExecutionTime: 0,\n averageExecutionTime: 0,\n byAction: new Map(),\n byType: new Map(),\n statusBreakdown: { success: 0, failed: 0, timeout: 0 },\n errorAnalysis: new Map()\n };\n }\n \n private initializeTimelineMetrics(): TimelineMetrics {\n return {\n totalSteps: 0,\n stepsByType: new Map(),\n parallelExecutions: 0,\n deepestNesting: 0,\n criticalPath: { steps: [], totalTime: 0 }\n };\n }\n \n /** Stable rate-map key for a model+vendor pair. */\n private rateKey(modelID: string | null | undefined, vendorID: string | null | undefined): string {\n return `${NormalizeUUID(modelID ?? '')}|${NormalizeUUID(vendorID ?? '')}`;\n }\n\n /** Load active realtime AIModelCost rates and normalize each to currency-per-token. */\n private async loadCacheRates() {\n this.cacheRates.clear();\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const res = await rv.RunView({\n EntityName: 'MJ: AI Model Costs',\n ExtraFilter: `Status='Active' AND ProcessingType='Realtime'`,\n Fields: ['ModelID', 'VendorID', 'InputPricePerUnit', 'OutputPricePerUnit', 'CacheReadPricePerUnit', 'CacheWritePricePerUnit', 'UnitType'],\n ResultType: 'simple'\n });\n if (!res.Success) return;\n for (const row of res.Results || []) {\n const divisor = AIAgentRunAnalyticsComponent.UNIT_DIVISORS[row.UnitType ?? ''] ?? 1_000_000;\n const input = (row.InputPricePerUnit ?? 0) / divisor;\n this.cacheRates.set(this.rateKey(row.ModelID, row.VendorID), {\n inputRate: input,\n outputRate: (row.OutputPricePerUnit ?? 0) / divisor,\n cacheReadRate: (row.CacheReadPricePerUnit ?? row.InputPricePerUnit ?? 0) / divisor,\n cacheWriteRate: (row.CacheWritePricePerUnit ?? row.InputPricePerUnit ?? 0) / divisor\n });\n }\n }\n\n private calculatePromptMetrics() {\n const metrics = this.initializePromptMetrics();\n \n for (const promptRun of this.allPromptRuns) {\n metrics.totalCount++;\n \n // Calculate execution time\n const execTime = this.calculateExecutionTime(promptRun.RunAt, promptRun.CompletedAt);\n metrics.totalExecutionTime += execTime;\n \n // Update model metrics\n const model = promptRun.Model || 'Unknown';\n const modelMetric = metrics.byModel.get(model) || { count: 0, totalTime: 0, avgTime: 0 };\n modelMetric.count++;\n modelMetric.totalTime += execTime;\n modelMetric.avgTime = modelMetric.totalTime / modelMetric.count;\n metrics.byModel.set(model, modelMetric);\n \n // Update vendor metrics\n const vendor = promptRun.Vendor || 'Unknown';\n const vendorMetric = metrics.byVendor.get(vendor) || { count: 0, totalTime: 0, avgTime: 0 };\n vendorMetric.count++;\n vendorMetric.totalTime += execTime;\n vendorMetric.avgTime = vendorMetric.totalTime / vendorMetric.count;\n metrics.byVendor.set(vendor, vendorMetric);\n \n // Update prompt name metrics\n const promptName = promptRun.Prompt || 'Unknown';\n const promptMetric = metrics.byPrompt.get(promptName) || { count: 0, totalTime: 0, avgTime: 0 };\n promptMetric.count++;\n promptMetric.totalTime += execTime;\n promptMetric.avgTime = promptMetric.totalTime / promptMetric.count;\n metrics.byPrompt.set(promptName, promptMetric);\n \n // Status breakdown\n if (promptRun.Success) {\n metrics.statusBreakdown.success++;\n } else if (promptRun.ErrorMessage?.includes('timeout')) {\n metrics.statusBreakdown.timeout++;\n } else {\n metrics.statusBreakdown.failed++;\n }\n \n // Cost tracking\n const cost = promptRun.TotalCost || 0;\n metrics.costBreakdown.totalCost += cost;\n \n const modelCost = metrics.costBreakdown.byModel.get(model) || 0;\n metrics.costBreakdown.byModel.set(model, modelCost + cost);\n \n const vendorCost = metrics.costBreakdown.byVendor.get(vendor) || 0;\n metrics.costBreakdown.byVendor.set(vendor, vendorCost + cost);\n \n // Token usage\n const inputTokens = promptRun.TokensPrompt || 0;\n const outputTokens = promptRun.TokensCompletion || 0;\n metrics.tokenUsage.totalInput += inputTokens;\n metrics.tokenUsage.totalOutput += outputTokens;\n // Provider prompt-cache tokens (read = cache hits, write = cache creation). Summed from the\n // child prompt runs' persisted TokensCacheRead/TokensCacheWrite columns.\n const cacheReadTokens = promptRun.TokensCacheRead || 0;\n const cacheWriteTokens = promptRun.TokensCacheWrite || 0;\n metrics.tokenUsage.totalCacheRead += cacheReadTokens;\n metrics.tokenUsage.totalCacheWrite += cacheWriteTokens;\n\n // Rate-derived cost split + cache savings. inputCost folds uncached + cache read + cache write\n // (each at its own rate); savings = the discount vs. pricing all input at the full input rate.\n // Runs whose model+vendor has no rate row are tracked separately so the split isn't silently off.\n const rate = this.cacheRates.get(this.rateKey(promptRun.ModelID, promptRun.VendorID));\n if (rate) {\n metrics.costBreakdown.inputCost += inputTokens * rate.inputRate + cacheReadTokens * rate.cacheReadRate + cacheWriteTokens * rate.cacheWriteRate;\n metrics.costBreakdown.outputCost += outputTokens * rate.outputRate;\n metrics.costBreakdown.savings += cacheReadTokens * (rate.inputRate - rate.cacheReadRate) + cacheWriteTokens * (rate.inputRate - rate.cacheWriteRate);\n } else {\n metrics.costBreakdown.unratedCost += cost;\n }\n\n const modelTokens = metrics.tokenUsage.byModel.get(model) || { input: 0, output: 0 };\n modelTokens.input += inputTokens;\n modelTokens.output += outputTokens;\n metrics.tokenUsage.byModel.set(model, modelTokens);\n }\n \n // Calculate overall average\n if (metrics.totalCount > 0) {\n metrics.averageExecutionTime = metrics.totalExecutionTime / metrics.totalCount;\n }\n \n this.promptMetrics = metrics;\n }\n \n private calculateActionMetrics() {\n const metrics = this.initializeActionMetrics();\n \n for (const actionLog of this.allActionLogs) {\n metrics.totalCount++;\n \n // Calculate execution time\n const execTime = this.calculateExecutionTime(actionLog.StartedAt, actionLog.EndedAt);\n metrics.totalExecutionTime += execTime;\n \n // Update action metrics\n const actionName = actionLog.Action || 'Unknown';\n const actionMetric = metrics.byAction.get(actionName) || { count: 0, totalTime: 0, avgTime: 0, successRate: 0 };\n actionMetric.count++;\n actionMetric.totalTime += execTime;\n actionMetric.avgTime = actionMetric.totalTime / actionMetric.count;\n \n // Track success rate\n if (actionLog.ResultCode === 'Success') {\n const successCount = (actionMetric.successRate * (actionMetric.count - 1) + 1);\n actionMetric.successRate = successCount / actionMetric.count;\n } else {\n actionMetric.successRate = (actionMetric.successRate * (actionMetric.count - 1)) / actionMetric.count;\n }\n \n metrics.byAction.set(actionName, actionMetric);\n \n // Update type metrics\n // Action type is not directly available on MJActionExecutionLogEntity\n const actionType = 'Action'; // Generic type for now\n const typeMetric = metrics.byType.get(actionType) || { count: 0, totalTime: 0, avgTime: 0 };\n typeMetric.count++;\n typeMetric.totalTime += execTime;\n typeMetric.avgTime = typeMetric.totalTime / typeMetric.count;\n metrics.byType.set(actionType, typeMetric);\n \n // Status breakdown\n if (actionLog.ResultCode === 'Success') {\n metrics.statusBreakdown.success++;\n } else if (actionLog.ResultCode === 'Timeout') {\n metrics.statusBreakdown.timeout++;\n } else {\n metrics.statusBreakdown.failed++;\n \n // Error analysis\n if (actionLog.Message) {\n const errorCount = metrics.errorAnalysis.get(actionLog.Message) || 0;\n metrics.errorAnalysis.set(actionLog.Message, errorCount + 1);\n }\n }\n }\n \n // Calculate overall average\n if (metrics.totalCount > 0) {\n metrics.averageExecutionTime = metrics.totalExecutionTime / metrics.totalCount;\n }\n \n this.actionMetrics = metrics;\n }\n \n private calculateTimelineMetrics() {\n const metrics = this.initializeTimelineMetrics();\n \n metrics.totalSteps = this.allSteps.length;\n \n // Count steps by type\n for (const step of this.allSteps) {\n const type = step.StepType || 'Unknown';\n const count = metrics.stepsByType.get(type) || 0;\n metrics.stepsByType.set(type, count + 1);\n }\n \n // TODO: Calculate parallel executions, deepest nesting, and critical path\n // This would require more complex analysis of the step relationships\n \n this.timelineMetrics = metrics;\n }\n \n private calculateExecutionTime(start: Date | null, end: Date | null): number {\n if (!start || !end) return 0;\n return new Date(end).getTime() - new Date(start).getTime();\n }\n \n private prepareChartData() {\n // Model distribution pie chart\n this.modelDistributionChartData = {\n labels: Array.from(this.promptMetrics.byModel.keys()),\n datasets: [{\n data: Array.from(this.promptMetrics.byModel.values()).map(m => m.count),\n backgroundColor: this.generateColors(this.promptMetrics.byModel.size)\n }]\n };\n \n // Execution time by vendor bar chart\n this.executionTimeChartData = {\n labels: Array.from(this.promptMetrics.byVendor.keys()),\n datasets: [{\n label: 'Average Execution Time (ms)',\n data: Array.from(this.promptMetrics.byVendor.values()).map(v => v.avgTime),\n backgroundColor: 'rgba(54, 162, 235, 0.5)',\n borderColor: 'rgba(54, 162, 235, 1)',\n borderWidth: 1\n }]\n };\n \n // Cost by vendor doughnut chart\n this.costByVendorChartData = {\n labels: Array.from(this.promptMetrics.costBreakdown.byVendor.keys()),\n datasets: [{\n data: Array.from(this.promptMetrics.costBreakdown.byVendor.values()),\n backgroundColor: this.generateColors(this.promptMetrics.costBreakdown.byVendor.size)\n }]\n };\n \n // Token usage stacked bar chart\n const tokenModels = Array.from(this.promptMetrics.tokenUsage.byModel.keys());\n this.tokenUsageChartData = {\n labels: tokenModels,\n datasets: [\n {\n label: 'Input Tokens',\n data: tokenModels.map(m => this.promptMetrics.tokenUsage.byModel.get(m)?.input || 0),\n backgroundColor: 'rgba(255, 99, 132, 0.5)'\n },\n {\n label: 'Output Tokens',\n data: tokenModels.map(m => this.promptMetrics.tokenUsage.byModel.get(m)?.output || 0),\n backgroundColor: 'rgba(75, 192, 192, 0.5)'\n }\n ]\n };\n \n // Action success rate bar chart\n this.actionSuccessRateChartData = {\n labels: Array.from(this.actionMetrics.byAction.keys()),\n datasets: [{\n label: 'Success Rate (%)',\n data: Array.from(this.actionMetrics.byAction.values()).map(a => a.successRate * 100),\n backgroundColor: 'rgba(75, 192, 192, 0.5)',\n borderColor: 'rgba(75, 192, 192, 1)',\n borderWidth: 1\n }]\n };\n \n // Step type distribution pie chart\n this.stepTypeDistributionChartData = {\n labels: Array.from(this.timelineMetrics.stepsByType.keys()),\n datasets: [{\n data: Array.from(this.timelineMetrics.stepsByType.values()),\n backgroundColor: this.generateColors(this.timelineMetrics.stepsByType.size)\n }]\n };\n }\n \n private generateColors(count: number): string[] {\n const colors = [\n 'rgba(255, 99, 132, 0.5)',\n 'rgba(54, 162, 235, 0.5)',\n 'rgba(255, 206, 86, 0.5)',\n 'rgba(75, 192, 192, 0.5)',\n 'rgba(153, 102, 255, 0.5)',\n 'rgba(255, 159, 64, 0.5)',\n 'rgba(199, 199, 199, 0.5)',\n 'rgba(83, 102, 255, 0.5)',\n 'rgba(255, 99, 255, 0.5)',\n 'rgba(99, 255, 132, 0.5)'\n ];\n \n // Repeat colors if needed\n const result: string[] = [];\n for (let i = 0; i < count; i++) {\n result.push(colors[i % colors.length]);\n }\n return result;\n }\n \n formatDuration(ms: number): string {\n if (ms < 1000) return `${ms.toFixed(0)}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3600000) return `${Math.floor(ms / 60000)}m ${Math.floor((ms % 60000) / 1000)}s`;\n return `${Math.floor(ms / 3600000)}h ${Math.floor((ms % 3600000) / 60000)}m`;\n }\n \n formatCost(cost: number): string {\n if (cost < 0.01) return `$${cost.toFixed(4)}`;\n if (cost < 1) return `$${cost.toFixed(3)}`;\n return `$${cost.toFixed(2)}`;\n }\n\n /** Total tokens the models processed across this run, including cached input (true throughput). */\n get totalTokensProcessed(): number {\n const u = this.promptMetrics.tokenUsage;\n return u.totalInput + u.totalOutput + u.totalCacheRead + u.totalCacheWrite;\n }\n\n /** Rate-derived input-side dollars (uncached + cache read + cache write). */\n get inputCost(): number { return this.promptMetrics.costBreakdown.inputCost; }\n /** Rate-derived output dollars. */\n get outputCost(): number { return this.promptMetrics.costBreakdown.outputCost; }\n /** Net dollars saved by caching vs. pricing all input at the full input rate. */\n get cacheSavings(): number { return this.promptMetrics.costBreakdown.savings; }\n /** Savings as a % of what the run would have cost with no caching. */\n get cacheSavingsPct(): number {\n const cb = this.promptMetrics.costBreakdown;\n const fullPrice = cb.totalCost + cb.savings;\n return fullPrice > 0 ? (cb.savings / fullPrice) * 100 : 0;\n }\n\n /** Percentage of input tokens served from the provider's prompt cache across this agent run. */\n get cacheHitRatePct(): number {\n const u = this.promptMetrics.tokenUsage;\n const totalInput = u.totalInput + u.totalCacheRead + u.totalCacheWrite;\n return totalInput > 0 ? (u.totalCacheRead / totalInput) * 100 : 0;\n }\n \n refresh() {\n this.loadData();\n }\n \n private renderCharts() {\n if (!this.modelDistributionChart) return; // Charts not ready yet\n \n this.renderModelDistributionChart();\n this.renderExecutionTimeChart();\n this.renderCostByVendorChart();\n this.renderTokenUsageChart();\n this.renderActionSuccessRateChart();\n this.renderStepTypeChart();\n \n // Additional prompt analytics charts\n this.renderPromptTimeDistributionChart();\n this.renderPromptTokenDistributionChart();\n this.renderPromptCostDistributionChart();\n this.renderPromptCountByNameChart();\n }\n \n private renderModelDistributionChart() {\n const element = this.modelDistributionChart.nativeElement;\n const data = Array.from(this.promptMetrics.byModel.entries()).map(([name, metrics]) => ({\n name,\n value: metrics.count\n }));\n \n if (data.length === 0) return;\n \n // Clear previous chart\n d3.select(element).selectAll('*').remove();\n \n const isExpanded = this.expandedCharts['modelDistribution'];\n const width = isExpanded ? 500 : 300;\n const height = isExpanded ? 400 : 220;\n const radius = Math.min(width, height) / 2 - 40;\n \n const svg = d3.select(element)\n .append('svg')\n .attr('width', width)\n .attr('height', height)\n .append('g')\n .attr('transform', `translate(${width / 2}, ${height / 2})`);\n \n const color = d3.scaleOrdinal(d3.schemeCategory10);\n \n const pie = d3.pie<any>()\n .value(d => d.value)\n .sort(null);\n \n const arc = d3.arc()\n .innerRadius(0)\n .outerRadius(radius);\n \n const arcs = svg.selectAll('arc')\n .data(pie(data))\n .enter()\n .append('g');\n \n arcs.append('path')\n .attr('d', arc as any)\n .attr('fill', (d, i) => color(i.toString()))\n .attr('stroke', 'white')\n .style('stroke-width', '2px');\n \n // Add labels\n arcs.append('text')\n .attr('transform', (d: any) => `translate(${arc.centroid(d)})`)\n .attr('text-anchor', 'middle')\n .style('font-size', '12px')\n .style('fill', 'white')\n .text((d: any) => d.data.value > 0 ? d.data.value : '');\n \n // Add title\n svg.append('text')\n .attr('x', 0)\n .attr('y', -radius - 25)\n .attr('text-anchor', 'middle')\n .style('font-size', '16px')\n .style('font-weight', 'bold')\n .text('Prompts by Model');\n }\n \n private renderExecutionTimeChart() {\n const element = this.executionTimeChart.nativeElement;\n const data = Array.from(this.promptMetrics.byVendor.entries()).map(([name, metrics]) => ({\n name,\n value: metrics.avgTime\n }));\n \n if (data.length === 0) return;\n \n // Clear previous chart\n d3.select(element).selectAll('*').remove();\n \n const isExpanded = this.expandedCharts['executionTime'];\n const margin = { top: 40, right: 20, bottom: 70, left: 60 };\n const width = (isExpanded ? 600 : 320) - margin.left - margin.right;\n const height = (isExpanded ? 350 : 200) - margin.top - margin.bottom;\n \n const svg = d3.select(element)\n .append('svg')\n .attr('width', width + margin.left + margin.right)\n .attr('height', height + margin.top + margin.bottom)\n .append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`);\n \n const x = d3.scaleBand()\n .range([0, width])\n .domain(data.map(d => d.name))\n .padding(0.1);\n \n const y = d3.scaleLinear()\n .domain([0, d3.max(data, d => d.value) || 0])\n .range([height, 0]);\n \n // Add bars\n svg.selectAll('.bar')\n .data(data)\n .enter().append('rect')\n .attr('class', 'bar')\n .attr('x', d => x(d.name) || 0)\n .attr('width', x.bandwidth())\n .attr('y', d => y(d.value))\n .attr('height', d => height - y(d.value))\n .attr('fill', '#36a2eb');\n \n // Add x axis\n svg.append('g')\n .attr('transform', `translate(0,${height})`)\n .call(d3.axisBottom(x))\n .selectAll('text')\n .attr('transform', 'rotate(-45)')\n .style('text-anchor', 'end');\n \n // Add y axis\n svg.append('g')\n .call(d3.axisLeft(y).tickFormat(d => `${d}ms`));\n \n // Add title\n svg.append('text')\n .attr('x', width / 2)\n .attr('y', -20)\n .attr('text-anchor', 'middle')\n .style('font-size', '16px')\n .style('font-weight', 'bold')\n .text('Average Execution Time by Vendor');\n }\n \n private renderCostByVendorChart() {\n const element = this.costByVendorChart.nativeElement;\n const data = Array.from(this.promptMetrics.costBreakdown.byVendor.entries()).map(([name, cost]) => ({\n name,\n value: cost\n }));\n \n if (data.length === 0) return;\n \n // Clear previous chart\n d3.select(element).selectAll('*').remove();\n \n const width = 300;\n const height = 220;\n const radius = Math.min(width, height) / 2 - 40;\n \n const svg = d3.select(element)\n .append('svg')\n .attr('width', width)\n .attr('height', height)\n .append('g')\n .attr('transform', `translate(${width / 2}, ${height / 2})`);\n \n const color = d3.scaleOrdinal(d3.schemeSet2);\n \n const pie = d3.pie<any>()\n .value(d => d.value)\n .sort(null);\n \n const arc = d3.arc()\n .innerRadius(radius * 0.5) // Doughnut chart\n .outerRadius(radius);\n \n const arcs = svg.selectAll('arc')\n .data(pie(data))\n .enter()\n .append('g');\n \n arcs.append('path')\n .attr('d', arc as any)\n .attr('fill', (d, i) => color(i.toString()))\n .attr('stroke', 'white')\n .style('stroke-width', '2px');\n \n // Add title\n svg.append('text')\n .attr('x', 0)\n .attr('y', -radius - 25)\n .attr('text-anchor', 'middle')\n .style('font-size', '16px')\n .style('font-weight', 'bold')\n .text('Cost Distribution by Vendor');\n }\n \n private renderTokenUsageChart() {\n const element = this.tokenUsageChart.nativeElement;\n const models = Array.from(this.promptMetrics.tokenUsage.byModel.keys());\n const inputData = models.map(model => ({\n model,\n type: 'Input',\n value: this.promptMetrics.tokenUsage.byModel.get(model)?.input || 0\n }));\n const outputData = models.map(model => ({\n model,\n type: 'Output',\n value: this.promptMetrics.tokenUsage.byModel.get(model)?.output || 0\n }));\n const data = [...inputData, ...outputData];\n \n if (data.length === 0) return;\n \n // Clear previous chart\n d3.select(element).selectAll('*').remove();\n \n const margin = { top: 40, right: 100, bottom: 70, left: 60 };\n const width = 320 - margin.left - margin.right;\n const height = 200 - margin.top - margin.bottom;\n \n const svg = d3.select(element)\n .append('svg')\n .attr('width', width + margin.left + margin.right)\n .attr('height', height + margin.top + margin.bottom)\n .append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`);\n \n const x0 = d3.scaleBand()\n .rangeRound([0, width])\n .paddingInner(0.1)\n .domain(models);\n \n const x1 = d3.scaleBand()\n .padding(0.05)\n .domain(['Input', 'Output'])\n .rangeRound([0, x0.bandwidth()]);\n \n const y = d3.scaleLinear()\n .rangeRound([height, 0])\n .domain([0, d3.max(data, d => d.value) || 0]);\n \n const color = d3.scaleOrdinal()\n .domain(['Input', 'Output'])\n .range(['#ff6384', '#4bc0c0']);\n \n const grouped = d3.group(data, d => d.model);\n \n svg.append('g')\n .selectAll('g')\n .data(grouped)\n .enter().append('g')\n .attr('transform', d => `translate(${x0(d[0]) || 0},0)`)\n .selectAll('rect')\n .data(d => d[1])\n .enter().append('rect')\n .attr('x', d => x1(d.type) || 0)\n .attr('y', d => y(d.value))\n .attr('width', x1.bandwidth())\n .attr('height', d => height - y(d.value))\n .attr('fill', d => color(d.type) as string);\n \n // Add x axis\n svg.append('g')\n .attr('transform', `translate(0,${height})`)\n .call(d3.axisBottom(x0))\n .selectAll('text')\n .attr('transform', 'rotate(-45)')\n .style('text-anchor', 'end');\n \n // Add y axis\n svg.append('g')\n .call(d3.axisLeft(y));\n \n // Add legend\n const legend = svg.append('g')\n .attr('font-family', 'sans-serif')\n .attr('font-size', 10)\n .attr('text-anchor', 'end')\n .selectAll('g')\n .data(['Input', 'Output'])\n .enter().append('g')\n .attr('transform', (d, i) => `translate(0,${i * 20})`);\n \n legend.append('rect')\n .attr('x', width + 70)\n .attr('width', 19)\n .attr('height', 19)\n .attr('fill', d => color(d) as string);\n \n legend.append('text')\n .attr('x', width + 65)\n .attr('y', 9.5)\n .attr('dy', '0.32em')\n .text(d => d);\n \n // Add title\n svg.append('text')\n .attr('x', width / 2)\n .attr('y', -20)\n .attr('text-anchor', 'middle')\n .style('font-size', '16px')\n .style('font-weight', 'bold')\n .text('Token Usage by Model');\n }\n \n private renderActionSuccessRateChart() {\n const element = this.actionSuccessRateChart.nativeElement;\n const data = Array.from(this.actionMetrics.byAction.entries()).map(([name, metrics]) => ({\n name,\n value: metrics.successRate * 100\n }));\n \n if (data.length === 0) return;\n \n // Clear previous chart\n d3.select(element).selectAll('*').remove();\n \n const margin = { top: 40, right: 20, bottom: 100, left: 60 };\n const width = 320 - margin.left - margin.right;\n const height = 200 - margin.top - margin.bottom;\n \n const svg = d3.select(element)\n .append('svg')\n .attr('width', width + margin.left + margin.right)\n .attr('height', height + margin.top + margin.bottom)\n .append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`);\n \n const x = d3.scaleBand()\n .range([0, width])\n .domain(data.map(d => d.name))\n .padding(0.1);\n \n const y = d3.scaleLinear()\n .domain([0, 100])\n .range([height, 0]);\n \n // Add bars with color based on success rate\n svg.selectAll('.bar')\n .data(data)\n .enter().append('rect')\n .attr('class', 'bar')\n .attr('x', d => x(d.name) || 0)\n .attr('width', x.bandwidth())\n .attr('y', d => y(d.value))\n .attr('height', d => height - y(d.value))\n .attr('fill', d => d.value > 90 ? '#4bc0c0' : d.value > 70 ? '#ffce56' : '#ff6384');\n \n // Add x axis\n svg.append('g')\n .attr('transform', `translate(0,${height})`)\n .call(d3.axisBottom(x))\n .selectAll('text')\n .attr('transform', 'rotate(-45)')\n .style('text-anchor', 'end');\n \n // Add y axis\n svg.append('g')\n .call(d3.axisLeft(y).tickFormat(d => `${d}%`));\n \n // Add title\n svg.append('text')\n .attr('x', width / 2)\n .attr('y', -20)\n .attr('text-anchor', 'middle')\n .style('font-size', '16px')\n .style('font-weight', 'bold')\n .text('Action Success Rates');\n }\n \n private renderStepTypeChart() {\n const element = this.stepTypeChart.nativeElement;\n const data = Array.from(this.timelineMetrics.stepsByType.entries()).map(([name, value]) => ({\n name,\n value\n }));\n \n if (data.length === 0) return;\n \n // Clear previous chart\n d3.select(element).selectAll('*').remove();\n \n const width = 300;\n const height = 220;\n const radius = Math.min(width, height) / 2 - 40;\n \n const svg = d3.select(element)\n .append('svg')\n .attr('width', width)\n .attr('height', height)\n .append('g')\n .attr('transform', `translate(${width / 2}, ${height / 2})`);\n \n const color = d3.scaleOrdinal(d3.schemeSet3);\n \n const pie = d3.pie<any>()\n .value(d => d.value)\n .sort(null);\n \n const arc = d3.arc()\n .innerRadius(0)\n .outerRadius(radius);\n \n const arcs = svg.selectAll('arc')\n .data(pie(data))\n .enter()\n .append('g');\n \n arcs.append('path')\n .attr('d', arc as any)\n .attr('fill', (d, i) => color(i.toString()))\n .attr('stroke', 'white')\n .style('stroke-width', '2px');\n \n // Add labels\n arcs.append('text')\n .attr('transform', (d: any) => {\n const centroid = arc.centroid(d);\n return `translate(${centroid})`;\n })\n .attr('text-anchor', 'middle')\n .style('font-size', '12px')\n .style('fill', 'white')\n .text((d: any) => d.data.value > 0 ? d.data.value : '');\n \n // Add title\n svg.append('text')\n .attr('x', 0)\n .attr('y', -radius - 25)\n .attr('text-anchor', 'middle')\n .style('font-size', '16px')\n .style('font-weight', 'bold')\n .text('Step Type Distribution');\n }\n \n calculatePromptSuccessRate(promptName: string): string {\n const successfulRuns = this.allPromptRuns.filter(run => \n run.Prompt === promptName && run.Success === true\n ).length;\n const totalRuns = this.allPromptRuns.filter(run => \n run.Prompt === promptName\n ).length;\n \n if (totalRuns === 0) return '0';\n return ((successfulRuns / totalRuns) * 100).toFixed(1);\n }\n \n toggleChartExpansion(chartKey: string): void {\n this.expandedCharts[chartKey] = !this.expandedCharts[chartKey];\n // Re-render the chart after expansion state changes\n this.setTrackedTimeout(() => {\n this.renderCharts();\n }, 100);\n }\n \n toggleViewMode(): void {\n if (this.viewMode === 'grid') {\n this.viewMode = 'expanded';\n // Expand all charts\n Object.keys(this.expandedCharts).forEach(key => {\n this.expandedCharts[key] = true;\n });\n } else {\n this.viewMode = 'grid';\n // Collapse all charts\n Object.keys(this.expandedCharts).forEach(key => {\n this.expandedCharts[key] = false;\n });\n }\n this.setTrackedTimeout(() => {\n this.renderCharts();\n }, 100);\n }\n \n getActionType(actionName: string): string {\n // Action type is not directly available on MJActionExecutionLogEntity\n return 'Action';\n }\n \n getTopErrors(): Array<{ message: string; count: number }> {\n return Array.from(this.actionMetrics.errorAnalysis.entries())\n .map(([message, count]) => {\n // Try to extract meaningful error message from potentially complex error strings\n let cleanMessage = message;\n \n // If it looks like a view execution result, extract the key part\n if (message.includes('View executed successfully but returned no data')) {\n cleanMessage = 'View executed successfully but returned no data';\n } else if (message.length > 200) {\n // For very long error messages, truncate and add ellipsis\n cleanMessage = message.substring(0, 200) + '...';\n }\n \n return { message: cleanMessage, count };\n })\n .sort((a, b) => b.count - a.count)\n .slice(0, 5); // Top 5 errors\n }\n \n getModelPerformanceData(): any[] {\n const modelData: Map<string, any> = new Map();\n \n for (const promptRun of this.allPromptRuns) {\n const model = promptRun.Model || 'Unknown';\n const vendor = promptRun.Vendor || 'Unknown';\n const key = `${model}|${vendor}`;\n \n if (!modelData.has(key)) {\n modelData.set(key, {\n name: model,\n vendor: vendor,\n count: 0,\n totalTime: 0,\n avgTime: 0,\n totalCost: 0,\n avgCost: 0,\n inputTokens: 0,\n outputTokens: 0\n });\n }\n \n const data = modelData.get(key)!;\n data.count++;\n const execTime = this.calculateExecutionTime(promptRun.RunAt, promptRun.CompletedAt);\n data.totalTime += execTime;\n data.avgTime = data.totalTime / data.count;\n data.totalCost += promptRun.TotalCost || 0;\n data.avgCost = data.totalCost / data.count;\n data.inputTokens += promptRun.TokensPrompt || 0;\n data.outputTokens += promptRun.TokensCompletion || 0;\n }\n \n return Array.from(modelData.values()).sort((a, b) => b.count - a.count);\n }\n \n getStepTypeIcon(stepType: string): string {\n const iconMap: Record<string, string> = {\n 'Prompts': 'fa-microchip',\n 'Actions': 'fa-cog',\n 'Sub-Agent': 'fa-robot',\n 'Start': 'fa-play-circle',\n 'End': 'fa-stop-circle',\n 'Decision': 'fa-code-branch',\n 'Loop': 'fa-sync',\n 'Error': 'fa-exclamation-triangle'\n };\n return iconMap[stepType] || 'fa-circle';\n }\n \n getModelColor(model: string): string {\n // Return a color from the same palette used in generateColors\n const colors = [\n 'rgba(255, 99, 132, 0.5)',\n 'rgba(54, 162, 235, 0.5)',\n 'rgba(255, 206, 86, 0.5)',\n 'rgba(75, 192, 192, 0.5)',\n 'rgba(153, 102, 255, 0.5)',\n 'rgba(255, 159, 64, 0.5)',\n 'rgba(199, 199, 199, 0.5)',\n 'rgba(83, 102, 255, 0.5)',\n 'rgba(255, 99, 255, 0.5)',\n 'rgba(99, 255, 132, 0.5)'\n ];\n \n // Use a simple hash of the model name to consistently pick a color\n let hash = 0;\n for (let i = 0; i < model.length; i++) {\n hash = model.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n }\n \n private renderPromptTimeDistributionChart() {\n const element = this.promptTimeDistributionChart.nativeElement;\n const data = Array.from(this.promptMetrics.byPrompt.entries())\n .map(([name, metrics]) => ({\n name: name.length > 20 ? name.substring(0, 20) + '...' : name,\n value: metrics.avgTime\n }))\n .sort((a, b) => b.value - a.value)\n .slice(0, 10); // Top 10 prompts by avg time\n \n if (data.length === 0) return;\n \n // Clear previous chart\n d3.select(element).selectAll('*').remove();\n \n const margin = { top: 40, right: 20, bottom: 120, left: 80 };\n const width = 320 - margin.left - margin.right;\n const height = 200 - margin.top - margin.bottom;\n \n const svg = d3.select(element)\n .append('svg')\n .attr('width', width + margin.left + margin.right)\n .attr('height', height + margin.top + margin.bottom)\n .append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`);\n \n const x = d3.scaleBand()\n .range([0, width])\n .domain(data.map(d => d.name))\n .padding(0.1);\n \n const y = d3.scaleLinear()\n .domain([0, d3.max(data, d => d.value) || 0])\n .range([height, 0]);\n \n // Add bars\n svg.selectAll('.bar')\n .data(data)\n .enter().append('rect')\n .attr('class', 'bar')\n .attr('x', d => x(d.name) || 0)\n .attr('width', x.bandwidth())\n .attr('y', d => y(d.value))\n .attr('height', d => height - y(d.value))\n .attr('fill', '#667eea');\n \n // Add x axis\n svg.append('g')\n .attr('transform', `translate(0,${height})`)\n .call(d3.axisBottom(x))\n .selectAll('text')\n .attr('transform', 'rotate(-45)')\n .style('text-anchor', 'end')\n .style('font-size', '10px');\n \n // Add y axis\n svg.append('g')\n .call(d3.axisLeft(y).tickFormat(d => `${d}ms`));\n \n // Add title\n svg.append('text')\n .attr('x', width / 2)\n .attr('y', -20)\n .attr('text-anchor', 'middle')\n .style('font-size', '16px')\n .style('font-weight', 'bold')\n .text('Average Execution Time by Prompt');\n }\n \n private renderPromptTokenDistributionChart() {\n const element = this.promptTokenDistributionChart.nativeElement;\n \n // Aggregate token data by prompt\n const promptTokenData = new Map<string, { input: number; output: number }>();\n for (const run of this.allPromptRuns) {\n const promptName = run.Prompt || 'Unknown';\n const existing = promptTokenData.get(promptName) || { input: 0, output: 0 };\n existing.input += run.TokensPrompt || 0;\n existing.output += run.TokensCompletion || 0;\n promptTokenData.set(promptName, existing);\n }\n \n const topPrompts = Array.from(promptTokenData.entries())\n .sort((a, b) => (b[1].input + b[1].output) - (a[1].input + a[1].output))\n .slice(0, 8)\n .map(([name]) => name);\n \n const inputData = topPrompts.map(prompt => ({\n prompt: prompt.length > 15 ? prompt.substring(0, 15) + '...' : prompt,\n type: 'Input',\n value: promptTokenData.get(prompt)?.input || 0\n }));\n \n const outputData = topPrompts.map(prompt => ({\n prompt: prompt.length > 15 ? prompt.substring(0, 15) + '...' : prompt,\n type: 'Output',\n value: promptTokenData.get(prompt)?.output || 0\n }));\n \n const data = [...inputData, ...outputData];\n \n if (data.length === 0) return;\n \n // Clear previous chart\n d3.select(element).selectAll('*').remove();\n \n const margin = { top: 40, right: 100, bottom: 100, left: 80 };\n const width = 320 - margin.left - margin.right;\n const height = 200 - margin.top - margin.bottom;\n \n const svg = d3.select(element)\n .append('svg')\n .attr('width', width + margin.left + margin.right)\n .attr('height', height + margin.top + margin.bottom)\n .append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`);\n \n const x0 = d3.scaleBand()\n .rangeRound([0, width])\n .paddingInner(0.1)\n .domain(topPrompts.map(p => p.length > 15 ? p.substring(0, 15) + '...' : p));\n \n const x1 = d3.scaleBand()\n .padding(0.05)\n .domain(['Input', 'Output'])\n .rangeRound([0, x0.bandwidth()]);\n \n const y = d3.scaleLinear()\n .rangeRound([height, 0])\n .domain([0, d3.max(data, d => d.value) || 0]);\n \n const color = d3.scaleOrdinal()\n .domain(['Input', 'Output'])\n .range(['#764ba2', '#667eea']);\n \n const grouped = d3.group(data, d => d.prompt);\n \n svg.append('g')\n .selectAll('g')\n .data(grouped)\n .enter().append('g')\n .attr('transform', d => `translate(${x0(d[0]) || 0},0)`)\n .selectAll('rect')\n .data(d => d[1])\n .enter().append('rect')\n .attr('x', d => x1(d.type) || 0)\n .attr('y', d => y(d.value))\n .attr('width', x1.bandwidth())\n .attr('height', d => height - y(d.value))\n .attr('fill', d => color(d.type) as string);\n \n // Add x axis\n svg.append('g')\n .attr('transform', `translate(0,${height})`)\n .call(d3.axisBottom(x0))\n .selectAll('text')\n .attr('transform', 'rotate(-45)')\n .style('text-anchor', 'end')\n .style('font-size', '10px');\n \n // Add y axis\n svg.append('g')\n .call(d3.axisLeft(y).tickFormat(d => d3.format('.2s')(d)));\n \n // Add legend\n const legend = svg.append('g')\n .attr('font-family', 'sans-serif')\n .attr('font-size', 10)\n .attr('text-anchor', 'end')\n .selectAll('g')\n .data(['Input', 'Output'])\n .enter().append('g')\n .attr('transform', (d, i) => `translate(0,${i * 20})`);\n \n legend.append('rect')\n .attr('x', width + 70)\n .attr('width', 19)\n .attr('height', 19)\n .attr('fill', d => color(d) as string);\n \n legend.append('text')\n .attr('x', width + 65)\n .attr('y', 9.5)\n .attr('dy', '0.32em')\n .text(d => d);\n \n // Add title\n svg.append('text')\n .attr('x', width / 2)\n .attr('y', -20)\n .attr('text-anchor', 'middle')\n .style('font-size', '16px')\n .style('font-weight', 'bold')\n .text('Token Usage by Prompt');\n }\n \n private renderPromptCostDistributionChart() {\n const element = this.promptCostDistributionChart.nativeElement;\n \n // Aggregate cost data by prompt\n const promptCostData = new Map<string, number>();\n for (const run of this.allPromptRuns) {\n const promptName = run.Prompt || 'Unknown';\n const existing = promptCostData.get(promptName) || 0;\n promptCostData.set(promptName, existing + (run.TotalCost || 0));\n }\n \n const data = Array.from(promptCostData.entries())\n .filter(([_, cost]) => cost > 0)\n .map(([name, cost]) => ({\n name: name.length > 20 ? name.substring(0, 20) + '...' : name,\n value: cost\n }))\n .sort((a, b) => b.value - a.value)\n .slice(0, 10); // Top 10 prompts by cost\n \n if (data.length === 0) return;\n \n // Clear previous chart\n d3.select(element).selectAll('*').remove();\n \n const width = 300;\n const height = 220;\n const radius = Math.min(width, height) / 2 - 40;\n \n const svg = d3.select(element)\n .append('svg')\n .attr('width', width)\n .attr('height', height)\n .append('g')\n .attr('transform', `translate(${width / 2}, ${height / 2})`);\n \n const color = d3.scaleOrdinal(d3.schemePurples[9].slice(2));\n \n const pie = d3.pie<any>()\n .value(d => d.value)\n .sort((a, b) => b.value - a.value);\n \n const arc = d3.arc()\n .innerRadius(radius * 0.5)\n .outerRadius(radius);\n \n const arcs = svg.selectAll('arc')\n .data(pie(data))\n .enter()\n .append('g');\n \n arcs.append('path')\n .attr('d', arc as any)\n .attr('fill', (d, i) => color(i.toString()))\n .attr('stroke', 'white')\n .style('stroke-width', '2px');\n \n // Add title\n svg.append('text')\n .attr('x', 0)\n .attr('y', -radius - 25)\n .attr('text-anchor', 'middle')\n .style('font-size', '16px')\n .style('font-weight', 'bold')\n .text('Cost Distribution by Prompt');\n \n // Add total cost in center\n svg.append('text')\n .attr('text-anchor', 'middle')\n .attr('dy', '-0.5em')\n .style('font-size', '14px')\n .style('font-weight', 'bold')\n .text('Total Cost');\n \n svg.append('text')\n .attr('text-anchor', 'middle')\n .attr('dy', '1em')\n .style('font-size', '18px')\n .style('font-weight', 'bold')\n .text(this.formatCost(data.reduce((sum, d) => sum + d.value, 0)));\n }\n \n private renderPromptCountByNameChart() {\n const element = this.promptCountByNameChart.nativeElement;\n const data = Array.from(this.promptMetrics.byPrompt.entries())\n .map(([name, metrics]) => ({\n name: name.length > 20 ? name.substring(0, 20) + '...' : name,\n value: metrics.count\n }))\n .sort((a, b) => b.value - a.value)\n .slice(0, 10); // Top 10 prompts by count\n \n if (data.length === 0) return;\n \n // Clear previous chart\n d3.select(element).selectAll('*').remove();\n \n const margin = { top: 40, right: 20, bottom: 120, left: 60 };\n const width = 320 - margin.left - margin.right;\n const height = 200 - margin.top - margin.bottom;\n \n const svg = d3.select(element)\n .append('svg')\n .attr('width', width + margin.left + margin.right)\n .attr('height', height + margin.top + margin.bottom)\n .append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`);\n \n const x = d3.scaleBand()\n .range([0, width])\n .domain(data.map(d => d.name))\n .padding(0.1);\n \n const y = d3.scaleLinear()\n .domain([0, d3.max(data, d => d.value) || 0])\n .range([height, 0]);\n \n // Create gradient\n const gradient = svg.append('defs')\n .append('linearGradient')\n .attr('id', 'promptCountGradient')\n .attr('x1', '0%')\n .attr('y1', '0%')\n .attr('x2', '0%')\n .attr('y2', '100%');\n \n gradient.append('stop')\n .attr('offset', '0%')\n .attr('stop-color', '#667eea')\n .attr('stop-opacity', 1);\n \n gradient.append('stop')\n .attr('offset', '100%')\n .attr('stop-color', '#764ba2')\n .attr('stop-opacity', 1);\n \n // Add bars\n svg.selectAll('.bar')\n .data(data)\n .enter().append('rect')\n .attr('class', 'bar')\n .attr('x', d => x(d.name) || 0)\n .attr('width', x.bandwidth())\n .attr('y', d => y(d.value))\n .attr('height', d => height - y(d.value))\n .attr('fill', 'url(#promptCountGradient)');\n \n // Add value labels on bars\n svg.selectAll('.bar-label')\n .data(data)\n .enter().append('text')\n .attr('class', 'bar-label')\n .attr('x', d => (x(d.name) || 0) + x.bandwidth() / 2)\n .attr('y', d => y(d.value) - 5)\n .attr('text-anchor', 'middle')\n .style('font-size', '12px')\n .style('font-weight', 'bold')\n .text(d => d.value);\n \n // Add x axis\n svg.append('g')\n .attr('transform', `translate(0,${height})`)\n .call(d3.axisBottom(x))\n .selectAll('text')\n .attr('transform', 'rotate(-45)')\n .style('text-anchor', 'end')\n .style('font-size', '10px');\n \n // Add y axis\n svg.append('g')\n .call(d3.axisLeft(y));\n \n // Add title\n svg.append('text')\n .attr('x', width / 2)\n .attr('y', -20)\n .attr('text-anchor', 'middle')\n .style('font-size', '16px')\n .style('font-weight', 'bold')\n .text('Prompt Execution Count');\n }\n\n /**\n * Get all agent run IDs in hierarchy, starting from the root run\n */\n private async getAllAgentRunIds(rootRunId: string): Promise<string[]> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const agentRunIds: string[] = [rootRunId];\n \n // Simple recursive approach to find all child runs\n const findChildRuns = async (parentId: string): Promise<void> => {\n const result = await rv.RunView({\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ParentRunID = '${parentId}'`,\n });\n \n if (result.Success && result.Results && result.Results.length > 0) {\n for (const childRun of result.Results) {\n if (!agentRunIds.some(id => UUIDsEqual(id, childRun.ID))) {\n agentRunIds.push(childRun.ID);\n await findChildRuns(childRun.ID); // Recursively find children\n }\n }\n }\n };\n \n await findChildRuns(rootRunId);\n return agentRunIds;\n }\n\n /**\n * Load all prompt runs for the given agent run IDs\n * Uses the same approach as the cost calculation: find prompt runs via agent run steps\n */\n private async loadAllPromptRuns(agentRunIds: string[]): Promise<any[]> {\n if (agentRunIds.length === 0) return [];\n \n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n \n // First, get all the prompt steps for the agent runs\n const stepsResult = await rv.RunView({\n EntityName: 'MJ: AI Agent Run Steps',\n ExtraFilter: `AgentRunID IN ('${agentRunIds.join(\"','\")}') AND StepType = 'Prompt'`,\n ResultType: 'simple'\n });\n \n if (!stepsResult.Success || !stepsResult.Results || stepsResult.Results.length === 0) {\n return [];\n }\n \n // Extract the TargetLogID values (these are the prompt run IDs)\n const promptRunIds = stepsResult.Results\n .map(step => step.TargetLogID)\n .filter(id => id); // Remove any null/undefined values\n \n if (promptRunIds.length === 0) {\n return [];\n }\n \n \n // Now get the actual prompt runs\n const promptResult = await rv.RunView({\n EntityName: 'MJ: AI Prompt Runs', \n ExtraFilter: `ID IN ('${promptRunIds.join(\"','\")}')`,\n OrderBy: 'RunAt',\n ResultType: 'simple'\n });\n \n return promptResult.Success ? (promptResult.Results || []) : [];\n }\n \n /**\n * TrackBy function for keyvalue pipe\n */\n trackByKey(index: number, item: { key: string; value: any }): string {\n return item.key;\n }\n \n /**\n * TrackBy function for error messages\n */\n trackByErrorMessage(index: number, error: { message: string; count: number }): string {\n return error.message;\n }\n \n /**\n * TrackBy function for model performance data\n */\n trackByModelName(index: number, model: any): string {\n return model.name || index.toString();\n }\n}","<div class=\"analytics-container\">\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-state\">\n <i class=\"fas fa-spinner fa-spin fa-2x\"></i>\n <p>Loading analytics data...</p>\n </div>\n }\n\n <!-- Error State -->\n @if (error && !isLoading) {\n <div class=\"error-state\">\n <i class=\"fas fa-exclamation-triangle fa-2x\"></i>\n <p>{{ error }}</p>\n <button mjButton (click)=\"loadData()\">Retry</button>\n </div>\n }\n\n <!-- Analytics Content -->\n @if (!isLoading && !error) {\n <div class=\"analytics-content\">\n <!-- Summary Cards -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-tachometer-alt\"></i> Overview\n </ng-template>\n <div class=\"summary-cards\">\n <div class=\"summary-card\">\n <div class=\"card-icon prompts\">\n <i class=\"fas fa-microchip\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Total Prompts</h3>\n <div class=\"metric-value\">{{ promptMetrics.totalCount }}</div>\n <div class=\"metric-detail\">\n <span class=\"success\">{{ promptMetrics.statusBreakdown.success }} successful</span>\n @if (promptMetrics.statusBreakdown.failed > 0) {\n <span class=\"failed\">{{ promptMetrics.statusBreakdown.failed }} failed</span>\n }\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon actions\">\n <i class=\"fas fa-cog\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Total Actions</h3>\n <div class=\"metric-value\">{{ actionMetrics.totalCount }}</div>\n <div class=\"metric-detail\">\n <span class=\"success\">{{ actionMetrics.statusBreakdown.success }} successful</span>\n @if (actionMetrics.statusBreakdown.failed > 0) {\n <span class=\"failed\">{{ actionMetrics.statusBreakdown.failed }} failed</span>\n }\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon cost\">\n <i class=\"fas fa-dollar-sign\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Total Cost</h3>\n <div class=\"metric-value\">{{ formatCost(promptMetrics.costBreakdown.totalCost) }}</div>\n <div class=\"metric-detail cache-detail\">\n <span>{{ totalTokensProcessed | number }} tokens</span>\n @if (promptMetrics.tokenUsage.totalCacheRead > 0 || promptMetrics.tokenUsage.totalCacheWrite > 0) {\n <span>incl. {{ (promptMetrics.tokenUsage.totalCacheRead + promptMetrics.tokenUsage.totalCacheWrite) | number }} cached</span>\n }\n @if (inputCost > 0 || outputCost > 0) {\n <span>input {{ formatCost(inputCost) }} &middot; output {{ formatCost(outputCost) }}</span>\n }\n @if (cacheSavings > 0) {\n <span class=\"success\">saved {{ formatCost(cacheSavings) }} ({{ cacheSavingsPct | number:'1.0-0' }}%) via cache</span>\n }\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon cache\">\n <i class=\"fas fa-bolt\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Prompt Cache</h3>\n <div class=\"metric-value\">{{ promptMetrics.tokenUsage.totalCacheRead | number }}</div>\n <div class=\"metric-detail cache-detail\">\n <span>tokens read from cache</span>\n @if (promptMetrics.tokenUsage.totalCacheWrite > 0) {\n <span>{{ promptMetrics.tokenUsage.totalCacheWrite | number }} written</span>\n }\n @if (promptMetrics.tokenUsage.totalCacheRead > 0 || promptMetrics.tokenUsage.totalCacheWrite > 0) {\n <span>{{ cacheHitRatePct | number:'1.0-0' }}% hit rate</span>\n }\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon time\">\n <i class=\"fas fa-clock\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Execution Time</h3>\n <div class=\"metric-value\">{{ formatDuration(promptMetrics.totalExecutionTime + actionMetrics.totalExecutionTime) }}</div>\n <div class=\"metric-detail\">\n <span>{{ timelineMetrics.totalSteps }} total steps</span>\n </div>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Prompt Analytics -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-microchip\"></i> Prompt Analytics\n </ng-template>\n <div class=\"analytics-panel\">\n <!-- View Mode Toggle -->\n @if (promptMetrics.totalCount > 0) {\n <div class=\"view-mode-toggle\">\n <button mjButton\n variant=\"flat\"\n (click)=\"toggleViewMode()\">\n <i class=\"fas\" [ngClass]=\"viewMode === 'grid' ? 'fa-expand-arrows-alt' : 'fa-compress-arrows-alt'\"></i>\n {{ viewMode === 'grid' ? 'Expand All' : 'Collapse All' }}\n </button>\n </div>\n }\n <!-- No prompts message -->\n @if (promptMetrics.totalCount === 0) {\n <div class=\"no-data-message\">\n <i class=\"fas fa-info-circle\"></i>\n <p>No prompt executions found in this agent run.</p>\n <p class=\"small\">This agent run may have only executed actions without any AI prompts.</p>\n </div>\n }\n @if (promptMetrics.totalCount > 0) {\n <div class=\"charts-grid\">\n <!-- Model Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['modelDistribution']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('modelDistribution')\">\n <h3><i class=\"fas fa-chart-pie\"></i> Prompts by Model</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['modelDistribution'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"modelDistributionChart\" #modelDistributionChart></div>\n @if (promptMetrics.byModel.size > 0) {\n <div class=\"chart-legend\">\n @for (item of promptMetrics.byModel | keyvalue; track trackByKey($index, item)) {\n <div class=\"legend-item\">\n <span class=\"legend-color\" [style.backgroundColor]=\"getModelColor(item.key)\"></span>\n <span class=\"legend-label\">{{ item.key }}: {{ item.value.count }} ({{ (item.value.count / promptMetrics.totalCount * 100).toFixed(1) }}%)</span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <!-- Execution Time by Vendor -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['executionTime']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('executionTime')\">\n <h3><i class=\"fas fa-clock\"></i> Average Execution Time by Vendor</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['executionTime'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"executionTimeChart\" #executionTimeChart></div>\n </div>\n </div>\n </div>\n <!-- Cost by Vendor -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['costByVendor']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('costByVendor')\">\n <h3><i class=\"fas fa-dollar-sign\"></i> Cost Distribution by Vendor</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['costByVendor'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"costByVendorChart\" #costByVendorChart></div>\n <div class=\"chart-total\">Total: {{ formatCost(promptMetrics.costBreakdown.totalCost) }}</div>\n </div>\n </div>\n </div>\n <!-- Token Usage -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['tokenUsage']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('tokenUsage')\">\n <h3><i class=\"fas fa-coins\"></i> Token Usage by Model</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['tokenUsage'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"tokenUsageChart\" #tokenUsageChart></div>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- Additional Prompt Analytics Charts -->\n @if (promptMetrics.totalCount > 0) {\n <div class=\"charts-grid\" style=\"margin-top: 20px;\">\n <!-- Prompt Execution Time Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptTime']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptTime')\">\n <h3><i class=\"fas fa-hourglass-half\"></i> Average Execution Time by Prompt</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptTime'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptTimeDistributionChart\" #promptTimeDistributionChart></div>\n </div>\n </div>\n </div>\n <!-- Prompt Token Usage -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptToken']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptToken')\">\n <h3><i class=\"fas fa-database\"></i> Token Usage by Prompt</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptToken'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptTokenDistributionChart\" #promptTokenDistributionChart></div>\n </div>\n </div>\n </div>\n <!-- Prompt Cost Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptCost']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptCost')\">\n <h3><i class=\"fas fa-chart-pie\"></i> Cost Distribution by Prompt</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptCost'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptCostDistributionChart\" #promptCostDistributionChart></div>\n </div>\n </div>\n </div>\n <!-- Prompt Count by Name -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptCount']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptCount')\">\n <h3><i class=\"fas fa-list-ol\"></i> Prompt Execution Count</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptCount'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptCountByNameChart\" #promptCountByNameChart></div>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- Detailed Prompt Metrics -->\n <div class=\"detailed-metrics\">\n <button mjButton\n variant=\"flat\"\n (click)=\"promptDetailsExpanded = !promptDetailsExpanded\">\n <i class=\"fas\" [ngClass]=\"promptDetailsExpanded ? 'fa-chevron-up' : 'fa-chevron-down'\"></i>\n Detailed Prompt Metrics\n </button>\n @if (promptDetailsExpanded) {\n <div class=\"metrics-table\">\n <table>\n <thead>\n <tr>\n <th>Prompt Name</th>\n <th>Count</th>\n <th>Avg Time</th>\n <th>Total Time</th>\n <th>Success Rate</th>\n </tr>\n </thead>\n <tbody>\n @for (prompt of promptMetrics.byPrompt | keyvalue; track trackByKey($index, prompt)) {\n <tr>\n <td>{{ prompt.key }}</td>\n <td>{{ prompt.value.count }}</td>\n <td>{{ formatDuration(prompt.value.avgTime) }}</td>\n <td>{{ formatDuration(prompt.value.totalTime) }}</td>\n <td>\n <span class=\"success-rate\">\n <!-- Calculate success rate for this prompt -->\n {{ calculatePromptSuccessRate(prompt.key) }}%\n </span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Action Analytics -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-cog\"></i> Action Analytics\n </ng-template>\n <div class=\"analytics-panel\">\n <div class=\"charts-grid\">\n <!-- Action Success Rate -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['actionSuccess']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('actionSuccess')\">\n <h3><i class=\"fas fa-chart-bar\"></i> Action Success Rate</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['actionSuccess'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"actionSuccessRateChart\" #actionSuccessRateChart></div>\n </div>\n </div>\n </div>\n <!-- Step Type Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['stepType']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('stepType')\">\n <h3><i class=\"fas fa-layer-group\"></i> Step Type Distribution</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['stepType'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"stepTypeChart\" #stepTypeChart></div>\n </div>\n </div>\n </div>\n </div>\n <!-- Detailed Action Metrics -->\n <div class=\"detailed-metrics\">\n <button mjButton\n variant=\"flat\"\n (click)=\"actionDetailsExpanded = !actionDetailsExpanded\">\n <i class=\"fas\" [ngClass]=\"actionDetailsExpanded ? 'fa-chevron-up' : 'fa-chevron-down'\"></i>\n Detailed Action Metrics\n </button>\n @if (actionDetailsExpanded) {\n <div class=\"metrics-table\">\n <table>\n <thead>\n <tr>\n <th>Action Name</th>\n <th>Count</th>\n <th>Avg Time</th>\n <th>Success Rate</th>\n <th>Type</th>\n </tr>\n </thead>\n <tbody>\n @for (action of actionMetrics.byAction | keyvalue; track trackByKey($index, action)) {\n <tr>\n <td>{{ action.key }}</td>\n <td>{{ action.value.count }}</td>\n <td>{{ formatDuration(action.value.avgTime) }}</td>\n <td>\n <span class=\"success-rate\" [class.high]=\"action.value.successRate > 0.9\"\n [class.medium]=\"action.value.successRate > 0.7 && action.value.successRate <= 0.9\"\n [class.low]=\"action.value.successRate <= 0.7\">\n {{ (action.value.successRate * 100).toFixed(1) }}%\n </span>\n </td>\n <td>{{ getActionType(action.key) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n <!-- Error Analysis -->\n <div class=\"error-analysis-section\">\n @if (actionMetrics.errorAnalysis.size > 0) {\n <div class=\"error-analysis\">\n <h3>\n <i class=\"fas fa-exclamation-triangle\"></i>\n Common Errors\n </h3>\n <p class=\"error-analysis-description\">\n This section shows the most frequent error messages from failed actions, helping identify systemic issues that may need attention.\n </p>\n <div class=\"error-list\">\n @for (error of getTopErrors(); track trackByErrorMessage($index, error)) {\n <div class=\"error-item\">\n <span class=\"error-count\">{{ error.count }}x</span>\n <span class=\"error-message\">{{ error.message }}</span>\n </div>\n }\n </div>\n </div>\n }\n @if (actionMetrics.errorAnalysis.size === 0) {\n <div class=\"no-errors\">\n <i class=\"fas fa-check-circle\"></i>\n <p>No action errors detected in this run. All actions completed successfully!</p>\n </div>\n }\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Model Performance Comparison -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-chart-line\"></i> Model Performance Comparison\n </ng-template>\n <div class=\"analytics-panel\">\n <div class=\"model-comparison\">\n <table>\n <thead>\n <tr>\n <th>Model</th>\n <th>Vendor</th>\n <th>Prompts</th>\n <th>Avg Time</th>\n <th>Total Cost</th>\n <th>Avg Cost/Prompt</th>\n <th>Input Tokens</th>\n <th>Output Tokens</th>\n </tr>\n </thead>\n <tbody>\n @for (model of getModelPerformanceData(); track trackByModelName($index, model)) {\n <tr>\n <td>{{ model.name }}</td>\n <td>{{ model.vendor }}</td>\n <td>{{ model.count }}</td>\n <td>{{ formatDuration(model.avgTime) }}</td>\n <td>{{ formatCost(model.totalCost) }}</td>\n <td>{{ formatCost(model.avgCost) }}</td>\n <td>{{ model.inputTokens | number:'1.0-0' }}</td>\n <td>{{ model.outputTokens | number:'1.0-0' }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Timeline Analysis -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-stream\"></i> Execution Timeline Analysis\n </ng-template>\n <div class=\"analytics-panel\">\n <div class=\"timeline-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-label\">Total Steps</span>\n <span class=\"stat-value\">{{ timelineMetrics.totalSteps }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Parallel Executions</span>\n <span class=\"stat-value\">{{ timelineMetrics.parallelExecutions }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Max Nesting Depth</span>\n <span class=\"stat-value\">{{ timelineMetrics.deepestNesting }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Sub-Agent Runs</span>\n <span class=\"stat-value\">{{ subAgentRuns.length }}</span>\n </div>\n </div>\n <div class=\"step-breakdown\">\n <h3>Steps by Type</h3>\n <div class=\"step-type-list\">\n @for (type of timelineMetrics.stepsByType | keyvalue; track trackByKey($index, type)) {\n <div class=\"step-type-item\">\n <i class=\"fas\" [ngClass]=\"getStepTypeIcon(type.key)\"></i>\n <span class=\"type-name\">{{ type.key }}</span>\n <span class=\"type-count\">{{ type.value }}</span>\n <span class=\"type-percentage\">({{ (type.value / timelineMetrics.totalSteps * 100).toFixed(1) }}%)</span>\n </div>\n }\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n </div>\n }\n</div>"]}
1
+ {"version":3,"file":"ai-agent-run-analytics.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-analytics.component.ts","../../../../src/lib/custom/ai-agent-run/ai-agent-run-analytics.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnInit, OnDestroy, ViewChild, ElementRef, ChangeDetectorRef, AfterViewInit, ChangeDetectionStrategy } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { RunView } from '@memberjunction/core';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\nimport { MJAIPromptRunEntity } from '@memberjunction/core-entities';\nimport * as d3 from 'd3';\nimport { AIAgentRunCostService } from './ai-agent-run-cost.service';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\ninterface PromptMetrics {\n totalCount: number;\n totalExecutionTime: number;\n averageExecutionTime: number;\n byModel: Map<string, { count: number; totalTime: number; avgTime: number }>;\n byVendor: Map<string, { count: number; totalTime: number; avgTime: number }>;\n byPrompt: Map<string, { count: number; totalTime: number; avgTime: number }>;\n statusBreakdown: { success: number; failed: number; timeout: number };\n costBreakdown: {\n totalCost: number;\n byModel: Map<string, number>;\n byVendor: Map<string, number>;\n // Rate-derived dollar split (computed from AIModelCost rates). inputCost folds uncached + cache\n // read + cache write; savings = what it would have cost with no caching minus actual.\n inputCost: number;\n outputCost: number;\n savings: number;\n unratedCost: number; // stored cost of runs whose model+vendor had no rate row (breakdown excludes them)\n };\n tokenUsage: { totalInput: number; totalOutput: number; totalCacheRead: number; totalCacheWrite: number; byModel: Map<string, { input: number; output: number }> };\n}\n\ninterface ActionMetrics {\n totalCount: number;\n totalExecutionTime: number;\n averageExecutionTime: number;\n byAction: Map<string, { count: number; totalTime: number; avgTime: number; successRate: number }>;\n byType: Map<string, { count: number; totalTime: number; avgTime: number }>;\n statusBreakdown: { success: number; failed: number; timeout: number };\n errorAnalysis: Map<string, number>; // Error message to count\n}\n\ninterface TimelineMetrics {\n totalSteps: number;\n stepsByType: Map<string, number>;\n parallelExecutions: number;\n deepestNesting: number;\n criticalPath: { steps: string[]; totalTime: number };\n}\n\ninterface SimpleAgentRun {\n ID: string;\n AgentID?: string;\n Status?: string;\n // Add other fields as needed\n}\n\ninterface SimpleAgentRunStep {\n ID: string;\n StepType: string;\n TargetLogID?: string;\n // Add other fields as needed\n}\n\ninterface SimpleActionLog {\n ID: string;\n Action: string | null;\n StartedAt: Date | null;\n EndedAt: Date | null;\n ResultCode: string | null;\n Message: string | null;\n // Add other fields as needed\n}\n\n@Component({\n standalone: false,\n selector: 'mj-ai-agent-run-analytics',\n templateUrl: './ai-agent-run-analytics.component.html',\n styleUrls: ['./ai-agent-run-analytics.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AIAgentRunAnalyticsComponent extends BaseAngularComponent implements OnInit, OnDestroy, AfterViewInit {\n @Input() agentRunId!: string;\n \n private destroy$ = new Subject<void>();\n \n /** Track active timeouts for cleanup */\n private activeTimeouts: number[] = [];\n \n /** Helper method to create tracked setTimeout calls */\n private setTrackedTimeout(callback: () => void, delay: number = 0): number {\n const timeoutId = setTimeout(() => {\n // Remove from tracking array when timeout executes\n this.removeTimeoutFromTracking(timeoutId);\n callback();\n }, delay) as any as number;\n \n this.activeTimeouts.push(timeoutId);\n return timeoutId;\n }\n \n /** Remove timeout from tracking array */\n private removeTimeoutFromTracking(timeoutId: number): void {\n const index = this.activeTimeouts.indexOf(timeoutId);\n if (index > -1) {\n this.activeTimeouts.splice(index, 1);\n }\n }\n \n // Chart expansion states\n expandedCharts: { [key: string]: boolean } = {\n modelDistribution: false,\n executionTime: false,\n costByVendor: false,\n tokenUsage: false,\n promptTime: false,\n promptToken: false,\n promptCost: false,\n promptCount: false,\n actionSuccess: false,\n stepType: false\n };\n \n viewMode: 'grid' | 'expanded' = 'grid';\n \n // Loading state\n isLoading = true;\n error: string | null = null;\n \n // Data\n agentRun: SimpleAgentRun | null = null;\n allPromptRuns: MJAIPromptRunEntity[] = [];\n\n // Per model+vendor cache pricing (currency-per-token), loaded from AIModelCost for the cost split.\n private cacheRates = new Map<string, { inputRate: number; outputRate: number; cacheReadRate: number; cacheWriteRate: number }>();\n private static readonly UNIT_DIVISORS: Record<string, number> = {\n 'Per Million Tokens': 1_000_000, 'Per Hundred Thousand Tokens': 100_000, 'Per Thousand Tokens': 1_000\n };\n allActionLogs: SimpleActionLog[] = [];\n allSteps: SimpleAgentRunStep[] = [];\n subAgentRuns: SimpleAgentRun[] = [];\n \n // Metrics\n promptMetrics: PromptMetrics = this.initializePromptMetrics();\n actionMetrics: ActionMetrics = this.initializeActionMetrics();\n timelineMetrics: TimelineMetrics = this.initializeTimelineMetrics();\n \n // Chart configurations\n modelDistributionChartData: any;\n executionTimeChartData: any;\n costByVendorChartData: any;\n tokenUsageChartData: any;\n actionSuccessRateChartData: any;\n stepTypeDistributionChartData: any;\n \n // Expanded sections\n promptDetailsExpanded = false;\n actionDetailsExpanded = false;\n \n // Expansion panel states\n panelStates = {\n summary: true,\n prompts: true,\n actions: true,\n models: true,\n timeline: true\n };\n \n // Chart element references\n @ViewChild('modelDistributionChart', { static: false }) modelDistributionChart!: ElementRef;\n @ViewChild('executionTimeChart', { static: false }) executionTimeChart!: ElementRef;\n @ViewChild('costByVendorChart', { static: false }) costByVendorChart!: ElementRef;\n @ViewChild('tokenUsageChart', { static: false }) tokenUsageChart!: ElementRef;\n @ViewChild('actionSuccessRateChart', { static: false }) actionSuccessRateChart!: ElementRef;\n @ViewChild('stepTypeChart', { static: false }) stepTypeChart!: ElementRef;\n @ViewChild('promptTimeDistributionChart', { static: false }) promptTimeDistributionChart!: ElementRef;\n @ViewChild('promptTokenDistributionChart', { static: false }) promptTokenDistributionChart!: ElementRef;\n @ViewChild('promptCostDistributionChart', { static: false }) promptCostDistributionChart!: ElementRef;\n @ViewChild('promptCountByNameChart', { static: false }) promptCountByNameChart!: ElementRef;\n \n constructor(\n private cdr: ChangeDetectorRef,\n private costService: AIAgentRunCostService\n ) {\n super();}\n \n ngOnInit() {\n if (this.agentRunId) {\n this.loadData();\n }\n }\n \n ngOnDestroy() {\n // Signal all subscriptions to complete\n this.destroy$.next();\n this.destroy$.complete();\n \n // Clear all active timeouts\n this.activeTimeouts.forEach(timeoutId => {\n clearTimeout(timeoutId);\n });\n this.activeTimeouts.length = 0;\n \n // Clean up all D3 charts (must be done last)\n this.cleanupAllCharts();\n \n console.log('AI Agent Run Analytics component destroyed and cleaned up');\n }\n \n private cleanupAllCharts() {\n // List of all chart element refs\n const chartRefs = [\n this.modelDistributionChart,\n this.executionTimeChart,\n this.costByVendorChart,\n this.tokenUsageChart,\n this.actionSuccessRateChart,\n this.stepTypeChart,\n this.promptTimeDistributionChart,\n this.promptTokenDistributionChart,\n this.promptCostDistributionChart,\n this.promptCountByNameChart\n ];\n \n // More comprehensive D3 cleanup\n chartRefs.forEach(chartRef => {\n if (chartRef?.nativeElement) {\n const element = chartRef.nativeElement;\n const d3Element = d3.select(element);\n \n // Remove ALL possible event listeners (comprehensive list)\n const allEventTypes = [\n 'click', 'dblclick', 'mousedown', 'mouseup', 'mouseover', 'mouseout', \n 'mousemove', 'mouseenter', 'mouseleave', 'contextmenu',\n 'touchstart', 'touchend', 'touchmove', 'touchcancel',\n 'wheel', 'scroll', 'resize', 'focus', 'blur',\n 'keydown', 'keyup', 'keypress',\n 'drag', 'dragstart', 'dragend', 'dragover', 'dragenter', 'dragleave', 'drop'\n ];\n \n // Remove event listeners from all child elements\n d3Element.selectAll('*').each(function() {\n const node = d3.select(this);\n allEventTypes.forEach(eventType => {\n node.on(eventType, null);\n });\n });\n \n // Remove event listeners from the main element too\n allEventTypes.forEach(eventType => {\n d3Element.on(eventType, null);\n });\n \n // Cancel any ongoing transitions\n d3Element.selectAll('*').interrupt();\n \n // Remove all SVG elements and clear the container\n d3Element.selectAll('*').remove();\n \n // Clear innerHTML as final cleanup\n element.innerHTML = '';\n }\n });\n \n // Clear any tooltips that might be attached to body or other elements\n d3.selectAll('.d3-tooltip, .tooltip, .chart-tooltip').remove();\n \n // Clear any D3 selections that might be cached globally\n // Note: This is more aggressive but necessary for preventing leaks\n try {\n d3.selectAll('[data-chart-element=\"true\"]').remove();\n d3.selectAll('.d3-tooltip').remove();\n d3.selectAll('.chart-tooltip').remove();\n } catch (error) {\n console.warn('D3 global cleanup had issues:', error);\n }\n }\n \n ngAfterViewInit() {\n // Charts will be rendered after data is loaded\n }\n \n async loadData() {\n this.isLoading = true;\n this.error = null;\n \n try {\n // Load all data including nested sub-agent runs\n await this.loadAllRunData();\n \n // Calculate metrics\n this.calculatePromptMetrics();\n this.calculateActionMetrics();\n this.calculateTimelineMetrics();\n \n // Prepare chart data\n this.prepareChartData();\n \n // Render charts after view updates\n this.cdr.detectChanges();\n this.setTrackedTimeout(() => {\n this.renderCharts();\n });\n \n } catch (error) {\n console.error('Error loading analytics data:', error);\n this.error = 'Failed to load analytics data';\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n \n private async loadAllRunData() {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n \n // Get all agent run IDs in hierarchy (including root and children)\n const agentRunIds = await this.getAllAgentRunIds(this.agentRunId);\n \n // Batch load all data (except prompt runs which we'll load via shared service)\n const results = await rv.RunViews([\n // Main agent run\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ID = '${this.agentRunId}'`,\n },\n // All sub-agent runs\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: agentRunIds.length > 1 ? `ID IN ('${agentRunIds.slice(1).join(\"','\")}')` : `ID = '00000000-0000-0000-0000-000000000000'`,\n },\n // All action logs - need to get via steps\n {\n EntityName: 'MJ: AI Agent Run Steps',\n ExtraFilter: `AgentRunID IN ('${agentRunIds.join(\"','\")}') AND StepType = 'Actions'`,\n },\n // All steps for timeline analysis - only need basic fields like StepType\n {\n EntityName: 'MJ: AI Agent Run Steps',\n ExtraFilter: `AgentRunID IN ('${agentRunIds.join(\"','\")}')`,\n }\n ]);\n \n // Process results\n \n if (results[0].Success && results[0].Results && results[0].Results.length > 0) {\n this.agentRun = results[0].Results[0];\n }\n \n if (results[1].Success) {\n this.subAgentRuns = results[1].Results || [];\n }\n \n // Load all prompt runs for the agent run hierarchy\n this.allPromptRuns = await this.loadAllPromptRuns(agentRunIds);\n\n // Load cache pricing so cost can be split (input/output) and cache savings computed\n await this.loadCacheRates();\n \n if (results[2].Success) {\n const actionSteps = results[2].Results || [];\n // Now load the actual action logs\n if (actionSteps.length > 0) {\n const actionLogIds = actionSteps\n .map(s => s.TargetLogID)\n .filter(id => id != null);\n \n if (actionLogIds.length > 0) {\n const actionResult = await rv.RunView({\n EntityName: 'MJ: Action Execution Logs',\n ExtraFilter: `ID IN ('${actionLogIds.join(\"','\")}')`\n });\n \n if (actionResult.Success) {\n this.allActionLogs = actionResult.Results || [];\n }\n }\n }\n }\n \n if (results[3].Success) {\n this.allSteps = results[3].Results || [];\n }\n }\n \n \n private initializePromptMetrics(): PromptMetrics {\n return {\n totalCount: 0,\n totalExecutionTime: 0,\n averageExecutionTime: 0,\n byModel: new Map(),\n byVendor: new Map(),\n byPrompt: new Map(),\n statusBreakdown: { success: 0, failed: 0, timeout: 0 },\n costBreakdown: { totalCost: 0, byModel: new Map(), byVendor: new Map(), inputCost: 0, outputCost: 0, savings: 0, unratedCost: 0 },\n tokenUsage: { totalInput: 0, totalOutput: 0, totalCacheRead: 0, totalCacheWrite: 0, byModel: new Map() }\n };\n }\n \n private initializeActionMetrics(): ActionMetrics {\n return {\n totalCount: 0,\n totalExecutionTime: 0,\n averageExecutionTime: 0,\n byAction: new Map(),\n byType: new Map(),\n statusBreakdown: { success: 0, failed: 0, timeout: 0 },\n errorAnalysis: new Map()\n };\n }\n \n private initializeTimelineMetrics(): TimelineMetrics {\n return {\n totalSteps: 0,\n stepsByType: new Map(),\n parallelExecutions: 0,\n deepestNesting: 0,\n criticalPath: { steps: [], totalTime: 0 }\n };\n }\n \n /** Stable rate-map key for a model+vendor pair. */\n private rateKey(modelID: string | null | undefined, vendorID: string | null | undefined): string {\n return `${NormalizeUUID(modelID ?? '')}|${NormalizeUUID(vendorID ?? '')}`;\n }\n\n /** Load active realtime AIModelCost rates and normalize each to currency-per-token. */\n private async loadCacheRates() {\n this.cacheRates.clear();\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const res = await rv.RunView({\n EntityName: 'MJ: AI Model Costs',\n ExtraFilter: `Status='Active' AND ProcessingType='Realtime'`,\n Fields: ['ModelID', 'VendorID', 'InputPricePerUnit', 'OutputPricePerUnit', 'CacheReadPricePerUnit', 'CacheWritePricePerUnit', 'UnitType'],\n ResultType: 'simple'\n });\n if (!res.Success) return;\n for (const row of res.Results || []) {\n const divisor = AIAgentRunAnalyticsComponent.UNIT_DIVISORS[row.UnitType ?? ''] ?? 1_000_000;\n const input = (row.InputPricePerUnit ?? 0) / divisor;\n this.cacheRates.set(this.rateKey(row.ModelID, row.VendorID), {\n inputRate: input,\n outputRate: (row.OutputPricePerUnit ?? 0) / divisor,\n cacheReadRate: (row.CacheReadPricePerUnit ?? row.InputPricePerUnit ?? 0) / divisor,\n cacheWriteRate: (row.CacheWritePricePerUnit ?? row.InputPricePerUnit ?? 0) / divisor\n });\n }\n }\n\n private calculatePromptMetrics() {\n const metrics = this.initializePromptMetrics();\n \n for (const promptRun of this.allPromptRuns) {\n metrics.totalCount++;\n \n // Calculate execution time\n const execTime = this.calculateExecutionTime(promptRun.RunAt, promptRun.CompletedAt);\n metrics.totalExecutionTime += execTime;\n \n // Update model metrics\n const model = promptRun.Model || 'Unknown';\n const modelMetric = metrics.byModel.get(model) || { count: 0, totalTime: 0, avgTime: 0 };\n modelMetric.count++;\n modelMetric.totalTime += execTime;\n modelMetric.avgTime = modelMetric.totalTime / modelMetric.count;\n metrics.byModel.set(model, modelMetric);\n \n // Update vendor metrics\n const vendor = promptRun.Vendor || 'Unknown';\n const vendorMetric = metrics.byVendor.get(vendor) || { count: 0, totalTime: 0, avgTime: 0 };\n vendorMetric.count++;\n vendorMetric.totalTime += execTime;\n vendorMetric.avgTime = vendorMetric.totalTime / vendorMetric.count;\n metrics.byVendor.set(vendor, vendorMetric);\n \n // Update prompt name metrics\n const promptName = promptRun.Prompt || 'Unknown';\n const promptMetric = metrics.byPrompt.get(promptName) || { count: 0, totalTime: 0, avgTime: 0 };\n promptMetric.count++;\n promptMetric.totalTime += execTime;\n promptMetric.avgTime = promptMetric.totalTime / promptMetric.count;\n metrics.byPrompt.set(promptName, promptMetric);\n \n // Status breakdown\n if (promptRun.Success) {\n metrics.statusBreakdown.success++;\n } else if (promptRun.ErrorMessage?.includes('timeout')) {\n metrics.statusBreakdown.timeout++;\n } else {\n metrics.statusBreakdown.failed++;\n }\n \n // Cost tracking\n const cost = promptRun.TotalCost || 0;\n metrics.costBreakdown.totalCost += cost;\n \n const modelCost = metrics.costBreakdown.byModel.get(model) || 0;\n metrics.costBreakdown.byModel.set(model, modelCost + cost);\n \n const vendorCost = metrics.costBreakdown.byVendor.get(vendor) || 0;\n metrics.costBreakdown.byVendor.set(vendor, vendorCost + cost);\n \n // Token usage\n const inputTokens = promptRun.TokensPrompt || 0;\n const outputTokens = promptRun.TokensCompletion || 0;\n metrics.tokenUsage.totalInput += inputTokens;\n metrics.tokenUsage.totalOutput += outputTokens;\n // Provider prompt-cache tokens (read = cache hits, write = cache creation). Summed from the\n // child prompt runs' persisted TokensCacheRead/TokensCacheWrite columns.\n const cacheReadTokens = promptRun.TokensCacheRead || 0;\n const cacheWriteTokens = promptRun.TokensCacheWrite || 0;\n metrics.tokenUsage.totalCacheRead += cacheReadTokens;\n metrics.tokenUsage.totalCacheWrite += cacheWriteTokens;\n\n // Rate-derived cost split + cache savings. inputCost folds uncached + cache read + cache write\n // (each at its own rate); savings = the discount vs. pricing all input at the full input rate.\n // Runs whose model+vendor has no rate row are tracked separately so the split isn't silently off.\n const rate = this.cacheRates.get(this.rateKey(promptRun.ModelID, promptRun.VendorID));\n if (rate) {\n metrics.costBreakdown.inputCost += inputTokens * rate.inputRate + cacheReadTokens * rate.cacheReadRate + cacheWriteTokens * rate.cacheWriteRate;\n metrics.costBreakdown.outputCost += outputTokens * rate.outputRate;\n metrics.costBreakdown.savings += cacheReadTokens * (rate.inputRate - rate.cacheReadRate) + cacheWriteTokens * (rate.inputRate - rate.cacheWriteRate);\n } else {\n metrics.costBreakdown.unratedCost += cost;\n }\n\n const modelTokens = metrics.tokenUsage.byModel.get(model) || { input: 0, output: 0 };\n modelTokens.input += inputTokens;\n modelTokens.output += outputTokens;\n metrics.tokenUsage.byModel.set(model, modelTokens);\n }\n \n // Calculate overall average\n if (metrics.totalCount > 0) {\n metrics.averageExecutionTime = metrics.totalExecutionTime / metrics.totalCount;\n }\n \n this.promptMetrics = metrics;\n }\n \n private calculateActionMetrics() {\n const metrics = this.initializeActionMetrics();\n \n for (const actionLog of this.allActionLogs) {\n metrics.totalCount++;\n \n // Calculate execution time\n const execTime = this.calculateExecutionTime(actionLog.StartedAt, actionLog.EndedAt);\n metrics.totalExecutionTime += execTime;\n \n // Update action metrics\n const actionName = actionLog.Action || 'Unknown';\n const actionMetric = metrics.byAction.get(actionName) || { count: 0, totalTime: 0, avgTime: 0, successRate: 0 };\n actionMetric.count++;\n actionMetric.totalTime += execTime;\n actionMetric.avgTime = actionMetric.totalTime / actionMetric.count;\n \n // Track success rate\n if (actionLog.ResultCode === 'Success') {\n const successCount = (actionMetric.successRate * (actionMetric.count - 1) + 1);\n actionMetric.successRate = successCount / actionMetric.count;\n } else {\n actionMetric.successRate = (actionMetric.successRate * (actionMetric.count - 1)) / actionMetric.count;\n }\n \n metrics.byAction.set(actionName, actionMetric);\n \n // Update type metrics\n // Action type is not directly available on MJActionExecutionLogEntity\n const actionType = 'Action'; // Generic type for now\n const typeMetric = metrics.byType.get(actionType) || { count: 0, totalTime: 0, avgTime: 0 };\n typeMetric.count++;\n typeMetric.totalTime += execTime;\n typeMetric.avgTime = typeMetric.totalTime / typeMetric.count;\n metrics.byType.set(actionType, typeMetric);\n \n // Status breakdown\n if (actionLog.ResultCode === 'Success') {\n metrics.statusBreakdown.success++;\n } else if (actionLog.ResultCode === 'Timeout') {\n metrics.statusBreakdown.timeout++;\n } else {\n metrics.statusBreakdown.failed++;\n \n // Error analysis\n if (actionLog.Message) {\n const errorCount = metrics.errorAnalysis.get(actionLog.Message) || 0;\n metrics.errorAnalysis.set(actionLog.Message, errorCount + 1);\n }\n }\n }\n \n // Calculate overall average\n if (metrics.totalCount > 0) {\n metrics.averageExecutionTime = metrics.totalExecutionTime / metrics.totalCount;\n }\n \n this.actionMetrics = metrics;\n }\n \n private calculateTimelineMetrics() {\n const metrics = this.initializeTimelineMetrics();\n \n metrics.totalSteps = this.allSteps.length;\n \n // Count steps by type\n for (const step of this.allSteps) {\n const type = step.StepType || 'Unknown';\n const count = metrics.stepsByType.get(type) || 0;\n metrics.stepsByType.set(type, count + 1);\n }\n \n // TODO: Calculate parallel executions, deepest nesting, and critical path\n // This would require more complex analysis of the step relationships\n \n this.timelineMetrics = metrics;\n }\n \n private calculateExecutionTime(start: Date | null, end: Date | null): number {\n if (!start || !end) return 0;\n return new Date(end).getTime() - new Date(start).getTime();\n }\n \n private prepareChartData() {\n // Model distribution pie chart\n this.modelDistributionChartData = {\n labels: Array.from(this.promptMetrics.byModel.keys()),\n datasets: [{\n data: Array.from(this.promptMetrics.byModel.values()).map(m => m.count),\n backgroundColor: this.generateColors(this.promptMetrics.byModel.size)\n }]\n };\n \n // Execution time by vendor bar chart\n this.executionTimeChartData = {\n labels: Array.from(this.promptMetrics.byVendor.keys()),\n datasets: [{\n label: 'Average Execution Time (ms)',\n data: Array.from(this.promptMetrics.byVendor.values()).map(v => v.avgTime),\n backgroundColor: 'rgba(54, 162, 235, 0.5)',\n borderColor: 'rgba(54, 162, 235, 1)',\n borderWidth: 1\n }]\n };\n \n // Cost by vendor doughnut chart\n this.costByVendorChartData = {\n labels: Array.from(this.promptMetrics.costBreakdown.byVendor.keys()),\n datasets: [{\n data: Array.from(this.promptMetrics.costBreakdown.byVendor.values()),\n backgroundColor: this.generateColors(this.promptMetrics.costBreakdown.byVendor.size)\n }]\n };\n \n // Token usage stacked bar chart\n const tokenModels = Array.from(this.promptMetrics.tokenUsage.byModel.keys());\n this.tokenUsageChartData = {\n labels: tokenModels,\n datasets: [\n {\n label: 'Input Tokens',\n data: tokenModels.map(m => this.promptMetrics.tokenUsage.byModel.get(m)?.input || 0),\n backgroundColor: 'rgba(255, 99, 132, 0.5)'\n },\n {\n label: 'Output Tokens',\n data: tokenModels.map(m => this.promptMetrics.tokenUsage.byModel.get(m)?.output || 0),\n backgroundColor: 'rgba(75, 192, 192, 0.5)'\n }\n ]\n };\n \n // Action success rate bar chart\n this.actionSuccessRateChartData = {\n labels: Array.from(this.actionMetrics.byAction.keys()),\n datasets: [{\n label: 'Success Rate (%)',\n data: Array.from(this.actionMetrics.byAction.values()).map(a => a.successRate * 100),\n backgroundColor: 'rgba(75, 192, 192, 0.5)',\n borderColor: 'rgba(75, 192, 192, 1)',\n borderWidth: 1\n }]\n };\n \n // Step type distribution pie chart\n this.stepTypeDistributionChartData = {\n labels: Array.from(this.timelineMetrics.stepsByType.keys()),\n datasets: [{\n data: Array.from(this.timelineMetrics.stepsByType.values()),\n backgroundColor: this.generateColors(this.timelineMetrics.stepsByType.size)\n }]\n };\n }\n \n private generateColors(count: number): string[] {\n const colors = [\n 'rgba(255, 99, 132, 0.5)',\n 'rgba(54, 162, 235, 0.5)',\n 'rgba(255, 206, 86, 0.5)',\n 'rgba(75, 192, 192, 0.5)',\n 'rgba(153, 102, 255, 0.5)',\n 'rgba(255, 159, 64, 0.5)',\n 'rgba(199, 199, 199, 0.5)',\n 'rgba(83, 102, 255, 0.5)',\n 'rgba(255, 99, 255, 0.5)',\n 'rgba(99, 255, 132, 0.5)'\n ];\n \n // Repeat colors if needed\n const result: string[] = [];\n for (let i = 0; i < count; i++) {\n result.push(colors[i % colors.length]);\n }\n return result;\n }\n \n formatDuration(ms: number): string {\n if (ms < 1000) return `${ms.toFixed(0)}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3600000) return `${Math.floor(ms / 60000)}m ${Math.floor((ms % 60000) / 1000)}s`;\n return `${Math.floor(ms / 3600000)}h ${Math.floor((ms % 3600000) / 60000)}m`;\n }\n \n formatCost(cost: number): string {\n if (cost < 0.01) return `$${cost.toFixed(4)}`;\n if (cost < 1) return `$${cost.toFixed(3)}`;\n return `$${cost.toFixed(2)}`;\n }\n\n /** Total tokens the models processed across this run, including cached input (true throughput). */\n get totalTokensProcessed(): number {\n const u = this.promptMetrics.tokenUsage;\n return u.totalInput + u.totalOutput + u.totalCacheRead + u.totalCacheWrite;\n }\n\n /** Rate-derived input-side dollars (uncached + cache read + cache write). */\n get inputCost(): number { return this.promptMetrics.costBreakdown.inputCost; }\n /** Rate-derived output dollars. */\n get outputCost(): number { return this.promptMetrics.costBreakdown.outputCost; }\n /** Net dollars saved by caching vs. pricing all input at the full input rate. */\n get cacheSavings(): number { return this.promptMetrics.costBreakdown.savings; }\n /** Savings as a % of what the run would have cost with no caching. */\n get cacheSavingsPct(): number {\n const cb = this.promptMetrics.costBreakdown;\n const fullPrice = cb.totalCost + cb.savings;\n return fullPrice > 0 ? (cb.savings / fullPrice) * 100 : 0;\n }\n\n /** Percentage of input tokens served from the provider's prompt cache across this agent run. */\n get cacheHitRatePct(): number {\n const u = this.promptMetrics.tokenUsage;\n const totalInput = u.totalInput + u.totalCacheRead + u.totalCacheWrite;\n return totalInput > 0 ? (u.totalCacheRead / totalInput) * 100 : 0;\n }\n \n refresh() {\n this.loadData();\n }\n \n private renderCharts() {\n if (!this.modelDistributionChart) return; // Charts not ready yet\n \n this.renderModelDistributionChart();\n this.renderExecutionTimeChart();\n this.renderCostByVendorChart();\n this.renderTokenUsageChart();\n this.renderActionSuccessRateChart();\n this.renderStepTypeChart();\n \n // Additional prompt analytics charts\n this.renderPromptTimeDistributionChart();\n this.renderPromptTokenDistributionChart();\n this.renderPromptCostDistributionChart();\n this.renderPromptCountByNameChart();\n }\n \n private renderModelDistributionChart() {\n const element = this.modelDistributionChart.nativeElement;\n const data = Array.from(this.promptMetrics.byModel.entries()).map(([name, metrics]) => ({\n name,\n value: metrics.count\n }));\n \n if (data.length === 0) return;\n \n // Clear previous chart\n d3.select(element).selectAll('*').remove();\n \n const isExpanded = this.expandedCharts['modelDistribution'];\n const width = isExpanded ? 500 : 300;\n const height = isExpanded ? 400 : 220;\n const radius = Math.min(width, height) / 2 - 40;\n \n const svg = d3.select(element)\n .append('svg')\n .attr('width', width)\n .attr('height', height)\n .append('g')\n .attr('transform', `translate(${width / 2}, ${height / 2})`);\n \n const color = d3.scaleOrdinal(d3.schemeCategory10);\n \n const pie = d3.pie<any>()\n .value(d => d.value)\n .sort(null);\n \n const arc = d3.arc()\n .innerRadius(0)\n .outerRadius(radius);\n \n const arcs = svg.selectAll('arc')\n .data(pie(data))\n .enter()\n .append('g');\n \n arcs.append('path')\n .attr('d', arc as any)\n .attr('fill', (d, i) => color(i.toString()))\n .attr('stroke', 'white')\n .style('stroke-width', '2px');\n \n // Add labels\n arcs.append('text')\n .attr('transform', (d: any) => `translate(${arc.centroid(d)})`)\n .attr('text-anchor', 'middle')\n .style('font-size', '12px')\n .style('fill', 'white')\n .text((d: any) => d.data.value > 0 ? d.data.value : '');\n \n // Add title\n svg.append('text')\n .attr('x', 0)\n .attr('y', -radius - 25)\n .attr('text-anchor', 'middle')\n .style('font-size', '16px')\n .style('font-weight', 'bold')\n .text('Prompts by Model');\n }\n \n private renderExecutionTimeChart() {\n const element = this.executionTimeChart.nativeElement;\n const data = Array.from(this.promptMetrics.byVendor.entries()).map(([name, metrics]) => ({\n name,\n value: metrics.avgTime\n }));\n \n if (data.length === 0) return;\n \n // Clear previous chart\n d3.select(element).selectAll('*').remove();\n \n const isExpanded = this.expandedCharts['executionTime'];\n const margin = { top: 40, right: 20, bottom: 70, left: 60 };\n const width = (isExpanded ? 600 : 320) - margin.left - margin.right;\n const height = (isExpanded ? 350 : 200) - margin.top - margin.bottom;\n \n const svg = d3.select(element)\n .append('svg')\n .attr('width', width + margin.left + margin.right)\n .attr('height', height + margin.top + margin.bottom)\n .append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`);\n \n const x = d3.scaleBand()\n .range([0, width])\n .domain(data.map(d => d.name))\n .padding(0.1);\n \n const y = d3.scaleLinear()\n .domain([0, d3.max(data, d => d.value) || 0])\n .range([height, 0]);\n \n // Add bars\n svg.selectAll('.bar')\n .data(data)\n .enter().append('rect')\n .attr('class', 'bar')\n .attr('x', d => x(d.name) || 0)\n .attr('width', x.bandwidth())\n .attr('y', d => y(d.value))\n .attr('height', d => height - y(d.value))\n .attr('fill', '#36a2eb');\n \n // Add x axis\n svg.append('g')\n .attr('transform', `translate(0,${height})`)\n .call(d3.axisBottom(x))\n .selectAll('text')\n .attr('transform', 'rotate(-45)')\n .style('text-anchor', 'end');\n \n // Add y axis\n svg.append('g')\n .call(d3.axisLeft(y).tickFormat(d => `${d}ms`));\n \n // Add title\n svg.append('text')\n .attr('x', width / 2)\n .attr('y', -20)\n .attr('text-anchor', 'middle')\n .style('font-size', '16px')\n .style('font-weight', 'bold')\n .text('Average Execution Time by Vendor');\n }\n \n private renderCostByVendorChart() {\n const element = this.costByVendorChart.nativeElement;\n const data = Array.from(this.promptMetrics.costBreakdown.byVendor.entries()).map(([name, cost]) => ({\n name,\n value: cost\n }));\n \n if (data.length === 0) return;\n \n // Clear previous chart\n d3.select(element).selectAll('*').remove();\n \n const width = 300;\n const height = 220;\n const radius = Math.min(width, height) / 2 - 40;\n \n const svg = d3.select(element)\n .append('svg')\n .attr('width', width)\n .attr('height', height)\n .append('g')\n .attr('transform', `translate(${width / 2}, ${height / 2})`);\n \n const color = d3.scaleOrdinal(d3.schemeSet2);\n \n const pie = d3.pie<any>()\n .value(d => d.value)\n .sort(null);\n \n const arc = d3.arc()\n .innerRadius(radius * 0.5) // Doughnut chart\n .outerRadius(radius);\n \n const arcs = svg.selectAll('arc')\n .data(pie(data))\n .enter()\n .append('g');\n \n arcs.append('path')\n .attr('d', arc as any)\n .attr('fill', (d, i) => color(i.toString()))\n .attr('stroke', 'white')\n .style('stroke-width', '2px');\n \n // Add title\n svg.append('text')\n .attr('x', 0)\n .attr('y', -radius - 25)\n .attr('text-anchor', 'middle')\n .style('font-size', '16px')\n .style('font-weight', 'bold')\n .text('Cost Distribution by Vendor');\n }\n \n private renderTokenUsageChart() {\n const element = this.tokenUsageChart.nativeElement;\n const models = Array.from(this.promptMetrics.tokenUsage.byModel.keys());\n const inputData = models.map(model => ({\n model,\n type: 'Input',\n value: this.promptMetrics.tokenUsage.byModel.get(model)?.input || 0\n }));\n const outputData = models.map(model => ({\n model,\n type: 'Output',\n value: this.promptMetrics.tokenUsage.byModel.get(model)?.output || 0\n }));\n const data = [...inputData, ...outputData];\n \n if (data.length === 0) return;\n \n // Clear previous chart\n d3.select(element).selectAll('*').remove();\n \n const margin = { top: 40, right: 100, bottom: 70, left: 60 };\n const width = 320 - margin.left - margin.right;\n const height = 200 - margin.top - margin.bottom;\n \n const svg = d3.select(element)\n .append('svg')\n .attr('width', width + margin.left + margin.right)\n .attr('height', height + margin.top + margin.bottom)\n .append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`);\n \n const x0 = d3.scaleBand()\n .rangeRound([0, width])\n .paddingInner(0.1)\n .domain(models);\n \n const x1 = d3.scaleBand()\n .padding(0.05)\n .domain(['Input', 'Output'])\n .rangeRound([0, x0.bandwidth()]);\n \n const y = d3.scaleLinear()\n .rangeRound([height, 0])\n .domain([0, d3.max(data, d => d.value) || 0]);\n \n const color = d3.scaleOrdinal()\n .domain(['Input', 'Output'])\n .range(['#ff6384', '#4bc0c0']);\n \n const grouped = d3.group(data, d => d.model);\n \n svg.append('g')\n .selectAll('g')\n .data(grouped)\n .enter().append('g')\n .attr('transform', d => `translate(${x0(d[0]) || 0},0)`)\n .selectAll('rect')\n .data(d => d[1])\n .enter().append('rect')\n .attr('x', d => x1(d.type) || 0)\n .attr('y', d => y(d.value))\n .attr('width', x1.bandwidth())\n .attr('height', d => height - y(d.value))\n .attr('fill', d => color(d.type) as string);\n \n // Add x axis\n svg.append('g')\n .attr('transform', `translate(0,${height})`)\n .call(d3.axisBottom(x0))\n .selectAll('text')\n .attr('transform', 'rotate(-45)')\n .style('text-anchor', 'end');\n \n // Add y axis\n svg.append('g')\n .call(d3.axisLeft(y));\n \n // Add legend\n const legend = svg.append('g')\n .attr('font-family', 'sans-serif')\n .attr('font-size', 10)\n .attr('text-anchor', 'end')\n .selectAll('g')\n .data(['Input', 'Output'])\n .enter().append('g')\n .attr('transform', (d, i) => `translate(0,${i * 20})`);\n \n legend.append('rect')\n .attr('x', width + 70)\n .attr('width', 19)\n .attr('height', 19)\n .attr('fill', d => color(d) as string);\n \n legend.append('text')\n .attr('x', width + 65)\n .attr('y', 9.5)\n .attr('dy', '0.32em')\n .text(d => d);\n \n // Add title\n svg.append('text')\n .attr('x', width / 2)\n .attr('y', -20)\n .attr('text-anchor', 'middle')\n .style('font-size', '16px')\n .style('font-weight', 'bold')\n .text('Token Usage by Model');\n }\n \n private renderActionSuccessRateChart() {\n const element = this.actionSuccessRateChart.nativeElement;\n const data = Array.from(this.actionMetrics.byAction.entries()).map(([name, metrics]) => ({\n name,\n value: metrics.successRate * 100\n }));\n \n if (data.length === 0) return;\n \n // Clear previous chart\n d3.select(element).selectAll('*').remove();\n \n const margin = { top: 40, right: 20, bottom: 100, left: 60 };\n const width = 320 - margin.left - margin.right;\n const height = 200 - margin.top - margin.bottom;\n \n const svg = d3.select(element)\n .append('svg')\n .attr('width', width + margin.left + margin.right)\n .attr('height', height + margin.top + margin.bottom)\n .append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`);\n \n const x = d3.scaleBand()\n .range([0, width])\n .domain(data.map(d => d.name))\n .padding(0.1);\n \n const y = d3.scaleLinear()\n .domain([0, 100])\n .range([height, 0]);\n \n // Add bars with color based on success rate\n svg.selectAll('.bar')\n .data(data)\n .enter().append('rect')\n .attr('class', 'bar')\n .attr('x', d => x(d.name) || 0)\n .attr('width', x.bandwidth())\n .attr('y', d => y(d.value))\n .attr('height', d => height - y(d.value))\n .attr('fill', d => d.value > 90 ? '#4bc0c0' : d.value > 70 ? '#ffce56' : '#ff6384');\n \n // Add x axis\n svg.append('g')\n .attr('transform', `translate(0,${height})`)\n .call(d3.axisBottom(x))\n .selectAll('text')\n .attr('transform', 'rotate(-45)')\n .style('text-anchor', 'end');\n \n // Add y axis\n svg.append('g')\n .call(d3.axisLeft(y).tickFormat(d => `${d}%`));\n \n // Add title\n svg.append('text')\n .attr('x', width / 2)\n .attr('y', -20)\n .attr('text-anchor', 'middle')\n .style('font-size', '16px')\n .style('font-weight', 'bold')\n .text('Action Success Rates');\n }\n \n private renderStepTypeChart() {\n const element = this.stepTypeChart.nativeElement;\n const data = Array.from(this.timelineMetrics.stepsByType.entries()).map(([name, value]) => ({\n name,\n value\n }));\n \n if (data.length === 0) return;\n \n // Clear previous chart\n d3.select(element).selectAll('*').remove();\n \n const width = 300;\n const height = 220;\n const radius = Math.min(width, height) / 2 - 40;\n \n const svg = d3.select(element)\n .append('svg')\n .attr('width', width)\n .attr('height', height)\n .append('g')\n .attr('transform', `translate(${width / 2}, ${height / 2})`);\n \n const color = d3.scaleOrdinal(d3.schemeSet3);\n \n const pie = d3.pie<any>()\n .value(d => d.value)\n .sort(null);\n \n const arc = d3.arc()\n .innerRadius(0)\n .outerRadius(radius);\n \n const arcs = svg.selectAll('arc')\n .data(pie(data))\n .enter()\n .append('g');\n \n arcs.append('path')\n .attr('d', arc as any)\n .attr('fill', (d, i) => color(i.toString()))\n .attr('stroke', 'white')\n .style('stroke-width', '2px');\n \n // Add labels\n arcs.append('text')\n .attr('transform', (d: any) => {\n const centroid = arc.centroid(d);\n return `translate(${centroid})`;\n })\n .attr('text-anchor', 'middle')\n .style('font-size', '12px')\n .style('fill', 'white')\n .text((d: any) => d.data.value > 0 ? d.data.value : '');\n \n // Add title\n svg.append('text')\n .attr('x', 0)\n .attr('y', -radius - 25)\n .attr('text-anchor', 'middle')\n .style('font-size', '16px')\n .style('font-weight', 'bold')\n .text('Step Type Distribution');\n }\n \n calculatePromptSuccessRate(promptName: string): string {\n const successfulRuns = this.allPromptRuns.filter(run => \n run.Prompt === promptName && run.Success === true\n ).length;\n const totalRuns = this.allPromptRuns.filter(run => \n run.Prompt === promptName\n ).length;\n \n if (totalRuns === 0) return '0';\n return ((successfulRuns / totalRuns) * 100).toFixed(1);\n }\n \n toggleChartExpansion(chartKey: string): void {\n this.expandedCharts[chartKey] = !this.expandedCharts[chartKey];\n // Re-render the chart after expansion state changes\n this.setTrackedTimeout(() => {\n this.renderCharts();\n }, 100);\n }\n \n toggleViewMode(): void {\n if (this.viewMode === 'grid') {\n this.viewMode = 'expanded';\n // Expand all charts\n Object.keys(this.expandedCharts).forEach(key => {\n this.expandedCharts[key] = true;\n });\n } else {\n this.viewMode = 'grid';\n // Collapse all charts\n Object.keys(this.expandedCharts).forEach(key => {\n this.expandedCharts[key] = false;\n });\n }\n this.setTrackedTimeout(() => {\n this.renderCharts();\n }, 100);\n }\n \n getActionType(actionName: string): string {\n // Action type is not directly available on MJActionExecutionLogEntity\n return 'Action';\n }\n \n getTopErrors(): Array<{ message: string; count: number }> {\n return Array.from(this.actionMetrics.errorAnalysis.entries())\n .map(([message, count]) => {\n // Try to extract meaningful error message from potentially complex error strings\n let cleanMessage = message;\n \n // If it looks like a view execution result, extract the key part\n if (message.includes('View executed successfully but returned no data')) {\n cleanMessage = 'View executed successfully but returned no data';\n } else if (message.length > 200) {\n // For very long error messages, truncate and add ellipsis\n cleanMessage = message.substring(0, 200) + '...';\n }\n \n return { message: cleanMessage, count };\n })\n .sort((a, b) => b.count - a.count)\n .slice(0, 5); // Top 5 errors\n }\n \n getModelPerformanceData(): any[] {\n const modelData: Map<string, any> = new Map();\n \n for (const promptRun of this.allPromptRuns) {\n const model = promptRun.Model || 'Unknown';\n const vendor = promptRun.Vendor || 'Unknown';\n const key = `${model}|${vendor}`;\n \n if (!modelData.has(key)) {\n modelData.set(key, {\n name: model,\n vendor: vendor,\n count: 0,\n totalTime: 0,\n avgTime: 0,\n totalCost: 0,\n avgCost: 0,\n inputTokens: 0,\n outputTokens: 0\n });\n }\n \n const data = modelData.get(key)!;\n data.count++;\n const execTime = this.calculateExecutionTime(promptRun.RunAt, promptRun.CompletedAt);\n data.totalTime += execTime;\n data.avgTime = data.totalTime / data.count;\n data.totalCost += promptRun.TotalCost || 0;\n data.avgCost = data.totalCost / data.count;\n data.inputTokens += promptRun.TokensPrompt || 0;\n data.outputTokens += promptRun.TokensCompletion || 0;\n }\n \n return Array.from(modelData.values()).sort((a, b) => b.count - a.count);\n }\n \n getStepTypeIcon(stepType: string): string {\n const iconMap: Record<string, string> = {\n 'Prompts': 'fa-microchip',\n 'Actions': 'fa-cog',\n 'Sub-Agent': 'fa-robot',\n 'Start': 'fa-play-circle',\n 'End': 'fa-stop-circle',\n 'Decision': 'fa-code-branch',\n 'Loop': 'fa-sync',\n 'Error': 'fa-exclamation-triangle'\n };\n return iconMap[stepType] || 'fa-circle';\n }\n \n getModelColor(model: string): string {\n // Return a color from the same palette used in generateColors\n const colors = [\n 'rgba(255, 99, 132, 0.5)',\n 'rgba(54, 162, 235, 0.5)',\n 'rgba(255, 206, 86, 0.5)',\n 'rgba(75, 192, 192, 0.5)',\n 'rgba(153, 102, 255, 0.5)',\n 'rgba(255, 159, 64, 0.5)',\n 'rgba(199, 199, 199, 0.5)',\n 'rgba(83, 102, 255, 0.5)',\n 'rgba(255, 99, 255, 0.5)',\n 'rgba(99, 255, 132, 0.5)'\n ];\n \n // Use a simple hash of the model name to consistently pick a color\n let hash = 0;\n for (let i = 0; i < model.length; i++) {\n hash = model.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n }\n \n private renderPromptTimeDistributionChart() {\n const element = this.promptTimeDistributionChart.nativeElement;\n const data = Array.from(this.promptMetrics.byPrompt.entries())\n .map(([name, metrics]) => ({\n name: name.length > 20 ? name.substring(0, 20) + '...' : name,\n value: metrics.avgTime\n }))\n .sort((a, b) => b.value - a.value)\n .slice(0, 10); // Top 10 prompts by avg time\n \n if (data.length === 0) return;\n \n // Clear previous chart\n d3.select(element).selectAll('*').remove();\n \n const margin = { top: 40, right: 20, bottom: 120, left: 80 };\n const width = 320 - margin.left - margin.right;\n const height = 200 - margin.top - margin.bottom;\n \n const svg = d3.select(element)\n .append('svg')\n .attr('width', width + margin.left + margin.right)\n .attr('height', height + margin.top + margin.bottom)\n .append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`);\n \n const x = d3.scaleBand()\n .range([0, width])\n .domain(data.map(d => d.name))\n .padding(0.1);\n \n const y = d3.scaleLinear()\n .domain([0, d3.max(data, d => d.value) || 0])\n .range([height, 0]);\n \n // Add bars\n svg.selectAll('.bar')\n .data(data)\n .enter().append('rect')\n .attr('class', 'bar')\n .attr('x', d => x(d.name) || 0)\n .attr('width', x.bandwidth())\n .attr('y', d => y(d.value))\n .attr('height', d => height - y(d.value))\n .attr('fill', '#667eea');\n \n // Add x axis\n svg.append('g')\n .attr('transform', `translate(0,${height})`)\n .call(d3.axisBottom(x))\n .selectAll('text')\n .attr('transform', 'rotate(-45)')\n .style('text-anchor', 'end')\n .style('font-size', '10px');\n \n // Add y axis\n svg.append('g')\n .call(d3.axisLeft(y).tickFormat(d => `${d}ms`));\n \n // Add title\n svg.append('text')\n .attr('x', width / 2)\n .attr('y', -20)\n .attr('text-anchor', 'middle')\n .style('font-size', '16px')\n .style('font-weight', 'bold')\n .text('Average Execution Time by Prompt');\n }\n \n private renderPromptTokenDistributionChart() {\n const element = this.promptTokenDistributionChart.nativeElement;\n \n // Aggregate token data by prompt\n const promptTokenData = new Map<string, { input: number; output: number }>();\n for (const run of this.allPromptRuns) {\n const promptName = run.Prompt || 'Unknown';\n const existing = promptTokenData.get(promptName) || { input: 0, output: 0 };\n existing.input += run.TokensPrompt || 0;\n existing.output += run.TokensCompletion || 0;\n promptTokenData.set(promptName, existing);\n }\n \n const topPrompts = Array.from(promptTokenData.entries())\n .sort((a, b) => (b[1].input + b[1].output) - (a[1].input + a[1].output))\n .slice(0, 8)\n .map(([name]) => name);\n \n const inputData = topPrompts.map(prompt => ({\n prompt: prompt.length > 15 ? prompt.substring(0, 15) + '...' : prompt,\n type: 'Input',\n value: promptTokenData.get(prompt)?.input || 0\n }));\n \n const outputData = topPrompts.map(prompt => ({\n prompt: prompt.length > 15 ? prompt.substring(0, 15) + '...' : prompt,\n type: 'Output',\n value: promptTokenData.get(prompt)?.output || 0\n }));\n \n const data = [...inputData, ...outputData];\n \n if (data.length === 0) return;\n \n // Clear previous chart\n d3.select(element).selectAll('*').remove();\n \n const margin = { top: 40, right: 100, bottom: 100, left: 80 };\n const width = 320 - margin.left - margin.right;\n const height = 200 - margin.top - margin.bottom;\n \n const svg = d3.select(element)\n .append('svg')\n .attr('width', width + margin.left + margin.right)\n .attr('height', height + margin.top + margin.bottom)\n .append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`);\n \n const x0 = d3.scaleBand()\n .rangeRound([0, width])\n .paddingInner(0.1)\n .domain(topPrompts.map(p => p.length > 15 ? p.substring(0, 15) + '...' : p));\n \n const x1 = d3.scaleBand()\n .padding(0.05)\n .domain(['Input', 'Output'])\n .rangeRound([0, x0.bandwidth()]);\n \n const y = d3.scaleLinear()\n .rangeRound([height, 0])\n .domain([0, d3.max(data, d => d.value) || 0]);\n \n const color = d3.scaleOrdinal()\n .domain(['Input', 'Output'])\n .range(['#764ba2', '#667eea']);\n \n const grouped = d3.group(data, d => d.prompt);\n \n svg.append('g')\n .selectAll('g')\n .data(grouped)\n .enter().append('g')\n .attr('transform', d => `translate(${x0(d[0]) || 0},0)`)\n .selectAll('rect')\n .data(d => d[1])\n .enter().append('rect')\n .attr('x', d => x1(d.type) || 0)\n .attr('y', d => y(d.value))\n .attr('width', x1.bandwidth())\n .attr('height', d => height - y(d.value))\n .attr('fill', d => color(d.type) as string);\n \n // Add x axis\n svg.append('g')\n .attr('transform', `translate(0,${height})`)\n .call(d3.axisBottom(x0))\n .selectAll('text')\n .attr('transform', 'rotate(-45)')\n .style('text-anchor', 'end')\n .style('font-size', '10px');\n \n // Add y axis\n svg.append('g')\n .call(d3.axisLeft(y).tickFormat(d => d3.format('.2s')(d)));\n \n // Add legend\n const legend = svg.append('g')\n .attr('font-family', 'sans-serif')\n .attr('font-size', 10)\n .attr('text-anchor', 'end')\n .selectAll('g')\n .data(['Input', 'Output'])\n .enter().append('g')\n .attr('transform', (d, i) => `translate(0,${i * 20})`);\n \n legend.append('rect')\n .attr('x', width + 70)\n .attr('width', 19)\n .attr('height', 19)\n .attr('fill', d => color(d) as string);\n \n legend.append('text')\n .attr('x', width + 65)\n .attr('y', 9.5)\n .attr('dy', '0.32em')\n .text(d => d);\n \n // Add title\n svg.append('text')\n .attr('x', width / 2)\n .attr('y', -20)\n .attr('text-anchor', 'middle')\n .style('font-size', '16px')\n .style('font-weight', 'bold')\n .text('Token Usage by Prompt');\n }\n \n private renderPromptCostDistributionChart() {\n const element = this.promptCostDistributionChart.nativeElement;\n \n // Aggregate cost data by prompt\n const promptCostData = new Map<string, number>();\n for (const run of this.allPromptRuns) {\n const promptName = run.Prompt || 'Unknown';\n const existing = promptCostData.get(promptName) || 0;\n promptCostData.set(promptName, existing + (run.TotalCost || 0));\n }\n \n const data = Array.from(promptCostData.entries())\n .filter(([_, cost]) => cost > 0)\n .map(([name, cost]) => ({\n name: name.length > 20 ? name.substring(0, 20) + '...' : name,\n value: cost\n }))\n .sort((a, b) => b.value - a.value)\n .slice(0, 10); // Top 10 prompts by cost\n \n if (data.length === 0) return;\n \n // Clear previous chart\n d3.select(element).selectAll('*').remove();\n \n const width = 300;\n const height = 220;\n const radius = Math.min(width, height) / 2 - 40;\n \n const svg = d3.select(element)\n .append('svg')\n .attr('width', width)\n .attr('height', height)\n .append('g')\n .attr('transform', `translate(${width / 2}, ${height / 2})`);\n \n const color = d3.scaleOrdinal(d3.schemePurples[9].slice(2));\n \n const pie = d3.pie<any>()\n .value(d => d.value)\n .sort((a, b) => b.value - a.value);\n \n const arc = d3.arc()\n .innerRadius(radius * 0.5)\n .outerRadius(radius);\n \n const arcs = svg.selectAll('arc')\n .data(pie(data))\n .enter()\n .append('g');\n \n arcs.append('path')\n .attr('d', arc as any)\n .attr('fill', (d, i) => color(i.toString()))\n .attr('stroke', 'white')\n .style('stroke-width', '2px');\n \n // Add title\n svg.append('text')\n .attr('x', 0)\n .attr('y', -radius - 25)\n .attr('text-anchor', 'middle')\n .style('font-size', '16px')\n .style('font-weight', 'bold')\n .text('Cost Distribution by Prompt');\n \n // Add total cost in center\n svg.append('text')\n .attr('text-anchor', 'middle')\n .attr('dy', '-0.5em')\n .style('font-size', '14px')\n .style('font-weight', 'bold')\n .text('Total Cost');\n \n svg.append('text')\n .attr('text-anchor', 'middle')\n .attr('dy', '1em')\n .style('font-size', '18px')\n .style('font-weight', 'bold')\n .text(this.formatCost(data.reduce((sum, d) => sum + d.value, 0)));\n }\n \n private renderPromptCountByNameChart() {\n const element = this.promptCountByNameChart.nativeElement;\n const data = Array.from(this.promptMetrics.byPrompt.entries())\n .map(([name, metrics]) => ({\n name: name.length > 20 ? name.substring(0, 20) + '...' : name,\n value: metrics.count\n }))\n .sort((a, b) => b.value - a.value)\n .slice(0, 10); // Top 10 prompts by count\n \n if (data.length === 0) return;\n \n // Clear previous chart\n d3.select(element).selectAll('*').remove();\n \n const margin = { top: 40, right: 20, bottom: 120, left: 60 };\n const width = 320 - margin.left - margin.right;\n const height = 200 - margin.top - margin.bottom;\n \n const svg = d3.select(element)\n .append('svg')\n .attr('width', width + margin.left + margin.right)\n .attr('height', height + margin.top + margin.bottom)\n .append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`);\n \n const x = d3.scaleBand()\n .range([0, width])\n .domain(data.map(d => d.name))\n .padding(0.1);\n \n const y = d3.scaleLinear()\n .domain([0, d3.max(data, d => d.value) || 0])\n .range([height, 0]);\n \n // Create gradient\n const gradient = svg.append('defs')\n .append('linearGradient')\n .attr('id', 'promptCountGradient')\n .attr('x1', '0%')\n .attr('y1', '0%')\n .attr('x2', '0%')\n .attr('y2', '100%');\n \n gradient.append('stop')\n .attr('offset', '0%')\n .attr('stop-color', '#667eea')\n .attr('stop-opacity', 1);\n \n gradient.append('stop')\n .attr('offset', '100%')\n .attr('stop-color', '#764ba2')\n .attr('stop-opacity', 1);\n \n // Add bars\n svg.selectAll('.bar')\n .data(data)\n .enter().append('rect')\n .attr('class', 'bar')\n .attr('x', d => x(d.name) || 0)\n .attr('width', x.bandwidth())\n .attr('y', d => y(d.value))\n .attr('height', d => height - y(d.value))\n .attr('fill', 'url(#promptCountGradient)');\n \n // Add value labels on bars\n svg.selectAll('.bar-label')\n .data(data)\n .enter().append('text')\n .attr('class', 'bar-label')\n .attr('x', d => (x(d.name) || 0) + x.bandwidth() / 2)\n .attr('y', d => y(d.value) - 5)\n .attr('text-anchor', 'middle')\n .style('font-size', '12px')\n .style('font-weight', 'bold')\n .text(d => d.value);\n \n // Add x axis\n svg.append('g')\n .attr('transform', `translate(0,${height})`)\n .call(d3.axisBottom(x))\n .selectAll('text')\n .attr('transform', 'rotate(-45)')\n .style('text-anchor', 'end')\n .style('font-size', '10px');\n \n // Add y axis\n svg.append('g')\n .call(d3.axisLeft(y));\n \n // Add title\n svg.append('text')\n .attr('x', width / 2)\n .attr('y', -20)\n .attr('text-anchor', 'middle')\n .style('font-size', '16px')\n .style('font-weight', 'bold')\n .text('Prompt Execution Count');\n }\n\n /**\n * Get all agent run IDs in hierarchy, starting from the root run\n */\n private async getAllAgentRunIds(rootRunId: string): Promise<string[]> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const agentRunIds: string[] = [rootRunId];\n \n // Simple recursive approach to find all child runs\n const findChildRuns = async (parentId: string): Promise<void> => {\n const result = await rv.RunView({\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ParentRunID = '${parentId}'`,\n });\n \n if (result.Success && result.Results && result.Results.length > 0) {\n for (const childRun of result.Results) {\n if (!agentRunIds.some(id => UUIDsEqual(id, childRun.ID))) {\n agentRunIds.push(childRun.ID);\n await findChildRuns(childRun.ID); // Recursively find children\n }\n }\n }\n };\n \n await findChildRuns(rootRunId);\n return agentRunIds;\n }\n\n /**\n * Load all prompt runs for the given agent run IDs\n * Uses the same approach as the cost calculation: find prompt runs via agent run steps\n */\n private async loadAllPromptRuns(agentRunIds: string[]): Promise<any[]> {\n if (agentRunIds.length === 0) return [];\n \n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n \n // First, get all the prompt steps for the agent runs\n const stepsResult = await rv.RunView({\n EntityName: 'MJ: AI Agent Run Steps',\n ExtraFilter: `AgentRunID IN ('${agentRunIds.join(\"','\")}') AND StepType = 'Prompt'`,\n ResultType: 'simple'\n });\n \n if (!stepsResult.Success || !stepsResult.Results || stepsResult.Results.length === 0) {\n return [];\n }\n \n // Extract the TargetLogID values (these are the prompt run IDs)\n const promptRunIds = stepsResult.Results\n .map(step => step.TargetLogID)\n .filter(id => id); // Remove any null/undefined values\n \n if (promptRunIds.length === 0) {\n return [];\n }\n \n \n // Now get the actual prompt runs\n const promptResult = await rv.RunView({\n EntityName: 'MJ: AI Prompt Runs', \n ExtraFilter: `ID IN ('${promptRunIds.join(\"','\")}')`,\n OrderBy: 'RunAt',\n ResultType: 'simple'\n });\n \n return promptResult.Success ? (promptResult.Results || []) : [];\n }\n \n /**\n * TrackBy function for keyvalue pipe\n */\n trackByKey(index: number, item: { key: string; value: any }): string {\n return item.key;\n }\n \n /**\n * TrackBy function for error messages\n */\n trackByErrorMessage(index: number, error: { message: string; count: number }): string {\n return error.message;\n }\n \n /**\n * TrackBy function for model performance data\n */\n trackByModelName(index: number, model: any): string {\n return model.name || index.toString();\n }\n}","<div class=\"analytics-container\">\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-state\">\n <i class=\"fas fa-spinner fa-spin fa-2x\"></i>\n <p>Loading analytics data...</p>\n </div>\n }\n\n <!-- Error State -->\n @if (error && !isLoading) {\n <div class=\"error-state\">\n <i class=\"fas fa-exclamation-triangle fa-2x\"></i>\n <p>{{ error }}</p>\n <button mjButton (click)=\"loadData()\">Retry</button>\n </div>\n }\n\n <!-- Analytics Content -->\n @if (!isLoading && !error) {\n <div class=\"analytics-content\">\n <!-- Summary Cards -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-tachometer-alt\"></i> Overview\n </ng-template>\n <div class=\"summary-cards\">\n <div class=\"summary-card\">\n <div class=\"card-icon prompts\">\n <i class=\"fas fa-microchip\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Total Prompts</h3>\n <div class=\"metric-value\">{{ promptMetrics.totalCount }}</div>\n <div class=\"metric-detail\">\n <span class=\"success\">{{ promptMetrics.statusBreakdown.success }} successful</span>\n @if (promptMetrics.statusBreakdown.failed > 0) {\n <span class=\"failed\">{{ promptMetrics.statusBreakdown.failed }} failed</span>\n }\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon actions\">\n <i class=\"fas fa-cog\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Total Actions</h3>\n <div class=\"metric-value\">{{ actionMetrics.totalCount }}</div>\n <div class=\"metric-detail\">\n <span class=\"success\">{{ actionMetrics.statusBreakdown.success }} successful</span>\n @if (actionMetrics.statusBreakdown.failed > 0) {\n <span class=\"failed\">{{ actionMetrics.statusBreakdown.failed }} failed</span>\n }\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon cost\">\n <i class=\"fas fa-dollar-sign\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Total Cost</h3>\n <div class=\"metric-value\">{{ formatCost(promptMetrics.costBreakdown.totalCost) }}</div>\n <div class=\"metric-detail cache-detail\">\n <span>{{ totalTokensProcessed | number }} tokens</span>\n @if (promptMetrics.tokenUsage.totalCacheRead > 0 || promptMetrics.tokenUsage.totalCacheWrite > 0) {\n <span>incl. {{ (promptMetrics.tokenUsage.totalCacheRead + promptMetrics.tokenUsage.totalCacheWrite) | number }} cached</span>\n }\n @if (inputCost > 0 || outputCost > 0) {\n <span>input {{ formatCost(inputCost) }} &middot; output {{ formatCost(outputCost) }}</span>\n }\n @if (cacheSavings > 0) {\n <span class=\"success\">saved {{ formatCost(cacheSavings) }} ({{ cacheSavingsPct | number:'1.0-0' }}%) via cache</span>\n }\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon cache\">\n <i class=\"fas fa-bolt\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Prompt Cache</h3>\n <div class=\"metric-value\">{{ promptMetrics.tokenUsage.totalCacheRead | number }}</div>\n <div class=\"metric-detail cache-detail\">\n <span>tokens read from cache</span>\n @if (promptMetrics.tokenUsage.totalCacheWrite > 0) {\n <span>{{ promptMetrics.tokenUsage.totalCacheWrite | number }} written</span>\n }\n @if (promptMetrics.tokenUsage.totalCacheRead > 0 || promptMetrics.tokenUsage.totalCacheWrite > 0) {\n <span>{{ cacheHitRatePct | number:'1.0-0' }}% hit rate</span>\n }\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon time\">\n <i class=\"fas fa-clock\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Execution Time</h3>\n <div class=\"metric-value\">{{ formatDuration(promptMetrics.totalExecutionTime + actionMetrics.totalExecutionTime) }}</div>\n <div class=\"metric-detail\">\n <span>{{ timelineMetrics.totalSteps }} total steps</span>\n </div>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Prompt Analytics -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-microchip\"></i> Prompt Analytics\n </ng-template>\n <div class=\"analytics-panel\">\n <!-- View Mode Toggle -->\n @if (promptMetrics.totalCount > 0) {\n <div class=\"view-mode-toggle\">\n <button mjButton\n variant=\"flat\"\n (click)=\"toggleViewMode()\">\n <i class=\"fas\" [ngClass]=\"viewMode === 'grid' ? 'fa-expand-arrows-alt' : 'fa-compress-arrows-alt'\"></i>\n {{ viewMode === 'grid' ? 'Expand All' : 'Collapse All' }}\n </button>\n </div>\n }\n <!-- No prompts message -->\n @if (promptMetrics.totalCount === 0) {\n <div class=\"no-data-message\">\n <i class=\"fas fa-info-circle\"></i>\n <p>No prompt executions found in this agent run.</p>\n <p class=\"small\">This agent run may have only executed actions without any AI prompts.</p>\n </div>\n }\n @if (promptMetrics.totalCount > 0) {\n <div class=\"charts-grid\">\n <!-- Model Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['modelDistribution']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('modelDistribution')\">\n <h3><i class=\"fas fa-chart-pie\"></i> Prompts by Model</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['modelDistribution'] ? 'Collapse Model Distribution chart' : 'Expand Model Distribution chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['modelDistribution'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"modelDistributionChart\" #modelDistributionChart></div>\n @if (promptMetrics.byModel.size > 0) {\n <div class=\"chart-legend\">\n @for (item of promptMetrics.byModel | keyvalue; track trackByKey($index, item)) {\n <div class=\"legend-item\">\n <span class=\"legend-color\" [style.backgroundColor]=\"getModelColor(item.key)\"></span>\n <span class=\"legend-label\">{{ item.key }}: {{ item.value.count }} ({{ (item.value.count / promptMetrics.totalCount * 100).toFixed(1) }}%)</span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <!-- Execution Time by Vendor -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['executionTime']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('executionTime')\">\n <h3><i class=\"fas fa-clock\"></i> Average Execution Time by Vendor</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['executionTime'] ? 'Collapse Average Execution Time by Vendor chart' : 'Expand Average Execution Time by Vendor chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['executionTime'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"executionTimeChart\" #executionTimeChart></div>\n </div>\n </div>\n </div>\n <!-- Cost by Vendor -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['costByVendor']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('costByVendor')\">\n <h3><i class=\"fas fa-dollar-sign\"></i> Cost Distribution by Vendor</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['costByVendor'] ? 'Collapse Cost Distribution by Vendor chart' : 'Expand Cost Distribution by Vendor chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['costByVendor'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"costByVendorChart\" #costByVendorChart></div>\n <div class=\"chart-total\">Total: {{ formatCost(promptMetrics.costBreakdown.totalCost) }}</div>\n </div>\n </div>\n </div>\n <!-- Token Usage -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['tokenUsage']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('tokenUsage')\">\n <h3><i class=\"fas fa-coins\"></i> Token Usage by Model</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['tokenUsage'] ? 'Collapse Token Usage by Model chart' : 'Expand Token Usage by Model chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['tokenUsage'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"tokenUsageChart\" #tokenUsageChart></div>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- Additional Prompt Analytics Charts -->\n @if (promptMetrics.totalCount > 0) {\n <div class=\"charts-grid\" style=\"margin-top: 20px;\">\n <!-- Prompt Execution Time Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptTime']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptTime')\">\n <h3><i class=\"fas fa-hourglass-half\"></i> Average Execution Time by Prompt</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['promptTime'] ? 'Collapse Average Execution Time by Prompt chart' : 'Expand Average Execution Time by Prompt chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptTime'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptTimeDistributionChart\" #promptTimeDistributionChart></div>\n </div>\n </div>\n </div>\n <!-- Prompt Token Usage -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptToken']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptToken')\">\n <h3><i class=\"fas fa-database\"></i> Token Usage by Prompt</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['promptToken'] ? 'Collapse Token Usage by Prompt chart' : 'Expand Token Usage by Prompt chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptToken'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptTokenDistributionChart\" #promptTokenDistributionChart></div>\n </div>\n </div>\n </div>\n <!-- Prompt Cost Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptCost']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptCost')\">\n <h3><i class=\"fas fa-chart-pie\"></i> Cost Distribution by Prompt</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['promptCost'] ? 'Collapse Cost Distribution by Prompt chart' : 'Expand Cost Distribution by Prompt chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptCost'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptCostDistributionChart\" #promptCostDistributionChart></div>\n </div>\n </div>\n </div>\n <!-- Prompt Count by Name -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptCount']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptCount')\">\n <h3><i class=\"fas fa-list-ol\"></i> Prompt Execution Count</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['promptCount'] ? 'Collapse Prompt Execution Count chart' : 'Expand Prompt Execution Count chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptCount'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptCountByNameChart\" #promptCountByNameChart></div>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- Detailed Prompt Metrics -->\n <div class=\"detailed-metrics\">\n <button mjButton\n variant=\"flat\"\n (click)=\"promptDetailsExpanded = !promptDetailsExpanded\">\n <i class=\"fas\" [ngClass]=\"promptDetailsExpanded ? 'fa-chevron-up' : 'fa-chevron-down'\"></i>\n Detailed Prompt Metrics\n </button>\n @if (promptDetailsExpanded) {\n <div class=\"metrics-table\">\n <table>\n <thead>\n <tr>\n <th>Prompt Name</th>\n <th>Count</th>\n <th>Avg Time</th>\n <th>Total Time</th>\n <th>Success Rate</th>\n </tr>\n </thead>\n <tbody>\n @for (prompt of promptMetrics.byPrompt | keyvalue; track trackByKey($index, prompt)) {\n <tr>\n <td>{{ prompt.key }}</td>\n <td>{{ prompt.value.count }}</td>\n <td>{{ formatDuration(prompt.value.avgTime) }}</td>\n <td>{{ formatDuration(prompt.value.totalTime) }}</td>\n <td>\n <span class=\"success-rate\">\n <!-- Calculate success rate for this prompt -->\n {{ calculatePromptSuccessRate(prompt.key) }}%\n </span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Action Analytics -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-cog\"></i> Action Analytics\n </ng-template>\n <div class=\"analytics-panel\">\n <div class=\"charts-grid\">\n <!-- Action Success Rate -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['actionSuccess']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('actionSuccess')\">\n <h3><i class=\"fas fa-chart-bar\"></i> Action Success Rate</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['actionSuccess'] ? 'Collapse Action Success Rate chart' : 'Expand Action Success Rate chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['actionSuccess'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"actionSuccessRateChart\" #actionSuccessRateChart></div>\n </div>\n </div>\n </div>\n <!-- Step Type Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['stepType']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('stepType')\">\n <h3><i class=\"fas fa-layer-group\"></i> Step Type Distribution</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['stepType'] ? 'Collapse Step Type Distribution chart' : 'Expand Step Type Distribution chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['stepType'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"stepTypeChart\" #stepTypeChart></div>\n </div>\n </div>\n </div>\n </div>\n <!-- Detailed Action Metrics -->\n <div class=\"detailed-metrics\">\n <button mjButton\n variant=\"flat\"\n (click)=\"actionDetailsExpanded = !actionDetailsExpanded\">\n <i class=\"fas\" [ngClass]=\"actionDetailsExpanded ? 'fa-chevron-up' : 'fa-chevron-down'\"></i>\n Detailed Action Metrics\n </button>\n @if (actionDetailsExpanded) {\n <div class=\"metrics-table\">\n <table>\n <thead>\n <tr>\n <th>Action Name</th>\n <th>Count</th>\n <th>Avg Time</th>\n <th>Success Rate</th>\n <th>Type</th>\n </tr>\n </thead>\n <tbody>\n @for (action of actionMetrics.byAction | keyvalue; track trackByKey($index, action)) {\n <tr>\n <td>{{ action.key }}</td>\n <td>{{ action.value.count }}</td>\n <td>{{ formatDuration(action.value.avgTime) }}</td>\n <td>\n <span class=\"success-rate\" [class.high]=\"action.value.successRate > 0.9\"\n [class.medium]=\"action.value.successRate > 0.7 && action.value.successRate <= 0.9\"\n [class.low]=\"action.value.successRate <= 0.7\">\n {{ (action.value.successRate * 100).toFixed(1) }}%\n </span>\n </td>\n <td>{{ getActionType(action.key) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n <!-- Error Analysis -->\n <div class=\"error-analysis-section\">\n @if (actionMetrics.errorAnalysis.size > 0) {\n <div class=\"error-analysis\">\n <h3>\n <i class=\"fas fa-exclamation-triangle\"></i>\n Common Errors\n </h3>\n <p class=\"error-analysis-description\">\n This section shows the most frequent error messages from failed actions, helping identify systemic issues that may need attention.\n </p>\n <div class=\"error-list\">\n @for (error of getTopErrors(); track trackByErrorMessage($index, error)) {\n <div class=\"error-item\">\n <span class=\"error-count\">{{ error.count }}x</span>\n <span class=\"error-message\">{{ error.message }}</span>\n </div>\n }\n </div>\n </div>\n }\n @if (actionMetrics.errorAnalysis.size === 0) {\n <div class=\"no-errors\">\n <i class=\"fas fa-check-circle\"></i>\n <p>No action errors detected in this run. All actions completed successfully!</p>\n </div>\n }\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Model Performance Comparison -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-chart-line\"></i> Model Performance Comparison\n </ng-template>\n <div class=\"analytics-panel\">\n <div class=\"model-comparison\">\n <table>\n <thead>\n <tr>\n <th>Model</th>\n <th>Vendor</th>\n <th>Prompts</th>\n <th>Avg Time</th>\n <th>Total Cost</th>\n <th>Avg Cost/Prompt</th>\n <th>Input Tokens</th>\n <th>Output Tokens</th>\n </tr>\n </thead>\n <tbody>\n @for (model of getModelPerformanceData(); track trackByModelName($index, model)) {\n <tr>\n <td>{{ model.name }}</td>\n <td>{{ model.vendor }}</td>\n <td>{{ model.count }}</td>\n <td>{{ formatDuration(model.avgTime) }}</td>\n <td>{{ formatCost(model.totalCost) }}</td>\n <td>{{ formatCost(model.avgCost) }}</td>\n <td>{{ model.inputTokens | number:'1.0-0' }}</td>\n <td>{{ model.outputTokens | number:'1.0-0' }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Timeline Analysis -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-stream\"></i> Execution Timeline Analysis\n </ng-template>\n <div class=\"analytics-panel\">\n <div class=\"timeline-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-label\">Total Steps</span>\n <span class=\"stat-value\">{{ timelineMetrics.totalSteps }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Parallel Executions</span>\n <span class=\"stat-value\">{{ timelineMetrics.parallelExecutions }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Max Nesting Depth</span>\n <span class=\"stat-value\">{{ timelineMetrics.deepestNesting }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Sub-Agent Runs</span>\n <span class=\"stat-value\">{{ subAgentRuns.length }}</span>\n </div>\n </div>\n <div class=\"step-breakdown\">\n <h3>Steps by Type</h3>\n <div class=\"step-type-list\">\n @for (type of timelineMetrics.stepsByType | keyvalue; track trackByKey($index, type)) {\n <div class=\"step-type-item\">\n <i class=\"fas\" [ngClass]=\"getStepTypeIcon(type.key)\"></i>\n <span class=\"type-name\">{{ type.key }}</span>\n <span class=\"type-count\">{{ type.value }}</span>\n <span class=\"type-percentage\">({{ (type.value / timelineMetrics.totalSteps * 100).toFixed(1) }}%)</span>\n </div>\n }\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n </div>\n }\n</div>"]}