@memberjunction/ng-dashboards 5.34.1 → 5.35.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 (346) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +51 -0
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +399 -292
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +8 -2
  6. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
  7. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +87 -85
  8. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
  9. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +75 -0
  10. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  11. package/dist/AI/components/analytics/ai-analytics-resource.component.js +400 -89
  12. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  13. package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +5 -0
  14. package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -1
  15. package/dist/AI/components/analytics/analytics-filter-bar.component.js +184 -135
  16. package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -1
  17. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +8 -2
  18. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
  19. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +104 -103
  20. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
  21. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +8 -2
  22. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
  23. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +76 -74
  24. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
  25. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
  26. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +67 -87
  27. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
  28. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +12 -19
  29. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
  30. package/dist/AI/components/analytics/model-performance/model-performance.component.js +96 -203
  31. package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
  32. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  33. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +110 -126
  34. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  35. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
  36. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +61 -77
  37. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
  38. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +990 -992
  39. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  40. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +6 -3
  41. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  42. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +493 -490
  43. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  44. package/dist/AI/components/models/model-management.component.d.ts +17 -0
  45. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  46. package/dist/AI/components/models/model-management.component.js +370 -425
  47. package/dist/AI/components/models/model-management.component.js.map +1 -1
  48. package/dist/AI/components/prompts/prompt-management.component.d.ts +17 -0
  49. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  50. package/dist/AI/components/prompts/prompt-management.component.js +317 -357
  51. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  52. package/dist/AI/components/requests/agent-requests-resource.component.d.ts +11 -0
  53. package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
  54. package/dist/AI/components/requests/agent-requests-resource.component.js +170 -175
  55. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  56. package/dist/AI/components/system/system-configuration.component.d.ts +19 -0
  57. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  58. package/dist/AI/components/system/system-configuration.component.js +403 -362
  59. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  60. package/dist/AI/components/tags/tags-resource.component.js +781 -783
  61. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  62. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +8 -3
  63. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  64. package/dist/AI/components/vectors/vector-management-resource.component.js +547 -521
  65. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  66. package/dist/Actions/components/actions-overview.component.d.ts +6 -0
  67. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  68. package/dist/Actions/components/actions-overview.component.js +79 -30
  69. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  70. package/dist/Actions/components/execution-monitoring.component.d.ts +9 -3
  71. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
  72. package/dist/Actions/components/execution-monitoring.component.js +196 -142
  73. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  74. package/dist/Actions/components/explorer/action-explorer.component.d.ts +41 -1
  75. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  76. package/dist/Actions/components/explorer/action-explorer.component.js +388 -94
  77. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  78. package/dist/Actions/components/explorer/index.d.ts +0 -1
  79. package/dist/Actions/components/explorer/index.d.ts.map +1 -1
  80. package/dist/Actions/components/explorer/index.js +0 -1
  81. package/dist/Actions/components/explorer/index.js.map +1 -1
  82. package/dist/Admin/admin-data-schema.component.js +32 -40
  83. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  84. package/dist/Admin/admin-dev-tools-resource.component.js +32 -40
  85. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  86. package/dist/Admin/admin-identity-access.component.js +32 -40
  87. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  88. package/dist/Admin/admin-monitoring.component.js +32 -40
  89. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  90. package/dist/ApplicationRoles/application-roles-resource.component.js +76 -82
  91. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  92. package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -1
  93. package/dist/Archiving/components/archive-config-resource.component.js +24 -5
  94. package/dist/Archiving/components/archive-config-resource.component.js.map +1 -1
  95. package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -1
  96. package/dist/Archiving/components/archive-runs-resource.component.js +24 -5
  97. package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -1
  98. package/dist/Communication/communication-logs-resource.component.d.ts +1 -1
  99. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  100. package/dist/Communication/communication-logs-resource.component.js +80 -99
  101. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  102. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  103. package/dist/Communication/communication-monitor-resource.component.js +127 -106
  104. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  105. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  106. package/dist/Communication/communication-providers-resource.component.js +44 -45
  107. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  108. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  109. package/dist/Communication/communication-runs-resource.component.js +60 -58
  110. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  111. package/dist/Communication/communication-templates-resource.component.d.ts +1 -1
  112. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  113. package/dist/Communication/communication-templates-resource.component.js +139 -162
  114. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  115. package/dist/Credentials/components/credentials-audit-resource.component.d.ts +7 -0
  116. package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
  117. package/dist/Credentials/components/credentials-audit-resource.component.js +310 -297
  118. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  119. package/dist/Credentials/components/credentials-categories-resource.component.js +245 -266
  120. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  121. package/dist/Credentials/components/credentials-list-resource.component.d.ts +7 -0
  122. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  123. package/dist/Credentials/components/credentials-list-resource.component.js +381 -399
  124. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  125. package/dist/Credentials/components/credentials-overview-resource.component.js +222 -228
  126. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  127. package/dist/Credentials/components/credentials-types-resource.component.d.ts +6 -0
  128. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  129. package/dist/Credentials/components/credentials-types-resource.component.js +294 -305
  130. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  131. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +8 -0
  132. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -1
  133. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +21 -0
  134. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
  135. package/dist/DatabaseDesigner/components/entity-list.component.js +147 -160
  136. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  137. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
  138. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  139. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +19 -1
  140. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  141. package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -16
  142. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  143. package/dist/Home/home-dashboard.component.d.ts +6 -0
  144. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  145. package/dist/Home/home-dashboard.component.js +521 -485
  146. package/dist/Home/home-dashboard.component.js.map +1 -1
  147. package/dist/Integration/components/activity/activity.component.d.ts +8 -0
  148. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  149. package/dist/Integration/components/activity/activity.component.js +309 -318
  150. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  151. package/dist/Integration/components/connections/connections.component.js +866 -847
  152. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  153. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +234 -233
  154. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  155. package/dist/Integration/components/overview/overview.component.js +182 -163
  156. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  157. package/dist/Integration/components/pipelines/pipelines.component.d.ts +2 -0
  158. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
  159. package/dist/Integration/components/pipelines/pipelines.component.js +610 -606
  160. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  161. package/dist/Integration/components/schedules/schedules.component.js +241 -241
  162. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  163. package/dist/Integration/integration.module.d.ts +1 -1
  164. package/dist/Integration/integration.module.d.ts.map +1 -1
  165. package/dist/Integration/integration.module.js +28 -1
  166. package/dist/Integration/integration.module.js.map +1 -1
  167. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +673 -674
  168. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  169. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +54 -51
  170. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  171. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +745 -703
  172. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  173. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +12 -1
  174. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
  175. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +191 -120
  176. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  177. package/dist/Lists/components/lists-browse-resource.component.d.ts +18 -1
  178. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  179. package/dist/Lists/components/lists-browse-resource.component.js +486 -532
  180. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  181. package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
  182. package/dist/Lists/components/lists-categories-resource.component.js +152 -160
  183. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  184. package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
  185. package/dist/Lists/components/lists-my-lists-resource.component.js +302 -319
  186. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  187. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  188. package/dist/Lists/components/lists-operations-resource.component.js +234 -246
  189. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  190. package/dist/MCP/mcp-dashboard.component.d.ts +20 -0
  191. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  192. package/dist/MCP/mcp-dashboard.component.js +1248 -1338
  193. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  194. package/dist/MCP/mcp.module.d.ts +1 -1
  195. package/dist/MCP/mcp.module.d.ts.map +1 -1
  196. package/dist/MCP/mcp.module.js +34 -1
  197. package/dist/MCP/mcp.module.js.map +1 -1
  198. package/dist/Permissions/audit-log-resource.component.js +76 -85
  199. package/dist/Permissions/audit-log-resource.component.js.map +1 -1
  200. package/dist/Permissions/resource-access-resource.component.js +64 -69
  201. package/dist/Permissions/resource-access-resource.component.js.map +1 -1
  202. package/dist/Permissions/user-access-resource.component.js +63 -74
  203. package/dist/Permissions/user-access-resource.component.js.map +1 -1
  204. package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
  205. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  206. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +2 -1
  207. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
  208. package/dist/Scheduling/components/scheduling-activity-resource.component.js +11 -12
  209. package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
  210. package/dist/Scheduling/components/scheduling-activity.component.d.ts +9 -1
  211. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
  212. package/dist/Scheduling/components/scheduling-activity.component.js +250 -197
  213. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  214. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +2 -1
  215. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
  216. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +11 -12
  217. package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
  218. package/dist/Scheduling/components/scheduling-jobs.component.d.ts +9 -1
  219. package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
  220. package/dist/Scheduling/components/scheduling-jobs.component.js +203 -147
  221. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  222. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +2 -1
  223. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
  224. package/dist/Scheduling/components/scheduling-overview-resource.component.js +11 -12
  225. package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
  226. package/dist/Scheduling/components/scheduling-overview.component.d.ts +3 -1
  227. package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
  228. package/dist/Scheduling/components/scheduling-overview.component.js +224 -190
  229. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  230. package/dist/Scheduling/scheduling-dashboard.component.d.ts +19 -6
  231. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  232. package/dist/Scheduling/scheduling-dashboard.component.js +262 -104
  233. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  234. package/dist/SystemDiagnostics/system-diagnostics.component.js +773 -783
  235. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  236. package/dist/Testing/components/testing-analytics-resource.component.d.ts +2 -1
  237. package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
  238. package/dist/Testing/components/testing-analytics-resource.component.js +7 -14
  239. package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
  240. package/dist/Testing/components/testing-analytics.component.d.ts +3 -1
  241. package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
  242. package/dist/Testing/components/testing-analytics.component.js +420 -393
  243. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  244. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
  245. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
  246. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +16 -19
  247. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
  248. package/dist/Testing/components/testing-dashboard-tab.component.d.ts +3 -1
  249. package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
  250. package/dist/Testing/components/testing-dashboard-tab.component.js +157 -122
  251. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  252. package/dist/Testing/components/testing-explorer-resource.component.d.ts +2 -1
  253. package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
  254. package/dist/Testing/components/testing-explorer-resource.component.js +7 -12
  255. package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
  256. package/dist/Testing/components/testing-explorer.component.d.ts +8 -1
  257. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  258. package/dist/Testing/components/testing-explorer.component.js +587 -608
  259. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  260. package/dist/Testing/components/testing-review-resource.component.d.ts +4 -1
  261. package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
  262. package/dist/Testing/components/testing-review-resource.component.js +9 -12
  263. package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
  264. package/dist/Testing/components/testing-review.component.d.ts +3 -1
  265. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  266. package/dist/Testing/components/testing-review.component.js +310 -274
  267. package/dist/Testing/components/testing-review.component.js.map +1 -1
  268. package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
  269. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
  270. package/dist/Testing/components/testing-runs-resource.component.js +16 -19
  271. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
  272. package/dist/Testing/components/testing-runs.component.d.ts +3 -1
  273. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
  274. package/dist/Testing/components/testing-runs.component.js +307 -273
  275. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  276. package/dist/Testing/testing-dashboard.component.d.ts +2 -0
  277. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  278. package/dist/Testing/testing-dashboard.component.js +107 -93
  279. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  280. package/dist/VersionHistory/components/diff-resource.component.js +185 -188
  281. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  282. package/dist/VersionHistory/components/graph-resource.component.js +154 -184
  283. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  284. package/dist/VersionHistory/components/labels-resource.component.d.ts +7 -0
  285. package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
  286. package/dist/VersionHistory/components/labels-resource.component.js +350 -354
  287. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  288. package/dist/VersionHistory/components/restore-resource.component.js +163 -169
  289. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  290. package/dist/actions-dashboards.module.d.ts +15 -16
  291. package/dist/actions-dashboards.module.d.ts.map +1 -1
  292. package/dist/actions-dashboards.module.js +34 -11
  293. package/dist/actions-dashboards.module.js.map +1 -1
  294. package/dist/ai-dashboards.module.d.ts +45 -48
  295. package/dist/ai-dashboards.module.d.ts.map +1 -1
  296. package/dist/ai-dashboards.module.js +36 -10
  297. package/dist/ai-dashboards.module.js.map +1 -1
  298. package/dist/archiving-dashboards.module.d.ts +2 -1
  299. package/dist/archiving-dashboards.module.d.ts.map +1 -1
  300. package/dist/archiving-dashboards.module.js +12 -2
  301. package/dist/archiving-dashboards.module.js.map +1 -1
  302. package/dist/communication-dashboards.module.d.ts +2 -1
  303. package/dist/communication-dashboards.module.d.ts.map +1 -1
  304. package/dist/communication-dashboards.module.js +24 -3
  305. package/dist/communication-dashboards.module.js.map +1 -1
  306. package/dist/core-dashboards.module.d.ts +1 -1
  307. package/dist/core-dashboards.module.d.ts.map +1 -1
  308. package/dist/core-dashboards.module.js +31 -1
  309. package/dist/core-dashboards.module.js.map +1 -1
  310. package/dist/credentials-dashboards.module.d.ts +1 -1
  311. package/dist/credentials-dashboards.module.d.ts.map +1 -1
  312. package/dist/credentials-dashboards.module.js +28 -1
  313. package/dist/credentials-dashboards.module.js.map +1 -1
  314. package/dist/lists-dashboards.module.d.ts +1 -1
  315. package/dist/lists-dashboards.module.d.ts.map +1 -1
  316. package/dist/lists-dashboards.module.js +28 -1
  317. package/dist/lists-dashboards.module.js.map +1 -1
  318. package/dist/public-api.d.ts +2 -2
  319. package/dist/public-api.d.ts.map +1 -1
  320. package/dist/public-api.js +3 -3
  321. package/dist/public-api.js.map +1 -1
  322. package/dist/scheduling-dashboards.module.d.ts +1 -1
  323. package/dist/scheduling-dashboards.module.d.ts.map +1 -1
  324. package/dist/scheduling-dashboards.module.js +31 -1
  325. package/dist/scheduling-dashboards.module.js.map +1 -1
  326. package/dist/testing-dashboards.module.d.ts +8 -7
  327. package/dist/testing-dashboards.module.d.ts.map +1 -1
  328. package/dist/testing-dashboards.module.js +30 -0
  329. package/dist/testing-dashboards.module.js.map +1 -1
  330. package/package.json +52 -52
  331. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +0 -56
  332. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +0 -1
  333. package/dist/AI/components/agents/agent-filter-panel.component.js +0 -285
  334. package/dist/AI/components/agents/agent-filter-panel.component.js.map +0 -1
  335. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +0 -49
  336. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +0 -1
  337. package/dist/AI/components/prompts/prompt-filter-panel.component.js +0 -184
  338. package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +0 -1
  339. package/dist/AI/components/system/system-config-filter-panel.component.d.ts +0 -33
  340. package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +0 -1
  341. package/dist/AI/components/system/system-config-filter-panel.component.js +0 -144
  342. package/dist/AI/components/system/system-config-filter-panel.component.js.map +0 -1
  343. package/dist/Actions/components/explorer/action-toolbar.component.d.ts +0 -63
  344. package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +0 -1
  345. package/dist/Actions/components/explorer/action-toolbar.component.js +0 -463
  346. package/dist/Actions/components/explorer/action-toolbar.component.js.map +0 -1
@@ -12,38 +12,37 @@ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
12
12
  import { UUIDsEqual } from '@memberjunction/global';
13
13
  import * as i0 from "@angular/core";
14
14
  import * as i1 from "@memberjunction/ng-shared-generic";
15
- import * as i2 from "../analytics-filter-bar.component";
16
- import * as i3 from "@angular/common";
15
+ import * as i2 from "@angular/common";
17
16
  const _forTrack0 = ($index, $item) => $item.AgentID;
18
17
  const _forTrack1 = ($index, $item) => $item.field;
19
18
  const _forTrack2 = ($index, $item) => $item.ID;
20
19
  const _forTrack3 = ($index, $item) => $item.Label;
21
- function AnalyticsAgentRunsComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
22
- i0.ɵɵelementStart(0, "div", 1);
23
- i0.ɵɵelement(1, "mj-loading", 2);
20
+ function AnalyticsAgentRunsComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
21
+ i0.ɵɵelementStart(0, "div", 0);
22
+ i0.ɵɵelement(1, "mj-loading", 1);
24
23
  i0.ɵɵelementEnd();
25
24
  } }
26
- function AnalyticsAgentRunsComponent_Conditional_2_Conditional_41_Template(rf, ctx) { if (rf & 1) {
27
- i0.ɵɵelementStart(0, "div", 14);
25
+ function AnalyticsAgentRunsComponent_Conditional_1_Conditional_41_Template(rf, ctx) { if (rf & 1) {
26
+ i0.ɵɵelementStart(0, "div", 13);
28
27
  i0.ɵɵtext(1, "No agent cost data for selected period");
29
28
  i0.ɵɵelementEnd();
30
29
  } }
31
- function AnalyticsAgentRunsComponent_Conditional_2_For_43_For_5_Template(rf, ctx) { if (rf & 1) {
32
- i0.ɵɵelement(0, "div", 26);
30
+ function AnalyticsAgentRunsComponent_Conditional_1_For_43_For_5_Template(rf, ctx) { if (rf & 1) {
31
+ i0.ɵɵelement(0, "div", 25);
33
32
  } if (rf & 2) {
34
33
  const seg_r1 = ctx.$implicit;
35
34
  const ctx_r1 = i0.ɵɵnextContext(3);
36
35
  i0.ɵɵstyleProp("width", seg_r1.Percent, "%")("background", seg_r1.Color);
37
36
  i0.ɵɵproperty("title", seg_r1.Label + ": " + ctx_r1.FormatCurrency(seg_r1.Value, 4));
38
37
  } }
39
- function AnalyticsAgentRunsComponent_Conditional_2_For_43_Template(rf, ctx) { if (rf & 1) {
40
- i0.ɵɵelementStart(0, "div", 15)(1, "div", 22);
38
+ function AnalyticsAgentRunsComponent_Conditional_1_For_43_Template(rf, ctx) { if (rf & 1) {
39
+ i0.ɵɵelementStart(0, "div", 14)(1, "div", 21);
41
40
  i0.ɵɵtext(2);
42
41
  i0.ɵɵelementEnd();
43
- i0.ɵɵelementStart(3, "div", 23);
44
- i0.ɵɵrepeaterCreate(4, AnalyticsAgentRunsComponent_Conditional_2_For_43_For_5_Template, 1, 5, "div", 24, _forTrack3);
42
+ i0.ɵɵelementStart(3, "div", 22);
43
+ i0.ɵɵrepeaterCreate(4, AnalyticsAgentRunsComponent_Conditional_1_For_43_For_5_Template, 1, 5, "div", 23, _forTrack3);
45
44
  i0.ɵɵelementEnd();
46
- i0.ɵɵelementStart(6, "div", 25);
45
+ i0.ɵɵelementStart(6, "div", 24);
47
46
  i0.ɵɵtext(7);
48
47
  i0.ɵɵelementEnd()();
49
48
  } if (rf & 2) {
@@ -58,9 +57,9 @@ function AnalyticsAgentRunsComponent_Conditional_2_For_43_Template(rf, ctx) { if
58
57
  i0.ɵɵadvance(3);
59
58
  i0.ɵɵtextInterpolate(ctx_r1.FormatCurrency(row_r3.TotalCost));
60
59
  } }
61
- function AnalyticsAgentRunsComponent_Conditional_2_Conditional_44_For_2_Template(rf, ctx) { if (rf & 1) {
62
- i0.ɵɵelementStart(0, "div", 27);
63
- i0.ɵɵelement(1, "span", 28);
60
+ function AnalyticsAgentRunsComponent_Conditional_1_Conditional_44_For_2_Template(rf, ctx) { if (rf & 1) {
61
+ i0.ɵɵelementStart(0, "div", 26);
62
+ i0.ɵɵelement(1, "span", 27);
64
63
  i0.ɵɵtext(2);
65
64
  i0.ɵɵelementEnd();
66
65
  } if (rf & 2) {
@@ -70,27 +69,27 @@ function AnalyticsAgentRunsComponent_Conditional_2_Conditional_44_For_2_Template
70
69
  i0.ɵɵadvance();
71
70
  i0.ɵɵtextInterpolate1(" ", item_r4.Label, " ");
72
71
  } }
73
- function AnalyticsAgentRunsComponent_Conditional_2_Conditional_44_Template(rf, ctx) { if (rf & 1) {
74
- i0.ɵɵelementStart(0, "div", 16);
75
- i0.ɵɵrepeaterCreate(1, AnalyticsAgentRunsComponent_Conditional_2_Conditional_44_For_2_Template, 3, 3, "div", 27, _forTrack3);
72
+ function AnalyticsAgentRunsComponent_Conditional_1_Conditional_44_Template(rf, ctx) { if (rf & 1) {
73
+ i0.ɵɵelementStart(0, "div", 15);
74
+ i0.ɵɵrepeaterCreate(1, AnalyticsAgentRunsComponent_Conditional_1_Conditional_44_For_2_Template, 3, 3, "div", 26, _forTrack3);
76
75
  i0.ɵɵelementEnd();
77
76
  } if (rf & 2) {
78
77
  const ctx_r1 = i0.ɵɵnextContext(2);
79
78
  i0.ɵɵadvance();
80
79
  i0.ɵɵrepeater(ctx_r1.LegendItems);
81
80
  } }
82
- function AnalyticsAgentRunsComponent_Conditional_2_For_57_Conditional_2_Template(rf, ctx) { if (rf & 1) {
81
+ function AnalyticsAgentRunsComponent_Conditional_1_For_57_Conditional_2_Template(rf, ctx) { if (rf & 1) {
83
82
  i0.ɵɵelement(0, "i");
84
83
  } if (rf & 2) {
85
84
  const ctx_r1 = i0.ɵɵnextContext(3);
86
85
  i0.ɵɵclassMap(ctx_r1.SortDir === "asc" ? "fa-solid fa-caret-up" : "fa-solid fa-caret-down");
87
86
  } }
88
- function AnalyticsAgentRunsComponent_Conditional_2_For_57_Template(rf, ctx) { if (rf & 1) {
87
+ function AnalyticsAgentRunsComponent_Conditional_1_For_57_Template(rf, ctx) { if (rf & 1) {
89
88
  const _r5 = i0.ɵɵgetCurrentView();
90
- i0.ɵɵelementStart(0, "th", 29);
91
- i0.ɵɵlistener("click", function AnalyticsAgentRunsComponent_Conditional_2_For_57_Template_th_click_0_listener() { const col_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSort(col_r6.field)); });
89
+ i0.ɵɵelementStart(0, "th", 28);
90
+ i0.ɵɵlistener("click", function AnalyticsAgentRunsComponent_Conditional_1_For_57_Template_th_click_0_listener() { const col_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSort(col_r6.field)); });
92
91
  i0.ɵɵtext(1);
93
- i0.ɵɵconditionalCreate(2, AnalyticsAgentRunsComponent_Conditional_2_For_57_Conditional_2_Template, 1, 2, "i", 30);
92
+ i0.ɵɵconditionalCreate(2, AnalyticsAgentRunsComponent_Conditional_1_For_57_Conditional_2_Template, 1, 2, "i", 29);
94
93
  i0.ɵɵelementEnd();
95
94
  } if (rf & 2) {
96
95
  const col_r6 = ctx.$implicit;
@@ -101,8 +100,8 @@ function AnalyticsAgentRunsComponent_Conditional_2_For_57_Template(rf, ctx) { if
101
100
  i0.ɵɵadvance();
102
101
  i0.ɵɵconditional(ctx_r1.SortField === col_r6.field ? 2 : -1);
103
102
  } }
104
- function AnalyticsAgentRunsComponent_Conditional_2_Conditional_59_Template(rf, ctx) { if (rf & 1) {
105
- i0.ɵɵelementStart(0, "tr")(1, "td", 31);
103
+ function AnalyticsAgentRunsComponent_Conditional_1_Conditional_59_Template(rf, ctx) { if (rf & 1) {
104
+ i0.ɵɵelementStart(0, "tr")(1, "td", 30);
106
105
  i0.ɵɵtext(2, "No runs found");
107
106
  i0.ɵɵelementEnd()();
108
107
  } if (rf & 2) {
@@ -110,23 +109,23 @@ function AnalyticsAgentRunsComponent_Conditional_2_Conditional_59_Template(rf, c
110
109
  i0.ɵɵadvance();
111
110
  i0.ɵɵattribute("colspan", ctx_r1.TableColumns.length);
112
111
  } }
113
- function AnalyticsAgentRunsComponent_Conditional_2_For_61_Template(rf, ctx) { if (rf & 1) {
114
- i0.ɵɵelementStart(0, "tr")(1, "td", 32);
112
+ function AnalyticsAgentRunsComponent_Conditional_1_For_61_Template(rf, ctx) { if (rf & 1) {
113
+ i0.ɵɵelementStart(0, "tr")(1, "td", 31);
115
114
  i0.ɵɵtext(2);
116
115
  i0.ɵɵelementEnd();
117
- i0.ɵɵelementStart(3, "td")(4, "span", 33);
116
+ i0.ɵɵelementStart(3, "td")(4, "span", 32);
118
117
  i0.ɵɵtext(5);
119
118
  i0.ɵɵelementEnd()();
120
- i0.ɵɵelementStart(6, "td", 34);
119
+ i0.ɵɵelementStart(6, "td", 33);
121
120
  i0.ɵɵtext(7);
122
121
  i0.ɵɵelementEnd();
123
- i0.ɵɵelementStart(8, "td", 34);
122
+ i0.ɵɵelementStart(8, "td", 33);
124
123
  i0.ɵɵtext(9);
125
124
  i0.ɵɵelementEnd();
126
- i0.ɵɵelementStart(10, "td", 34);
125
+ i0.ɵɵelementStart(10, "td", 33);
127
126
  i0.ɵɵtext(11);
128
127
  i0.ɵɵelementEnd();
129
- i0.ɵɵelementStart(12, "td", 35);
128
+ i0.ɵɵelementStart(12, "td", 34);
130
129
  i0.ɵɵtext(13);
131
130
  i0.ɵɵelementEnd()();
132
131
  } if (rf & 2) {
@@ -146,69 +145,69 @@ function AnalyticsAgentRunsComponent_Conditional_2_For_61_Template(rf, ctx) { if
146
145
  i0.ɵɵadvance(2);
147
146
  i0.ɵɵtextInterpolate(run_r7.Time);
148
147
  } }
149
- function AnalyticsAgentRunsComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
150
- i0.ɵɵelementStart(0, "div", 3)(1, "div", 4)(2, "div", 5);
148
+ function AnalyticsAgentRunsComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
149
+ i0.ɵɵelementStart(0, "div", 2)(1, "div", 3)(2, "div", 4);
151
150
  i0.ɵɵtext(3, "Total Runs");
152
151
  i0.ɵɵelementEnd();
153
- i0.ɵɵelementStart(4, "div", 6);
152
+ i0.ɵɵelementStart(4, "div", 5);
154
153
  i0.ɵɵtext(5);
155
154
  i0.ɵɵpipe(6, "number");
156
155
  i0.ɵɵelementEnd()();
157
- i0.ɵɵelementStart(7, "div", 4)(8, "div", 5);
156
+ i0.ɵɵelementStart(7, "div", 3)(8, "div", 4);
158
157
  i0.ɵɵtext(9, "Total Cost");
159
158
  i0.ɵɵelementEnd();
160
- i0.ɵɵelementStart(10, "div", 6);
159
+ i0.ɵɵelementStart(10, "div", 5);
161
160
  i0.ɵɵtext(11);
162
161
  i0.ɵɵelementEnd()();
163
- i0.ɵɵelementStart(12, "div", 7)(13, "div", 5);
162
+ i0.ɵɵelementStart(12, "div", 6)(13, "div", 4);
164
163
  i0.ɵɵtext(14, "Prompt Runs");
165
164
  i0.ɵɵelementEnd();
166
- i0.ɵɵelementStart(15, "div", 6);
165
+ i0.ɵɵelementStart(15, "div", 5);
167
166
  i0.ɵɵtext(16);
168
167
  i0.ɵɵpipe(17, "number");
169
168
  i0.ɵɵelementEnd()();
170
- i0.ɵɵelementStart(18, "div", 7)(19, "div", 5);
169
+ i0.ɵɵelementStart(18, "div", 6)(19, "div", 4);
171
170
  i0.ɵɵtext(20, "Avg Cost/Run");
172
171
  i0.ɵɵelementEnd();
173
- i0.ɵɵelementStart(21, "div", 6);
172
+ i0.ɵɵelementStart(21, "div", 5);
174
173
  i0.ɵɵtext(22);
175
174
  i0.ɵɵelementEnd()();
176
- i0.ɵɵelementStart(23, "div", 8)(24, "div", 5);
175
+ i0.ɵɵelementStart(23, "div", 7)(24, "div", 4);
177
176
  i0.ɵɵtext(25, "Success Rate");
178
177
  i0.ɵɵelementEnd();
179
- i0.ɵɵelementStart(26, "div", 6);
178
+ i0.ɵɵelementStart(26, "div", 5);
180
179
  i0.ɵɵtext(27);
181
180
  i0.ɵɵpipe(28, "number");
182
181
  i0.ɵɵelementEnd()();
183
- i0.ɵɵelementStart(29, "div", 7)(30, "div", 5);
182
+ i0.ɵɵelementStart(29, "div", 6)(30, "div", 4);
184
183
  i0.ɵɵtext(31, "Avg Duration");
185
184
  i0.ɵɵelementEnd();
186
- i0.ɵɵelementStart(32, "div", 6);
185
+ i0.ɵɵelementStart(32, "div", 5);
187
186
  i0.ɵɵtext(33);
188
187
  i0.ɵɵpipe(34, "number");
189
188
  i0.ɵɵelementEnd()()();
190
- i0.ɵɵelementStart(35, "div", 9)(36, "div", 10)(37, "div", 11);
191
- i0.ɵɵelement(38, "i", 12);
189
+ i0.ɵɵelementStart(35, "div", 8)(36, "div", 9)(37, "div", 10);
190
+ i0.ɵɵelement(38, "i", 11);
192
191
  i0.ɵɵtext(39, " Cost Attribution by Agent ");
193
192
  i0.ɵɵelementEnd()();
194
- i0.ɵɵelementStart(40, "div", 13);
195
- i0.ɵɵconditionalCreate(41, AnalyticsAgentRunsComponent_Conditional_2_Conditional_41_Template, 2, 0, "div", 14);
196
- i0.ɵɵrepeaterCreate(42, AnalyticsAgentRunsComponent_Conditional_2_For_43_Template, 8, 3, "div", 15, _forTrack0);
197
- i0.ɵɵconditionalCreate(44, AnalyticsAgentRunsComponent_Conditional_2_Conditional_44_Template, 3, 0, "div", 16);
193
+ i0.ɵɵelementStart(40, "div", 12);
194
+ i0.ɵɵconditionalCreate(41, AnalyticsAgentRunsComponent_Conditional_1_Conditional_41_Template, 2, 0, "div", 13);
195
+ i0.ɵɵrepeaterCreate(42, AnalyticsAgentRunsComponent_Conditional_1_For_43_Template, 8, 3, "div", 14, _forTrack0);
196
+ i0.ɵɵconditionalCreate(44, AnalyticsAgentRunsComponent_Conditional_1_Conditional_44_Template, 3, 0, "div", 15);
198
197
  i0.ɵɵelementEnd()();
199
- i0.ɵɵelementStart(45, "div", 9)(46, "div", 10)(47, "div", 11);
200
- i0.ɵɵelement(48, "i", 17);
198
+ i0.ɵɵelementStart(45, "div", 8)(46, "div", 9)(47, "div", 10);
199
+ i0.ɵɵelement(48, "i", 16);
201
200
  i0.ɵɵtext(49, " Recent Agent Runs ");
202
201
  i0.ɵɵelementEnd();
203
- i0.ɵɵelementStart(50, "span", 18);
202
+ i0.ɵɵelementStart(50, "span", 17);
204
203
  i0.ɵɵtext(51);
205
204
  i0.ɵɵelementEnd()();
206
- i0.ɵɵelementStart(52, "div", 19)(53, "table", 20)(54, "thead")(55, "tr");
207
- i0.ɵɵrepeaterCreate(56, AnalyticsAgentRunsComponent_Conditional_2_For_57_Template, 3, 4, "th", 21, _forTrack1);
205
+ i0.ɵɵelementStart(52, "div", 18)(53, "table", 19)(54, "thead")(55, "tr");
206
+ i0.ɵɵrepeaterCreate(56, AnalyticsAgentRunsComponent_Conditional_1_For_57_Template, 3, 4, "th", 20, _forTrack1);
208
207
  i0.ɵɵelementEnd()();
209
208
  i0.ɵɵelementStart(58, "tbody");
210
- i0.ɵɵconditionalCreate(59, AnalyticsAgentRunsComponent_Conditional_2_Conditional_59_Template, 3, 1, "tr");
211
- i0.ɵɵrepeaterCreate(60, AnalyticsAgentRunsComponent_Conditional_2_For_61_Template, 14, 8, "tr", null, _forTrack2);
209
+ i0.ɵɵconditionalCreate(59, AnalyticsAgentRunsComponent_Conditional_1_Conditional_59_Template, 3, 1, "tr");
210
+ i0.ɵɵrepeaterCreate(60, AnalyticsAgentRunsComponent_Conditional_1_For_61_Template, 14, 8, "tr", null, _forTrack2);
212
211
  i0.ɵɵelementEnd()()()();
213
212
  } if (rf & 2) {
214
213
  const ctx_r1 = i0.ɵɵnextContext();
@@ -253,10 +252,30 @@ const COST_COLORS = [
253
252
  'var(--mj-text-disabled)'
254
253
  ];
255
254
  export class AnalyticsAgentRunsComponent extends BaseAngularComponent {
256
- TimeRange = '7d';
257
- Filters = { Agents: [], Statuses: [] };
255
+ _timeRange = '7d';
256
+ set TimeRange(value) {
257
+ const prev = this._timeRange;
258
+ this._timeRange = value;
259
+ if (prev !== value && this.initialized)
260
+ this.LoadData();
261
+ }
262
+ get TimeRange() { return this._timeRange; }
263
+ _filters = { Agents: [], Statuses: [] };
264
+ set Filters(value) {
265
+ const next = value ?? { Agents: [], Statuses: [] };
266
+ const changed = !this.shallowFiltersEqual(this._filters, next);
267
+ this._filters = next;
268
+ if (changed && this.initialized)
269
+ this.LoadData();
270
+ }
271
+ get Filters() { return this._filters; }
272
+ shallowFiltersEqual(a, b) {
273
+ const sameArr = (x, y) => x.length === y.length && x.every((v, i) => v === y[i]);
274
+ return sameArr(a.Agents, b.Agents) && sameArr(a.Statuses, b.Statuses);
275
+ }
258
276
  TimeRangeChange = new EventEmitter();
259
277
  FiltersChange = new EventEmitter();
278
+ initialized = false;
260
279
  cdr = inject(ChangeDetectorRef);
261
280
  destroy$ = new Subject();
262
281
  IsLoading = false;
@@ -293,6 +312,7 @@ export class AnalyticsAgentRunsComponent extends BaseAngularComponent {
293
312
  agentRuns = [];
294
313
  promptRuns = [];
295
314
  ngOnInit() {
315
+ this.initialized = true;
296
316
  this.LoadData();
297
317
  }
298
318
  ngOnDestroy() {
@@ -549,33 +569,15 @@ export class AnalyticsAgentRunsComponent extends BaseAngularComponent {
549
569
  return diffDay + 'd ago';
550
570
  }
551
571
  static ɵfac = /*@__PURE__*/ (() => { let ɵAnalyticsAgentRunsComponent_BaseFactory; return function AnalyticsAgentRunsComponent_Factory(__ngFactoryType__) { return (ɵAnalyticsAgentRunsComponent_BaseFactory || (ɵAnalyticsAgentRunsComponent_BaseFactory = i0.ɵɵgetInheritedFactory(AnalyticsAgentRunsComponent)))(__ngFactoryType__ || AnalyticsAgentRunsComponent); }; })();
552
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AnalyticsAgentRunsComponent, selectors: [["app-analytics-agent-runs"]], inputs: { TimeRange: "TimeRange", Filters: "Filters" }, outputs: { TimeRangeChange: "TimeRangeChange", FiltersChange: "FiltersChange" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 9, consts: [[3, "TimeRangeChange", "FiltersChange", "TimeRange", "Filters", "ShowModelFilter", "ShowPromptFilter", "ShowAgentFilter", "ShowStatusFilter", "ShowCompareToggle", "ShowExportButton"], [1, "loading-container"], ["text", "Loading agent runs..."], [1, "stats-grid"], [1, "stat-card", "accent-brand"], [1, "stat-label"], [1, "stat-value"], [1, "stat-card"], [1, "stat-card", "accent-success"], [1, "panel"], [1, "panel-header"], [1, "panel-header__title"], [1, "fa-solid", "fa-chart-bar", "panel-header__icon"], [1, "panel-body"], [1, "panel-empty"], [1, "attribution-row"], [1, "legend-row"], [1, "fa-solid", "fa-list", "panel-header__icon"], [1, "panel-header__subtitle"], [1, "table-wrapper"], [1, "data-table"], [1, "sortable-header", 3, "sorted"], [1, "attribution-name", 3, "title"], [1, "attribution-bar-container"], [1, "attribution-segment", 3, "width", "background", "title"], [1, "attribution-total"], [1, "attribution-segment", 3, "title"], [1, "legend-item"], [1, "legend-swatch"], [1, "sortable-header", 3, "click"], [3, "class"], [1, "empty-row"], [1, "cell-agent"], [1, "status-pill"], [1, "cell-numeric"], [1, "cell-time"]], template: function AnalyticsAgentRunsComponent_Template(rf, ctx) { if (rf & 1) {
553
- i0.ɵɵelementStart(0, "app-analytics-filter-bar", 0);
554
- i0.ɵɵlistener("TimeRangeChange", function AnalyticsAgentRunsComponent_Template_app_analytics_filter_bar_TimeRangeChange_0_listener($event) { return ctx.OnTimeRangeChange($event); })("FiltersChange", function AnalyticsAgentRunsComponent_Template_app_analytics_filter_bar_FiltersChange_0_listener($event) { return ctx.OnFiltersChange($event); });
555
- i0.ɵɵelementEnd();
556
- i0.ɵɵconditionalCreate(1, AnalyticsAgentRunsComponent_Conditional_1_Template, 2, 0, "div", 1)(2, AnalyticsAgentRunsComponent_Conditional_2_Template, 62, 20);
572
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AnalyticsAgentRunsComponent, selectors: [["app-analytics-agent-runs"]], inputs: { TimeRange: "TimeRange", Filters: "Filters" }, outputs: { TimeRangeChange: "TimeRangeChange", FiltersChange: "FiltersChange" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, "loading-container"], ["text", "Loading agent runs..."], [1, "stats-grid"], [1, "stat-card", "accent-brand"], [1, "stat-label"], [1, "stat-value"], [1, "stat-card"], [1, "stat-card", "accent-success"], [1, "panel"], [1, "panel-header"], [1, "panel-header__title"], [1, "fa-solid", "fa-chart-bar", "panel-header__icon"], [1, "panel-body"], [1, "panel-empty"], [1, "attribution-row"], [1, "legend-row"], [1, "fa-solid", "fa-list", "panel-header__icon"], [1, "panel-header__subtitle"], [1, "table-wrapper"], [1, "data-table"], [1, "sortable-header", 3, "sorted"], [1, "attribution-name", 3, "title"], [1, "attribution-bar-container"], [1, "attribution-segment", 3, "width", "background", "title"], [1, "attribution-total"], [1, "attribution-segment", 3, "title"], [1, "legend-item"], [1, "legend-swatch"], [1, "sortable-header", 3, "click"], [3, "class"], [1, "empty-row"], [1, "cell-agent"], [1, "status-pill"], [1, "cell-numeric"], [1, "cell-time"]], template: function AnalyticsAgentRunsComponent_Template(rf, ctx) { if (rf & 1) {
573
+ i0.ɵɵconditionalCreate(0, AnalyticsAgentRunsComponent_Conditional_0_Template, 2, 0, "div", 0)(1, AnalyticsAgentRunsComponent_Conditional_1_Template, 62, 20);
557
574
  } if (rf & 2) {
558
- i0.ɵɵproperty("TimeRange", ctx.TimeRange)("Filters", ctx.globalFilters)("ShowModelFilter", false)("ShowPromptFilter", false)("ShowAgentFilter", true)("ShowStatusFilter", true)("ShowCompareToggle", false)("ShowExportButton", false);
559
- i0.ɵɵadvance();
560
- i0.ɵɵconditional(ctx.IsLoading ? 1 : 2);
561
- } }, dependencies: [i1.LoadingComponent, i2.AnalyticsFilterBarComponent, i3.DecimalPipe], styles: ["[_nghost-%COMP%] { display: block; }\n\n .loading-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n }\n\n \n\n .stats-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 12px;\n margin: 16px 0;\n }\n\n .stat-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 14px 16px;\n text-align: center;\n border-top: 3px solid var(--mj-border-subtle);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n\n .stat-card[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n }\n\n .stat-card.accent-brand[_ngcontent-%COMP%] { border-top-color: var(--mj-brand-primary); }\n .stat-card.accent-success[_ngcontent-%COMP%] { border-top-color: var(--mj-status-success); }\n .stat-card.accent-warning[_ngcontent-%COMP%] { border-top-color: var(--mj-status-warning); }\n\n .stat-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 4px;\n }\n\n .stat-value[_ngcontent-%COMP%] {\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n letter-spacing: -0.02em;\n }\n\n \n\n .panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n margin-bottom: 16px;\n overflow: hidden;\n }\n\n .panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 18px;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .panel-header__title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .panel-header__icon[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-brand-primary);\n }\n\n .panel-header__subtitle[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .panel-body[_ngcontent-%COMP%] {\n padding: 16px 18px;\n }\n\n .panel-empty[_ngcontent-%COMP%] {\n text-align: center;\n padding: 24px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n }\n\n \n\n .attribution-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .attribution-row[_ngcontent-%COMP%]:last-of-type {\n border-bottom: none;\n }\n\n .attribution-name[_ngcontent-%COMP%] {\n width: 140px;\n min-width: 140px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .attribution-bar-container[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n height: 24px;\n border-radius: 6px;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n }\n\n .attribution-segment[_ngcontent-%COMP%] {\n height: 100%;\n min-width: 2px;\n transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .attribution-total[_ngcontent-%COMP%] {\n width: 80px;\n min-width: 80px;\n text-align: right;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n }\n\n .legend-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n padding: 12px 0 4px;\n flex-wrap: wrap;\n }\n\n .legend-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .legend-swatch[_ngcontent-%COMP%] {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n flex-shrink: 0;\n }\n\n \n\n .table-wrapper[_ngcontent-%COMP%] {\n overflow-x: auto;\n }\n\n .data-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n }\n\n .data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n .data-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n }\n\n .sortable-header[_ngcontent-%COMP%] {\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n transition: color 0.15s;\n }\n\n .sortable-header[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n }\n\n .sortable-header.sorted[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n\n .sortable-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-left: 4px;\n font-size: 10px;\n }\n\n .data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n transition: background 0.15s;\n }\n\n .data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .cell-agent[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n max-width: 200px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .cell-numeric[_ngcontent-%COMP%] {\n text-align: right;\n font-variant-numeric: tabular-nums;\n color: var(--mj-text-secondary);\n }\n\n .cell-time[_ngcontent-%COMP%] {\n white-space: nowrap;\n color: var(--mj-text-muted);\n font-size: 12px;\n }\n\n .empty-row[_ngcontent-%COMP%] {\n text-align: center;\n color: var(--mj-text-disabled);\n padding: 24px;\n }\n\n \n\n .status-pill[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 3px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.3px;\n }\n\n .status-completed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .status-running[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .status-failed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .status-cancelled[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n .status-paused[_ngcontent-%COMP%], .status-awaitingfeedback[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-text-disabled) 12%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n }\n\n \n\n @media (max-width: 1200px) {\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(3, 1fr);\n }\n }\n\n @media (max-width: 768px) {\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .attribution-name[_ngcontent-%COMP%] {\n width: 100px;\n min-width: 100px;\n }\n\n .attribution-total[_ngcontent-%COMP%] {\n width: 60px;\n min-width: 60px;\n }\n\n .stat-value[_ngcontent-%COMP%] {\n font-size: 18px;\n }\n }"] });
575
+ i0.ɵɵconditional(ctx.IsLoading ? 0 : 1);
576
+ } }, dependencies: [i1.LoadingComponent, i2.DecimalPipe], styles: ["[_nghost-%COMP%] { display: block; }\n\n .loading-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n }\n\n \n\n .stats-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 12px;\n margin: 16px 0;\n }\n\n .stat-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 14px 16px;\n text-align: center;\n border-top: 3px solid var(--mj-border-subtle);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n\n .stat-card[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n }\n\n .stat-card.accent-brand[_ngcontent-%COMP%] { border-top-color: var(--mj-brand-primary); }\n .stat-card.accent-success[_ngcontent-%COMP%] { border-top-color: var(--mj-status-success); }\n .stat-card.accent-warning[_ngcontent-%COMP%] { border-top-color: var(--mj-status-warning); }\n\n .stat-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 4px;\n }\n\n .stat-value[_ngcontent-%COMP%] {\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n letter-spacing: -0.02em;\n }\n\n \n\n .panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n margin-bottom: 16px;\n overflow: hidden;\n }\n\n .panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 18px;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .panel-header__title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .panel-header__icon[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-brand-primary);\n }\n\n .panel-header__subtitle[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .panel-body[_ngcontent-%COMP%] {\n padding: 16px 18px;\n }\n\n .panel-empty[_ngcontent-%COMP%] {\n text-align: center;\n padding: 24px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n }\n\n \n\n .attribution-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .attribution-row[_ngcontent-%COMP%]:last-of-type {\n border-bottom: none;\n }\n\n .attribution-name[_ngcontent-%COMP%] {\n width: 140px;\n min-width: 140px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .attribution-bar-container[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n height: 24px;\n border-radius: 6px;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n }\n\n .attribution-segment[_ngcontent-%COMP%] {\n height: 100%;\n min-width: 2px;\n transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .attribution-total[_ngcontent-%COMP%] {\n width: 80px;\n min-width: 80px;\n text-align: right;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n }\n\n .legend-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n padding: 12px 0 4px;\n flex-wrap: wrap;\n }\n\n .legend-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .legend-swatch[_ngcontent-%COMP%] {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n flex-shrink: 0;\n }\n\n \n\n .table-wrapper[_ngcontent-%COMP%] {\n overflow-x: auto;\n }\n\n .data-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n }\n\n .data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n .data-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n }\n\n .sortable-header[_ngcontent-%COMP%] {\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n transition: color 0.15s;\n }\n\n .sortable-header[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n }\n\n .sortable-header.sorted[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n\n .sortable-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-left: 4px;\n font-size: 10px;\n }\n\n .data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n transition: background 0.15s;\n }\n\n .data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .cell-agent[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n max-width: 200px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .cell-numeric[_ngcontent-%COMP%] {\n text-align: right;\n font-variant-numeric: tabular-nums;\n color: var(--mj-text-secondary);\n }\n\n .cell-time[_ngcontent-%COMP%] {\n white-space: nowrap;\n color: var(--mj-text-muted);\n font-size: 12px;\n }\n\n .empty-row[_ngcontent-%COMP%] {\n text-align: center;\n color: var(--mj-text-disabled);\n padding: 24px;\n }\n\n \n\n .status-pill[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 3px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.3px;\n }\n\n .status-completed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .status-running[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .status-failed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .status-cancelled[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n .status-paused[_ngcontent-%COMP%], .status-awaitingfeedback[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-text-disabled) 12%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n }\n\n \n\n @media (max-width: 1200px) {\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(3, 1fr);\n }\n }\n\n @media (max-width: 768px) {\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .attribution-name[_ngcontent-%COMP%] {\n width: 100px;\n min-width: 100px;\n }\n\n .attribution-total[_ngcontent-%COMP%] {\n width: 60px;\n min-width: 60px;\n }\n\n .stat-value[_ngcontent-%COMP%] {\n font-size: 18px;\n }\n }"] });
562
577
  }
563
578
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AnalyticsAgentRunsComponent, [{
564
579
  type: Component,
565
580
  args: [{ standalone: false, selector: 'app-analytics-agent-runs', template: `
566
- <!-- Filter Bar -->
567
- <app-analytics-filter-bar
568
- [TimeRange]="TimeRange"
569
- [Filters]="globalFilters"
570
- [ShowModelFilter]="false"
571
- [ShowPromptFilter]="false"
572
- [ShowAgentFilter]="true"
573
- [ShowStatusFilter]="true"
574
- [ShowCompareToggle]="false"
575
- [ShowExportButton]="false"
576
- (TimeRangeChange)="OnTimeRangeChange($event)"
577
- (FiltersChange)="OnFiltersChange($event)"
578
- ></app-analytics-filter-bar>
579
581
 
580
582
  @if (IsLoading) {
581
583
  <div class="loading-container">
@@ -706,6 +708,6 @@ export class AnalyticsAgentRunsComponent extends BaseAngularComponent {
706
708
  }], FiltersChange: [{
707
709
  type: Output
708
710
  }] }); })();
709
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AnalyticsAgentRunsComponent, { className: "AnalyticsAgentRunsComponent", filePath: "src/AI/components/analytics/agent-runs/agent-run-analysis.component.ts", lineNumber: 557 }); })();
711
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AnalyticsAgentRunsComponent, { className: "AnalyticsAgentRunsComponent", filePath: "src/AI/components/analytics/agent-runs/agent-run-analysis.component.ts", lineNumber: 544 }); })();
710
712
  export function LoadAnalyticsAgentRuns() { }
711
713
  //# sourceMappingURL=agent-run-analysis.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-run-analysis.component.js","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/agent-runs/agent-run-analysis.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Agent Run Analysis -- Cost Attribution Focus.\n *\n * Displays agent run stats, cost attribution horizontal stacked bars per agent,\n * and a sortable recent agent runs table. All data loaded via RunView from\n * \"MJ: AI Agent Runs\" and \"MJ: AI Prompt Runs\" entities.\n */\n\nimport {\n Component, Input, Output, EventEmitter,\n OnInit, OnDestroy, ChangeDetectorRef, inject\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RunView } from '@memberjunction/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { GlobalFilterState } from '../../../interfaces/analytics-preferences.interface';\n\n// ── Interfaces ──\n\ninterface AgentRunFilters {\n Agents: string[];\n Statuses: string[];\n}\n\ninterface AgentRunRecord {\n ID: string;\n StartedAt: string;\n CompletedAt: string | null;\n Status: string;\n Success: boolean | null;\n TotalCost: number | null;\n TotalTokensUsed: number | null;\n AgentID: string;\n Agent: string | null;\n ErrorMessage: string | null;\n}\n\ninterface PromptRunRecord {\n ID: string;\n AgentRunID: string | null;\n Cost: number | null;\n TotalCost: number | null;\n Model: string | null;\n Vendor: string | null;\n}\n\ninterface AgentRunStats {\n TotalRuns: number;\n TotalCost: number;\n PromptRuns: number;\n AvgCostPerRun: number;\n SuccessRate: number;\n AvgDurationSeconds: number;\n}\n\ninterface CostAttributionRow {\n AgentName: string;\n AgentID: string;\n TotalCost: number;\n Segments: CostSegment[];\n}\n\ninterface CostSegment {\n Label: string;\n Value: number;\n Percent: number;\n Color: string;\n}\n\ninterface RecentRunRow {\n ID: string;\n Agent: string;\n Status: string;\n StatusClass: string;\n StepCount: number;\n Duration: string;\n Cost: string;\n Time: string;\n}\n\ntype SortField = 'Agent' | 'Status' | 'StepCount' | 'Duration' | 'Cost' | 'Time';\ntype SortDirection = 'asc' | 'desc';\n\nconst AGENT_RUN_FIELDS = [\n 'ID', 'StartedAt', 'CompletedAt', 'Status', 'Success',\n 'TotalCost', 'TotalTokensUsed', 'AgentID', 'Agent', 'ErrorMessage'\n];\n\nconst PROMPT_RUN_FIELDS = [\n 'ID', 'AgentRunID', 'Cost', 'TotalCost', 'Model', 'Vendor'\n];\n\nconst COST_COLORS = [\n 'var(--mj-brand-primary)',\n 'var(--mj-brand-accent, var(--mj-brand-primary-hover))',\n 'var(--mj-status-info)',\n 'var(--mj-text-disabled)'\n];\n\n@Component({\n standalone: false,\n selector: 'app-analytics-agent-runs',\n template: `\n <!-- Filter Bar -->\n <app-analytics-filter-bar\n [TimeRange]=\"TimeRange\"\n [Filters]=\"globalFilters\"\n [ShowModelFilter]=\"false\"\n [ShowPromptFilter]=\"false\"\n [ShowAgentFilter]=\"true\"\n [ShowStatusFilter]=\"true\"\n [ShowCompareToggle]=\"false\"\n [ShowExportButton]=\"false\"\n (TimeRangeChange)=\"OnTimeRangeChange($event)\"\n (FiltersChange)=\"OnFiltersChange($event)\"\n ></app-analytics-filter-bar>\n\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading agent runs...\"></mj-loading>\n </div>\n } @else {\n <!-- Stats Bar -->\n <div class=\"stats-grid\">\n <div class=\"stat-card accent-brand\">\n <div class=\"stat-label\">Total Runs</div>\n <div class=\"stat-value\">{{ Stats.TotalRuns | number }}</div>\n </div>\n <div class=\"stat-card accent-brand\">\n <div class=\"stat-label\">Total Cost</div>\n <div class=\"stat-value\">{{ FormatCurrency(Stats.TotalCost) }}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Prompt Runs</div>\n <div class=\"stat-value\">{{ Stats.PromptRuns | number }}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Avg Cost/Run</div>\n <div class=\"stat-value\">{{ FormatCurrency(Stats.AvgCostPerRun, 4) }}</div>\n </div>\n <div class=\"stat-card accent-success\">\n <div class=\"stat-label\">Success Rate</div>\n <div class=\"stat-value\">{{ Stats.SuccessRate | number:'1.1-1' }}%</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Avg Duration</div>\n <div class=\"stat-value\">{{ Stats.AvgDurationSeconds | number:'1.1-1' }}s</div>\n </div>\n </div>\n\n <!-- Cost Attribution Panel -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-header__title\">\n <i class=\"fa-solid fa-chart-bar panel-header__icon\"></i>\n Cost Attribution by Agent\n </div>\n </div>\n <div class=\"panel-body\">\n @if (CostAttributionRows.length === 0) {\n <div class=\"panel-empty\">No agent cost data for selected period</div>\n }\n @for (row of CostAttributionRows; track row.AgentID) {\n <div class=\"attribution-row\">\n <div class=\"attribution-name\" [title]=\"row.AgentName\">{{ row.AgentName }}</div>\n <div class=\"attribution-bar-container\">\n @for (seg of row.Segments; track seg.Label) {\n <div\n class=\"attribution-segment\"\n [style.width.%]=\"seg.Percent\"\n [style.background]=\"seg.Color\"\n [title]=\"seg.Label + ': ' + FormatCurrency(seg.Value, 4)\"\n ></div>\n }\n </div>\n <div class=\"attribution-total\">{{ FormatCurrency(row.TotalCost) }}</div>\n </div>\n }\n @if (CostAttributionRows.length > 0) {\n <div class=\"legend-row\">\n @for (item of LegendItems; track item.Label) {\n <div class=\"legend-item\">\n <span class=\"legend-swatch\" [style.background]=\"item.Color\"></span>\n {{ item.Label }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Recent Agent Runs Table -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-header__title\">\n <i class=\"fa-solid fa-list panel-header__icon\"></i>\n Recent Agent Runs\n </div>\n <span class=\"panel-header__subtitle\">{{ RecentRuns.length }} runs</span>\n </div>\n <div class=\"table-wrapper\">\n <table class=\"data-table\">\n <thead>\n <tr>\n @for (col of TableColumns; track col.field) {\n <th\n class=\"sortable-header\"\n [class.sorted]=\"SortField === col.field\"\n (click)=\"OnSort(col.field)\">\n {{ col.label }}\n @if (SortField === col.field) {\n <i [class]=\"SortDir === 'asc' ? 'fa-solid fa-caret-up' : 'fa-solid fa-caret-down'\"></i>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (RecentRuns.length === 0) {\n <tr><td [attr.colspan]=\"TableColumns.length\" class=\"empty-row\">No runs found</td></tr>\n }\n @for (run of RecentRuns; track run.ID) {\n <tr>\n <td class=\"cell-agent\">{{ run.Agent }}</td>\n <td><span class=\"status-pill\" [class]=\"run.StatusClass\">{{ run.Status }}</span></td>\n <td class=\"cell-numeric\">{{ run.StepCount }}</td>\n <td class=\"cell-numeric\">{{ run.Duration }}</td>\n <td class=\"cell-numeric\">{{ run.Cost }}</td>\n <td class=\"cell-time\">{{ run.Time }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n `,\n styles: [`\n :host { display: block; }\n\n .loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n }\n\n /* ── Stats Grid ── */\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 12px;\n margin: 16px 0;\n }\n\n .stat-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 14px 16px;\n text-align: center;\n border-top: 3px solid var(--mj-border-subtle);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n\n .stat-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n }\n\n .stat-card.accent-brand { border-top-color: var(--mj-brand-primary); }\n .stat-card.accent-success { border-top-color: var(--mj-status-success); }\n .stat-card.accent-warning { border-top-color: var(--mj-status-warning); }\n\n .stat-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 4px;\n }\n\n .stat-value {\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n letter-spacing: -0.02em;\n }\n\n /* ── Panel ── */\n .panel {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n margin-bottom: 16px;\n overflow: hidden;\n }\n\n .panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 18px;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .panel-header__title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .panel-header__icon {\n font-size: 13px;\n color: var(--mj-brand-primary);\n }\n\n .panel-header__subtitle {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .panel-body {\n padding: 16px 18px;\n }\n\n .panel-empty {\n text-align: center;\n padding: 24px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n }\n\n /* ── Cost Attribution ── */\n .attribution-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .attribution-row:last-of-type {\n border-bottom: none;\n }\n\n .attribution-name {\n width: 140px;\n min-width: 140px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .attribution-bar-container {\n flex: 1;\n display: flex;\n height: 24px;\n border-radius: 6px;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n }\n\n .attribution-segment {\n height: 100%;\n min-width: 2px;\n transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .attribution-total {\n width: 80px;\n min-width: 80px;\n text-align: right;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n }\n\n .legend-row {\n display: flex;\n gap: 16px;\n padding: 12px 0 4px;\n flex-wrap: wrap;\n }\n\n .legend-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .legend-swatch {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n flex-shrink: 0;\n }\n\n /* ── Table ── */\n .table-wrapper {\n overflow-x: auto;\n }\n\n .data-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n }\n\n .data-table th,\n .data-table td {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .data-table th {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n }\n\n .sortable-header {\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n transition: color 0.15s;\n }\n\n .sortable-header:hover {\n color: var(--mj-brand-primary);\n }\n\n .sortable-header.sorted {\n color: var(--mj-brand-primary);\n }\n\n .sortable-header i {\n margin-left: 4px;\n font-size: 10px;\n }\n\n .data-table tbody tr {\n transition: background 0.15s;\n }\n\n .data-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .cell-agent {\n font-weight: 500;\n color: var(--mj-text-primary);\n max-width: 200px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .cell-numeric {\n text-align: right;\n font-variant-numeric: tabular-nums;\n color: var(--mj-text-secondary);\n }\n\n .cell-time {\n white-space: nowrap;\n color: var(--mj-text-muted);\n font-size: 12px;\n }\n\n .empty-row {\n text-align: center;\n color: var(--mj-text-disabled);\n padding: 24px;\n }\n\n /* ── Status Pills ── */\n .status-pill {\n display: inline-block;\n padding: 3px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.3px;\n }\n\n .status-completed {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .status-running {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .status-failed {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .status-cancelled {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n .status-paused, .status-awaitingfeedback {\n background: color-mix(in srgb, var(--mj-text-disabled) 12%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n }\n\n /* ── Responsive ── */\n @media (max-width: 1200px) {\n .stats-grid {\n grid-template-columns: repeat(3, 1fr);\n }\n }\n\n @media (max-width: 768px) {\n .stats-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .attribution-name {\n width: 100px;\n min-width: 100px;\n }\n\n .attribution-total {\n width: 60px;\n min-width: 60px;\n }\n\n .stat-value {\n font-size: 18px;\n }\n }\n `]\n})\nexport class AnalyticsAgentRunsComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n @Input() TimeRange = '7d';\n @Input() Filters: AgentRunFilters = { Agents: [], Statuses: [] };\n\n @Output() TimeRangeChange = new EventEmitter<string>();\n @Output() FiltersChange = new EventEmitter<AgentRunFilters>();\n\n private cdr = inject(ChangeDetectorRef);\n private destroy$ = new Subject<void>();\n\n public IsLoading = false;\n\n public Stats: AgentRunStats = {\n TotalRuns: 0,\n TotalCost: 0,\n PromptRuns: 0,\n AvgCostPerRun: 0,\n SuccessRate: 0,\n AvgDurationSeconds: 0\n };\n\n public CostAttributionRows: CostAttributionRow[] = [];\n public LegendItems: { Label: string; Color: string }[] = [];\n public RecentRuns: RecentRunRow[] = [];\n public SortField: SortField = 'Time';\n public SortDir: SortDirection = 'desc';\n\n public TableColumns: { field: SortField; label: string }[] = [\n { field: 'Agent', label: 'Agent' },\n { field: 'Status', label: 'Status' },\n { field: 'StepCount', label: 'Steps' },\n { field: 'Duration', label: 'Duration' },\n { field: 'Cost', label: 'Cost' },\n { field: 'Time', label: 'Time' }\n ];\n\n /** Bridge the local filter shape to the global shape the filter bar expects */\n public get globalFilters(): GlobalFilterState {\n return {\n Models: [],\n Agents: this.Filters.Agents,\n Prompts: [],\n Statuses: this.Filters.Statuses\n };\n }\n\n private agentRuns: AgentRunRecord[] = [];\n private promptRuns: PromptRunRecord[] = [];\n\n ngOnInit(): void {\n this.LoadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ── Public Event Handlers ──\n\n public OnTimeRangeChange(range: string): void {\n this.TimeRange = range;\n this.TimeRangeChange.emit(range);\n this.LoadData();\n }\n\n public OnFiltersChange(filters: GlobalFilterState): void {\n this.Filters = { Agents: filters.Agents, Statuses: filters.Statuses };\n this.FiltersChange.emit(this.Filters);\n this.LoadData();\n }\n\n public OnSort(field: SortField): void {\n if (this.SortField === field) {\n this.SortDir = this.SortDir === 'asc' ? 'desc' : 'asc';\n } else {\n this.SortField = field;\n this.SortDir = field === 'Time' ? 'desc' : 'asc';\n }\n this.sortRecentRuns();\n this.cdr.detectChanges();\n }\n\n public FormatCurrency(value: number, decimals = 2): string {\n if (value === 0) return '$0.00';\n if (value < 0.01 && decimals < 4) decimals = 4;\n return '$' + value.toFixed(decimals);\n }\n\n // ── Data Loading ──\n\n private async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const dateFilter = this.buildDateFilter('StartedAt');\n const agentFilter = this.buildAgentFilter();\n const statusFilter = this.buildStatusFilter();\n const extraFilter = [dateFilter, agentFilter, statusFilter].filter(Boolean).join(' AND ');\n\n const promptDateFilter = this.buildDateFilter('RunAt');\n\n const [agentResult, promptResult] = await rv.RunViews([\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: extraFilter,\n Fields: AGENT_RUN_FIELDS,\n OrderBy: 'StartedAt DESC',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: promptDateFilter,\n Fields: PROMPT_RUN_FIELDS,\n OrderBy: 'RunAt DESC',\n ResultType: 'simple'\n }\n ]);\n\n this.agentRuns = (agentResult?.Results ?? []) as AgentRunRecord[];\n this.promptRuns = (promptResult?.Results ?? []) as PromptRunRecord[];\n\n this.computeStats();\n this.computeCostAttribution();\n this.buildRecentRuns();\n this.sortRecentRuns();\n } catch (e) {\n console.error('Agent Run Analysis load error:', e);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ── Computations ──\n\n private computeStats(): void {\n const runs = this.agentRuns;\n const total = runs.length;\n const totalCost = runs.reduce((s, r) => s + (r.TotalCost ?? 0), 0);\n const completed = runs.filter(r => r.Status === 'Completed');\n const successCount = runs.filter(r => r.Success === true).length;\n\n const durations = completed\n .filter(r => r.CompletedAt)\n .map(r => {\n const start = new Date(r.StartedAt).getTime();\n const end = new Date(r.CompletedAt!).getTime();\n return (end - start) / 1000;\n })\n .filter(d => d > 0);\n\n const avgDuration = durations.length > 0\n ? durations.reduce((s, d) => s + d, 0) / durations.length\n : 0;\n\n const linkedPromptRuns = this.promptRuns.filter(\n p => p.AgentRunID != null && this.agentRunIdSet.has(p.AgentRunID)\n );\n\n this.Stats = {\n TotalRuns: total,\n TotalCost: totalCost,\n PromptRuns: linkedPromptRuns.length,\n AvgCostPerRun: total > 0 ? totalCost / total : 0,\n SuccessRate: total > 0 ? (successCount / total) * 100 : 0,\n AvgDurationSeconds: avgDuration\n };\n }\n\n private get agentRunIdSet(): Set<string> {\n return new Set(this.agentRuns.map(r => r.ID));\n }\n\n private computeCostAttribution(): void {\n const agentCostMap = new Map<string, { name: string; vendorCosts: Map<string, number>; totalCost: number }>();\n\n // Group prompt runs by agent run, then by vendor\n for (const pr of this.promptRuns) {\n if (!pr.AgentRunID) continue;\n const agentRun = this.agentRuns.find(ar => UUIDsEqual(ar.ID, pr.AgentRunID));\n if (!agentRun) continue;\n\n const agentKey = agentRun.AgentID;\n if (!agentCostMap.has(agentKey)) {\n agentCostMap.set(agentKey, {\n name: agentRun.Agent ?? 'Unknown',\n vendorCosts: new Map<string, number>(),\n totalCost: 0\n });\n }\n\n const entry = agentCostMap.get(agentKey)!;\n const vendor = pr.Vendor ?? 'Other';\n const cost = pr.Cost ?? pr.TotalCost ?? 0;\n entry.vendorCosts.set(vendor, (entry.vendorCosts.get(vendor) ?? 0) + cost);\n entry.totalCost += cost;\n }\n\n // Collect all vendors for consistent coloring\n const allVendors = new Set<string>();\n for (const entry of agentCostMap.values()) {\n for (const v of entry.vendorCosts.keys()) {\n allVendors.add(v);\n }\n }\n const vendorList = Array.from(allVendors);\n\n // Build legend\n this.LegendItems = vendorList.map((v, i) => ({\n Label: v,\n Color: COST_COLORS[i % COST_COLORS.length]\n }));\n\n // Sort by total cost descending\n const sorted = Array.from(agentCostMap.entries())\n .sort((a, b) => b[1].totalCost - a[1].totalCost);\n\n this.CostAttributionRows = sorted.map(([agentId, entry]) => {\n const segments: CostSegment[] = vendorList.map((vendor, i) => {\n const val = entry.vendorCosts.get(vendor) ?? 0;\n return {\n Label: vendor,\n Value: val,\n Percent: entry.totalCost > 0 ? (val / entry.totalCost) * 100 : 0,\n Color: COST_COLORS[i % COST_COLORS.length]\n };\n }).filter(s => s.Value > 0);\n\n return {\n AgentName: entry.name,\n AgentID: agentId,\n TotalCost: entry.totalCost,\n Segments: segments\n };\n });\n }\n\n private buildRecentRuns(): void {\n // Count prompt runs per agent run\n const promptCountMap = new Map<string, number>();\n for (const pr of this.promptRuns) {\n if (pr.AgentRunID) {\n promptCountMap.set(pr.AgentRunID, (promptCountMap.get(pr.AgentRunID) ?? 0) + 1);\n }\n }\n\n this.RecentRuns = this.agentRuns.slice(0, 100).map(r => ({\n ID: r.ID,\n Agent: r.Agent ?? 'Unknown',\n Status: r.Status,\n StatusClass: this.getStatusClass(r.Status),\n StepCount: promptCountMap.get(r.ID) ?? 0,\n Duration: this.formatDuration(r.StartedAt, r.CompletedAt),\n Cost: this.FormatCurrency(r.TotalCost ?? 0),\n Time: this.formatRelativeTime(r.StartedAt)\n }));\n }\n\n private sortRecentRuns(): void {\n const dir = this.SortDir === 'asc' ? 1 : -1;\n this.RecentRuns.sort((a, b) => {\n switch (this.SortField) {\n case 'Agent': return dir * a.Agent.localeCompare(b.Agent);\n case 'Status': return dir * a.Status.localeCompare(b.Status);\n case 'StepCount': return dir * (a.StepCount - b.StepCount);\n case 'Duration': return dir * a.Duration.localeCompare(b.Duration);\n case 'Cost': return dir * a.Cost.localeCompare(b.Cost);\n case 'Time': return dir * a.Time.localeCompare(b.Time);\n default: return 0;\n }\n });\n }\n\n // ── Helpers ──\n\n private buildDateFilter(field: string): string {\n const now = new Date();\n const ms = this.timeRangeToMs(this.TimeRange);\n const start = new Date(now.getTime() - ms);\n return `${field} >= '${start.toISOString()}'`;\n }\n\n private buildAgentFilter(): string {\n if (this.Filters.Agents.length === 0) return '';\n const ids = this.Filters.Agents.map(id => `'${id}'`).join(',');\n return `AgentID IN (${ids})`;\n }\n\n private buildStatusFilter(): string {\n if (this.Filters.Statuses.length === 0) return '';\n const values = this.Filters.Statuses.map(s => `'${s}'`).join(',');\n return `Status IN (${values})`;\n }\n\n private timeRangeToMs(range: string): number {\n const map: Record<string, number> = {\n '1h': 3600000,\n '6h': 21600000,\n '24h': 86400000,\n '7d': 604800000,\n '30d': 2592000000\n };\n return map[range] ?? 604800000;\n }\n\n private getStatusClass(status: string): string {\n return 'status-pill status-' + status.toLowerCase().replace(/\\s+/g, '');\n }\n\n private formatDuration(startStr: string, endStr: string | null): string {\n if (!endStr) return '--';\n const ms = new Date(endStr).getTime() - new Date(startStr).getTime();\n if (ms < 1000) return ms + 'ms';\n if (ms < 60000) return (ms / 1000).toFixed(1) + 's';\n return (ms / 60000).toFixed(1) + 'm';\n }\n\n private formatRelativeTime(dateStr: string): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diffMs = now - then;\n const diffMin = Math.floor(diffMs / 60000);\n if (diffMin < 1) return 'just now';\n if (diffMin < 60) return diffMin + 'm ago';\n const diffHr = Math.floor(diffMin / 60);\n if (diffHr < 24) return diffHr + 'h ago';\n const diffDay = Math.floor(diffHr / 24);\n return diffDay + 'd ago';\n }\n}\n\nexport function LoadAnalyticsAgentRuns() { /* tree-shaking prevention */ }\n"]}
1
+ {"version":3,"file":"agent-run-analysis.component.js","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/agent-runs/agent-run-analysis.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Agent Run Analysis -- Cost Attribution Focus.\n *\n * Displays agent run stats, cost attribution horizontal stacked bars per agent,\n * and a sortable recent agent runs table. All data loaded via RunView from\n * \"MJ: AI Agent Runs\" and \"MJ: AI Prompt Runs\" entities.\n */\n\nimport {\n Component, Input, Output, EventEmitter,\n OnInit, OnDestroy, ChangeDetectorRef, inject\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RunView } from '@memberjunction/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { GlobalFilterState } from '../../../interfaces/analytics-preferences.interface';\n\n// ── Interfaces ──\n\ninterface AgentRunFilters {\n Agents: string[];\n Statuses: string[];\n}\n\ninterface AgentRunRecord {\n ID: string;\n StartedAt: string;\n CompletedAt: string | null;\n Status: string;\n Success: boolean | null;\n TotalCost: number | null;\n TotalTokensUsed: number | null;\n AgentID: string;\n Agent: string | null;\n ErrorMessage: string | null;\n}\n\ninterface PromptRunRecord {\n ID: string;\n AgentRunID: string | null;\n Cost: number | null;\n TotalCost: number | null;\n Model: string | null;\n Vendor: string | null;\n}\n\ninterface AgentRunStats {\n TotalRuns: number;\n TotalCost: number;\n PromptRuns: number;\n AvgCostPerRun: number;\n SuccessRate: number;\n AvgDurationSeconds: number;\n}\n\ninterface CostAttributionRow {\n AgentName: string;\n AgentID: string;\n TotalCost: number;\n Segments: CostSegment[];\n}\n\ninterface CostSegment {\n Label: string;\n Value: number;\n Percent: number;\n Color: string;\n}\n\ninterface RecentRunRow {\n ID: string;\n Agent: string;\n Status: string;\n StatusClass: string;\n StepCount: number;\n Duration: string;\n Cost: string;\n Time: string;\n}\n\ntype SortField = 'Agent' | 'Status' | 'StepCount' | 'Duration' | 'Cost' | 'Time';\ntype SortDirection = 'asc' | 'desc';\n\nconst AGENT_RUN_FIELDS = [\n 'ID', 'StartedAt', 'CompletedAt', 'Status', 'Success',\n 'TotalCost', 'TotalTokensUsed', 'AgentID', 'Agent', 'ErrorMessage'\n];\n\nconst PROMPT_RUN_FIELDS = [\n 'ID', 'AgentRunID', 'Cost', 'TotalCost', 'Model', 'Vendor'\n];\n\nconst COST_COLORS = [\n 'var(--mj-brand-primary)',\n 'var(--mj-brand-accent, var(--mj-brand-primary-hover))',\n 'var(--mj-status-info)',\n 'var(--mj-text-disabled)'\n];\n\n@Component({\n standalone: false,\n selector: 'app-analytics-agent-runs',\n template: `\n\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading agent runs...\"></mj-loading>\n </div>\n } @else {\n <!-- Stats Bar -->\n <div class=\"stats-grid\">\n <div class=\"stat-card accent-brand\">\n <div class=\"stat-label\">Total Runs</div>\n <div class=\"stat-value\">{{ Stats.TotalRuns | number }}</div>\n </div>\n <div class=\"stat-card accent-brand\">\n <div class=\"stat-label\">Total Cost</div>\n <div class=\"stat-value\">{{ FormatCurrency(Stats.TotalCost) }}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Prompt Runs</div>\n <div class=\"stat-value\">{{ Stats.PromptRuns | number }}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Avg Cost/Run</div>\n <div class=\"stat-value\">{{ FormatCurrency(Stats.AvgCostPerRun, 4) }}</div>\n </div>\n <div class=\"stat-card accent-success\">\n <div class=\"stat-label\">Success Rate</div>\n <div class=\"stat-value\">{{ Stats.SuccessRate | number:'1.1-1' }}%</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Avg Duration</div>\n <div class=\"stat-value\">{{ Stats.AvgDurationSeconds | number:'1.1-1' }}s</div>\n </div>\n </div>\n\n <!-- Cost Attribution Panel -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-header__title\">\n <i class=\"fa-solid fa-chart-bar panel-header__icon\"></i>\n Cost Attribution by Agent\n </div>\n </div>\n <div class=\"panel-body\">\n @if (CostAttributionRows.length === 0) {\n <div class=\"panel-empty\">No agent cost data for selected period</div>\n }\n @for (row of CostAttributionRows; track row.AgentID) {\n <div class=\"attribution-row\">\n <div class=\"attribution-name\" [title]=\"row.AgentName\">{{ row.AgentName }}</div>\n <div class=\"attribution-bar-container\">\n @for (seg of row.Segments; track seg.Label) {\n <div\n class=\"attribution-segment\"\n [style.width.%]=\"seg.Percent\"\n [style.background]=\"seg.Color\"\n [title]=\"seg.Label + ': ' + FormatCurrency(seg.Value, 4)\"\n ></div>\n }\n </div>\n <div class=\"attribution-total\">{{ FormatCurrency(row.TotalCost) }}</div>\n </div>\n }\n @if (CostAttributionRows.length > 0) {\n <div class=\"legend-row\">\n @for (item of LegendItems; track item.Label) {\n <div class=\"legend-item\">\n <span class=\"legend-swatch\" [style.background]=\"item.Color\"></span>\n {{ item.Label }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Recent Agent Runs Table -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-header__title\">\n <i class=\"fa-solid fa-list panel-header__icon\"></i>\n Recent Agent Runs\n </div>\n <span class=\"panel-header__subtitle\">{{ RecentRuns.length }} runs</span>\n </div>\n <div class=\"table-wrapper\">\n <table class=\"data-table\">\n <thead>\n <tr>\n @for (col of TableColumns; track col.field) {\n <th\n class=\"sortable-header\"\n [class.sorted]=\"SortField === col.field\"\n (click)=\"OnSort(col.field)\">\n {{ col.label }}\n @if (SortField === col.field) {\n <i [class]=\"SortDir === 'asc' ? 'fa-solid fa-caret-up' : 'fa-solid fa-caret-down'\"></i>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (RecentRuns.length === 0) {\n <tr><td [attr.colspan]=\"TableColumns.length\" class=\"empty-row\">No runs found</td></tr>\n }\n @for (run of RecentRuns; track run.ID) {\n <tr>\n <td class=\"cell-agent\">{{ run.Agent }}</td>\n <td><span class=\"status-pill\" [class]=\"run.StatusClass\">{{ run.Status }}</span></td>\n <td class=\"cell-numeric\">{{ run.StepCount }}</td>\n <td class=\"cell-numeric\">{{ run.Duration }}</td>\n <td class=\"cell-numeric\">{{ run.Cost }}</td>\n <td class=\"cell-time\">{{ run.Time }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n `,\n styles: [`\n :host { display: block; }\n\n .loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n }\n\n /* ── Stats Grid ── */\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 12px;\n margin: 16px 0;\n }\n\n .stat-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 14px 16px;\n text-align: center;\n border-top: 3px solid var(--mj-border-subtle);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n\n .stat-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n }\n\n .stat-card.accent-brand { border-top-color: var(--mj-brand-primary); }\n .stat-card.accent-success { border-top-color: var(--mj-status-success); }\n .stat-card.accent-warning { border-top-color: var(--mj-status-warning); }\n\n .stat-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 4px;\n }\n\n .stat-value {\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n letter-spacing: -0.02em;\n }\n\n /* ── Panel ── */\n .panel {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n margin-bottom: 16px;\n overflow: hidden;\n }\n\n .panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 18px;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .panel-header__title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .panel-header__icon {\n font-size: 13px;\n color: var(--mj-brand-primary);\n }\n\n .panel-header__subtitle {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .panel-body {\n padding: 16px 18px;\n }\n\n .panel-empty {\n text-align: center;\n padding: 24px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n }\n\n /* ── Cost Attribution ── */\n .attribution-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .attribution-row:last-of-type {\n border-bottom: none;\n }\n\n .attribution-name {\n width: 140px;\n min-width: 140px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .attribution-bar-container {\n flex: 1;\n display: flex;\n height: 24px;\n border-radius: 6px;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n }\n\n .attribution-segment {\n height: 100%;\n min-width: 2px;\n transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .attribution-total {\n width: 80px;\n min-width: 80px;\n text-align: right;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n }\n\n .legend-row {\n display: flex;\n gap: 16px;\n padding: 12px 0 4px;\n flex-wrap: wrap;\n }\n\n .legend-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .legend-swatch {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n flex-shrink: 0;\n }\n\n /* ── Table ── */\n .table-wrapper {\n overflow-x: auto;\n }\n\n .data-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n }\n\n .data-table th,\n .data-table td {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .data-table th {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n }\n\n .sortable-header {\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n transition: color 0.15s;\n }\n\n .sortable-header:hover {\n color: var(--mj-brand-primary);\n }\n\n .sortable-header.sorted {\n color: var(--mj-brand-primary);\n }\n\n .sortable-header i {\n margin-left: 4px;\n font-size: 10px;\n }\n\n .data-table tbody tr {\n transition: background 0.15s;\n }\n\n .data-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .cell-agent {\n font-weight: 500;\n color: var(--mj-text-primary);\n max-width: 200px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .cell-numeric {\n text-align: right;\n font-variant-numeric: tabular-nums;\n color: var(--mj-text-secondary);\n }\n\n .cell-time {\n white-space: nowrap;\n color: var(--mj-text-muted);\n font-size: 12px;\n }\n\n .empty-row {\n text-align: center;\n color: var(--mj-text-disabled);\n padding: 24px;\n }\n\n /* ── Status Pills ── */\n .status-pill {\n display: inline-block;\n padding: 3px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.3px;\n }\n\n .status-completed {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .status-running {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .status-failed {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .status-cancelled {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n .status-paused, .status-awaitingfeedback {\n background: color-mix(in srgb, var(--mj-text-disabled) 12%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n }\n\n /* ── Responsive ── */\n @media (max-width: 1200px) {\n .stats-grid {\n grid-template-columns: repeat(3, 1fr);\n }\n }\n\n @media (max-width: 768px) {\n .stats-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .attribution-name {\n width: 100px;\n min-width: 100px;\n }\n\n .attribution-total {\n width: 60px;\n min-width: 60px;\n }\n\n .stat-value {\n font-size: 18px;\n }\n }\n `]\n})\nexport class AnalyticsAgentRunsComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n private _timeRange = '7d';\n @Input()\n set TimeRange(value: string) {\n const prev = this._timeRange;\n this._timeRange = value;\n if (prev !== value && this.initialized) this.LoadData();\n }\n get TimeRange(): string { return this._timeRange; }\n\n private _filters: AgentRunFilters = { Agents: [], Statuses: [] };\n @Input()\n set Filters(value: AgentRunFilters) {\n const next = value ?? { Agents: [], Statuses: [] };\n const changed = !this.shallowFiltersEqual(this._filters, next);\n this._filters = next;\n if (changed && this.initialized) this.LoadData();\n }\n get Filters(): AgentRunFilters { return this._filters; }\n\n private shallowFiltersEqual(a: AgentRunFilters, b: AgentRunFilters): boolean {\n const sameArr = (x: string[], y: string[]) => x.length === y.length && x.every((v, i) => v === y[i]);\n return sameArr(a.Agents, b.Agents) && sameArr(a.Statuses, b.Statuses);\n }\n\n @Output() TimeRangeChange = new EventEmitter<string>();\n @Output() FiltersChange = new EventEmitter<AgentRunFilters>();\n\n private initialized = false;\n\n private cdr = inject(ChangeDetectorRef);\n private destroy$ = new Subject<void>();\n\n public IsLoading = false;\n\n public Stats: AgentRunStats = {\n TotalRuns: 0,\n TotalCost: 0,\n PromptRuns: 0,\n AvgCostPerRun: 0,\n SuccessRate: 0,\n AvgDurationSeconds: 0\n };\n\n public CostAttributionRows: CostAttributionRow[] = [];\n public LegendItems: { Label: string; Color: string }[] = [];\n public RecentRuns: RecentRunRow[] = [];\n public SortField: SortField = 'Time';\n public SortDir: SortDirection = 'desc';\n\n public TableColumns: { field: SortField; label: string }[] = [\n { field: 'Agent', label: 'Agent' },\n { field: 'Status', label: 'Status' },\n { field: 'StepCount', label: 'Steps' },\n { field: 'Duration', label: 'Duration' },\n { field: 'Cost', label: 'Cost' },\n { field: 'Time', label: 'Time' }\n ];\n\n /** Bridge the local filter shape to the global shape the filter bar expects */\n public get globalFilters(): GlobalFilterState {\n return {\n Models: [],\n Agents: this.Filters.Agents,\n Prompts: [],\n Statuses: this.Filters.Statuses\n };\n }\n\n private agentRuns: AgentRunRecord[] = [];\n private promptRuns: PromptRunRecord[] = [];\n\n ngOnInit(): void {\n this.initialized = true;\n this.LoadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ── Public Event Handlers ──\n\n public OnTimeRangeChange(range: string): void {\n this.TimeRange = range;\n this.TimeRangeChange.emit(range);\n this.LoadData();\n }\n\n public OnFiltersChange(filters: GlobalFilterState): void {\n this.Filters = { Agents: filters.Agents, Statuses: filters.Statuses };\n this.FiltersChange.emit(this.Filters);\n this.LoadData();\n }\n\n public OnSort(field: SortField): void {\n if (this.SortField === field) {\n this.SortDir = this.SortDir === 'asc' ? 'desc' : 'asc';\n } else {\n this.SortField = field;\n this.SortDir = field === 'Time' ? 'desc' : 'asc';\n }\n this.sortRecentRuns();\n this.cdr.detectChanges();\n }\n\n public FormatCurrency(value: number, decimals = 2): string {\n if (value === 0) return '$0.00';\n if (value < 0.01 && decimals < 4) decimals = 4;\n return '$' + value.toFixed(decimals);\n }\n\n // ── Data Loading ──\n\n private async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const dateFilter = this.buildDateFilter('StartedAt');\n const agentFilter = this.buildAgentFilter();\n const statusFilter = this.buildStatusFilter();\n const extraFilter = [dateFilter, agentFilter, statusFilter].filter(Boolean).join(' AND ');\n\n const promptDateFilter = this.buildDateFilter('RunAt');\n\n const [agentResult, promptResult] = await rv.RunViews([\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: extraFilter,\n Fields: AGENT_RUN_FIELDS,\n OrderBy: 'StartedAt DESC',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: promptDateFilter,\n Fields: PROMPT_RUN_FIELDS,\n OrderBy: 'RunAt DESC',\n ResultType: 'simple'\n }\n ]);\n\n this.agentRuns = (agentResult?.Results ?? []) as AgentRunRecord[];\n this.promptRuns = (promptResult?.Results ?? []) as PromptRunRecord[];\n\n this.computeStats();\n this.computeCostAttribution();\n this.buildRecentRuns();\n this.sortRecentRuns();\n } catch (e) {\n console.error('Agent Run Analysis load error:', e);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ── Computations ──\n\n private computeStats(): void {\n const runs = this.agentRuns;\n const total = runs.length;\n const totalCost = runs.reduce((s, r) => s + (r.TotalCost ?? 0), 0);\n const completed = runs.filter(r => r.Status === 'Completed');\n const successCount = runs.filter(r => r.Success === true).length;\n\n const durations = completed\n .filter(r => r.CompletedAt)\n .map(r => {\n const start = new Date(r.StartedAt).getTime();\n const end = new Date(r.CompletedAt!).getTime();\n return (end - start) / 1000;\n })\n .filter(d => d > 0);\n\n const avgDuration = durations.length > 0\n ? durations.reduce((s, d) => s + d, 0) / durations.length\n : 0;\n\n const linkedPromptRuns = this.promptRuns.filter(\n p => p.AgentRunID != null && this.agentRunIdSet.has(p.AgentRunID)\n );\n\n this.Stats = {\n TotalRuns: total,\n TotalCost: totalCost,\n PromptRuns: linkedPromptRuns.length,\n AvgCostPerRun: total > 0 ? totalCost / total : 0,\n SuccessRate: total > 0 ? (successCount / total) * 100 : 0,\n AvgDurationSeconds: avgDuration\n };\n }\n\n private get agentRunIdSet(): Set<string> {\n return new Set(this.agentRuns.map(r => r.ID));\n }\n\n private computeCostAttribution(): void {\n const agentCostMap = new Map<string, { name: string; vendorCosts: Map<string, number>; totalCost: number }>();\n\n // Group prompt runs by agent run, then by vendor\n for (const pr of this.promptRuns) {\n if (!pr.AgentRunID) continue;\n const agentRun = this.agentRuns.find(ar => UUIDsEqual(ar.ID, pr.AgentRunID));\n if (!agentRun) continue;\n\n const agentKey = agentRun.AgentID;\n if (!agentCostMap.has(agentKey)) {\n agentCostMap.set(agentKey, {\n name: agentRun.Agent ?? 'Unknown',\n vendorCosts: new Map<string, number>(),\n totalCost: 0\n });\n }\n\n const entry = agentCostMap.get(agentKey)!;\n const vendor = pr.Vendor ?? 'Other';\n const cost = pr.Cost ?? pr.TotalCost ?? 0;\n entry.vendorCosts.set(vendor, (entry.vendorCosts.get(vendor) ?? 0) + cost);\n entry.totalCost += cost;\n }\n\n // Collect all vendors for consistent coloring\n const allVendors = new Set<string>();\n for (const entry of agentCostMap.values()) {\n for (const v of entry.vendorCosts.keys()) {\n allVendors.add(v);\n }\n }\n const vendorList = Array.from(allVendors);\n\n // Build legend\n this.LegendItems = vendorList.map((v, i) => ({\n Label: v,\n Color: COST_COLORS[i % COST_COLORS.length]\n }));\n\n // Sort by total cost descending\n const sorted = Array.from(agentCostMap.entries())\n .sort((a, b) => b[1].totalCost - a[1].totalCost);\n\n this.CostAttributionRows = sorted.map(([agentId, entry]) => {\n const segments: CostSegment[] = vendorList.map((vendor, i) => {\n const val = entry.vendorCosts.get(vendor) ?? 0;\n return {\n Label: vendor,\n Value: val,\n Percent: entry.totalCost > 0 ? (val / entry.totalCost) * 100 : 0,\n Color: COST_COLORS[i % COST_COLORS.length]\n };\n }).filter(s => s.Value > 0);\n\n return {\n AgentName: entry.name,\n AgentID: agentId,\n TotalCost: entry.totalCost,\n Segments: segments\n };\n });\n }\n\n private buildRecentRuns(): void {\n // Count prompt runs per agent run\n const promptCountMap = new Map<string, number>();\n for (const pr of this.promptRuns) {\n if (pr.AgentRunID) {\n promptCountMap.set(pr.AgentRunID, (promptCountMap.get(pr.AgentRunID) ?? 0) + 1);\n }\n }\n\n this.RecentRuns = this.agentRuns.slice(0, 100).map(r => ({\n ID: r.ID,\n Agent: r.Agent ?? 'Unknown',\n Status: r.Status,\n StatusClass: this.getStatusClass(r.Status),\n StepCount: promptCountMap.get(r.ID) ?? 0,\n Duration: this.formatDuration(r.StartedAt, r.CompletedAt),\n Cost: this.FormatCurrency(r.TotalCost ?? 0),\n Time: this.formatRelativeTime(r.StartedAt)\n }));\n }\n\n private sortRecentRuns(): void {\n const dir = this.SortDir === 'asc' ? 1 : -1;\n this.RecentRuns.sort((a, b) => {\n switch (this.SortField) {\n case 'Agent': return dir * a.Agent.localeCompare(b.Agent);\n case 'Status': return dir * a.Status.localeCompare(b.Status);\n case 'StepCount': return dir * (a.StepCount - b.StepCount);\n case 'Duration': return dir * a.Duration.localeCompare(b.Duration);\n case 'Cost': return dir * a.Cost.localeCompare(b.Cost);\n case 'Time': return dir * a.Time.localeCompare(b.Time);\n default: return 0;\n }\n });\n }\n\n // ── Helpers ──\n\n private buildDateFilter(field: string): string {\n const now = new Date();\n const ms = this.timeRangeToMs(this.TimeRange);\n const start = new Date(now.getTime() - ms);\n return `${field} >= '${start.toISOString()}'`;\n }\n\n private buildAgentFilter(): string {\n if (this.Filters.Agents.length === 0) return '';\n const ids = this.Filters.Agents.map(id => `'${id}'`).join(',');\n return `AgentID IN (${ids})`;\n }\n\n private buildStatusFilter(): string {\n if (this.Filters.Statuses.length === 0) return '';\n const values = this.Filters.Statuses.map(s => `'${s}'`).join(',');\n return `Status IN (${values})`;\n }\n\n private timeRangeToMs(range: string): number {\n const map: Record<string, number> = {\n '1h': 3600000,\n '6h': 21600000,\n '24h': 86400000,\n '7d': 604800000,\n '30d': 2592000000\n };\n return map[range] ?? 604800000;\n }\n\n private getStatusClass(status: string): string {\n return 'status-pill status-' + status.toLowerCase().replace(/\\s+/g, '');\n }\n\n private formatDuration(startStr: string, endStr: string | null): string {\n if (!endStr) return '--';\n const ms = new Date(endStr).getTime() - new Date(startStr).getTime();\n if (ms < 1000) return ms + 'ms';\n if (ms < 60000) return (ms / 1000).toFixed(1) + 's';\n return (ms / 60000).toFixed(1) + 'm';\n }\n\n private formatRelativeTime(dateStr: string): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diffMs = now - then;\n const diffMin = Math.floor(diffMs / 60000);\n if (diffMin < 1) return 'just now';\n if (diffMin < 60) return diffMin + 'm ago';\n const diffHr = Math.floor(diffMin / 60);\n if (diffHr < 24) return diffHr + 'h ago';\n const diffDay = Math.floor(diffHr / 24);\n return diffDay + 'd ago';\n }\n}\n\nexport function LoadAnalyticsAgentRuns() { /* tree-shaking prevention */ }\n"]}