@memberjunction/ng-core-entity-forms 5.22.0 → 5.24.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 (215) hide show
  1. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts +4 -5
  2. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts.map +1 -1
  3. package/dist/lib/custom/AIAgents/add-action-dialog.component.js +55 -59
  4. package/dist/lib/custom/AIAgents/add-action-dialog.component.js.map +1 -1
  5. package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js +0 -1
  6. package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js.map +1 -1
  7. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts +4 -5
  8. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts.map +1 -1
  9. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +54 -71
  10. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js.map +1 -1
  11. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  12. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +1053 -1096
  13. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  14. package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts +2 -3
  15. package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts.map +1 -1
  16. package/dist/lib/custom/AIAgents/ai-agent-management.service.js +39 -82
  17. package/dist/lib/custom/AIAgents/ai-agent-management.service.js.map +1 -1
  18. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts +4 -5
  19. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts.map +1 -1
  20. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +28 -31
  21. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js.map +1 -1
  22. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts +4 -5
  23. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts.map +1 -1
  24. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +15 -14
  25. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -1
  26. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts +4 -7
  27. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts.map +1 -1
  28. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +77 -124
  29. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js.map +1 -1
  30. package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts +2 -2
  31. package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts.map +1 -1
  32. package/dist/lib/custom/AIAgents/new-agent-dialog.service.js +10 -11
  33. package/dist/lib/custom/AIAgents/new-agent-dialog.service.js.map +1 -1
  34. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts +4 -5
  35. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts.map +1 -1
  36. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +18 -18
  37. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
  38. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts +4 -5
  39. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts.map +1 -1
  40. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +59 -80
  41. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js.map +1 -1
  42. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +4 -5
  43. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -1
  44. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +23 -24
  45. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
  46. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
  47. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +862 -906
  48. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  49. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +4 -5
  50. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js.map +1 -1
  51. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +448 -499
  52. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  53. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts +2 -2
  54. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts.map +1 -1
  55. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js +6 -11
  56. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js.map +1 -1
  57. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts +4 -5
  58. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts.map +1 -1
  59. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +16 -15
  60. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js.map +1 -1
  61. package/dist/lib/custom/Actions/action-execution-log-form.component.js +160 -166
  62. package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
  63. package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
  64. package/dist/lib/custom/Actions/action-form.component.js +93 -94
  65. package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
  66. package/dist/lib/custom/ContentSources/content-source-form.component.d.ts +22 -0
  67. package/dist/lib/custom/ContentSources/content-source-form.component.d.ts.map +1 -0
  68. package/dist/lib/custom/ContentSources/content-source-form.component.js +165 -0
  69. package/dist/lib/custom/ContentSources/content-source-form.component.js.map +1 -0
  70. package/dist/lib/custom/Entities/entity-form.component.js +2 -2
  71. package/dist/lib/custom/Lists/list-form.component.js +61 -63
  72. package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
  73. package/dist/lib/custom/Queries/query-category-dialog.component.js +33 -59
  74. package/dist/lib/custom/Queries/query-category-dialog.component.js.map +1 -1
  75. package/dist/lib/custom/Queries/query-form.component.js +354 -360
  76. package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
  77. package/dist/lib/custom/Queries/query-run-dialog.component.js +62 -71
  78. package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
  79. package/dist/lib/custom/Templates/template-param-dialog.component.js +128 -124
  80. package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
  81. package/dist/lib/custom/Templates/template-params-grid.component.d.ts +45 -22
  82. package/dist/lib/custom/Templates/template-params-grid.component.d.ts.map +1 -1
  83. package/dist/lib/custom/Templates/template-params-grid.component.js +380 -384
  84. package/dist/lib/custom/Templates/template-params-grid.component.js.map +1 -1
  85. package/dist/lib/custom/Templates/templates-form.component.js +34 -36
  86. package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
  87. package/dist/lib/custom/Tests/test-form.component.js +8 -9
  88. package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
  89. package/dist/lib/custom/Tests/test-run-feedback-form.component.js +4 -4
  90. package/dist/lib/custom/Tests/test-run-feedback-form.component.js.map +1 -1
  91. package/dist/lib/custom/Tests/test-run-form.component.js +7 -7
  92. package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
  93. package/dist/lib/custom/Tests/test-suite-form.component.js +6 -7
  94. package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
  95. package/dist/lib/custom/Tests/test-suite-run-form.component.js +6 -7
  96. package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
  97. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +381 -409
  98. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
  99. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
  100. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +1 -1
  101. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
  102. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
  103. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +74 -63
  104. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  105. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js +10 -10
  106. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js.map +1 -1
  107. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
  108. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +352 -332
  109. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  110. package/dist/lib/custom/custom-forms.module.d.ts +25 -29
  111. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  112. package/dist/lib/custom/custom-forms.module.js +57 -82
  113. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  114. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts +4 -5
  115. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts.map +1 -1
  116. package/dist/lib/custom/shared/entity-selector-dialog.component.js +59 -66
  117. package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
  118. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
  119. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +176 -156
  120. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
  121. package/dist/lib/generated/Entities/MJAIAgentClientTool/mjaiagentclienttool.form.component.d.ts +10 -0
  122. package/dist/lib/generated/Entities/MJAIAgentClientTool/mjaiagentclienttool.form.component.d.ts.map +1 -0
  123. package/dist/lib/generated/Entities/MJAIAgentClientTool/mjaiagentclienttool.form.component.js +65 -0
  124. package/dist/lib/generated/Entities/MJAIAgentClientTool/mjaiagentclienttool.form.component.js.map +1 -0
  125. package/dist/lib/generated/Entities/MJAIClientToolDefinition/mjaiclienttooldefinition.form.component.d.ts +10 -0
  126. package/dist/lib/generated/Entities/MJAIClientToolDefinition/mjaiclienttooldefinition.form.component.d.ts.map +1 -0
  127. package/dist/lib/generated/Entities/MJAIClientToolDefinition/mjaiclienttooldefinition.form.component.js +89 -0
  128. package/dist/lib/generated/Entities/MJAIClientToolDefinition/mjaiclienttooldefinition.form.component.js.map +1 -0
  129. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.d.ts.map +1 -1
  130. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js +98 -44
  131. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js.map +1 -1
  132. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.d.ts.map +1 -1
  133. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js +35 -17
  134. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
  135. package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.d.ts.map +1 -1
  136. package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js +79 -20
  137. package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js.map +1 -1
  138. package/dist/lib/generated/Entities/MJContentItemDuplicate/mjcontentitemduplicate.form.component.d.ts +10 -0
  139. package/dist/lib/generated/Entities/MJContentItemDuplicate/mjcontentitemduplicate.form.component.d.ts.map +1 -0
  140. package/dist/lib/generated/Entities/MJContentItemDuplicate/mjcontentitemduplicate.form.component.js +73 -0
  141. package/dist/lib/generated/Entities/MJContentItemDuplicate/mjcontentitemduplicate.form.component.js.map +1 -0
  142. package/dist/lib/generated/Entities/MJContentItemTag/mjcontentitemtag.form.component.js +11 -6
  143. package/dist/lib/generated/Entities/MJContentItemTag/mjcontentitemtag.form.component.js.map +1 -1
  144. package/dist/lib/generated/Entities/MJContentProcessRun/mjcontentprocessrun.form.component.d.ts.map +1 -1
  145. package/dist/lib/generated/Entities/MJContentProcessRun/mjcontentprocessrun.form.component.js +49 -8
  146. package/dist/lib/generated/Entities/MJContentProcessRun/mjcontentprocessrun.form.component.js.map +1 -1
  147. package/dist/lib/generated/Entities/MJContentProcessRunDetail/mjcontentprocessrundetail.form.component.d.ts +10 -0
  148. package/dist/lib/generated/Entities/MJContentProcessRunDetail/mjcontentprocessrundetail.form.component.d.ts.map +1 -0
  149. package/dist/lib/generated/Entities/MJContentProcessRunDetail/mjcontentprocessrundetail.form.component.js +107 -0
  150. package/dist/lib/generated/Entities/MJContentProcessRunDetail/mjcontentprocessrundetail.form.component.js.map +1 -0
  151. package/dist/lib/generated/Entities/MJContentProcessRunPromptRun/mjcontentprocessrunpromptrun.form.component.d.ts +10 -0
  152. package/dist/lib/generated/Entities/MJContentProcessRunPromptRun/mjcontentprocessrunpromptrun.form.component.d.ts.map +1 -0
  153. package/dist/lib/generated/Entities/MJContentProcessRunPromptRun/mjcontentprocessrunpromptrun.form.component.js +57 -0
  154. package/dist/lib/generated/Entities/MJContentProcessRunPromptRun/mjcontentprocessrunpromptrun.form.component.js.map +1 -0
  155. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.d.ts.map +1 -1
  156. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js +71 -24
  157. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js.map +1 -1
  158. package/dist/lib/generated/Entities/MJContentSourceType/mjcontentsourcetype.form.component.d.ts.map +1 -1
  159. package/dist/lib/generated/Entities/MJContentSourceType/mjcontentsourcetype.form.component.js +43 -15
  160. package/dist/lib/generated/Entities/MJContentSourceType/mjcontentsourcetype.form.component.js.map +1 -1
  161. package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.d.ts.map +1 -1
  162. package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.js +43 -17
  163. package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.js.map +1 -1
  164. package/dist/lib/generated/Entities/MJDuplicateRun/mjduplicaterun.form.component.js +21 -11
  165. package/dist/lib/generated/Entities/MJDuplicateRun/mjduplicaterun.form.component.js.map +1 -1
  166. package/dist/lib/generated/Entities/MJDuplicateRunDetail/mjduplicaterundetail.form.component.js +19 -13
  167. package/dist/lib/generated/Entities/MJDuplicateRunDetail/mjduplicaterundetail.form.component.js.map +1 -1
  168. package/dist/lib/generated/Entities/MJDuplicateRunDetailMatch/mjduplicaterundetailmatch.form.component.d.ts.map +1 -1
  169. package/dist/lib/generated/Entities/MJDuplicateRunDetailMatch/mjduplicaterundetailmatch.form.component.js +7 -9
  170. package/dist/lib/generated/Entities/MJDuplicateRunDetailMatch/mjduplicaterundetailmatch.form.component.js.map +1 -1
  171. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
  172. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +78 -60
  173. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
  174. package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.d.ts.map +1 -1
  175. package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js +24 -6
  176. package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js.map +1 -1
  177. package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.d.ts.map +1 -1
  178. package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js +21 -9
  179. package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js.map +1 -1
  180. package/dist/lib/generated/Entities/MJEntityRecordDocument/mjentityrecorddocument.form.component.d.ts.map +1 -1
  181. package/dist/lib/generated/Entities/MJEntityRecordDocument/mjentityrecorddocument.form.component.js +23 -5
  182. package/dist/lib/generated/Entities/MJEntityRecordDocument/mjentityrecorddocument.form.component.js.map +1 -1
  183. package/dist/lib/generated/Entities/MJKnowledgeHubSavedSearch/mjknowledgehubsavedsearch.form.component.d.ts +10 -0
  184. package/dist/lib/generated/Entities/MJKnowledgeHubSavedSearch/mjknowledgehubsavedsearch.form.component.d.ts.map +1 -0
  185. package/dist/lib/generated/Entities/MJKnowledgeHubSavedSearch/mjknowledgehubsavedsearch.form.component.js +77 -0
  186. package/dist/lib/generated/Entities/MJKnowledgeHubSavedSearch/mjknowledgehubsavedsearch.form.component.js.map +1 -0
  187. package/dist/lib/generated/Entities/MJScheduledAction/mjscheduledaction.form.component.d.ts.map +1 -1
  188. package/dist/lib/generated/Entities/MJScheduledAction/mjscheduledaction.form.component.js +22 -4
  189. package/dist/lib/generated/Entities/MJScheduledAction/mjscheduledaction.form.component.js.map +1 -1
  190. package/dist/lib/generated/Entities/MJTag/mjtag.form.component.d.ts.map +1 -1
  191. package/dist/lib/generated/Entities/MJTag/mjtag.form.component.js +139 -19
  192. package/dist/lib/generated/Entities/MJTag/mjtag.form.component.js.map +1 -1
  193. package/dist/lib/generated/Entities/MJTagAuditLog/mjtagauditlog.form.component.d.ts +10 -0
  194. package/dist/lib/generated/Entities/MJTagAuditLog/mjtagauditlog.form.component.d.ts.map +1 -0
  195. package/dist/lib/generated/Entities/MJTagAuditLog/mjtagauditlog.form.component.js +67 -0
  196. package/dist/lib/generated/Entities/MJTagAuditLog/mjtagauditlog.form.component.js.map +1 -0
  197. package/dist/lib/generated/Entities/MJTagCoOccurrence/mjtagcooccurrence.form.component.d.ts +10 -0
  198. package/dist/lib/generated/Entities/MJTagCoOccurrence/mjtagcooccurrence.form.component.d.ts.map +1 -0
  199. package/dist/lib/generated/Entities/MJTagCoOccurrence/mjtagcooccurrence.form.component.js +65 -0
  200. package/dist/lib/generated/Entities/MJTagCoOccurrence/mjtagcooccurrence.form.component.js.map +1 -0
  201. package/dist/lib/generated/Entities/MJTaggedItem/mjtaggeditem.form.component.js +10 -8
  202. package/dist/lib/generated/Entities/MJTaggedItem/mjtaggeditem.form.component.js.map +1 -1
  203. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  204. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +226 -154
  205. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  206. package/dist/lib/generated/Entities/MJVectorIndex/mjvectorindex.form.component.d.ts.map +1 -1
  207. package/dist/lib/generated/Entities/MJVectorIndex/mjvectorindex.form.component.js +41 -5
  208. package/dist/lib/generated/Entities/MJVectorIndex/mjvectorindex.form.component.js.map +1 -1
  209. package/dist/lib/generated/generated-forms.module.d.ts +286 -279
  210. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  211. package/dist/lib/generated/generated-forms.module.js +192 -214
  212. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  213. package/dist/lib/shared/components/template-editor.component.js +14 -15
  214. package/dist/lib/shared/components/template-editor.component.js.map +1 -1
  215. package/package.json +34 -41
@@ -6,8 +6,7 @@ import * as d3 from 'd3';
6
6
  import * as i0 from "@angular/core";
7
7
  import * as i1 from "./ai-agent-run-cost.service";
8
8
  import * as i2 from "@angular/common";
9
- import * as i3 from "@progress/kendo-angular-layout";
10
- import * as i4 from "@progress/kendo-angular-buttons";
9
+ import * as i3 from "@memberjunction/ng-ui-components";
11
10
  const _c0 = ["modelDistributionChart"];
12
11
  const _c1 = ["executionTimeChart"];
13
12
  const _c2 = ["costByVendorChart"];
@@ -41,211 +40,135 @@ function AIAgentRunAnalyticsComponent_Conditional_2_Template(rf, ctx) { if (rf &
41
40
  i0.ɵɵadvance(3);
42
41
  i0.ɵɵtextInterpolate(ctx_r1.error);
43
42
  } }
44
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_3_Template(rf, ctx) { if (rf & 1) {
45
- i0.ɵɵelement(0, "i", 21);
43
+ function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_2_Template(rf, ctx) { if (rf & 1) {
44
+ i0.ɵɵelement(0, "i", 63);
46
45
  i0.ɵɵtext(1, " Overview ");
47
46
  } }
48
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_4_Conditional_12_Template(rf, ctx) { if (rf & 1) {
49
- i0.ɵɵelementStart(0, "span", 30);
47
+ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_15_Template(rf, ctx) { if (rf & 1) {
48
+ i0.ɵɵelementStart(0, "span", 27);
50
49
  i0.ɵɵtext(1);
51
50
  i0.ɵɵelementEnd();
52
51
  } if (rf & 2) {
53
- const ctx_r1 = i0.ɵɵnextContext(3);
52
+ const ctx_r1 = i0.ɵɵnextContext(2);
54
53
  i0.ɵɵadvance();
55
54
  i0.ɵɵtextInterpolate1("", ctx_r1.promptMetrics.statusBreakdown.failed, " failed");
56
55
  } }
57
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_4_Conditional_24_Template(rf, ctx) { if (rf & 1) {
58
- i0.ɵɵelementStart(0, "span", 30);
56
+ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_27_Template(rf, ctx) { if (rf & 1) {
57
+ i0.ɵɵelementStart(0, "span", 27);
59
58
  i0.ɵɵtext(1);
60
59
  i0.ɵɵelementEnd();
61
- } if (rf & 2) {
62
- const ctx_r1 = i0.ɵɵnextContext(3);
63
- i0.ɵɵadvance();
64
- i0.ɵɵtextInterpolate1("", ctx_r1.actionMetrics.statusBreakdown.failed, " failed");
65
- } }
66
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_4_Template(rf, ctx) { if (rf & 1) {
67
- i0.ɵɵelementStart(0, "div", 22)(1, "div", 23)(2, "div", 24);
68
- i0.ɵɵelement(3, "i", 25);
69
- i0.ɵɵelementEnd();
70
- i0.ɵɵelementStart(4, "div", 26)(5, "h3");
71
- i0.ɵɵtext(6, "Total Prompts");
72
- i0.ɵɵelementEnd();
73
- i0.ɵɵelementStart(7, "div", 27);
74
- i0.ɵɵtext(8);
75
- i0.ɵɵelementEnd();
76
- i0.ɵɵelementStart(9, "div", 28)(10, "span", 29);
77
- i0.ɵɵtext(11);
78
- i0.ɵɵelementEnd();
79
- i0.ɵɵconditionalCreate(12, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_4_Conditional_12_Template, 2, 1, "span", 30);
80
- i0.ɵɵelementEnd()()();
81
- i0.ɵɵelementStart(13, "div", 23)(14, "div", 31);
82
- i0.ɵɵelement(15, "i", 32);
83
- i0.ɵɵelementEnd();
84
- i0.ɵɵelementStart(16, "div", 26)(17, "h3");
85
- i0.ɵɵtext(18, "Total Actions");
86
- i0.ɵɵelementEnd();
87
- i0.ɵɵelementStart(19, "div", 27);
88
- i0.ɵɵtext(20);
89
- i0.ɵɵelementEnd();
90
- i0.ɵɵelementStart(21, "div", 28)(22, "span", 29);
91
- i0.ɵɵtext(23);
92
- i0.ɵɵelementEnd();
93
- i0.ɵɵconditionalCreate(24, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_4_Conditional_24_Template, 2, 1, "span", 30);
94
- i0.ɵɵelementEnd()()();
95
- i0.ɵɵelementStart(25, "div", 23)(26, "div", 33);
96
- i0.ɵɵelement(27, "i", 34);
97
- i0.ɵɵelementEnd();
98
- i0.ɵɵelementStart(28, "div", 26)(29, "h3");
99
- i0.ɵɵtext(30, "Total Cost");
100
- i0.ɵɵelementEnd();
101
- i0.ɵɵelementStart(31, "div", 27);
102
- i0.ɵɵtext(32);
103
- i0.ɵɵelementEnd();
104
- i0.ɵɵelementStart(33, "div", 28)(34, "span");
105
- i0.ɵɵtext(35);
106
- i0.ɵɵelementEnd()()()();
107
- i0.ɵɵelementStart(36, "div", 23)(37, "div", 35);
108
- i0.ɵɵelement(38, "i", 36);
109
- i0.ɵɵelementEnd();
110
- i0.ɵɵelementStart(39, "div", 26)(40, "h3");
111
- i0.ɵɵtext(41, "Execution Time");
112
- i0.ɵɵelementEnd();
113
- i0.ɵɵelementStart(42, "div", 27);
114
- i0.ɵɵtext(43);
115
- i0.ɵɵelementEnd();
116
- i0.ɵɵelementStart(44, "div", 28)(45, "span");
117
- i0.ɵɵtext(46);
118
- i0.ɵɵelementEnd()()()()();
119
60
  } if (rf & 2) {
120
61
  const ctx_r1 = i0.ɵɵnextContext(2);
121
- i0.ɵɵadvance(8);
122
- i0.ɵɵtextInterpolate(ctx_r1.promptMetrics.totalCount);
123
- i0.ɵɵadvance(3);
124
- i0.ɵɵtextInterpolate1("", ctx_r1.promptMetrics.statusBreakdown.success, " successful");
125
- i0.ɵɵadvance();
126
- i0.ɵɵconditional(ctx_r1.promptMetrics.statusBreakdown.failed > 0 ? 12 : -1);
127
- i0.ɵɵadvance(8);
128
- i0.ɵɵtextInterpolate(ctx_r1.actionMetrics.totalCount);
129
- i0.ɵɵadvance(3);
130
- i0.ɵɵtextInterpolate1("", ctx_r1.actionMetrics.statusBreakdown.success, " successful");
131
62
  i0.ɵɵadvance();
132
- i0.ɵɵconditional(ctx_r1.actionMetrics.statusBreakdown.failed > 0 ? 24 : -1);
133
- i0.ɵɵadvance(8);
134
- i0.ɵɵtextInterpolate(ctx_r1.formatCost(ctx_r1.promptMetrics.costBreakdown.totalCost));
135
- i0.ɵɵadvance(3);
136
- i0.ɵɵtextInterpolate1("", ctx_r1.promptMetrics.tokenUsage.totalInput + ctx_r1.promptMetrics.tokenUsage.totalOutput, " tokens");
137
- i0.ɵɵadvance(8);
138
- i0.ɵɵtextInterpolate(ctx_r1.formatDuration(ctx_r1.promptMetrics.totalExecutionTime + ctx_r1.actionMetrics.totalExecutionTime));
139
- i0.ɵɵadvance(3);
140
- i0.ɵɵtextInterpolate1("", ctx_r1.timelineMetrics.totalSteps, " total steps");
63
+ i0.ɵɵtextInterpolate1("", ctx_r1.actionMetrics.statusBreakdown.failed, " failed");
141
64
  } }
142
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_6_Template(rf, ctx) { if (rf & 1) {
143
- i0.ɵɵelement(0, "i", 25);
65
+ function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_51_Template(rf, ctx) { if (rf & 1) {
66
+ i0.ɵɵelement(0, "i", 22);
144
67
  i0.ɵɵtext(1, " Prompt Analytics ");
145
68
  } }
146
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_1_Template(rf, ctx) { if (rf & 1) {
69
+ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_53_Template(rf, ctx) { if (rf & 1) {
147
70
  const _r4 = i0.ɵɵgetCurrentView();
148
- i0.ɵɵelementStart(0, "div", 38)(1, "button", 46);
149
- i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_1_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleViewMode()); });
150
- i0.ɵɵelement(2, "i", 44);
71
+ i0.ɵɵelementStart(0, "div", 35)(1, "button", 40);
72
+ i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_53_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleViewMode()); });
73
+ i0.ɵɵelement(2, "i", 41);
151
74
  i0.ɵɵtext(3);
152
75
  i0.ɵɵelementEnd()();
153
76
  } if (rf & 2) {
154
- const ctx_r1 = i0.ɵɵnextContext(3);
77
+ const ctx_r1 = i0.ɵɵnextContext(2);
155
78
  i0.ɵɵadvance(2);
156
79
  i0.ɵɵproperty("ngClass", ctx_r1.viewMode === "grid" ? "fa-expand-arrows-alt" : "fa-compress-arrows-alt");
157
80
  i0.ɵɵadvance();
158
81
  i0.ɵɵtextInterpolate1(" ", ctx_r1.viewMode === "grid" ? "Expand All" : "Collapse All", " ");
159
82
  } }
160
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_2_Template(rf, ctx) { if (rf & 1) {
161
- i0.ɵɵelementStart(0, "div", 39);
162
- i0.ɵɵelement(1, "i", 47);
83
+ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_54_Template(rf, ctx) { if (rf & 1) {
84
+ i0.ɵɵelementStart(0, "div", 36);
85
+ i0.ɵɵelement(1, "i", 64);
163
86
  i0.ɵɵelementStart(2, "p");
164
87
  i0.ɵɵtext(3, "No prompt executions found in this agent run.");
165
88
  i0.ɵɵelementEnd();
166
- i0.ɵɵelementStart(4, "p", 48);
89
+ i0.ɵɵelementStart(4, "p", 65);
167
90
  i0.ɵɵtext(5, "This agent run may have only executed actions without any AI prompts.");
168
91
  i0.ɵɵelementEnd()();
169
92
  } }
170
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_3_Conditional_12_For_2_Template(rf, ctx) { if (rf & 1) {
171
- i0.ɵɵelementStart(0, "div", 62);
172
- i0.ɵɵelement(1, "span", 63);
173
- i0.ɵɵelementStart(2, "span", 64);
93
+ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_55_Conditional_12_For_2_Template(rf, ctx) { if (rf & 1) {
94
+ i0.ɵɵelementStart(0, "div", 74);
95
+ i0.ɵɵelement(1, "span", 75);
96
+ i0.ɵɵelementStart(2, "span", 76);
174
97
  i0.ɵɵtext(3);
175
98
  i0.ɵɵelementEnd()();
176
99
  } if (rf & 2) {
177
100
  const item_r6 = ctx.$implicit;
178
- const ctx_r1 = i0.ɵɵnextContext(5);
101
+ const ctx_r1 = i0.ɵɵnextContext(4);
179
102
  i0.ɵɵadvance();
180
103
  i0.ɵɵstyleProp("background-color", ctx_r1.getModelColor(item_r6.key));
181
104
  i0.ɵɵadvance(2);
182
105
  i0.ɵɵtextInterpolate3("", item_r6.key, ": ", item_r6.value.count, " (", (item_r6.value.count / ctx_r1.promptMetrics.totalCount * 100).toFixed(1), "%)");
183
106
  } }
184
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_3_Conditional_12_Template(rf, ctx) { if (rf & 1) {
185
- i0.ɵɵelementStart(0, "div", 56);
186
- i0.ɵɵrepeaterCreate(1, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_3_Conditional_12_For_2_Template, 4, 5, "div", 62, i0.ɵɵcomponentInstance().trackByKey, true);
107
+ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_55_Conditional_12_Template(rf, ctx) { if (rf & 1) {
108
+ i0.ɵɵelementStart(0, "div", 68);
109
+ i0.ɵɵrepeaterCreate(1, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_55_Conditional_12_For_2_Template, 4, 5, "div", 74, i0.ɵɵcomponentInstance().trackByKey, true);
187
110
  i0.ɵɵpipe(3, "keyvalue");
188
111
  i0.ɵɵelementEnd();
189
112
  } if (rf & 2) {
190
- const ctx_r1 = i0.ɵɵnextContext(4);
113
+ const ctx_r1 = i0.ɵɵnextContext(3);
191
114
  i0.ɵɵadvance();
192
115
  i0.ɵɵrepeater(i0.ɵɵpipeBind1(3, 0, ctx_r1.promptMetrics.byModel));
193
116
  } }
194
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_3_Template(rf, ctx) { if (rf & 1) {
117
+ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_55_Template(rf, ctx) { if (rf & 1) {
195
118
  const _r5 = i0.ɵɵgetCurrentView();
196
- i0.ɵɵelementStart(0, "div", 40)(1, "div", 49)(2, "div", 50);
197
- i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_3_Template_div_click_2_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("modelDistribution")); });
119
+ i0.ɵɵelementStart(0, "div", 37)(1, "div", 43)(2, "div", 44);
120
+ i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_55_Template_div_click_2_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("modelDistribution")); });
198
121
  i0.ɵɵelementStart(3, "h3");
199
- i0.ɵɵelement(4, "i", 51);
122
+ i0.ɵɵelement(4, "i", 66);
200
123
  i0.ɵɵtext(5, " Prompts by Model");
201
124
  i0.ɵɵelementEnd();
202
- i0.ɵɵelementStart(6, "button", 52);
203
- i0.ɵɵelement(7, "i", 44);
125
+ i0.ɵɵelementStart(6, "button", 46);
126
+ i0.ɵɵelement(7, "i", 41);
204
127
  i0.ɵɵelementEnd()();
205
- i0.ɵɵelementStart(8, "div", 53)(9, "div", 54);
206
- i0.ɵɵelement(10, "div", 55, 0);
207
- i0.ɵɵconditionalCreate(12, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_3_Conditional_12_Template, 4, 2, "div", 56);
128
+ i0.ɵɵelementStart(8, "div", 47)(9, "div", 48);
129
+ i0.ɵɵelement(10, "div", 67, 2);
130
+ i0.ɵɵconditionalCreate(12, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_55_Conditional_12_Template, 4, 2, "div", 68);
208
131
  i0.ɵɵelementEnd()()();
209
- i0.ɵɵelementStart(13, "div", 49)(14, "div", 50);
210
- i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_3_Template_div_click_14_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("executionTime")); });
132
+ i0.ɵɵelementStart(13, "div", 43)(14, "div", 44);
133
+ i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_55_Template_div_click_14_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("executionTime")); });
211
134
  i0.ɵɵelementStart(15, "h3");
212
- i0.ɵɵelement(16, "i", 36);
135
+ i0.ɵɵelement(16, "i", 33);
213
136
  i0.ɵɵtext(17, " Average Execution Time by Vendor");
214
137
  i0.ɵɵelementEnd();
215
- i0.ɵɵelementStart(18, "button", 52);
216
- i0.ɵɵelement(19, "i", 44);
138
+ i0.ɵɵelementStart(18, "button", 46);
139
+ i0.ɵɵelement(19, "i", 41);
217
140
  i0.ɵɵelementEnd()();
218
- i0.ɵɵelementStart(20, "div", 53)(21, "div", 54);
219
- i0.ɵɵelement(22, "div", 57, 1);
141
+ i0.ɵɵelementStart(20, "div", 47)(21, "div", 48);
142
+ i0.ɵɵelement(22, "div", 69, 3);
220
143
  i0.ɵɵelementEnd()()();
221
- i0.ɵɵelementStart(24, "div", 49)(25, "div", 50);
222
- i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_3_Template_div_click_25_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("costByVendor")); });
144
+ i0.ɵɵelementStart(24, "div", 43)(25, "div", 44);
145
+ i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_55_Template_div_click_25_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("costByVendor")); });
223
146
  i0.ɵɵelementStart(26, "h3");
224
- i0.ɵɵelement(27, "i", 34);
147
+ i0.ɵɵelement(27, "i", 31);
225
148
  i0.ɵɵtext(28, " Cost Distribution by Vendor");
226
149
  i0.ɵɵelementEnd();
227
- i0.ɵɵelementStart(29, "button", 52);
228
- i0.ɵɵelement(30, "i", 44);
150
+ i0.ɵɵelementStart(29, "button", 46);
151
+ i0.ɵɵelement(30, "i", 41);
229
152
  i0.ɵɵelementEnd()();
230
- i0.ɵɵelementStart(31, "div", 53)(32, "div", 54);
231
- i0.ɵɵelement(33, "div", 58, 2);
232
- i0.ɵɵelementStart(35, "div", 59);
153
+ i0.ɵɵelementStart(31, "div", 47)(32, "div", 48);
154
+ i0.ɵɵelement(33, "div", 70, 4);
155
+ i0.ɵɵelementStart(35, "div", 71);
233
156
  i0.ɵɵtext(36);
234
157
  i0.ɵɵelementEnd()()()();
235
- i0.ɵɵelementStart(37, "div", 49)(38, "div", 50);
236
- i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_3_Template_div_click_38_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("tokenUsage")); });
158
+ i0.ɵɵelementStart(37, "div", 43)(38, "div", 44);
159
+ i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_55_Template_div_click_38_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("tokenUsage")); });
237
160
  i0.ɵɵelementStart(39, "h3");
238
- i0.ɵɵelement(40, "i", 60);
161
+ i0.ɵɵelement(40, "i", 72);
239
162
  i0.ɵɵtext(41, " Token Usage by Model");
240
163
  i0.ɵɵelementEnd();
241
- i0.ɵɵelementStart(42, "button", 52);
242
- i0.ɵɵelement(43, "i", 44);
164
+ i0.ɵɵelementStart(42, "button", 46);
165
+ i0.ɵɵelement(43, "i", 41);
243
166
  i0.ɵɵelementEnd()();
244
- i0.ɵɵelementStart(44, "div", 53)(45, "div", 54);
245
- i0.ɵɵelement(46, "div", 61, 3);
167
+ i0.ɵɵelementStart(44, "div", 47)(45, "div", 48);
168
+ i0.ɵɵelement(46, "div", 73, 5);
246
169
  i0.ɵɵelementEnd()()()();
247
170
  } if (rf & 2) {
248
- const ctx_r1 = i0.ɵɵnextContext(3);
171
+ const ctx_r1 = i0.ɵɵnextContext(2);
249
172
  i0.ɵɵadvance();
250
173
  i0.ɵɵclassProp("expanded", ctx_r1.expandedCharts["modelDistribution"]);
251
174
  i0.ɵɵadvance(6);
@@ -267,58 +190,58 @@ function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_3_
267
190
  i0.ɵɵadvance(6);
268
191
  i0.ɵɵproperty("ngClass", ctx_r1.expandedCharts["tokenUsage"] ? "fa-compress" : "fa-expand");
269
192
  } }
270
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_4_Template(rf, ctx) { if (rf & 1) {
193
+ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_56_Template(rf, ctx) { if (rf & 1) {
271
194
  const _r7 = i0.ɵɵgetCurrentView();
272
- i0.ɵɵelementStart(0, "div", 41)(1, "div", 49)(2, "div", 50);
273
- i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_4_Template_div_click_2_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("promptTime")); });
195
+ i0.ɵɵelementStart(0, "div", 38)(1, "div", 43)(2, "div", 44);
196
+ i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_56_Template_div_click_2_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("promptTime")); });
274
197
  i0.ɵɵelementStart(3, "h3");
275
- i0.ɵɵelement(4, "i", 65);
198
+ i0.ɵɵelement(4, "i", 77);
276
199
  i0.ɵɵtext(5, " Average Execution Time by Prompt");
277
200
  i0.ɵɵelementEnd();
278
- i0.ɵɵelementStart(6, "button", 52);
279
- i0.ɵɵelement(7, "i", 44);
201
+ i0.ɵɵelementStart(6, "button", 46);
202
+ i0.ɵɵelement(7, "i", 41);
280
203
  i0.ɵɵelementEnd()();
281
- i0.ɵɵelementStart(8, "div", 53)(9, "div", 54);
282
- i0.ɵɵelement(10, "div", 66, 4);
204
+ i0.ɵɵelementStart(8, "div", 47)(9, "div", 48);
205
+ i0.ɵɵelement(10, "div", 78, 6);
283
206
  i0.ɵɵelementEnd()()();
284
- i0.ɵɵelementStart(12, "div", 49)(13, "div", 50);
285
- i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_4_Template_div_click_13_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("promptToken")); });
207
+ i0.ɵɵelementStart(12, "div", 43)(13, "div", 44);
208
+ i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_56_Template_div_click_13_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("promptToken")); });
286
209
  i0.ɵɵelementStart(14, "h3");
287
- i0.ɵɵelement(15, "i", 67);
210
+ i0.ɵɵelement(15, "i", 79);
288
211
  i0.ɵɵtext(16, " Token Usage by Prompt");
289
212
  i0.ɵɵelementEnd();
290
- i0.ɵɵelementStart(17, "button", 52);
291
- i0.ɵɵelement(18, "i", 44);
213
+ i0.ɵɵelementStart(17, "button", 46);
214
+ i0.ɵɵelement(18, "i", 41);
292
215
  i0.ɵɵelementEnd()();
293
- i0.ɵɵelementStart(19, "div", 53)(20, "div", 54);
294
- i0.ɵɵelement(21, "div", 68, 5);
216
+ i0.ɵɵelementStart(19, "div", 47)(20, "div", 48);
217
+ i0.ɵɵelement(21, "div", 80, 7);
295
218
  i0.ɵɵelementEnd()()();
296
- i0.ɵɵelementStart(23, "div", 49)(24, "div", 50);
297
- i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_4_Template_div_click_24_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("promptCost")); });
219
+ i0.ɵɵelementStart(23, "div", 43)(24, "div", 44);
220
+ i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_56_Template_div_click_24_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("promptCost")); });
298
221
  i0.ɵɵelementStart(25, "h3");
299
- i0.ɵɵelement(26, "i", 51);
222
+ i0.ɵɵelement(26, "i", 66);
300
223
  i0.ɵɵtext(27, " Cost Distribution by Prompt");
301
224
  i0.ɵɵelementEnd();
302
- i0.ɵɵelementStart(28, "button", 52);
303
- i0.ɵɵelement(29, "i", 44);
225
+ i0.ɵɵelementStart(28, "button", 46);
226
+ i0.ɵɵelement(29, "i", 41);
304
227
  i0.ɵɵelementEnd()();
305
- i0.ɵɵelementStart(30, "div", 53)(31, "div", 54);
306
- i0.ɵɵelement(32, "div", 69, 6);
228
+ i0.ɵɵelementStart(30, "div", 47)(31, "div", 48);
229
+ i0.ɵɵelement(32, "div", 81, 8);
307
230
  i0.ɵɵelementEnd()()();
308
- i0.ɵɵelementStart(34, "div", 49)(35, "div", 50);
309
- i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_4_Template_div_click_35_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("promptCount")); });
231
+ i0.ɵɵelementStart(34, "div", 43)(35, "div", 44);
232
+ i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_56_Template_div_click_35_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("promptCount")); });
310
233
  i0.ɵɵelementStart(36, "h3");
311
- i0.ɵɵelement(37, "i", 70);
234
+ i0.ɵɵelement(37, "i", 82);
312
235
  i0.ɵɵtext(38, " Prompt Execution Count");
313
236
  i0.ɵɵelementEnd();
314
- i0.ɵɵelementStart(39, "button", 52);
315
- i0.ɵɵelement(40, "i", 44);
237
+ i0.ɵɵelementStart(39, "button", 46);
238
+ i0.ɵɵelement(40, "i", 41);
316
239
  i0.ɵɵelementEnd()();
317
- i0.ɵɵelementStart(41, "div", 53)(42, "div", 54);
318
- i0.ɵɵelement(43, "div", 71, 7);
240
+ i0.ɵɵelementStart(41, "div", 47)(42, "div", 48);
241
+ i0.ɵɵelement(43, "div", 83, 9);
319
242
  i0.ɵɵelementEnd()()()();
320
243
  } if (rf & 2) {
321
- const ctx_r1 = i0.ɵɵnextContext(3);
244
+ const ctx_r1 = i0.ɵɵnextContext(2);
322
245
  i0.ɵɵadvance();
323
246
  i0.ɵɵclassProp("expanded", ctx_r1.expandedCharts["promptTime"]);
324
247
  i0.ɵɵadvance(6);
@@ -336,7 +259,7 @@ function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_4_
336
259
  i0.ɵɵadvance(6);
337
260
  i0.ɵɵproperty("ngClass", ctx_r1.expandedCharts["promptCount"] ? "fa-compress" : "fa-expand");
338
261
  } }
339
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_9_For_16_Template(rf, ctx) { if (rf & 1) {
262
+ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_61_For_16_Template(rf, ctx) { if (rf & 1) {
340
263
  i0.ɵɵelementStart(0, "tr")(1, "td");
341
264
  i0.ɵɵtext(2);
342
265
  i0.ɵɵelementEnd();
@@ -349,12 +272,12 @@ function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_9_
349
272
  i0.ɵɵelementStart(7, "td");
350
273
  i0.ɵɵtext(8);
351
274
  i0.ɵɵelementEnd();
352
- i0.ɵɵelementStart(9, "td")(10, "span", 72);
275
+ i0.ɵɵelementStart(9, "td")(10, "span", 84);
353
276
  i0.ɵɵtext(11);
354
277
  i0.ɵɵelementEnd()()();
355
278
  } if (rf & 2) {
356
279
  const prompt_r8 = ctx.$implicit;
357
- const ctx_r1 = i0.ɵɵnextContext(4);
280
+ const ctx_r1 = i0.ɵɵnextContext(3);
358
281
  i0.ɵɵadvance(2);
359
282
  i0.ɵɵtextInterpolate(prompt_r8.key);
360
283
  i0.ɵɵadvance(2);
@@ -366,8 +289,8 @@ function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_9_
366
289
  i0.ɵɵadvance(3);
367
290
  i0.ɵɵtextInterpolate1(" ", ctx_r1.calculatePromptSuccessRate(prompt_r8.key), "% ");
368
291
  } }
369
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_9_Template(rf, ctx) { if (rf & 1) {
370
- i0.ɵɵelementStart(0, "div", 45)(1, "table")(2, "thead")(3, "tr")(4, "th");
292
+ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_61_Template(rf, ctx) { if (rf & 1) {
293
+ i0.ɵɵelementStart(0, "div", 42)(1, "table")(2, "thead")(3, "tr")(4, "th");
371
294
  i0.ɵɵtext(5, "Prompt Name");
372
295
  i0.ɵɵelementEnd();
373
296
  i0.ɵɵelementStart(6, "th");
@@ -383,48 +306,19 @@ function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_9_
383
306
  i0.ɵɵtext(13, "Success Rate");
384
307
  i0.ɵɵelementEnd()()();
385
308
  i0.ɵɵelementStart(14, "tbody");
386
- i0.ɵɵrepeaterCreate(15, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_9_For_16_Template, 12, 5, "tr", null, i0.ɵɵcomponentInstance().trackByKey, true);
309
+ i0.ɵɵrepeaterCreate(15, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_61_For_16_Template, 12, 5, "tr", null, i0.ɵɵcomponentInstance().trackByKey, true);
387
310
  i0.ɵɵpipe(17, "keyvalue");
388
311
  i0.ɵɵelementEnd()()();
389
312
  } if (rf & 2) {
390
- const ctx_r1 = i0.ɵɵnextContext(3);
313
+ const ctx_r1 = i0.ɵɵnextContext(2);
391
314
  i0.ɵɵadvance(15);
392
315
  i0.ɵɵrepeater(i0.ɵɵpipeBind1(17, 0, ctx_r1.promptMetrics.byPrompt));
393
316
  } }
394
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Template(rf, ctx) { if (rf & 1) {
395
- const _r3 = i0.ɵɵgetCurrentView();
396
- i0.ɵɵelementStart(0, "div", 37);
397
- i0.ɵɵconditionalCreate(1, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_1_Template, 4, 2, "div", 38);
398
- i0.ɵɵconditionalCreate(2, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_2_Template, 6, 0, "div", 39);
399
- i0.ɵɵconditionalCreate(3, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_3_Template, 48, 14, "div", 40);
400
- i0.ɵɵconditionalCreate(4, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_4_Template, 45, 12, "div", 41);
401
- i0.ɵɵelementStart(5, "div", 42)(6, "button", 43);
402
- i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.promptDetailsExpanded = !ctx_r1.promptDetailsExpanded); });
403
- i0.ɵɵelement(7, "i", 44);
404
- i0.ɵɵtext(8, " Detailed Prompt Metrics ");
405
- i0.ɵɵelementEnd();
406
- i0.ɵɵconditionalCreate(9, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_9_Template, 18, 2, "div", 45);
407
- i0.ɵɵelementEnd()();
408
- } if (rf & 2) {
409
- const ctx_r1 = i0.ɵɵnextContext(2);
410
- i0.ɵɵadvance();
411
- i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount > 0 ? 1 : -1);
412
- i0.ɵɵadvance();
413
- i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount === 0 ? 2 : -1);
414
- i0.ɵɵadvance();
415
- i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount > 0 ? 3 : -1);
416
- i0.ɵɵadvance();
417
- i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount > 0 ? 4 : -1);
418
- i0.ɵɵadvance(3);
419
- i0.ɵɵproperty("ngClass", ctx_r1.promptDetailsExpanded ? "fa-chevron-up" : "fa-chevron-down");
420
- i0.ɵɵadvance(2);
421
- i0.ɵɵconditional(ctx_r1.promptDetailsExpanded ? 9 : -1);
422
- } }
423
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_9_Template(rf, ctx) { if (rf & 1) {
424
- i0.ɵɵelement(0, "i", 32);
317
+ function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_63_Template(rf, ctx) { if (rf & 1) {
318
+ i0.ɵɵelement(0, "i", 29);
425
319
  i0.ɵɵtext(1, " Action Analytics ");
426
320
  } }
427
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Conditional_28_For_16_Template(rf, ctx) { if (rf & 1) {
321
+ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_92_For_16_Template(rf, ctx) { if (rf & 1) {
428
322
  i0.ɵɵelementStart(0, "tr")(1, "td");
429
323
  i0.ɵɵtext(2);
430
324
  i0.ɵɵelementEnd();
@@ -434,30 +328,30 @@ function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Conditional_2
434
328
  i0.ɵɵelementStart(5, "td");
435
329
  i0.ɵɵtext(6);
436
330
  i0.ɵɵelementEnd();
437
- i0.ɵɵelementStart(7, "td")(8, "span", 72);
331
+ i0.ɵɵelementStart(7, "td")(8, "span", 84);
438
332
  i0.ɵɵtext(9);
439
333
  i0.ɵɵelementEnd()();
440
334
  i0.ɵɵelementStart(10, "td");
441
335
  i0.ɵɵtext(11);
442
336
  i0.ɵɵelementEnd()();
443
337
  } if (rf & 2) {
444
- const action_r10 = ctx.$implicit;
445
- const ctx_r1 = i0.ɵɵnextContext(4);
338
+ const action_r9 = ctx.$implicit;
339
+ const ctx_r1 = i0.ɵɵnextContext(3);
446
340
  i0.ɵɵadvance(2);
447
- i0.ɵɵtextInterpolate(action_r10.key);
341
+ i0.ɵɵtextInterpolate(action_r9.key);
448
342
  i0.ɵɵadvance(2);
449
- i0.ɵɵtextInterpolate(action_r10.value.count);
343
+ i0.ɵɵtextInterpolate(action_r9.value.count);
450
344
  i0.ɵɵadvance(2);
451
- i0.ɵɵtextInterpolate(ctx_r1.formatDuration(action_r10.value.avgTime));
345
+ i0.ɵɵtextInterpolate(ctx_r1.formatDuration(action_r9.value.avgTime));
452
346
  i0.ɵɵadvance(2);
453
- i0.ɵɵclassProp("high", action_r10.value.successRate > 0.9)("medium", action_r10.value.successRate > 0.7 && action_r10.value.successRate <= 0.9)("low", action_r10.value.successRate <= 0.7);
347
+ i0.ɵɵclassProp("high", action_r9.value.successRate > 0.9)("medium", action_r9.value.successRate > 0.7 && action_r9.value.successRate <= 0.9)("low", action_r9.value.successRate <= 0.7);
454
348
  i0.ɵɵadvance();
455
- i0.ɵɵtextInterpolate1(" ", (action_r10.value.successRate * 100).toFixed(1), "% ");
349
+ i0.ɵɵtextInterpolate1(" ", (action_r9.value.successRate * 100).toFixed(1), "% ");
456
350
  i0.ɵɵadvance(2);
457
- i0.ɵɵtextInterpolate(ctx_r1.getActionType(action_r10.key));
351
+ i0.ɵɵtextInterpolate(ctx_r1.getActionType(action_r9.key));
458
352
  } }
459
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Conditional_28_Template(rf, ctx) { if (rf & 1) {
460
- i0.ɵɵelementStart(0, "div", 45)(1, "table")(2, "thead")(3, "tr")(4, "th");
353
+ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_92_Template(rf, ctx) { if (rf & 1) {
354
+ i0.ɵɵelementStart(0, "div", 42)(1, "table")(2, "thead")(3, "tr")(4, "th");
461
355
  i0.ɵɵtext(5, "Action Name");
462
356
  i0.ɵɵelementEnd();
463
357
  i0.ɵɵelementStart(6, "th");
@@ -473,112 +367,56 @@ function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Conditional_2
473
367
  i0.ɵɵtext(13, "Type");
474
368
  i0.ɵɵelementEnd()()();
475
369
  i0.ɵɵelementStart(14, "tbody");
476
- i0.ɵɵrepeaterCreate(15, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Conditional_28_For_16_Template, 12, 11, "tr", null, i0.ɵɵcomponentInstance().trackByKey, true);
370
+ i0.ɵɵrepeaterCreate(15, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_92_For_16_Template, 12, 11, "tr", null, i0.ɵɵcomponentInstance().trackByKey, true);
477
371
  i0.ɵɵpipe(17, "keyvalue");
478
372
  i0.ɵɵelementEnd()()();
479
373
  } if (rf & 2) {
480
- const ctx_r1 = i0.ɵɵnextContext(3);
374
+ const ctx_r1 = i0.ɵɵnextContext(2);
481
375
  i0.ɵɵadvance(15);
482
376
  i0.ɵɵrepeater(i0.ɵɵpipeBind1(17, 0, ctx_r1.actionMetrics.byAction));
483
377
  } }
484
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Conditional_30_For_8_Template(rf, ctx) { if (rf & 1) {
485
- i0.ɵɵelementStart(0, "div", 83)(1, "span", 84);
378
+ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_94_For_8_Template(rf, ctx) { if (rf & 1) {
379
+ i0.ɵɵelementStart(0, "div", 88)(1, "span", 89);
486
380
  i0.ɵɵtext(2);
487
381
  i0.ɵɵelementEnd();
488
- i0.ɵɵelementStart(3, "span", 85);
382
+ i0.ɵɵelementStart(3, "span", 90);
489
383
  i0.ɵɵtext(4);
490
384
  i0.ɵɵelementEnd()();
491
385
  } if (rf & 2) {
492
- const error_r11 = ctx.$implicit;
386
+ const error_r10 = ctx.$implicit;
493
387
  i0.ɵɵadvance(2);
494
- i0.ɵɵtextInterpolate1("", error_r11.count, "x");
388
+ i0.ɵɵtextInterpolate1("", error_r10.count, "x");
495
389
  i0.ɵɵadvance(2);
496
- i0.ɵɵtextInterpolate(error_r11.message);
390
+ i0.ɵɵtextInterpolate(error_r10.message);
497
391
  } }
498
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Conditional_30_Template(rf, ctx) { if (rf & 1) {
499
- i0.ɵɵelementStart(0, "div", 78)(1, "h3");
500
- i0.ɵɵelement(2, "i", 80);
392
+ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_94_Template(rf, ctx) { if (rf & 1) {
393
+ i0.ɵɵelementStart(0, "div", 53)(1, "h3");
394
+ i0.ɵɵelement(2, "i", 85);
501
395
  i0.ɵɵtext(3, " Common Errors ");
502
396
  i0.ɵɵelementEnd();
503
- i0.ɵɵelementStart(4, "p", 81);
397
+ i0.ɵɵelementStart(4, "p", 86);
504
398
  i0.ɵɵtext(5, " This section shows the most frequent error messages from failed actions, helping identify systemic issues that may need attention. ");
505
399
  i0.ɵɵelementEnd();
506
- i0.ɵɵelementStart(6, "div", 82);
507
- i0.ɵɵrepeaterCreate(7, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Conditional_30_For_8_Template, 5, 2, "div", 83, i0.ɵɵcomponentInstance().trackByErrorMessage, true);
400
+ i0.ɵɵelementStart(6, "div", 87);
401
+ i0.ɵɵrepeaterCreate(7, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_94_For_8_Template, 5, 2, "div", 88, i0.ɵɵcomponentInstance().trackByErrorMessage, true);
508
402
  i0.ɵɵelementEnd()();
509
403
  } if (rf & 2) {
510
- const ctx_r1 = i0.ɵɵnextContext(3);
404
+ const ctx_r1 = i0.ɵɵnextContext(2);
511
405
  i0.ɵɵadvance(7);
512
406
  i0.ɵɵrepeater(ctx_r1.getTopErrors());
513
407
  } }
514
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Conditional_31_Template(rf, ctx) { if (rf & 1) {
515
- i0.ɵɵelementStart(0, "div", 79);
516
- i0.ɵɵelement(1, "i", 86);
408
+ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_95_Template(rf, ctx) { if (rf & 1) {
409
+ i0.ɵɵelementStart(0, "div", 54);
410
+ i0.ɵɵelement(1, "i", 91);
517
411
  i0.ɵɵelementStart(2, "p");
518
412
  i0.ɵɵtext(3, "No action errors detected in this run. All actions completed successfully!");
519
413
  i0.ɵɵelementEnd()();
520
414
  } }
521
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Template(rf, ctx) { if (rf & 1) {
522
- const _r9 = i0.ɵɵgetCurrentView();
523
- i0.ɵɵelementStart(0, "div", 37)(1, "div", 40)(2, "div", 49)(3, "div", 50);
524
- i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Template_div_click_3_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("actionSuccess")); });
525
- i0.ɵɵelementStart(4, "h3");
526
- i0.ɵɵelement(5, "i", 73);
527
- i0.ɵɵtext(6, " Action Success Rate");
528
- i0.ɵɵelementEnd();
529
- i0.ɵɵelementStart(7, "button", 52);
530
- i0.ɵɵelement(8, "i", 44);
531
- i0.ɵɵelementEnd()();
532
- i0.ɵɵelementStart(9, "div", 53)(10, "div", 54);
533
- i0.ɵɵelement(11, "div", 74, 8);
534
- i0.ɵɵelementEnd()()();
535
- i0.ɵɵelementStart(13, "div", 49)(14, "div", 50);
536
- i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Template_div_click_14_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("stepType")); });
537
- i0.ɵɵelementStart(15, "h3");
538
- i0.ɵɵelement(16, "i", 75);
539
- i0.ɵɵtext(17, " Step Type Distribution");
540
- i0.ɵɵelementEnd();
541
- i0.ɵɵelementStart(18, "button", 52);
542
- i0.ɵɵelement(19, "i", 44);
543
- i0.ɵɵelementEnd()();
544
- i0.ɵɵelementStart(20, "div", 53)(21, "div", 54);
545
- i0.ɵɵelement(22, "div", 76, 9);
546
- i0.ɵɵelementEnd()()()();
547
- i0.ɵɵelementStart(24, "div", 42)(25, "button", 43);
548
- i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Template_button_click_25_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.actionDetailsExpanded = !ctx_r1.actionDetailsExpanded); });
549
- i0.ɵɵelement(26, "i", 44);
550
- i0.ɵɵtext(27, " Detailed Action Metrics ");
551
- i0.ɵɵelementEnd();
552
- i0.ɵɵconditionalCreate(28, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Conditional_28_Template, 18, 2, "div", 45);
553
- i0.ɵɵelementEnd();
554
- i0.ɵɵelementStart(29, "div", 77);
555
- i0.ɵɵconditionalCreate(30, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Conditional_30_Template, 9, 0, "div", 78);
556
- i0.ɵɵconditionalCreate(31, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Conditional_31_Template, 4, 0, "div", 79);
557
- i0.ɵɵelementEnd()();
558
- } if (rf & 2) {
559
- const ctx_r1 = i0.ɵɵnextContext(2);
560
- i0.ɵɵadvance(2);
561
- i0.ɵɵclassProp("expanded", ctx_r1.expandedCharts["actionSuccess"]);
562
- i0.ɵɵadvance(6);
563
- i0.ɵɵproperty("ngClass", ctx_r1.expandedCharts["actionSuccess"] ? "fa-compress" : "fa-expand");
564
- i0.ɵɵadvance(5);
565
- i0.ɵɵclassProp("expanded", ctx_r1.expandedCharts["stepType"]);
566
- i0.ɵɵadvance(6);
567
- i0.ɵɵproperty("ngClass", ctx_r1.expandedCharts["stepType"] ? "fa-compress" : "fa-expand");
568
- i0.ɵɵadvance(7);
569
- i0.ɵɵproperty("ngClass", ctx_r1.actionDetailsExpanded ? "fa-chevron-up" : "fa-chevron-down");
570
- i0.ɵɵadvance(2);
571
- i0.ɵɵconditional(ctx_r1.actionDetailsExpanded ? 28 : -1);
572
- i0.ɵɵadvance(2);
573
- i0.ɵɵconditional(ctx_r1.actionMetrics.errorAnalysis.size > 0 ? 30 : -1);
574
- i0.ɵɵadvance();
575
- i0.ɵɵconditional(ctx_r1.actionMetrics.errorAnalysis.size === 0 ? 31 : -1);
576
- } }
577
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_12_Template(rf, ctx) { if (rf & 1) {
578
- i0.ɵɵelement(0, "i", 87);
415
+ function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_97_Template(rf, ctx) { if (rf & 1) {
416
+ i0.ɵɵelement(0, "i", 92);
579
417
  i0.ɵɵtext(1, " Model Performance Comparison ");
580
418
  } }
581
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_13_For_23_Template(rf, ctx) { if (rf & 1) {
419
+ function AIAgentRunAnalyticsComponent_Conditional_3_For_121_Template(rf, ctx) { if (rf & 1) {
582
420
  i0.ɵɵelementStart(0, "tr")(1, "td");
583
421
  i0.ɵɵtext(2);
584
422
  i0.ɵɵelementEnd();
@@ -606,160 +444,294 @@ function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_13_For_23_Templa
606
444
  i0.ɵɵpipe(18, "number");
607
445
  i0.ɵɵelementEnd()();
608
446
  } if (rf & 2) {
609
- const model_r12 = ctx.$implicit;
610
- const ctx_r1 = i0.ɵɵnextContext(3);
447
+ const model_r11 = ctx.$implicit;
448
+ const ctx_r1 = i0.ɵɵnextContext(2);
611
449
  i0.ɵɵadvance(2);
612
- i0.ɵɵtextInterpolate(model_r12.name);
450
+ i0.ɵɵtextInterpolate(model_r11.name);
613
451
  i0.ɵɵadvance(2);
614
- i0.ɵɵtextInterpolate(model_r12.vendor);
452
+ i0.ɵɵtextInterpolate(model_r11.vendor);
615
453
  i0.ɵɵadvance(2);
616
- i0.ɵɵtextInterpolate(model_r12.count);
454
+ i0.ɵɵtextInterpolate(model_r11.count);
617
455
  i0.ɵɵadvance(2);
618
- i0.ɵɵtextInterpolate(ctx_r1.formatDuration(model_r12.avgTime));
456
+ i0.ɵɵtextInterpolate(ctx_r1.formatDuration(model_r11.avgTime));
619
457
  i0.ɵɵadvance(2);
620
- i0.ɵɵtextInterpolate(ctx_r1.formatCost(model_r12.totalCost));
458
+ i0.ɵɵtextInterpolate(ctx_r1.formatCost(model_r11.totalCost));
621
459
  i0.ɵɵadvance(2);
622
- i0.ɵɵtextInterpolate(ctx_r1.formatCost(model_r12.avgCost));
460
+ i0.ɵɵtextInterpolate(ctx_r1.formatCost(model_r11.avgCost));
623
461
  i0.ɵɵadvance(2);
624
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(15, 8, model_r12.inputTokens, "1.0-0"));
462
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(15, 8, model_r11.inputTokens, "1.0-0"));
625
463
  i0.ɵɵadvance(3);
626
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(18, 11, model_r12.outputTokens, "1.0-0"));
627
- } }
628
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_13_Template(rf, ctx) { if (rf & 1) {
629
- i0.ɵɵelementStart(0, "div", 37)(1, "div", 88)(2, "table")(3, "thead")(4, "tr")(5, "th");
630
- i0.ɵɵtext(6, "Model");
631
- i0.ɵɵelementEnd();
632
- i0.ɵɵelementStart(7, "th");
633
- i0.ɵɵtext(8, "Vendor");
634
- i0.ɵɵelementEnd();
635
- i0.ɵɵelementStart(9, "th");
636
- i0.ɵɵtext(10, "Prompts");
637
- i0.ɵɵelementEnd();
638
- i0.ɵɵelementStart(11, "th");
639
- i0.ɵɵtext(12, "Avg Time");
640
- i0.ɵɵelementEnd();
641
- i0.ɵɵelementStart(13, "th");
642
- i0.ɵɵtext(14, "Total Cost");
643
- i0.ɵɵelementEnd();
644
- i0.ɵɵelementStart(15, "th");
645
- i0.ɵɵtext(16, "Avg Cost/Prompt");
646
- i0.ɵɵelementEnd();
647
- i0.ɵɵelementStart(17, "th");
648
- i0.ɵɵtext(18, "Input Tokens");
649
- i0.ɵɵelementEnd();
650
- i0.ɵɵelementStart(19, "th");
651
- i0.ɵɵtext(20, "Output Tokens");
652
- i0.ɵɵelementEnd()()();
653
- i0.ɵɵelementStart(21, "tbody");
654
- i0.ɵɵrepeaterCreate(22, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_13_For_23_Template, 19, 14, "tr", null, i0.ɵɵcomponentInstance().trackByModelName, true);
655
- i0.ɵɵelementEnd()()()();
656
- } if (rf & 2) {
657
- const ctx_r1 = i0.ɵɵnextContext(2);
658
- i0.ɵɵadvance(22);
659
- i0.ɵɵrepeater(ctx_r1.getModelPerformanceData());
464
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(18, 11, model_r11.outputTokens, "1.0-0"));
660
465
  } }
661
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_15_Template(rf, ctx) { if (rf & 1) {
662
- i0.ɵɵelement(0, "i", 89);
466
+ function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_123_Template(rf, ctx) { if (rf & 1) {
467
+ i0.ɵɵelement(0, "i", 93);
663
468
  i0.ɵɵtext(1, " Execution Timeline Analysis ");
664
469
  } }
665
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_16_For_27_Template(rf, ctx) { if (rf & 1) {
666
- i0.ɵɵelementStart(0, "div", 96);
667
- i0.ɵɵelement(1, "i", 44);
668
- i0.ɵɵelementStart(2, "span", 97);
470
+ function AIAgentRunAnalyticsComponent_Conditional_3_For_151_Template(rf, ctx) { if (rf & 1) {
471
+ i0.ɵɵelementStart(0, "div", 62);
472
+ i0.ɵɵelement(1, "i", 41);
473
+ i0.ɵɵelementStart(2, "span", 94);
669
474
  i0.ɵɵtext(3);
670
475
  i0.ɵɵelementEnd();
671
- i0.ɵɵelementStart(4, "span", 98);
476
+ i0.ɵɵelementStart(4, "span", 95);
672
477
  i0.ɵɵtext(5);
673
478
  i0.ɵɵelementEnd();
674
- i0.ɵɵelementStart(6, "span", 99);
479
+ i0.ɵɵelementStart(6, "span", 96);
675
480
  i0.ɵɵtext(7);
676
481
  i0.ɵɵelementEnd()();
677
482
  } if (rf & 2) {
678
- const type_r13 = ctx.$implicit;
679
- const ctx_r1 = i0.ɵɵnextContext(3);
483
+ const type_r12 = ctx.$implicit;
484
+ const ctx_r1 = i0.ɵɵnextContext(2);
680
485
  i0.ɵɵadvance();
681
- i0.ɵɵproperty("ngClass", ctx_r1.getStepTypeIcon(type_r13.key));
486
+ i0.ɵɵproperty("ngClass", ctx_r1.getStepTypeIcon(type_r12.key));
682
487
  i0.ɵɵadvance(2);
683
- i0.ɵɵtextInterpolate(type_r13.key);
488
+ i0.ɵɵtextInterpolate(type_r12.key);
684
489
  i0.ɵɵadvance(2);
685
- i0.ɵɵtextInterpolate(type_r13.value);
490
+ i0.ɵɵtextInterpolate(type_r12.value);
686
491
  i0.ɵɵadvance(2);
687
- i0.ɵɵtextInterpolate1("(", (type_r13.value / ctx_r1.timelineMetrics.totalSteps * 100).toFixed(1), "%)");
492
+ i0.ɵɵtextInterpolate1("(", (type_r12.value / ctx_r1.timelineMetrics.totalSteps * 100).toFixed(1), "%)");
688
493
  } }
689
- function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_16_Template(rf, ctx) { if (rf & 1) {
690
- i0.ɵɵelementStart(0, "div", 37)(1, "div", 90)(2, "div", 91)(3, "span", 92);
691
- i0.ɵɵtext(4, "Total Steps");
494
+ function AIAgentRunAnalyticsComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
495
+ const _r3 = i0.ɵɵgetCurrentView();
496
+ i0.ɵɵelementStart(0, "div", 13)(1, "mj-accordion-panel", 17);
497
+ i0.ɵɵtemplate(2, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_2_Template, 2, 0, "ng-template", 18);
498
+ i0.ɵɵelementStart(3, "div", 19)(4, "div", 20)(5, "div", 21);
499
+ i0.ɵɵelement(6, "i", 22);
692
500
  i0.ɵɵelementEnd();
693
- i0.ɵɵelementStart(5, "span", 93);
694
- i0.ɵɵtext(6);
695
- i0.ɵɵelementEnd()();
696
- i0.ɵɵelementStart(7, "div", 91)(8, "span", 92);
697
- i0.ɵɵtext(9, "Parallel Executions");
501
+ i0.ɵɵelementStart(7, "div", 23)(8, "h3");
502
+ i0.ɵɵtext(9, "Total Prompts");
698
503
  i0.ɵɵelementEnd();
699
- i0.ɵɵelementStart(10, "span", 93);
504
+ i0.ɵɵelementStart(10, "div", 24);
700
505
  i0.ɵɵtext(11);
701
- i0.ɵɵelementEnd()();
702
- i0.ɵɵelementStart(12, "div", 91)(13, "span", 92);
703
- i0.ɵɵtext(14, "Max Nesting Depth");
704
506
  i0.ɵɵelementEnd();
705
- i0.ɵɵelementStart(15, "span", 93);
706
- i0.ɵɵtext(16);
507
+ i0.ɵɵelementStart(12, "div", 25)(13, "span", 26);
508
+ i0.ɵɵtext(14);
509
+ i0.ɵɵelementEnd();
510
+ i0.ɵɵconditionalCreate(15, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_15_Template, 2, 1, "span", 27);
511
+ i0.ɵɵelementEnd()()();
512
+ i0.ɵɵelementStart(16, "div", 20)(17, "div", 28);
513
+ i0.ɵɵelement(18, "i", 29);
514
+ i0.ɵɵelementEnd();
515
+ i0.ɵɵelementStart(19, "div", 23)(20, "h3");
516
+ i0.ɵɵtext(21, "Total Actions");
517
+ i0.ɵɵelementEnd();
518
+ i0.ɵɵelementStart(22, "div", 24);
519
+ i0.ɵɵtext(23);
520
+ i0.ɵɵelementEnd();
521
+ i0.ɵɵelementStart(24, "div", 25)(25, "span", 26);
522
+ i0.ɵɵtext(26);
523
+ i0.ɵɵelementEnd();
524
+ i0.ɵɵconditionalCreate(27, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_27_Template, 2, 1, "span", 27);
525
+ i0.ɵɵelementEnd()()();
526
+ i0.ɵɵelementStart(28, "div", 20)(29, "div", 30);
527
+ i0.ɵɵelement(30, "i", 31);
528
+ i0.ɵɵelementEnd();
529
+ i0.ɵɵelementStart(31, "div", 23)(32, "h3");
530
+ i0.ɵɵtext(33, "Total Cost");
531
+ i0.ɵɵelementEnd();
532
+ i0.ɵɵelementStart(34, "div", 24);
533
+ i0.ɵɵtext(35);
534
+ i0.ɵɵelementEnd();
535
+ i0.ɵɵelementStart(36, "div", 25)(37, "span");
536
+ i0.ɵɵtext(38);
537
+ i0.ɵɵelementEnd()()()();
538
+ i0.ɵɵelementStart(39, "div", 20)(40, "div", 32);
539
+ i0.ɵɵelement(41, "i", 33);
540
+ i0.ɵɵelementEnd();
541
+ i0.ɵɵelementStart(42, "div", 23)(43, "h3");
542
+ i0.ɵɵtext(44, "Execution Time");
543
+ i0.ɵɵelementEnd();
544
+ i0.ɵɵelementStart(45, "div", 24);
545
+ i0.ɵɵtext(46);
546
+ i0.ɵɵelementEnd();
547
+ i0.ɵɵelementStart(47, "div", 25)(48, "span");
548
+ i0.ɵɵtext(49);
549
+ i0.ɵɵelementEnd()()()()()();
550
+ i0.ɵɵelementStart(50, "mj-accordion-panel", 17);
551
+ i0.ɵɵtemplate(51, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_51_Template, 2, 0, "ng-template", 18);
552
+ i0.ɵɵelementStart(52, "div", 34);
553
+ i0.ɵɵconditionalCreate(53, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_53_Template, 4, 2, "div", 35);
554
+ i0.ɵɵconditionalCreate(54, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_54_Template, 6, 0, "div", 36);
555
+ i0.ɵɵconditionalCreate(55, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_55_Template, 48, 14, "div", 37);
556
+ i0.ɵɵconditionalCreate(56, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_56_Template, 45, 12, "div", 38);
557
+ i0.ɵɵelementStart(57, "div", 39)(58, "button", 40);
558
+ i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Template_button_click_58_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.promptDetailsExpanded = !ctx_r1.promptDetailsExpanded); });
559
+ i0.ɵɵelement(59, "i", 41);
560
+ i0.ɵɵtext(60, " Detailed Prompt Metrics ");
561
+ i0.ɵɵelementEnd();
562
+ i0.ɵɵconditionalCreate(61, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_61_Template, 18, 2, "div", 42);
563
+ i0.ɵɵelementEnd()()();
564
+ i0.ɵɵelementStart(62, "mj-accordion-panel", 17);
565
+ i0.ɵɵtemplate(63, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_63_Template, 2, 0, "ng-template", 18);
566
+ i0.ɵɵelementStart(64, "div", 34)(65, "div", 37)(66, "div", 43)(67, "div", 44);
567
+ i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Template_div_click_67_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("actionSuccess")); });
568
+ i0.ɵɵelementStart(68, "h3");
569
+ i0.ɵɵelement(69, "i", 45);
570
+ i0.ɵɵtext(70, " Action Success Rate");
571
+ i0.ɵɵelementEnd();
572
+ i0.ɵɵelementStart(71, "button", 46);
573
+ i0.ɵɵelement(72, "i", 41);
574
+ i0.ɵɵelementEnd()();
575
+ i0.ɵɵelementStart(73, "div", 47)(74, "div", 48);
576
+ i0.ɵɵelement(75, "div", 49, 0);
577
+ i0.ɵɵelementEnd()()();
578
+ i0.ɵɵelementStart(77, "div", 43)(78, "div", 44);
579
+ i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Template_div_click_78_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("stepType")); });
580
+ i0.ɵɵelementStart(79, "h3");
581
+ i0.ɵɵelement(80, "i", 50);
582
+ i0.ɵɵtext(81, " Step Type Distribution");
583
+ i0.ɵɵelementEnd();
584
+ i0.ɵɵelementStart(82, "button", 46);
585
+ i0.ɵɵelement(83, "i", 41);
707
586
  i0.ɵɵelementEnd()();
708
- i0.ɵɵelementStart(17, "div", 91)(18, "span", 92);
709
- i0.ɵɵtext(19, "Sub-Agent Runs");
587
+ i0.ɵɵelementStart(84, "div", 47)(85, "div", 48);
588
+ i0.ɵɵelement(86, "div", 51, 1);
589
+ i0.ɵɵelementEnd()()()();
590
+ i0.ɵɵelementStart(88, "div", 39)(89, "button", 40);
591
+ i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Template_button_click_89_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.actionDetailsExpanded = !ctx_r1.actionDetailsExpanded); });
592
+ i0.ɵɵelement(90, "i", 41);
593
+ i0.ɵɵtext(91, " Detailed Action Metrics ");
710
594
  i0.ɵɵelementEnd();
711
- i0.ɵɵelementStart(20, "span", 93);
712
- i0.ɵɵtext(21);
595
+ i0.ɵɵconditionalCreate(92, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_92_Template, 18, 2, "div", 42);
596
+ i0.ɵɵelementEnd();
597
+ i0.ɵɵelementStart(93, "div", 52);
598
+ i0.ɵɵconditionalCreate(94, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_94_Template, 9, 0, "div", 53);
599
+ i0.ɵɵconditionalCreate(95, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_95_Template, 4, 0, "div", 54);
713
600
  i0.ɵɵelementEnd()()();
714
- i0.ɵɵelementStart(22, "div", 94)(23, "h3");
715
- i0.ɵɵtext(24, "Steps by Type");
601
+ i0.ɵɵelementStart(96, "mj-accordion-panel", 17);
602
+ i0.ɵɵtemplate(97, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_97_Template, 2, 0, "ng-template", 18);
603
+ i0.ɵɵelementStart(98, "div", 34)(99, "div", 55)(100, "table")(101, "thead")(102, "tr")(103, "th");
604
+ i0.ɵɵtext(104, "Model");
605
+ i0.ɵɵelementEnd();
606
+ i0.ɵɵelementStart(105, "th");
607
+ i0.ɵɵtext(106, "Vendor");
608
+ i0.ɵɵelementEnd();
609
+ i0.ɵɵelementStart(107, "th");
610
+ i0.ɵɵtext(108, "Prompts");
716
611
  i0.ɵɵelementEnd();
717
- i0.ɵɵelementStart(25, "div", 95);
718
- i0.ɵɵrepeaterCreate(26, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_16_For_27_Template, 8, 4, "div", 96, i0.ɵɵcomponentInstance().trackByKey, true);
719
- i0.ɵɵpipe(28, "keyvalue");
612
+ i0.ɵɵelementStart(109, "th");
613
+ i0.ɵɵtext(110, "Avg Time");
614
+ i0.ɵɵelementEnd();
615
+ i0.ɵɵelementStart(111, "th");
616
+ i0.ɵɵtext(112, "Total Cost");
617
+ i0.ɵɵelementEnd();
618
+ i0.ɵɵelementStart(113, "th");
619
+ i0.ɵɵtext(114, "Avg Cost/Prompt");
620
+ i0.ɵɵelementEnd();
621
+ i0.ɵɵelementStart(115, "th");
622
+ i0.ɵɵtext(116, "Input Tokens");
623
+ i0.ɵɵelementEnd();
624
+ i0.ɵɵelementStart(117, "th");
625
+ i0.ɵɵtext(118, "Output Tokens");
720
626
  i0.ɵɵelementEnd()()();
721
- } if (rf & 2) {
722
- const ctx_r1 = i0.ɵɵnextContext(2);
723
- i0.ɵɵadvance(6);
724
- i0.ɵɵtextInterpolate(ctx_r1.timelineMetrics.totalSteps);
725
- i0.ɵɵadvance(5);
726
- i0.ɵɵtextInterpolate(ctx_r1.timelineMetrics.parallelExecutions);
727
- i0.ɵɵadvance(5);
728
- i0.ɵɵtextInterpolate(ctx_r1.timelineMetrics.deepestNesting);
729
- i0.ɵɵadvance(5);
730
- i0.ɵɵtextInterpolate(ctx_r1.subAgentRuns.length);
731
- i0.ɵɵadvance(5);
732
- i0.ɵɵrepeater(i0.ɵɵpipeBind1(28, 4, ctx_r1.timelineMetrics.stepsByType));
733
- } }
734
- function AIAgentRunAnalyticsComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
735
- i0.ɵɵelementStart(0, "div", 13)(1, "kendo-panelbar", 17)(2, "kendo-panelbar-item", 18);
736
- i0.ɵɵtemplate(3, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_3_Template, 2, 0, "ng-template", 19)(4, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_4_Template, 47, 10, "ng-template", 20);
627
+ i0.ɵɵelementStart(119, "tbody");
628
+ i0.ɵɵrepeaterCreate(120, AIAgentRunAnalyticsComponent_Conditional_3_For_121_Template, 19, 14, "tr", null, i0.ɵɵcomponentInstance().trackByModelName, true);
629
+ i0.ɵɵelementEnd()()()()();
630
+ i0.ɵɵelementStart(122, "mj-accordion-panel", 17);
631
+ i0.ɵɵtemplate(123, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_123_Template, 2, 0, "ng-template", 18);
632
+ i0.ɵɵelementStart(124, "div", 34)(125, "div", 56)(126, "div", 57)(127, "span", 58);
633
+ i0.ɵɵtext(128, "Total Steps");
737
634
  i0.ɵɵelementEnd();
738
- i0.ɵɵelementStart(5, "kendo-panelbar-item", 18);
739
- i0.ɵɵtemplate(6, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_6_Template, 2, 0, "ng-template", 19)(7, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Template, 10, 6, "ng-template", 20);
635
+ i0.ɵɵelementStart(129, "span", 59);
636
+ i0.ɵɵtext(130);
637
+ i0.ɵɵelementEnd()();
638
+ i0.ɵɵelementStart(131, "div", 57)(132, "span", 58);
639
+ i0.ɵɵtext(133, "Parallel Executions");
740
640
  i0.ɵɵelementEnd();
741
- i0.ɵɵelementStart(8, "kendo-panelbar-item", 18);
742
- i0.ɵɵtemplate(9, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_9_Template, 2, 0, "ng-template", 19)(10, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Template, 32, 10, "ng-template", 20);
641
+ i0.ɵɵelementStart(134, "span", 59);
642
+ i0.ɵɵtext(135);
643
+ i0.ɵɵelementEnd()();
644
+ i0.ɵɵelementStart(136, "div", 57)(137, "span", 58);
645
+ i0.ɵɵtext(138, "Max Nesting Depth");
743
646
  i0.ɵɵelementEnd();
744
- i0.ɵɵelementStart(11, "kendo-panelbar-item", 18);
745
- i0.ɵɵtemplate(12, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_12_Template, 2, 0, "ng-template", 19)(13, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_13_Template, 24, 0, "ng-template", 20);
647
+ i0.ɵɵelementStart(139, "span", 59);
648
+ i0.ɵɵtext(140);
649
+ i0.ɵɵelementEnd()();
650
+ i0.ɵɵelementStart(141, "div", 57)(142, "span", 58);
651
+ i0.ɵɵtext(143, "Sub-Agent Runs");
746
652
  i0.ɵɵelementEnd();
747
- i0.ɵɵelementStart(14, "kendo-panelbar-item", 18);
748
- i0.ɵɵtemplate(15, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_15_Template, 2, 0, "ng-template", 19)(16, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_16_Template, 29, 6, "ng-template", 20);
653
+ i0.ɵɵelementStart(144, "span", 59);
654
+ i0.ɵɵtext(145);
749
655
  i0.ɵɵelementEnd()()();
656
+ i0.ɵɵelementStart(146, "div", 60)(147, "h3");
657
+ i0.ɵɵtext(148, "Steps by Type");
658
+ i0.ɵɵelementEnd();
659
+ i0.ɵɵelementStart(149, "div", 61);
660
+ i0.ɵɵrepeaterCreate(150, AIAgentRunAnalyticsComponent_Conditional_3_For_151_Template, 8, 4, "div", 62, i0.ɵɵcomponentInstance().trackByKey, true);
661
+ i0.ɵɵpipe(152, "keyvalue");
662
+ i0.ɵɵelementEnd()()()()();
750
663
  } if (rf & 2) {
664
+ const ctx_r1 = i0.ɵɵnextContext();
665
+ i0.ɵɵadvance();
666
+ i0.ɵɵproperty("Expanded", true);
667
+ i0.ɵɵadvance(10);
668
+ i0.ɵɵtextInterpolate(ctx_r1.promptMetrics.totalCount);
669
+ i0.ɵɵadvance(3);
670
+ i0.ɵɵtextInterpolate1("", ctx_r1.promptMetrics.statusBreakdown.success, " successful");
751
671
  i0.ɵɵadvance();
752
- i0.ɵɵproperty("keepItemContent", true);
672
+ i0.ɵɵconditional(ctx_r1.promptMetrics.statusBreakdown.failed > 0 ? 15 : -1);
673
+ i0.ɵɵadvance(8);
674
+ i0.ɵɵtextInterpolate(ctx_r1.actionMetrics.totalCount);
675
+ i0.ɵɵadvance(3);
676
+ i0.ɵɵtextInterpolate1("", ctx_r1.actionMetrics.statusBreakdown.success, " successful");
753
677
  i0.ɵɵadvance();
754
- i0.ɵɵproperty("expanded", true);
678
+ i0.ɵɵconditional(ctx_r1.actionMetrics.statusBreakdown.failed > 0 ? 27 : -1);
679
+ i0.ɵɵadvance(8);
680
+ i0.ɵɵtextInterpolate(ctx_r1.formatCost(ctx_r1.promptMetrics.costBreakdown.totalCost));
755
681
  i0.ɵɵadvance(3);
756
- i0.ɵɵproperty("expanded", true);
682
+ i0.ɵɵtextInterpolate1("", ctx_r1.promptMetrics.tokenUsage.totalInput + ctx_r1.promptMetrics.tokenUsage.totalOutput, " tokens");
683
+ i0.ɵɵadvance(8);
684
+ i0.ɵɵtextInterpolate(ctx_r1.formatDuration(ctx_r1.promptMetrics.totalExecutionTime + ctx_r1.actionMetrics.totalExecutionTime));
757
685
  i0.ɵɵadvance(3);
758
- i0.ɵɵproperty("expanded", true);
686
+ i0.ɵɵtextInterpolate1("", ctx_r1.timelineMetrics.totalSteps, " total steps");
687
+ i0.ɵɵadvance();
688
+ i0.ɵɵproperty("Expanded", true);
759
689
  i0.ɵɵadvance(3);
760
- i0.ɵɵproperty("expanded", true);
690
+ i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount > 0 ? 53 : -1);
691
+ i0.ɵɵadvance();
692
+ i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount === 0 ? 54 : -1);
693
+ i0.ɵɵadvance();
694
+ i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount > 0 ? 55 : -1);
695
+ i0.ɵɵadvance();
696
+ i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount > 0 ? 56 : -1);
761
697
  i0.ɵɵadvance(3);
762
- i0.ɵɵproperty("expanded", true);
698
+ i0.ɵɵproperty("ngClass", ctx_r1.promptDetailsExpanded ? "fa-chevron-up" : "fa-chevron-down");
699
+ i0.ɵɵadvance(2);
700
+ i0.ɵɵconditional(ctx_r1.promptDetailsExpanded ? 61 : -1);
701
+ i0.ɵɵadvance();
702
+ i0.ɵɵproperty("Expanded", true);
703
+ i0.ɵɵadvance(4);
704
+ i0.ɵɵclassProp("expanded", ctx_r1.expandedCharts["actionSuccess"]);
705
+ i0.ɵɵadvance(6);
706
+ i0.ɵɵproperty("ngClass", ctx_r1.expandedCharts["actionSuccess"] ? "fa-compress" : "fa-expand");
707
+ i0.ɵɵadvance(5);
708
+ i0.ɵɵclassProp("expanded", ctx_r1.expandedCharts["stepType"]);
709
+ i0.ɵɵadvance(6);
710
+ i0.ɵɵproperty("ngClass", ctx_r1.expandedCharts["stepType"] ? "fa-compress" : "fa-expand");
711
+ i0.ɵɵadvance(7);
712
+ i0.ɵɵproperty("ngClass", ctx_r1.actionDetailsExpanded ? "fa-chevron-up" : "fa-chevron-down");
713
+ i0.ɵɵadvance(2);
714
+ i0.ɵɵconditional(ctx_r1.actionDetailsExpanded ? 92 : -1);
715
+ i0.ɵɵadvance(2);
716
+ i0.ɵɵconditional(ctx_r1.actionMetrics.errorAnalysis.size > 0 ? 94 : -1);
717
+ i0.ɵɵadvance();
718
+ i0.ɵɵconditional(ctx_r1.actionMetrics.errorAnalysis.size === 0 ? 95 : -1);
719
+ i0.ɵɵadvance();
720
+ i0.ɵɵproperty("Expanded", true);
721
+ i0.ɵɵadvance(24);
722
+ i0.ɵɵrepeater(ctx_r1.getModelPerformanceData());
723
+ i0.ɵɵadvance(2);
724
+ i0.ɵɵproperty("Expanded", true);
725
+ i0.ɵɵadvance(8);
726
+ i0.ɵɵtextInterpolate(ctx_r1.timelineMetrics.totalSteps);
727
+ i0.ɵɵadvance(5);
728
+ i0.ɵɵtextInterpolate(ctx_r1.timelineMetrics.parallelExecutions);
729
+ i0.ɵɵadvance(5);
730
+ i0.ɵɵtextInterpolate(ctx_r1.timelineMetrics.deepestNesting);
731
+ i0.ɵɵadvance(5);
732
+ i0.ɵɵtextInterpolate(ctx_r1.subAgentRuns.length);
733
+ i0.ɵɵadvance(5);
734
+ i0.ɵɵrepeater(i0.ɵɵpipeBind1(152, 35, ctx_r1.timelineMetrics.stepsByType));
763
735
  } }
764
736
  export class AIAgentRunAnalyticsComponent {
765
737
  /** Helper method to create tracked setTimeout calls */
@@ -2156,11 +2128,11 @@ export class AIAgentRunAnalyticsComponent {
2156
2128
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.promptTokenDistributionChart = _t.first);
2157
2129
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.promptCostDistributionChart = _t.first);
2158
2130
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.promptCountByNameChart = _t.first);
2159
- } }, inputs: { agentRunId: "agentRunId" }, standalone: false, decls: 4, vars: 3, consts: [["modelDistributionChart", ""], ["executionTimeChart", ""], ["costByVendorChart", ""], ["tokenUsageChart", ""], ["promptTimeDistributionChart", ""], ["promptTokenDistributionChart", ""], ["promptCostDistributionChart", ""], ["promptCountByNameChart", ""], ["actionSuccessRateChart", ""], ["stepTypeChart", ""], [1, "analytics-container"], [1, "loading-state"], [1, "error-state"], [1, "analytics-content"], [1, "fas", "fa-spinner", "fa-spin", "fa-2x"], [1, "fas", "fa-exclamation-triangle", "fa-2x"], ["kendoButton", "", 3, "click"], [3, "keepItemContent"], [3, "expanded"], ["kendoPanelBarItemTitle", ""], ["kendoPanelBarContent", ""], [1, "fas", "fa-tachometer-alt"], [1, "summary-cards"], [1, "summary-card"], [1, "card-icon", "prompts"], [1, "fas", "fa-microchip"], [1, "card-content"], [1, "metric-value"], [1, "metric-detail"], [1, "success"], [1, "failed"], [1, "card-icon", "actions"], [1, "fas", "fa-cog"], [1, "card-icon", "cost"], [1, "fas", "fa-dollar-sign"], [1, "card-icon", "time"], [1, "fas", "fa-clock"], [1, "analytics-panel"], [1, "view-mode-toggle"], [1, "no-data-message"], [1, "charts-grid"], [1, "charts-grid", 2, "margin-top", "20px"], [1, "detailed-metrics"], ["kendoButton", "", "fillMode", "flat", 3, "click"], [1, "fas", 3, "ngClass"], [1, "metrics-table"], ["kendoButton", "", "fillMode", "flat", "size", "small", 3, "click"], [1, "fas", "fa-info-circle"], [1, "small"], [1, "chart-card"], [1, "chart-card-header", 3, "click"], [1, "fas", "fa-chart-pie"], [1, "expand-btn"], [1, "chart-card-body"], [1, "chart-container"], ["id", "modelDistributionChart"], [1, "chart-legend"], ["id", "executionTimeChart"], ["id", "costByVendorChart"], [1, "chart-total"], [1, "fas", "fa-coins"], ["id", "tokenUsageChart"], [1, "legend-item"], [1, "legend-color"], [1, "legend-label"], [1, "fas", "fa-hourglass-half"], ["id", "promptTimeDistributionChart"], [1, "fas", "fa-database"], ["id", "promptTokenDistributionChart"], ["id", "promptCostDistributionChart"], [1, "fas", "fa-list-ol"], ["id", "promptCountByNameChart"], [1, "success-rate"], [1, "fas", "fa-chart-bar"], ["id", "actionSuccessRateChart"], [1, "fas", "fa-layer-group"], ["id", "stepTypeChart"], [1, "error-analysis-section"], [1, "error-analysis"], [1, "no-errors"], [1, "fas", "fa-exclamation-triangle"], [1, "error-analysis-description"], [1, "error-list"], [1, "error-item"], [1, "error-count"], [1, "error-message"], [1, "fas", "fa-check-circle"], [1, "fas", "fa-chart-line"], [1, "model-comparison"], [1, "fas", "fa-stream"], [1, "timeline-stats"], [1, "stat-item"], [1, "stat-label"], [1, "stat-value"], [1, "step-breakdown"], [1, "step-type-list"], [1, "step-type-item"], [1, "type-name"], [1, "type-count"], [1, "type-percentage"]], template: function AIAgentRunAnalyticsComponent_Template(rf, ctx) { if (rf & 1) {
2131
+ } }, inputs: { agentRunId: "agentRunId" }, standalone: false, decls: 4, vars: 3, consts: [["actionSuccessRateChart", ""], ["stepTypeChart", ""], ["modelDistributionChart", ""], ["executionTimeChart", ""], ["costByVendorChart", ""], ["tokenUsageChart", ""], ["promptTimeDistributionChart", ""], ["promptTokenDistributionChart", ""], ["promptCostDistributionChart", ""], ["promptCountByNameChart", ""], [1, "analytics-container"], [1, "loading-state"], [1, "error-state"], [1, "analytics-content"], [1, "fas", "fa-spinner", "fa-spin", "fa-2x"], [1, "fas", "fa-exclamation-triangle", "fa-2x"], ["mjButton", "", 3, "click"], [3, "Expanded"], ["mjAccordionTitle", ""], [1, "summary-cards"], [1, "summary-card"], [1, "card-icon", "prompts"], [1, "fas", "fa-microchip"], [1, "card-content"], [1, "metric-value"], [1, "metric-detail"], [1, "success"], [1, "failed"], [1, "card-icon", "actions"], [1, "fas", "fa-cog"], [1, "card-icon", "cost"], [1, "fas", "fa-dollar-sign"], [1, "card-icon", "time"], [1, "fas", "fa-clock"], [1, "analytics-panel"], [1, "view-mode-toggle"], [1, "no-data-message"], [1, "charts-grid"], [1, "charts-grid", 2, "margin-top", "20px"], [1, "detailed-metrics"], ["mjButton", "", "variant", "flat", 3, "click"], [1, "fas", 3, "ngClass"], [1, "metrics-table"], [1, "chart-card"], [1, "chart-card-header", 3, "click"], [1, "fas", "fa-chart-bar"], [1, "expand-btn"], [1, "chart-card-body"], [1, "chart-container"], ["id", "actionSuccessRateChart"], [1, "fas", "fa-layer-group"], ["id", "stepTypeChart"], [1, "error-analysis-section"], [1, "error-analysis"], [1, "no-errors"], [1, "model-comparison"], [1, "timeline-stats"], [1, "stat-item"], [1, "stat-label"], [1, "stat-value"], [1, "step-breakdown"], [1, "step-type-list"], [1, "step-type-item"], [1, "fas", "fa-tachometer-alt"], [1, "fas", "fa-info-circle"], [1, "small"], [1, "fas", "fa-chart-pie"], ["id", "modelDistributionChart"], [1, "chart-legend"], ["id", "executionTimeChart"], ["id", "costByVendorChart"], [1, "chart-total"], [1, "fas", "fa-coins"], ["id", "tokenUsageChart"], [1, "legend-item"], [1, "legend-color"], [1, "legend-label"], [1, "fas", "fa-hourglass-half"], ["id", "promptTimeDistributionChart"], [1, "fas", "fa-database"], ["id", "promptTokenDistributionChart"], ["id", "promptCostDistributionChart"], [1, "fas", "fa-list-ol"], ["id", "promptCountByNameChart"], [1, "success-rate"], [1, "fas", "fa-exclamation-triangle"], [1, "error-analysis-description"], [1, "error-list"], [1, "error-item"], [1, "error-count"], [1, "error-message"], [1, "fas", "fa-check-circle"], [1, "fas", "fa-chart-line"], [1, "fas", "fa-stream"], [1, "type-name"], [1, "type-count"], [1, "type-percentage"]], template: function AIAgentRunAnalyticsComponent_Template(rf, ctx) { if (rf & 1) {
2160
2132
  i0.ɵɵelementStart(0, "div", 10);
2161
2133
  i0.ɵɵconditionalCreate(1, AIAgentRunAnalyticsComponent_Conditional_1_Template, 4, 0, "div", 11);
2162
2134
  i0.ɵɵconditionalCreate(2, AIAgentRunAnalyticsComponent_Conditional_2_Template, 6, 1, "div", 12);
2163
- i0.ɵɵconditionalCreate(3, AIAgentRunAnalyticsComponent_Conditional_3_Template, 17, 6, "div", 13);
2135
+ i0.ɵɵconditionalCreate(3, AIAgentRunAnalyticsComponent_Conditional_3_Template, 153, 37, "div", 13);
2164
2136
  i0.ɵɵelementEnd();
2165
2137
  } if (rf & 2) {
2166
2138
  i0.ɵɵadvance();
@@ -2169,11 +2141,11 @@ export class AIAgentRunAnalyticsComponent {
2169
2141
  i0.ɵɵconditional(ctx.error && !ctx.isLoading ? 2 : -1);
2170
2142
  i0.ɵɵadvance();
2171
2143
  i0.ɵɵconditional(!ctx.isLoading && !ctx.error ? 3 : -1);
2172
- } }, dependencies: [i2.NgClass, i3.PanelBarComponent, i3.PanelBarItemComponent, i3.PanelBarContentDirective, i3.PanelBarItemTitleDirective, i4.ButtonComponent, i2.DecimalPipe, i2.KeyValuePipe], styles: [".analytics-container[_ngcontent-%COMP%] {\n padding: 20px;\n height: 100%;\n overflow-y: auto;\n background-color: var(--mj-bg-surface-sunken);\n}\n\n\n\n.loading-state[_ngcontent-%COMP%], \n.error-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-muted);\n}\n\n.loading-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.error-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-bottom: 15px;\n}\n\n.error-state[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n.summary-cards[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.summary-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 20px;\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n align-items: center;\n transition: transform 0.2s, box-shadow 0.2s;\n}\n\n.summary-card[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n}\n\n.card-icon[_ngcontent-%COMP%] {\n width: 60px;\n height: 60px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 20px;\n font-size: 24px;\n color: var(--mj-text-inverse);\n}\n\n.card-icon.prompts[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\n\n.card-icon.actions[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n}\n\n.card-icon.cost[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n}\n\n.card-icon.time[_ngcontent-%COMP%] {\n background: var(--mj-status-warning);\n}\n\n.card-content[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value[_ngcontent-%COMP%] {\n font-size: 28px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.metric-detail[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.metric-detail[_ngcontent-%COMP%] .success[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n margin-right: 10px;\n}\n\n.metric-detail[_ngcontent-%COMP%] .failed[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n.analytics-panel[_ngcontent-%COMP%] {\n padding: 15px;\n}\n\n\n\n .analytics-content .k-panelbar {\n border: none;\n background: transparent;\n}\n\n .analytics-content .k-panelbar > .k-panelbar-item {\n border: none;\n border-radius: 12px;\n margin-bottom: 12px;\n box-shadow: 0 2px 8px rgba(0,0,0,0.06);\n background: var(--mj-bg-surface-card);\n overflow: hidden;\n}\n\n .analytics-content .k-panelbar > .k-panelbar-item > .k-header {\n background: var(--mj-bg-surface-card);\n border: none;\n padding: 16px 20px;\n border-radius: 12px 12px 0 0;\n color: var(--mj-text-primary);\n font-weight: 600;\n font-size: 16px;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n .analytics-content .k-panelbar > .k-panelbar-item > .k-header:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n .analytics-content .k-panelbar > .k-panelbar-item.k-panelbar-expanded > .k-header {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 12px 12px 0 0;\n}\n\n .analytics-content .k-panelbar > .k-panelbar-item > .k-header .k-panelbar-toggle {\n position: absolute;\n right: 24px;\n color: inherit;\n font-size: 14px;\n transition: transform 0.2s ease;\n}\n\n .analytics-content .k-panelbar > .k-panelbar-item.k-panelbar-expanded > .k-header .k-panelbar-toggle {\n transform: rotate(180deg);\n}\n\n .analytics-content .k-panelbar > .k-panelbar-item > .k-header .k-panelbar-toggle::before {\n content: '\\f107';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n}\n\n .analytics-content .k-panelbar > .k-panelbar-item > .k-content {\n padding: 0;\n border: none;\n background: var(--mj-bg-surface-sunken);\n border-radius: 0 0 12px 12px;\n}\n\n .analytics-content .k-panelbar .k-header .k-panelbar-icon {\n font-size: 18px;\n color: var(--mj-brand-primary);\n margin-right: 8px;\n}\n\n .analytics-content .k-panelbar .k-panelbar-expanded .k-header .k-panelbar-icon {\n color: var(--mj-text-inverse);\n}\n\n\n\n.charts-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));\n gap: 20px;\n margin-bottom: 20px;\n}\n\n\n\n.chart-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n transition: all 0.3s ease;\n}\n\n.chart-card.expanded[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.chart-card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background-color: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n}\n\n.chart-card-header[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.chart-card-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.chart-card-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n color: var(--mj-text-muted);\n}\n\n.expand-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n padding: 4px 8px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: color 0.2s;\n}\n\n.expand-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n}\n\n.chart-card-body[_ngcontent-%COMP%] {\n padding: 16px;\n background: var(--mj-bg-surface-card);\n}\n\n.chart-card.expanded[_ngcontent-%COMP%] .chart-card-body[_ngcontent-%COMP%] {\n padding: 24px;\n}\n\n.chart-card.expanded[_ngcontent-%COMP%] .chart-container[_ngcontent-%COMP%] > div[_ngcontent-%COMP%] {\n min-height: 400px;\n}\n\n\n\n.view-mode-toggle[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n margin-bottom: 16px;\n}\n\n.view-mode-toggle[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.chart-container[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.chart-container[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 10px 0;\n font-size: 15px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.chart-container[_ngcontent-%COMP%] > div[_ngcontent-%COMP%] {\n min-height: 220px;\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n\n\n.chart-container[_ngcontent-%COMP%] svg[_ngcontent-%COMP%] {\n display: block;\n margin: 0 auto;\n}\n\n.chart-legend[_ngcontent-%COMP%] {\n margin-top: 10px;\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n font-size: 12px;\n}\n\n.legend-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n}\n\n.legend-color[_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n border-radius: 3px;\n}\n\n.chart-total[_ngcontent-%COMP%] {\n text-align: center;\n margin-top: 10px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n\n\n.detailed-metrics[_ngcontent-%COMP%] {\n margin-top: 20px;\n border-top: 1px solid var(--mj-border-default);\n padding-top: 20px;\n}\n\n.detailed-metrics[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n margin-bottom: 15px;\n}\n\n.detailed-metrics[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 8px;\n}\n\n.metrics-table[_ngcontent-%COMP%] {\n overflow-x: auto;\n}\n\n.metrics-table[_ngcontent-%COMP%] table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.metrics-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface-sunken);\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 2px solid var(--mj-border-strong);\n}\n\n.metrics-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.metrics-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.success-rate[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.success-rate.high[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.success-rate.medium[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n.success-rate.low[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n.error-analysis[_ngcontent-%COMP%] {\n margin-top: 30px;\n padding: 20px;\n background-color: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n}\n\n.error-analysis[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 15px 0;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.error-analysis-description[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin-bottom: 20px;\n line-height: 1.5;\n}\n\n.error-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.error-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 10px;\n background-color: var(--mj-bg-surface);\n border-radius: 4px;\n font-size: 14px;\n}\n\n.error-count[_ngcontent-%COMP%] {\n background-color: var(--mj-status-error);\n color: var(--mj-text-inverse);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n}\n\n.error-message[_ngcontent-%COMP%] {\n flex: 1;\n color: var(--mj-text-secondary);\n}\n\n\n\n.no-errors[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px;\n background-color: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 30%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.no-errors[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-status-success);\n}\n\n.no-errors[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n}\n\n\n\n.no-data-message[_ngcontent-%COMP%] {\n text-align: center;\n padding: 60px 20px;\n color: var(--mj-text-muted);\n}\n\n.no-data-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n margin-bottom: 20px;\n color: var(--mj-border-strong);\n}\n\n.no-data-message[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 10px 0;\n font-size: 16px;\n}\n\n.no-data-message[_ngcontent-%COMP%] p.small[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-disabled);\n}\n\n\n\n.model-comparison[_ngcontent-%COMP%] {\n overflow-x: auto;\n}\n\n.model-comparison[_ngcontent-%COMP%] table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.model-comparison[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface-sunken);\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 2px solid var(--mj-border-strong);\n white-space: nowrap;\n}\n\n.model-comparison[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.model-comparison[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n\n\n.timeline-stats[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.stat-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n}\n\n.stat-label[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n}\n\n.stat-value[_ngcontent-%COMP%] {\n font-size: 32px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.step-breakdown[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 15px 0;\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.step-type-list[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));\n gap: 12px;\n}\n\n.step-type-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n}\n\n.step-type-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 30px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.type-name[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n}\n\n.type-count[_ngcontent-%COMP%] {\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.type-percentage[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-left: 5px;\n}\n\n\n\n@media (max-width: 768px) {\n .summary-cards[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n \n .charts-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n \n .timeline-stats[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}"], changeDetection: 0 }); }
2144
+ } }, dependencies: [i2.NgClass, i3.MJButtonDirective, i3.MJAccordionPanelComponent, i3.MJAccordionTitleDirective, i2.DecimalPipe, i2.KeyValuePipe], styles: [".analytics-container[_ngcontent-%COMP%] {\n padding: 20px;\n height: 100%;\n overflow-y: auto;\n background-color: var(--mj-bg-surface-sunken);\n}\n\n\n\n.loading-state[_ngcontent-%COMP%], \n.error-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-muted);\n}\n\n.loading-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.error-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-bottom: 15px;\n}\n\n.error-state[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n.summary-cards[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.summary-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 20px;\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n align-items: center;\n transition: transform 0.2s, box-shadow 0.2s;\n}\n\n.summary-card[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n}\n\n.card-icon[_ngcontent-%COMP%] {\n width: 60px;\n height: 60px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 20px;\n font-size: 24px;\n color: var(--mj-text-inverse);\n}\n\n.card-icon.prompts[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\n\n.card-icon.actions[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n}\n\n.card-icon.cost[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n}\n\n.card-icon.time[_ngcontent-%COMP%] {\n background: var(--mj-status-warning);\n}\n\n.card-content[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value[_ngcontent-%COMP%] {\n font-size: 28px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.metric-detail[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.metric-detail[_ngcontent-%COMP%] .success[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n margin-right: 10px;\n}\n\n.metric-detail[_ngcontent-%COMP%] .failed[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n.analytics-panel[_ngcontent-%COMP%] {\n padding: 15px;\n}\n\n\n\n.analytics-content[_ngcontent-%COMP%] mj-accordion-panel[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 12px;\n}\n\n\n\n.charts-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));\n gap: 20px;\n margin-bottom: 20px;\n}\n\n\n\n.chart-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n transition: all 0.3s ease;\n}\n\n.chart-card.expanded[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.chart-card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background-color: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n}\n\n.chart-card-header[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.chart-card-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.chart-card-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n color: var(--mj-text-muted);\n}\n\n.expand-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n padding: 4px 8px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: color 0.2s;\n}\n\n.expand-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n}\n\n.chart-card-body[_ngcontent-%COMP%] {\n padding: 16px;\n background: var(--mj-bg-surface-card);\n}\n\n.chart-card.expanded[_ngcontent-%COMP%] .chart-card-body[_ngcontent-%COMP%] {\n padding: 24px;\n}\n\n.chart-card.expanded[_ngcontent-%COMP%] .chart-container[_ngcontent-%COMP%] > div[_ngcontent-%COMP%] {\n min-height: 400px;\n}\n\n\n\n.view-mode-toggle[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n margin-bottom: 16px;\n}\n\n.view-mode-toggle[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.chart-container[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.chart-container[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 10px 0;\n font-size: 15px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.chart-container[_ngcontent-%COMP%] > div[_ngcontent-%COMP%] {\n min-height: 220px;\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n\n\n.chart-container[_ngcontent-%COMP%] svg[_ngcontent-%COMP%] {\n display: block;\n margin: 0 auto;\n}\n\n.chart-legend[_ngcontent-%COMP%] {\n margin-top: 10px;\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n font-size: 12px;\n}\n\n.legend-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n}\n\n.legend-color[_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n border-radius: 3px;\n}\n\n.chart-total[_ngcontent-%COMP%] {\n text-align: center;\n margin-top: 10px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n\n\n.detailed-metrics[_ngcontent-%COMP%] {\n margin-top: 20px;\n border-top: 1px solid var(--mj-border-default);\n padding-top: 20px;\n}\n\n.detailed-metrics[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n margin-bottom: 15px;\n}\n\n.detailed-metrics[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 8px;\n}\n\n.metrics-table[_ngcontent-%COMP%] {\n overflow-x: auto;\n}\n\n.metrics-table[_ngcontent-%COMP%] table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.metrics-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface-sunken);\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 2px solid var(--mj-border-strong);\n}\n\n.metrics-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.metrics-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.success-rate[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.success-rate.high[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.success-rate.medium[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n.success-rate.low[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n.error-analysis[_ngcontent-%COMP%] {\n margin-top: 30px;\n padding: 20px;\n background-color: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n}\n\n.error-analysis[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 15px 0;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.error-analysis-description[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin-bottom: 20px;\n line-height: 1.5;\n}\n\n.error-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.error-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 10px;\n background-color: var(--mj-bg-surface);\n border-radius: 4px;\n font-size: 14px;\n}\n\n.error-count[_ngcontent-%COMP%] {\n background-color: var(--mj-status-error);\n color: var(--mj-text-inverse);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n}\n\n.error-message[_ngcontent-%COMP%] {\n flex: 1;\n color: var(--mj-text-secondary);\n}\n\n\n\n.no-errors[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px;\n background-color: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 30%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.no-errors[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-status-success);\n}\n\n.no-errors[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n}\n\n\n\n.no-data-message[_ngcontent-%COMP%] {\n text-align: center;\n padding: 60px 20px;\n color: var(--mj-text-muted);\n}\n\n.no-data-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n margin-bottom: 20px;\n color: var(--mj-border-strong);\n}\n\n.no-data-message[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 10px 0;\n font-size: 16px;\n}\n\n.no-data-message[_ngcontent-%COMP%] p.small[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-disabled);\n}\n\n\n\n.model-comparison[_ngcontent-%COMP%] {\n overflow-x: auto;\n}\n\n.model-comparison[_ngcontent-%COMP%] table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.model-comparison[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface-sunken);\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 2px solid var(--mj-border-strong);\n white-space: nowrap;\n}\n\n.model-comparison[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.model-comparison[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n\n\n.timeline-stats[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.stat-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n}\n\n.stat-label[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n}\n\n.stat-value[_ngcontent-%COMP%] {\n font-size: 32px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.step-breakdown[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 15px 0;\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.step-type-list[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));\n gap: 12px;\n}\n\n.step-type-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n}\n\n.step-type-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 30px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.type-name[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n}\n\n.type-count[_ngcontent-%COMP%] {\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.type-percentage[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-left: 5px;\n}\n\n\n\n@media (max-width: 768px) {\n .summary-cards[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n \n .charts-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n \n .timeline-stats[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}"], changeDetection: 0 }); }
2173
2145
  }
2174
2146
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AIAgentRunAnalyticsComponent, [{
2175
2147
  type: Component,
2176
- args: [{ standalone: false, selector: 'mj-ai-agent-run-analytics', changeDetection: ChangeDetectionStrategy.OnPush, template: "<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 kendoButton (click)=\"loadData()\">Retry</button>\n </div>\n }\n\n <!-- Analytics Content -->\n @if (!isLoading && !error) {\n <div class=\"analytics-content\">\n <kendo-panelbar [keepItemContent]=\"true\">\n <!-- Summary Cards -->\n <kendo-panelbar-item [expanded]=\"true\">\n <ng-template kendoPanelBarItemTitle>\n <i class=\"fas fa-tachometer-alt\"></i> Overview\n </ng-template>\n <ng-template kendoPanelBarContent>\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\">\n <span>{{ promptMetrics.tokenUsage.totalInput + promptMetrics.tokenUsage.totalOutput }} tokens</span>\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 </ng-template>\n </kendo-panelbar-item>\n <!-- Prompt Analytics -->\n <kendo-panelbar-item [expanded]=\"true\">\n <ng-template kendoPanelBarItemTitle>\n <i class=\"fas fa-microchip\"></i> Prompt Analytics\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"analytics-panel\">\n <!-- View Mode Toggle -->\n @if (promptMetrics.totalCount > 0) {\n <div class=\"view-mode-toggle\">\n <button kendoButton\n fillMode=\"flat\"\n size=\"small\"\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 kendoButton\n fillMode=\"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 </ng-template>\n </kendo-panelbar-item>\n <!-- Action Analytics -->\n <kendo-panelbar-item [expanded]=\"true\">\n <ng-template kendoPanelBarItemTitle>\n <i class=\"fas fa-cog\"></i> Action Analytics\n </ng-template>\n <ng-template kendoPanelBarContent>\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 kendoButton\n fillMode=\"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 </ng-template>\n </kendo-panelbar-item>\n <!-- Model Performance Comparison -->\n <kendo-panelbar-item [expanded]=\"true\">\n <ng-template kendoPanelBarItemTitle>\n <i class=\"fas fa-chart-line\"></i> Model Performance Comparison\n </ng-template>\n <ng-template kendoPanelBarContent>\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 </ng-template>\n </kendo-panelbar-item>\n <!-- Timeline Analysis -->\n <kendo-panelbar-item [expanded]=\"true\">\n <ng-template kendoPanelBarItemTitle>\n <i class=\"fas fa-stream\"></i> Execution Timeline Analysis\n </ng-template>\n <ng-template kendoPanelBarContent>\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 </ng-template>\n </kendo-panelbar-item>\n </kendo-panelbar>\n </div>\n }\n</div>", styles: [".analytics-container {\n padding: 20px;\n height: 100%;\n overflow-y: auto;\n background-color: var(--mj-bg-surface-sunken);\n}\n\n/* Loading and Error States */\n.loading-state,\n.error-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-muted);\n}\n\n.loading-state i,\n.error-state i {\n margin-bottom: 15px;\n}\n\n.error-state {\n color: var(--mj-status-error);\n}\n\n/* Summary Cards */\n.summary-cards {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.summary-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 20px;\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n align-items: center;\n transition: transform 0.2s, box-shadow 0.2s;\n}\n\n.summary-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n}\n\n.card-icon {\n width: 60px;\n height: 60px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 20px;\n font-size: 24px;\n color: var(--mj-text-inverse);\n}\n\n.card-icon.prompts {\n background: var(--mj-brand-primary);\n}\n\n.card-icon.actions {\n background: var(--mj-status-error);\n}\n\n.card-icon.cost {\n background: var(--mj-status-success);\n}\n\n.card-icon.time {\n background: var(--mj-status-warning);\n}\n\n.card-content h3 {\n margin: 0 0 8px 0;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value {\n font-size: 28px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.metric-detail {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.metric-detail .success {\n color: var(--mj-status-success);\n margin-right: 10px;\n}\n\n.metric-detail .failed {\n color: var(--mj-status-error);\n}\n\n/* Analytics Panels */\n.analytics-panel {\n padding: 15px;\n}\n\n/* Kendo PanelBar Styling - Copied from AI Agent Form */\n::ng-deep .analytics-content .k-panelbar {\n border: none;\n background: transparent;\n}\n\n::ng-deep .analytics-content .k-panelbar > .k-panelbar-item {\n border: none;\n border-radius: 12px;\n margin-bottom: 12px;\n box-shadow: 0 2px 8px rgba(0,0,0,0.06);\n background: var(--mj-bg-surface-card);\n overflow: hidden;\n}\n\n::ng-deep .analytics-content .k-panelbar > .k-panelbar-item > .k-header {\n background: var(--mj-bg-surface-card);\n border: none;\n padding: 16px 20px;\n border-radius: 12px 12px 0 0;\n color: var(--mj-text-primary);\n font-weight: 600;\n font-size: 16px;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n::ng-deep .analytics-content .k-panelbar > .k-panelbar-item > .k-header:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n::ng-deep .analytics-content .k-panelbar > .k-panelbar-item.k-panelbar-expanded > .k-header {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 12px 12px 0 0;\n}\n\n::ng-deep .analytics-content .k-panelbar > .k-panelbar-item > .k-header .k-panelbar-toggle {\n position: absolute;\n right: 24px;\n color: inherit;\n font-size: 14px;\n transition: transform 0.2s ease;\n}\n\n::ng-deep .analytics-content .k-panelbar > .k-panelbar-item.k-panelbar-expanded > .k-header .k-panelbar-toggle {\n transform: rotate(180deg);\n}\n\n::ng-deep .analytics-content .k-panelbar > .k-panelbar-item > .k-header .k-panelbar-toggle::before {\n content: '\\f107';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n}\n\n::ng-deep .analytics-content .k-panelbar > .k-panelbar-item > .k-content {\n padding: 0;\n border: none;\n background: var(--mj-bg-surface-sunken);\n border-radius: 0 0 12px 12px;\n}\n\n::ng-deep .analytics-content .k-panelbar .k-header .k-panelbar-icon {\n font-size: 18px;\n color: var(--mj-brand-primary);\n margin-right: 8px;\n}\n\n::ng-deep .analytics-content .k-panelbar .k-panelbar-expanded .k-header .k-panelbar-icon {\n color: var(--mj-text-inverse);\n}\n\n/* Charts */\n.charts-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));\n gap: 20px;\n margin-bottom: 20px;\n}\n\n/* Chart Cards */\n.chart-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n transition: all 0.3s ease;\n}\n\n.chart-card.expanded {\n grid-column: 1 / -1;\n}\n\n.chart-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background-color: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n}\n\n.chart-card-header:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.chart-card-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.chart-card-header h3 i {\n font-size: 16px;\n color: var(--mj-text-muted);\n}\n\n.expand-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: color 0.2s;\n}\n\n.expand-btn:hover {\n color: var(--mj-text-secondary);\n}\n\n.chart-card-body {\n padding: 16px;\n background: var(--mj-bg-surface-card);\n}\n\n.chart-card.expanded .chart-card-body {\n padding: 24px;\n}\n\n.chart-card.expanded .chart-container > div {\n min-height: 400px;\n}\n\n/* View Mode Toggle */\n.view-mode-toggle {\n display: flex;\n justify-content: flex-end;\n margin-bottom: 16px;\n}\n\n.view-mode-toggle button {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.chart-container {\n position: relative;\n}\n\n.chart-container h3 {\n margin: 0 0 10px 0;\n font-size: 15px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.chart-container > div {\n min-height: 220px;\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n/* Ensure SVG charts are centered */\n.chart-container svg {\n display: block;\n margin: 0 auto;\n}\n\n.chart-legend {\n margin-top: 10px;\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n font-size: 12px;\n}\n\n.legend-item {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n}\n\n.legend-color {\n width: 16px;\n height: 16px;\n border-radius: 3px;\n}\n\n.chart-total {\n text-align: center;\n margin-top: 10px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n/* Detailed Metrics */\n.detailed-metrics {\n margin-top: 20px;\n border-top: 1px solid var(--mj-border-default);\n padding-top: 20px;\n}\n\n.detailed-metrics button {\n margin-bottom: 15px;\n}\n\n.detailed-metrics button i {\n margin-right: 8px;\n}\n\n.metrics-table {\n overflow-x: auto;\n}\n\n.metrics-table table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.metrics-table th {\n background-color: var(--mj-bg-surface-sunken);\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 2px solid var(--mj-border-strong);\n}\n\n.metrics-table td {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.metrics-table tr:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.success-rate {\n font-weight: 500;\n}\n\n.success-rate.high {\n color: var(--mj-status-success);\n}\n\n.success-rate.medium {\n color: var(--mj-status-warning);\n}\n\n.success-rate.low {\n color: var(--mj-status-error);\n}\n\n/* Error Analysis */\n.error-analysis {\n margin-top: 30px;\n padding: 20px;\n background-color: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n}\n\n.error-analysis h3 {\n margin: 0 0 15px 0;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.error-analysis-description {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin-bottom: 20px;\n line-height: 1.5;\n}\n\n.error-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.error-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 10px;\n background-color: var(--mj-bg-surface);\n border-radius: 4px;\n font-size: 14px;\n}\n\n.error-count {\n background-color: var(--mj-status-error);\n color: var(--mj-text-inverse);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n}\n\n.error-message {\n flex: 1;\n color: var(--mj-text-secondary);\n}\n\n/* No errors state */\n.no-errors {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px;\n background-color: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 30%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.no-errors i {\n font-size: 24px;\n color: var(--mj-status-success);\n}\n\n.no-errors p {\n margin: 0;\n font-size: 14px;\n}\n\n/* No data message */\n.no-data-message {\n text-align: center;\n padding: 60px 20px;\n color: var(--mj-text-muted);\n}\n\n.no-data-message i {\n font-size: 48px;\n margin-bottom: 20px;\n color: var(--mj-border-strong);\n}\n\n.no-data-message p {\n margin: 0 0 10px 0;\n font-size: 16px;\n}\n\n.no-data-message p.small {\n font-size: 14px;\n color: var(--mj-text-disabled);\n}\n\n/* Model Comparison Table */\n.model-comparison {\n overflow-x: auto;\n}\n\n.model-comparison table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.model-comparison th {\n background-color: var(--mj-bg-surface-sunken);\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 2px solid var(--mj-border-strong);\n white-space: nowrap;\n}\n\n.model-comparison td {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.model-comparison tr:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n/* Timeline Analysis */\n.timeline-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.stat-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n}\n\n.stat-label {\n font-size: 14px;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n}\n\n.stat-value {\n font-size: 32px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.step-breakdown h3 {\n margin: 0 0 15px 0;\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.step-type-list {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));\n gap: 12px;\n}\n\n.step-type-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n}\n\n.step-type-item i {\n width: 30px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.type-name {\n flex: 1;\n font-weight: 500;\n}\n\n.type-count {\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.type-percentage {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-left: 5px;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .summary-cards {\n grid-template-columns: 1fr;\n }\n \n .charts-grid {\n grid-template-columns: 1fr;\n }\n \n .timeline-stats {\n grid-template-columns: repeat(2, 1fr);\n }\n}"] }]
2148
+ args: [{ standalone: false, selector: 'mj-ai-agent-run-analytics', changeDetection: ChangeDetectionStrategy.OnPush, template: "<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\">\n <span>{{ promptMetrics.tokenUsage.totalInput + promptMetrics.tokenUsage.totalOutput }} tokens</span>\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>", styles: [".analytics-container {\n padding: 20px;\n height: 100%;\n overflow-y: auto;\n background-color: var(--mj-bg-surface-sunken);\n}\n\n/* Loading and Error States */\n.loading-state,\n.error-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-muted);\n}\n\n.loading-state i,\n.error-state i {\n margin-bottom: 15px;\n}\n\n.error-state {\n color: var(--mj-status-error);\n}\n\n/* Summary Cards */\n.summary-cards {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.summary-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 20px;\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n align-items: center;\n transition: transform 0.2s, box-shadow 0.2s;\n}\n\n.summary-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n}\n\n.card-icon {\n width: 60px;\n height: 60px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 20px;\n font-size: 24px;\n color: var(--mj-text-inverse);\n}\n\n.card-icon.prompts {\n background: var(--mj-brand-primary);\n}\n\n.card-icon.actions {\n background: var(--mj-status-error);\n}\n\n.card-icon.cost {\n background: var(--mj-status-success);\n}\n\n.card-icon.time {\n background: var(--mj-status-warning);\n}\n\n.card-content h3 {\n margin: 0 0 8px 0;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value {\n font-size: 28px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.metric-detail {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.metric-detail .success {\n color: var(--mj-status-success);\n margin-right: 10px;\n}\n\n.metric-detail .failed {\n color: var(--mj-status-error);\n}\n\n/* Analytics Panels */\n.analytics-panel {\n padding: 15px;\n}\n\n/* Accordion Panel Styling */\n.analytics-content mj-accordion-panel {\n display: block;\n margin-bottom: 12px;\n}\n\n/* Charts */\n.charts-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));\n gap: 20px;\n margin-bottom: 20px;\n}\n\n/* Chart Cards */\n.chart-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n transition: all 0.3s ease;\n}\n\n.chart-card.expanded {\n grid-column: 1 / -1;\n}\n\n.chart-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background-color: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n}\n\n.chart-card-header:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.chart-card-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.chart-card-header h3 i {\n font-size: 16px;\n color: var(--mj-text-muted);\n}\n\n.expand-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: color 0.2s;\n}\n\n.expand-btn:hover {\n color: var(--mj-text-secondary);\n}\n\n.chart-card-body {\n padding: 16px;\n background: var(--mj-bg-surface-card);\n}\n\n.chart-card.expanded .chart-card-body {\n padding: 24px;\n}\n\n.chart-card.expanded .chart-container > div {\n min-height: 400px;\n}\n\n/* View Mode Toggle */\n.view-mode-toggle {\n display: flex;\n justify-content: flex-end;\n margin-bottom: 16px;\n}\n\n.view-mode-toggle button {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.chart-container {\n position: relative;\n}\n\n.chart-container h3 {\n margin: 0 0 10px 0;\n font-size: 15px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.chart-container > div {\n min-height: 220px;\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n/* Ensure SVG charts are centered */\n.chart-container svg {\n display: block;\n margin: 0 auto;\n}\n\n.chart-legend {\n margin-top: 10px;\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n font-size: 12px;\n}\n\n.legend-item {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n}\n\n.legend-color {\n width: 16px;\n height: 16px;\n border-radius: 3px;\n}\n\n.chart-total {\n text-align: center;\n margin-top: 10px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n/* Detailed Metrics */\n.detailed-metrics {\n margin-top: 20px;\n border-top: 1px solid var(--mj-border-default);\n padding-top: 20px;\n}\n\n.detailed-metrics button {\n margin-bottom: 15px;\n}\n\n.detailed-metrics button i {\n margin-right: 8px;\n}\n\n.metrics-table {\n overflow-x: auto;\n}\n\n.metrics-table table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.metrics-table th {\n background-color: var(--mj-bg-surface-sunken);\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 2px solid var(--mj-border-strong);\n}\n\n.metrics-table td {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.metrics-table tr:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.success-rate {\n font-weight: 500;\n}\n\n.success-rate.high {\n color: var(--mj-status-success);\n}\n\n.success-rate.medium {\n color: var(--mj-status-warning);\n}\n\n.success-rate.low {\n color: var(--mj-status-error);\n}\n\n/* Error Analysis */\n.error-analysis {\n margin-top: 30px;\n padding: 20px;\n background-color: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n}\n\n.error-analysis h3 {\n margin: 0 0 15px 0;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.error-analysis-description {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin-bottom: 20px;\n line-height: 1.5;\n}\n\n.error-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.error-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 10px;\n background-color: var(--mj-bg-surface);\n border-radius: 4px;\n font-size: 14px;\n}\n\n.error-count {\n background-color: var(--mj-status-error);\n color: var(--mj-text-inverse);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n}\n\n.error-message {\n flex: 1;\n color: var(--mj-text-secondary);\n}\n\n/* No errors state */\n.no-errors {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px;\n background-color: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 30%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.no-errors i {\n font-size: 24px;\n color: var(--mj-status-success);\n}\n\n.no-errors p {\n margin: 0;\n font-size: 14px;\n}\n\n/* No data message */\n.no-data-message {\n text-align: center;\n padding: 60px 20px;\n color: var(--mj-text-muted);\n}\n\n.no-data-message i {\n font-size: 48px;\n margin-bottom: 20px;\n color: var(--mj-border-strong);\n}\n\n.no-data-message p {\n margin: 0 0 10px 0;\n font-size: 16px;\n}\n\n.no-data-message p.small {\n font-size: 14px;\n color: var(--mj-text-disabled);\n}\n\n/* Model Comparison Table */\n.model-comparison {\n overflow-x: auto;\n}\n\n.model-comparison table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.model-comparison th {\n background-color: var(--mj-bg-surface-sunken);\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 2px solid var(--mj-border-strong);\n white-space: nowrap;\n}\n\n.model-comparison td {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.model-comparison tr:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n/* Timeline Analysis */\n.timeline-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.stat-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n}\n\n.stat-label {\n font-size: 14px;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n}\n\n.stat-value {\n font-size: 32px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.step-breakdown h3 {\n margin: 0 0 15px 0;\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.step-type-list {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));\n gap: 12px;\n}\n\n.step-type-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n}\n\n.step-type-item i {\n width: 30px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.type-name {\n flex: 1;\n font-weight: 500;\n}\n\n.type-count {\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.type-percentage {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-left: 5px;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .summary-cards {\n grid-template-columns: 1fr;\n }\n \n .charts-grid {\n grid-template-columns: 1fr;\n }\n \n .timeline-stats {\n grid-template-columns: repeat(2, 1fr);\n }\n}"] }]
2177
2149
  }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.AIAgentRunCostService }], { agentRunId: [{
2178
2150
  type: Input
2179
2151
  }], modelDistributionChart: [{