@memberjunction/ng-dashboards 5.38.0 → 5.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. package/README.md +14 -7
  2. package/dist/AI/components/agents/agent-configuration.component.js +199 -198
  3. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  4. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  5. package/dist/AI/components/analytics/ai-analytics-resource.component.js +20 -17
  6. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  7. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +15 -0
  8. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
  9. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +166 -58
  10. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
  11. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
  12. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +2 -1
  13. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
  14. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +1 -0
  15. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
  16. package/dist/AI/components/analytics/model-performance/model-performance.component.js +55 -36
  17. package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
  18. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +9 -1
  19. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  20. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +158 -117
  21. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  22. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +1 -0
  23. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
  24. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +22 -8
  25. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
  26. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +217 -860
  27. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  28. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1717 -7802
  29. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  30. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts +56 -0
  31. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts.map +1 -0
  32. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js +423 -0
  33. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js.map +1 -0
  34. package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts +70 -0
  35. package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts.map +1 -0
  36. package/dist/AI/components/autotagging/components/classify-item-grid.component.js +308 -0
  37. package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -0
  38. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts +29 -0
  39. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -0
  40. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +186 -0
  41. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -0
  42. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts +69 -0
  43. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts.map +1 -0
  44. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js +278 -0
  45. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js.map +1 -0
  46. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts +73 -0
  47. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts.map +1 -0
  48. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js +393 -0
  49. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js.map +1 -0
  50. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts +122 -0
  51. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts.map +1 -0
  52. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js +908 -0
  53. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js.map +1 -0
  54. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts +87 -0
  55. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts.map +1 -0
  56. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js +475 -0
  57. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js.map +1 -0
  58. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts +29 -0
  59. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts.map +1 -0
  60. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js +208 -0
  61. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js.map +1 -0
  62. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts +21 -0
  63. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts.map +1 -0
  64. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js +70 -0
  65. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js.map +1 -0
  66. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +333 -0
  67. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -0
  68. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +2125 -0
  69. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -0
  70. package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts +61 -0
  71. package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts.map +1 -0
  72. package/dist/AI/components/autotagging/shared/classify.dryrun.js +78 -0
  73. package/dist/AI/components/autotagging/shared/classify.dryrun.js.map +1 -0
  74. package/dist/AI/components/autotagging/shared/classify.format.d.ts +58 -0
  75. package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -0
  76. package/dist/AI/components/autotagging/shared/classify.format.js +260 -0
  77. package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -0
  78. package/dist/AI/components/autotagging/shared/classify.types.d.ts +319 -0
  79. package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -0
  80. package/dist/AI/components/autotagging/shared/classify.types.js +6 -0
  81. package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -0
  82. package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts +103 -0
  83. package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts.map +1 -0
  84. package/dist/AI/components/autotagging/tabs/health-tab.component.js +571 -0
  85. package/dist/AI/components/autotagging/tabs/health-tab.component.js.map +1 -0
  86. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +77 -0
  87. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -0
  88. package/dist/AI/components/autotagging/tabs/history-tab.component.js +519 -0
  89. package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -0
  90. package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts +107 -0
  91. package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts.map +1 -0
  92. package/dist/AI/components/autotagging/tabs/inbox-tab.component.js +719 -0
  93. package/dist/AI/components/autotagging/tabs/inbox-tab.component.js.map +1 -0
  94. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +131 -0
  95. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -0
  96. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +813 -0
  97. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -0
  98. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +177 -0
  99. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -0
  100. package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1465 -0
  101. package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -0
  102. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +78 -0
  103. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -0
  104. package/dist/AI/components/autotagging/tabs/tags-tab.component.js +492 -0
  105. package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -0
  106. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts +397 -0
  107. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts.map +1 -0
  108. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js +3490 -0
  109. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js.map +1 -0
  110. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +56 -0
  111. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -0
  112. package/dist/AI/components/autotagging/tabs/types-tab.component.js +271 -0
  113. package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -0
  114. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +3 -0
  115. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  116. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +306 -290
  117. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  118. package/dist/AI/components/execution-monitoring.component.js +1 -1
  119. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  120. package/dist/AI/components/models/model-management.component.js +209 -208
  121. package/dist/AI/components/models/model-management.component.js.map +1 -1
  122. package/dist/AI/components/prompts/prompt-management.component.js +130 -128
  123. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  124. package/dist/AI/components/requests/agent-requests-resource.component.js +61 -61
  125. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  126. package/dist/AI/components/system/system-configuration.component.js +17 -17
  127. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  128. package/dist/AI/components/tags/tags-resource.component.d.ts +1 -0
  129. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  130. package/dist/AI/components/tags/tags-resource.component.js +578 -538
  131. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  132. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +3 -0
  133. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  134. package/dist/AI/components/vectors/vector-management-resource.component.js +331 -303
  135. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  136. package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
  137. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  138. package/dist/AI/services/ai-instrumentation.service.js +14 -2
  139. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  140. package/dist/AI/services/cache-metrics.d.ts +50 -0
  141. package/dist/AI/services/cache-metrics.d.ts.map +1 -0
  142. package/dist/AI/services/cache-metrics.js +43 -0
  143. package/dist/AI/services/cache-metrics.js.map +1 -0
  144. package/dist/APIKeys/api-applications-panel.component.js +2 -2
  145. package/dist/APIKeys/api-key-create-dialog.component.js +2 -2
  146. package/dist/APIKeys/api-key-edit-panel.component.js +2 -2
  147. package/dist/APIKeys/api-keys-resource.component.js +132 -131
  148. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  149. package/dist/Actions/components/actions-overview.component.js +141 -141
  150. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  151. package/dist/Actions/components/execution-monitoring.component.js +15 -15
  152. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  153. package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -5
  154. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  155. package/dist/Actions/components/explorer/action-explorer.component.js +139 -212
  156. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  157. package/dist/Admin/admin-data-schema.component.js +2 -2
  158. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  159. package/dist/Admin/admin-dev-tools-resource.component.js +2 -2
  160. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  161. package/dist/Admin/admin-identity-access.component.js +2 -2
  162. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  163. package/dist/Admin/admin-monitoring.component.js +2 -2
  164. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  165. package/dist/ApplicationRoles/application-roles-resource.component.js +54 -49
  166. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  167. package/dist/Communication/communication-logs-resource.component.d.ts +6 -0
  168. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  169. package/dist/Communication/communication-logs-resource.component.js +72 -50
  170. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  171. package/dist/Communication/communication-monitor-resource.component.js +103 -102
  172. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  173. package/dist/Communication/communication-providers-resource.component.js +52 -51
  174. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  175. package/dist/Communication/communication-runs-resource.component.js +39 -38
  176. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  177. package/dist/Communication/communication-templates-resource.component.d.ts +6 -0
  178. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  179. package/dist/Communication/communication-templates-resource.component.js +92 -89
  180. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  181. package/dist/Credentials/components/credentials-audit-resource.component.js +136 -135
  182. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  183. package/dist/Credentials/components/credentials-categories-resource.component.js +155 -152
  184. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  185. package/dist/Credentials/components/credentials-list-resource.component.js +119 -118
  186. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  187. package/dist/Credentials/components/credentials-overview-resource.component.js +129 -128
  188. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  189. package/dist/Credentials/components/credentials-types-resource.component.js +107 -106
  190. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  191. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +31 -340
  192. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  193. package/dist/DataExplorer/data-explorer-dashboard.component.js +468 -1958
  194. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  195. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  196. package/dist/DataExplorer/data-explorer-resource.component.js +10 -0
  197. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  198. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +1 -1
  199. package/dist/DatabaseDesigner/components/entity-list.component.js +115 -114
  200. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  201. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +5 -6
  202. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  203. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +4 -5
  204. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  205. package/dist/DevTools/app-state-inspector.component.js +18 -17
  206. package/dist/DevTools/app-state-inspector.component.js.map +1 -1
  207. package/dist/DevTools/class-registry.component.js +88 -85
  208. package/dist/DevTools/class-registry.component.js.map +1 -1
  209. package/dist/DevTools/event-monitor.component.js +155 -150
  210. package/dist/DevTools/event-monitor.component.js.map +1 -1
  211. package/dist/DevTools/graphql-console.component.js +245 -243
  212. package/dist/DevTools/graphql-console.component.js.map +1 -1
  213. package/dist/DevTools/layout-inspector.component.js +18 -17
  214. package/dist/DevTools/layout-inspector.component.js.map +1 -1
  215. package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -19
  216. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  217. package/dist/Home/home-dashboard.component.js +2 -2
  218. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  219. package/dist/Integration/components/activity/activity.component.js +236 -229
  220. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  221. package/dist/Integration/components/connections/connections.component.js +390 -389
  222. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  223. package/dist/Integration/components/overview/overview.component.js +2 -2
  224. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
  225. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +14 -11
  226. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  227. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +27 -2
  228. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
  229. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +244 -119
  230. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  231. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +293 -291
  232. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  233. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +62 -61
  234. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  235. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts +65 -0
  236. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts.map +1 -0
  237. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js +176 -0
  238. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js.map +1 -0
  239. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts +81 -0
  240. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts.map +1 -0
  241. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js +308 -0
  242. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js.map +1 -0
  243. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts +85 -0
  244. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts.map +1 -0
  245. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js +362 -0
  246. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js.map +1 -0
  247. package/dist/KnowledgeHub/index.d.ts +3 -0
  248. package/dist/KnowledgeHub/index.d.ts.map +1 -1
  249. package/dist/KnowledgeHub/index.js +3 -0
  250. package/dist/KnowledgeHub/index.js.map +1 -1
  251. package/dist/Lists/components/lists-browse-resource.component.d.ts +6 -2
  252. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  253. package/dist/Lists/components/lists-browse-resource.component.js +525 -566
  254. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  255. package/dist/Lists/components/lists-categories-resource.component.js +135 -134
  256. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  257. package/dist/Lists/components/lists-my-lists-resource.component.js +199 -198
  258. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  259. package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
  260. package/dist/MCP/mcp-dashboard.component.js +443 -438
  261. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  262. package/dist/QueryBrowser/query-browser-resource.component.js +1 -1
  263. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  264. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
  265. package/dist/Scheduling/components/scheduling-activity.component.js +146 -147
  266. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  267. package/dist/Scheduling/components/scheduling-jobs.component.js +76 -75
  268. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  269. package/dist/Scheduling/components/scheduling-overview.component.js +97 -96
  270. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  271. package/dist/Scheduling/scheduling-dashboard.component.js +24 -22
  272. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  273. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +2 -0
  274. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  275. package/dist/Scheduling/services/scheduling-instrumentation.service.js +1 -0
  276. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  277. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
  278. package/dist/Testing/components/testing-explorer.component.d.ts +14 -4
  279. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  280. package/dist/Testing/components/testing-explorer.component.js +436 -427
  281. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  282. package/dist/Testing/components/testing-runs-resource.component.js +1 -1
  283. package/dist/Testing/components/testing-runs.component.js +116 -115
  284. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  285. package/dist/Testing/testing-dashboard.component.js +6 -7
  286. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  287. package/dist/VersionHistory/components/labels-resource.component.js +173 -172
  288. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  289. package/dist/VersionHistory/components/restore-resource.component.d.ts +6 -0
  290. package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
  291. package/dist/VersionHistory/components/restore-resource.component.js +116 -92
  292. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  293. package/dist/ai-dashboards.module.d.ts +57 -35
  294. package/dist/ai-dashboards.module.d.ts.map +1 -1
  295. package/dist/ai-dashboards.module.js +80 -1
  296. package/dist/ai-dashboards.module.js.map +1 -1
  297. package/dist/communication-dashboards.module.d.ts +1 -1
  298. package/dist/communication-dashboards.module.d.ts.map +1 -1
  299. package/dist/communication-dashboards.module.js +7 -1
  300. package/dist/communication-dashboards.module.js.map +1 -1
  301. package/dist/data-explorer-dashboards.module.d.ts +12 -14
  302. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  303. package/dist/data-explorer-dashboards.module.js +5 -14
  304. package/dist/data-explorer-dashboards.module.js.map +1 -1
  305. package/dist/public-api.d.ts +3 -0
  306. package/dist/public-api.d.ts.map +1 -1
  307. package/dist/public-api.js +3 -0
  308. package/dist/public-api.js.map +1 -1
  309. package/dist/testing-dashboards.module.d.ts +4 -5
  310. package/dist/testing-dashboards.module.d.ts.map +1 -1
  311. package/dist/testing-dashboards.module.js +7 -5
  312. package/dist/testing-dashboards.module.js.map +1 -1
  313. package/package.json +57 -54
  314. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts +0 -79
  315. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts.map +0 -1
  316. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +0 -195
  317. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +0 -1
  318. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +0 -226
  319. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +0 -1
  320. package/dist/DataExplorer/components/view-selector/view-selector.component.js +0 -861
  321. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +0 -1
@@ -15,6 +15,8 @@ export interface PromptRunRecord {
15
15
  TokensUsed: number | null;
16
16
  TokensPrompt: number | null;
17
17
  TokensCompletion: number | null;
18
+ TokensCacheRead: number | null;
19
+ TokensCacheWrite: number | null;
18
20
  ExecutionTimeMS: number | null;
19
21
  ModelID: string | null;
20
22
  Model: string | null;
@@ -48,6 +50,7 @@ export interface DashboardKPIs {
48
50
  topAgent: string;
49
51
  errorRate: number;
50
52
  dailyCostBurn: number;
53
+ cacheHitRate: number;
51
54
  }
52
55
  export interface TrendData {
53
56
  timestamp: Date;
@@ -131,6 +134,8 @@ export declare class AIInstrumentationService {
131
134
  */
132
135
  private loadAllData;
133
136
  private computeKPIs;
137
+ /** Share of input tokens served from the provider's prompt cache across the period's prompt runs. */
138
+ private calculateCacheHitRate;
134
139
  private computeTrends;
135
140
  private computeLiveExecutions;
136
141
  private computeChartData;
@@ -1 +1 @@
1
- {"version":3,"file":"ai-instrumentation.service.d.ts","sourceRoot":"","sources":["../../../src/AI/services/ai-instrumentation.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-instrumentation.service.d.ts","sourceRoot":"","sources":["../../../src/AI/services/ai-instrumentation.service.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ import * as i0 from "@angular/core";
6
6
  /** Fields to request for prompt runs — only what the dashboard needs for aggregation */
7
7
  const PROMPT_RUN_FIELDS = [
8
8
  'ID', 'RunAt', 'CompletedAt', 'Success', 'Cost', 'TokensUsed',
9
- 'TokensPrompt', 'TokensCompletion', 'ExecutionTimeMS',
9
+ 'TokensPrompt', 'TokensCompletion', 'TokensCacheRead', 'TokensCacheWrite', 'ExecutionTimeMS',
10
10
  'ModelID', 'Model', 'AgentID', 'Agent', 'Prompt', 'ErrorMessage'
11
11
  ];
12
12
  /** Fields to request for agent runs — only what the dashboard needs for aggregation */
@@ -112,9 +112,21 @@ export class AIInstrumentationService {
112
112
  topModel: this.getTopModel(promptRuns),
113
113
  topAgent: this.getTopAgent(agentRuns),
114
114
  errorRate: 1 - successRate,
115
- dailyCostBurn: this.calculateDailyCostBurn(promptRuns, agentRuns)
115
+ dailyCostBurn: this.calculateDailyCostBurn(promptRuns, agentRuns),
116
+ cacheHitRate: this.calculateCacheHitRate(promptRuns)
116
117
  };
117
118
  }
119
+ /** Share of input tokens served from the provider's prompt cache across the period's prompt runs. */
120
+ calculateCacheHitRate(promptRuns) {
121
+ let uncached = 0, read = 0, write = 0;
122
+ for (const r of promptRuns) {
123
+ uncached += r.TokensPrompt || 0;
124
+ read += r.TokensCacheRead || 0;
125
+ write += r.TokensCacheWrite || 0;
126
+ }
127
+ const totalInput = uncached + read + write;
128
+ return totalInput > 0 ? read / totalInput : 0;
129
+ }
118
130
  // ─── Trend Computation ────────────────────────────────────────────
119
131
  computeTrends(promptRuns, agentRuns) {
120
132
  const { start, end } = this._dateRange$.value;
@@ -1 +1 @@
1
- {"version":3,"file":"ai-instrumentation.service.js","sourceRoot":"","sources":["../../../src/AI/services/ai-instrumentation.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAqB,MAAM,sBAAsB,CAAC;;AAuC5E,wFAAwF;AACxF,MAAM,iBAAiB,GAAG;IACxB,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY;IAC7D,cAAc,EAAE,kBAAkB,EAAE,iBAAiB;IACrD,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc;CACjE,CAAC;AAEF,uFAAuF;AACvF,MAAM,gBAAgB,GAAG;IACvB,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS;IACrD,WAAW,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc;CACnE,CAAC;AAyEF,MAAM,OAAO,wBAAwB;IAC3B,SAAS,GAA6B,IAAI,CAAC;IAEnD,sGAAsG;IACtG,IAAW,QAAQ,CAAC,KAA+B;QAC/C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC;IAC/C,CAAC;IAEgB,WAAW,GAAG,IAAI,eAAe,CAA6B;QAC7E,KAAK,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,gBAAgB;QACnE,GAAG,EAAE,IAAI,IAAI,EAAE;KAChB,CAAC,CAAC;IAEc,gBAAgB,GAAG,IAAI,eAAe,CAAS,CAAC,CAAC,CAAC;IAClD,WAAW,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC,CAAC;IAEnE,qCAAqC;IAC5B,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;IAEtD,gBAAe,CAAC;IAEhB;;;OAGG;IACc,QAAQ,GAAG,aAAa,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CACvF,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EACtC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,EACzC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EACvC,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;IAEF,mEAAmE;IAC1D,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CACjC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAC9D,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;IAEO,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CACnC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAChE,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;IAEO,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAC3C,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,EAChF,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;IAEO,UAAU,GAAG,aAAa,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CACrE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,EACzF,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;IAEF,YAAY,CAAC,KAAW,EAAE,GAAS;QACjC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,OAAO;QACL,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,WAAW;QACvB,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAE3D,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,CAAC,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAmC;YAC7H;gBACE,UAAU,EAAE,oBAAoB;gBAChC,WAAW,EAAE,aAAa,KAAK,CAAC,WAAW,EAAE,mBAAmB,GAAG,CAAC,WAAW,EAAE,GAAG;gBACpF,MAAM,EAAE,iBAAiB;gBACzB,UAAU,EAAE,QAAQ;aACrB;YACD;gBACE,UAAU,EAAE,mBAAmB;gBAC/B,WAAW,EAAE,iBAAiB,KAAK,CAAC,WAAW,EAAE,uBAAuB,GAAG,CAAC,WAAW,EAAE,GAAG;gBAC5F,MAAM,EAAE,gBAAgB;gBACxB,UAAU,EAAE,QAAQ;aACrB;YACD;gBACE,UAAU,EAAE,oBAAoB;gBAChC,WAAW,EAAE,aAAa,UAAU,CAAC,WAAW,EAAE,GAAG;gBACrD,OAAO,EAAE,YAAY;gBACrB,MAAM,EAAE,iBAAiB;gBACzB,UAAU,EAAE,QAAQ;aACrB;YACD;gBACE,UAAU,EAAE,mBAAmB;gBAC/B,WAAW,EAAE,iBAAiB,UAAU,CAAC,WAAW,EAAE,GAAG;gBACzD,OAAO,EAAE,gBAAgB;gBACzB,MAAM,EAAE,gBAAgB;gBACxB,UAAU,EAAE,QAAQ;aACrB;SACF,CAAC,CAAC;QAEH,OAAO;YACL,UAAU,EAAE,aAAa,CAAC,OAA4B;YACtD,SAAS,EAAE,YAAY,CAAC,OAA2B;YACnD,cAAc,EAAE,iBAAiB,CAAC,OAA4B;YAC9D,aAAa,EAAE,gBAAgB,CAAC,OAA2B;SAC5D,CAAC;IACJ,CAAC;IAED,oEAAoE;IAE5D,WAAW,CAAC,UAA6B,EAAE,SAA2B;QAC5E,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAC7D,MAAM,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAC1D,MAAM,gBAAgB,GAAG,IAAI,CAAC,6BAA6B,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACnF,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAErE,OAAO;YACL,eAAe;YACf,gBAAgB;YAChB,SAAS;YACT,YAAY,EAAE,KAAK;YACnB,gBAAgB;YAChB,WAAW;YACX,WAAW;YACX,YAAY,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC3D,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YACtC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;YACrC,SAAS,EAAE,CAAC,GAAG,WAAW;YAC1B,aAAa,EAAE,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE,SAAS,CAAC;SAClE,CAAC;IACJ,CAAC;IAED,qEAAqE;IAE7D,aAAa,CAAC,UAA6B,EAAE,SAA2B;QAC9E,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAE3D,OAAO,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YAChC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC,CAAC;YAC5D,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;gBAC1C,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBAChC,OAAO,KAAK,IAAI,MAAM,IAAI,KAAK,GAAG,SAAS,CAAC;YAC9C,CAAC,CAAC,CAAC;YACH,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;gBACxC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACxC,OAAO,SAAS,IAAI,MAAM,IAAI,SAAS,GAAG,SAAS,CAAC;YACtD,CAAC,CAAC,CAAC;YAEH,OAAO;gBACL,SAAS,EAAE,MAAM;gBACjB,UAAU,EAAE,aAAa,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM;gBACtD,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAC;gBAChD,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,YAAY,CAAC;gBACnD,OAAO,EAAE,IAAI,CAAC,6BAA6B,CAAC,aAAa,EAAE,YAAY,CAAC;gBACxE,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,YAAY,CAAC;aACtD,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,qEAAqE;IAE7D,qBAAqB,CAAC,UAA6B,EAAE,SAA2B;QACtF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,cAAc,GAAoB,EAAE,CAAC;QAE3C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,CAAC;YAC5D,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW;gBAC9B,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE;gBACrE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;YAElD,cAAc,CAAC,IAAI,CAAC;gBAClB,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,GAAG,CAAC,MAAM,IAAI,gBAAgB;gBACpC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;gBACtE,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC9B,QAAQ;gBACR,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC;gBACnB,MAAM,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC;gBAC3B,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,QAAQ,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG;aACnE,CAAC,CAAC;QACL,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC;YAC3C,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW;gBAC9B,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;gBACzE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;YAEtD,cAAc,CAAC,IAAI,CAAC;gBAClB,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,GAAG,CAAC,KAAK,IAAI,eAAe;gBAClC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW,EAAwC;gBACtE,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;gBAClC,QAAQ;gBACR,IAAI,EAAE,GAAG,CAAC,SAAS,IAAI,CAAC;gBACxB,MAAM,EAAE,GAAG,CAAC,eAAe,IAAI,CAAC;gBAChC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,QAAQ,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG;aACnE,CAAC,CAAC;QACL,CAAC;QAED,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,qEAAqE;IAE7D,gBAAgB,CAAC,UAA6B,EAAE,eAA4B;QAClF,OAAO;YACL,eAAe;YACf,WAAW,EAAE,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC;YAChD,iBAAiB,EAAE,IAAI,CAAC,wBAAwB,CAAC,UAAU,CAAC;YAC5D,eAAe,EAAE,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC;SACzD,CAAC;IACJ,CAAC;IAED,qEAAqE;IAE7D,qBAAqB,CAAC,UAA6B,EAAE,SAA2B;QACtF,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC;QAC3F,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QAC1E,OAAO,aAAa,GAAG,YAAY,CAAC;IACtC,CAAC;IAEO,QAAQ,CAAC,UAA6B,EAAE,SAA2B;QACzE,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzE,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5E,OAAO,UAAU,GAAG,SAAS,CAAC;IAChC,CAAC;IAEO,SAAS,CAAC,UAA6B,EAAE,SAA2B;QAC1E,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjF,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpF,OAAO,YAAY,GAAG,WAAW,CAAC;IACpC,CAAC;IAEO,6BAA6B,CAAC,UAA6B,EAAE,SAA2B;QAC9F,MAAM,WAAW,GAAG,UAAU;aAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAgB,CAAC,CAAC;QAEhC,MAAM,UAAU,GAAG,SAAS;aACzB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,WAAW,CAAC;aACzC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,WAAY,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAElF,MAAM,QAAQ,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,UAAU,CAAC,CAAC;QACjD,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACnG,CAAC;IAEO,oBAAoB,CAAC,UAA6B,EAAE,SAA2B;QACrF,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAC7D,IAAI,eAAe,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAEpC,MAAM,iBAAiB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QACnE,MAAM,gBAAgB,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAEjE,OAAO,CAAC,iBAAiB,GAAG,gBAAgB,CAAC,GAAG,eAAe,CAAC;IAClE,CAAC;IAEO,WAAW,CAAC,UAA6B,EAAE,SAA2B;QAC5E,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAC/D,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAC7D,OAAO,YAAY,GAAG,WAAW,CAAC;IACpC,CAAC;IAEO,sBAAsB,CAAC,UAA6B,EAAE,SAA2B;QACvF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAE5E,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC;QAC3E,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,CAAC;QAE7E,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAClD,CAAC;IAEO,eAAe,CAAC,KAAW,EAAE,GAAS;QAC5C,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACnE,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAQ,SAAS;QACxD,IAAI,KAAK,IAAI,EAAE,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,UAAU;QAC1D,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAsB,WAAW;IAC9D,CAAC;IAEO,mBAAmB,CAAC,KAAW,EAAE,GAAS;QAChD,MAAM,OAAO,GAAW,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAEnE,IAAI,UAAkB,CAAC;QACvB,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;YAChB,UAAU,GAAG,CAAC,CAAC;YACf,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YAC3B,UAAU,GAAG,CAAC,CAAC;YACf,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,EAAE,CAAC;YAChB,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/B,CAAC;QAED,OAAO,OAAO,GAAG,GAAG,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,UAAU,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,WAAW,CAAC,UAA6B;QAC/C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC9C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE7C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC7B,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACtE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAED,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAEzC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;aACjD,IAAI,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAErC,OAAO,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,eAAe,CAAC;IACvD,CAAC;IAEO,WAAW,CAAC,SAA2B;QAC7C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC9C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE7C,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC7B,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACtE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAED,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAEzC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;aACjD,IAAI,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAErC,OAAO,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,eAAe,CAAC;IACvD,CAAC;IAEO,kBAAkB,CAAC,UAA6B;QACtD,MAAM,UAAU,GAAG,IAAI,GAAG,EAA0D,CAAC;QAErF,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;gBACxF,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;gBAC/B,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC;gBACvC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;aACnC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;aAC7E,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAEO,wBAAwB,CAAC,UAA6B;QAC5D,MAAM,YAAY,GAAG,IAAI,GAAG,EAAuG,CAAC;QAEpI,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;gBACtD,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC5C,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI;oBACxC,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;oBACjC,SAAS,EAAE,GAAG,CAAC,KAAK,IAAI,eAAe;oBACvC,SAAS,EAAE,GAAG,CAAC,KAAK,IAAI,eAAe;iBACxC,CAAC;gBAEF,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBACzC,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC;gBACpB,IAAI,GAAG,CAAC,OAAO;oBAAE,QAAQ,CAAC,SAAS,IAAI,CAAC,CAAC;gBACzC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpD,KAAK,EAAE,IAAI,CAAC,SAAS;YACrB,KAAK,EAAE,IAAI,CAAC,SAAS;YACrB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM;YAC5E,WAAW,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK;SACzC,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,sBAAsB,CAAC,UAA6B;QAC1D,MAAM,eAAe,GAAG,IAAI,GAAG,EAAyE,CAAC;QAEzG,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,gBAAgB,EAAE,CAAC;gBACzE,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;gBACvG,QAAQ,CAAC,KAAK,IAAI,GAAG,CAAC,YAAY,CAAC;gBACnC,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC,gBAAgB,CAAC;gBACxC,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;gBAC/B,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvD,WAAW,EAAE,IAAI,CAAC,KAAK;YACvB,YAAY,EAAE,IAAI,CAAC,MAAM;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,IAAI;SACjB,CAAC,CAAC,CAAC;IACN,CAAC;IAED,qEAAqE;IAErE,KAAK,CAAC,mBAAmB,CAAC,WAAmB,EAAE,IAAwB;QACrE,IAAI,CAAC;YACH,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,OAAO,MAAM,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACN,OAAO,MAAM,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;YACzD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,yBAAyB,CAAC,WAAmB;QACzD,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAkB;YAClE;gBACE,UAAU,EAAE,oBAAoB;gBAChC,WAAW,EAAE,SAAS,WAAW,GAAG;gBACpC,MAAM,EAAE,iBAAiB;gBACzB,UAAU,EAAE,QAAQ;aACrB;YACD;gBACE,UAAU,EAAE,oBAAoB;gBAChC,WAAW,EAAE,eAAe,WAAW,GAAG;gBAC1C,MAAM,EAAE,iBAAiB;gBACzB,UAAU,EAAE,QAAQ;aACrB;SACF,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAElD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAC9E,CAAC;QAEF,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,GAAG,CAAC,MAAM,IAAI,gBAAgB;YACpC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ;YAC5C,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAC9B,OAAO,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;YAChE,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC;YACnB,MAAM,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC;YAC3B,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,KAAK;YAC7B,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS;YAC3C,QAAQ;YACR,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,SAAS;SAC9B,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,wBAAwB,CAAC,UAAkB;QACvD,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAiB;YACjE;gBACE,UAAU,EAAE,mBAAmB;gBAC/B,WAAW,EAAE,SAAS,UAAU,GAAG;gBACnC,MAAM,EAAE,gBAAgB;gBACxB,UAAU,EAAE,QAAQ;aACrB;YACD;gBACE,UAAU,EAAE,mBAAmB;gBAC/B,WAAW,EAAE,kBAAkB,UAAU,GAAG;gBAC5C,MAAM,EAAE,gBAAgB;gBACxB,UAAU,EAAE,QAAQ;aACrB;SACF,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAEjD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAC7E,CAAC;QAEF,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,GAAG,CAAC,KAAK,IAAI,eAAe;YAClC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE;YAChC,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;YAClC,OAAO,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;YAChE,IAAI,EAAE,GAAG,CAAC,SAAS,IAAI,CAAC;YACxB,MAAM,EAAE,GAAG,CAAC,eAAe,IAAI,CAAC;YAChC,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,KAAK;YAC7B,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS;YAC3C,QAAQ,EAAE,SAAS;YACnB,QAAQ;SACT,CAAC;IACJ,CAAC;kHAhgBU,wBAAwB;gEAAxB,wBAAwB,WAAxB,wBAAwB,mBAFvB,MAAM;;iFAEP,wBAAwB;cAHpC,UAAU;eAAC;gBACV,UAAU,EAAE,MAAM;aACnB","sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject, from, combineLatest } from 'rxjs';\nimport { switchMap, shareReplay, tap, map } from 'rxjs/operators';\nimport { RunView, Metadata, IMetadataProvider } from '@memberjunction/core';\n\n/**\n * Lightweight record types for dashboard aggregation.\n * We use ResultType: 'simple' with explicit Fields to avoid pulling\n * large text columns (InputData, OutputData, etc.) that can blow up\n * the GraphQL response beyond V8's string limit.\n */\nexport interface PromptRunRecord {\n ID: string;\n RunAt: string;\n CompletedAt: string | null;\n Success: boolean;\n Cost: number | null;\n TokensUsed: number | null;\n TokensPrompt: number | null;\n TokensCompletion: number | null;\n ExecutionTimeMS: number | null;\n ModelID: string | null;\n Model: string | null;\n AgentID: string | null;\n Agent: string | null;\n Prompt: string | null;\n ErrorMessage: string | null;\n}\n\nexport interface AgentRunRecord {\n ID: string;\n StartedAt: string;\n CompletedAt: string | null;\n Status: string;\n Success: boolean;\n TotalCost: number | null;\n TotalTokensUsed: number | null;\n AgentID: string | null;\n Agent: string | null;\n ErrorMessage: string | null;\n}\n\n/** Fields to request for prompt runs — only what the dashboard needs for aggregation */\nconst PROMPT_RUN_FIELDS = [\n 'ID', 'RunAt', 'CompletedAt', 'Success', 'Cost', 'TokensUsed',\n 'TokensPrompt', 'TokensCompletion', 'ExecutionTimeMS',\n 'ModelID', 'Model', 'AgentID', 'Agent', 'Prompt', 'ErrorMessage'\n];\n\n/** Fields to request for agent runs — only what the dashboard needs for aggregation */\nconst AGENT_RUN_FIELDS = [\n 'ID', 'StartedAt', 'CompletedAt', 'Status', 'Success',\n 'TotalCost', 'TotalTokensUsed', 'AgentID', 'Agent', 'ErrorMessage'\n];\n\nexport interface DashboardKPIs {\n totalExecutions: number;\n activeExecutions: number;\n totalCost: number;\n costCurrency: string;\n avgExecutionTime: number;\n successRate: number;\n totalTokens: number;\n costPerToken: number;\n topModel: string;\n topAgent: string;\n errorRate: number;\n dailyCostBurn: number;\n}\n\nexport interface TrendData {\n timestamp: Date;\n executions: number;\n cost: number;\n tokens: number;\n avgTime: number;\n errors: number;\n}\n\nexport interface LiveExecution {\n id: string;\n type: 'prompt' | 'agent';\n name: string;\n status: 'running' | 'completed' | 'failed';\n startTime: Date;\n duration?: number;\n cost?: number;\n tokens?: number;\n progress?: number;\n}\n\nexport interface ExecutionDetails {\n id: string;\n type: 'prompt' | 'agent';\n name: string;\n status: string;\n startTime: Date;\n endTime?: Date;\n cost: number;\n tokens: number;\n success: boolean;\n errorMessage?: string;\n parentId?: string;\n children: ExecutionDetails[];\n model?: string;\n vendor?: string;\n}\n\nexport interface ChartData {\n executionTrends: TrendData[];\n costByModel: { model: string; cost: number; tokens: number }[];\n performanceMatrix: { agent: string; model: string; avgTime: number; successRate: number }[];\n tokenEfficiency: { inputTokens: number; outputTokens: number; cost: number; model: string }[];\n}\n\n/** Internal shape for the single data load that all derived streams share */\ninterface DashboardRawData {\n promptRuns: PromptRunRecord[];\n agentRuns: AgentRunRecord[];\n livePromptRuns: PromptRunRecord[];\n liveAgentRuns: AgentRunRecord[];\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AIInstrumentationService {\n private _provider: IMetadataProvider | null = null;\n\n /** Set the metadata provider this service should use. Components should call this after injection. */\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n private readonly _dateRange$ = new BehaviorSubject<{ start: Date; end: Date }>({\n start: new Date(Date.now() - 24 * 60 * 60 * 1000), // Last 24 hours\n end: new Date()\n });\n\n private readonly _refreshTrigger$ = new BehaviorSubject<number>(0);\n private readonly _isLoading$ = new BehaviorSubject<boolean>(false);\n\n // Expose loading state as observable\n readonly isLoading$ = this._isLoading$.asObservable();\n\n constructor() {}\n\n /**\n * Single data load: fetches prompt runs and agent runs ONCE per refresh/date-range change.\n * All downstream streams derive from this shared dataset.\n */\n private readonly rawData$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(\n tap(() => this._isLoading$.next(true)),\n switchMap(() => from(this.loadAllData())),\n tap(() => this._isLoading$.next(false)),\n shareReplay(1)\n );\n\n // Derived streams — pure in-memory transforms, no extra DB queries\n readonly kpis$ = this.rawData$.pipe(\n map(data => this.computeKPIs(data.promptRuns, data.agentRuns)),\n shareReplay(1)\n );\n\n readonly trends$ = this.rawData$.pipe(\n map(data => this.computeTrends(data.promptRuns, data.agentRuns)),\n shareReplay(1)\n );\n\n readonly liveExecutions$ = this.rawData$.pipe(\n map(data => this.computeLiveExecutions(data.livePromptRuns, data.liveAgentRuns)),\n shareReplay(1)\n );\n\n readonly chartData$ = combineLatest([this.rawData$, this.trends$]).pipe(\n map(([data, executionTrends]) => this.computeChartData(data.promptRuns, executionTrends)),\n shareReplay(1)\n );\n\n setDateRange(start: Date, end: Date): void {\n this._dateRange$.next({ start, end });\n }\n\n refresh(): void {\n this._refreshTrigger$.next(this._refreshTrigger$.value + 1);\n }\n\n /**\n * Single batch query that loads all data needed by every dashboard widget.\n * Uses ResultType: 'simple' with explicit Fields to minimize payload size.\n */\n private async loadAllData(): Promise<DashboardRawData> {\n const { start, end } = this._dateRange$.value;\n const now = new Date();\n const recentTime = new Date(now.getTime() - 5 * 60 * 1000);\n\n const rv = RunView.FromMetadataProvider(this.Provider);\n const [promptResults, agentResults, livePromptResults, liveAgentResults] = await rv.RunViews<PromptRunRecord | AgentRunRecord>([\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `RunAt >= '${start.toISOString()}' AND RunAt <= '${end.toISOString()}'`,\n Fields: PROMPT_RUN_FIELDS,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,\n Fields: AGENT_RUN_FIELDS,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `RunAt >= '${recentTime.toISOString()}'`,\n OrderBy: 'RunAt DESC',\n Fields: PROMPT_RUN_FIELDS,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `StartedAt >= '${recentTime.toISOString()}'`,\n OrderBy: 'StartedAt DESC',\n Fields: AGENT_RUN_FIELDS,\n ResultType: 'simple'\n }\n ]);\n\n return {\n promptRuns: promptResults.Results as PromptRunRecord[],\n agentRuns: agentResults.Results as AgentRunRecord[],\n livePromptRuns: livePromptResults.Results as PromptRunRecord[],\n liveAgentRuns: liveAgentResults.Results as AgentRunRecord[]\n };\n }\n\n // ─── KPI Computation ─────────────────────────────────────────────\n\n private computeKPIs(promptRuns: PromptRunRecord[], agentRuns: AgentRunRecord[]): DashboardKPIs {\n const totalExecutions = promptRuns.length + agentRuns.length;\n const activeExecutions = this.countActiveExecutions(promptRuns, agentRuns);\n const totalCost = this.sumCosts(promptRuns, agentRuns);\n const totalTokens = this.sumTokens(promptRuns, agentRuns);\n const avgExecutionTime = this.calculateAverageExecutionTime(promptRuns, agentRuns);\n const successRate = this.calculateSuccessRate(promptRuns, agentRuns);\n\n return {\n totalExecutions,\n activeExecutions,\n totalCost,\n costCurrency: 'USD',\n avgExecutionTime,\n successRate,\n totalTokens,\n costPerToken: totalTokens > 0 ? totalCost / totalTokens : 0,\n topModel: this.getTopModel(promptRuns),\n topAgent: this.getTopAgent(agentRuns),\n errorRate: 1 - successRate,\n dailyCostBurn: this.calculateDailyCostBurn(promptRuns, agentRuns)\n };\n }\n\n // ─── Trend Computation ────────────────────────────────────────────\n\n private computeTrends(promptRuns: PromptRunRecord[], agentRuns: AgentRunRecord[]): TrendData[] {\n const { start, end } = this._dateRange$.value;\n const bucketSizeMs = this.getBucketSizeMs(start, end);\n const hourlyBuckets = this.createHourlyBuckets(start, end);\n\n return hourlyBuckets.map(bucket => {\n const bucketEnd = new Date(bucket.getTime() + bucketSizeMs);\n const bucketPrompts = promptRuns.filter(r => {\n const runAt = new Date(r.RunAt);\n return runAt >= bucket && runAt < bucketEnd;\n });\n const bucketAgents = agentRuns.filter(r => {\n const startedAt = new Date(r.StartedAt);\n return startedAt >= bucket && startedAt < bucketEnd;\n });\n\n return {\n timestamp: bucket,\n executions: bucketPrompts.length + bucketAgents.length,\n cost: this.sumCosts(bucketPrompts, bucketAgents),\n tokens: this.sumTokens(bucketPrompts, bucketAgents),\n avgTime: this.calculateAverageExecutionTime(bucketPrompts, bucketAgents),\n errors: this.countErrors(bucketPrompts, bucketAgents)\n };\n });\n }\n\n // ─── Live Executions Computation ──────────────────────────────────\n\n private computeLiveExecutions(promptRuns: PromptRunRecord[], agentRuns: AgentRunRecord[]): LiveExecution[] {\n const now = new Date();\n const liveExecutions: LiveExecution[] = [];\n\n for (const run of promptRuns) {\n const isRunning = !run.CompletedAt && run.Success !== false;\n const duration = run.CompletedAt\n ? new Date(run.CompletedAt).getTime() - new Date(run.RunAt).getTime()\n : now.getTime() - new Date(run.RunAt).getTime();\n\n liveExecutions.push({\n id: run.ID,\n type: 'prompt',\n name: run.Prompt || 'Unnamed Prompt',\n status: isRunning ? 'running' : (run.Success ? 'completed' : 'failed'),\n startTime: new Date(run.RunAt),\n duration,\n cost: run.Cost || 0,\n tokens: run.TokensUsed || 0,\n progress: isRunning ? Math.min(90, (duration / 30000) * 100) : 100\n });\n }\n\n for (const run of agentRuns) {\n const isRunning = run.Status === 'Running';\n const duration = run.CompletedAt\n ? new Date(run.CompletedAt).getTime() - new Date(run.StartedAt).getTime()\n : now.getTime() - new Date(run.StartedAt).getTime();\n\n liveExecutions.push({\n id: run.ID,\n type: 'agent',\n name: run.Agent || 'Unnamed Agent',\n status: run.Status.toLowerCase() as 'running' | 'completed' | 'failed',\n startTime: new Date(run.StartedAt),\n duration,\n cost: run.TotalCost || 0,\n tokens: run.TotalTokensUsed || 0,\n progress: isRunning ? Math.min(90, (duration / 60000) * 100) : 100\n });\n }\n\n return liveExecutions.sort((a, b) => b.startTime.getTime() - a.startTime.getTime());\n }\n\n // ─── Chart Data Computation ───────────────────────────────────────\n\n private computeChartData(promptRuns: PromptRunRecord[], executionTrends: TrendData[]): ChartData {\n return {\n executionTrends,\n costByModel: this.analyzeCostByModel(promptRuns),\n performanceMatrix: this.analyzePerformanceMatrix(promptRuns),\n tokenEfficiency: this.analyzeTokenEfficiency(promptRuns)\n };\n }\n\n // ─── Helper Methods ───────────────────────────────────────────────\n\n private countActiveExecutions(promptRuns: PromptRunRecord[], agentRuns: AgentRunRecord[]): number {\n const activePrompts = promptRuns.filter(r => !r.CompletedAt && r.Success !== false).length;\n const activeAgents = agentRuns.filter(r => r.Status === 'Running').length;\n return activePrompts + activeAgents;\n }\n\n private sumCosts(promptRuns: PromptRunRecord[], agentRuns: AgentRunRecord[]): number {\n const promptCost = promptRuns.reduce((sum, r) => sum + (r.Cost || 0), 0);\n const agentCost = agentRuns.reduce((sum, r) => sum + (r.TotalCost || 0), 0);\n return promptCost + agentCost;\n }\n\n private sumTokens(promptRuns: PromptRunRecord[], agentRuns: AgentRunRecord[]): number {\n const promptTokens = promptRuns.reduce((sum, r) => sum + (r.TokensUsed || 0), 0);\n const agentTokens = agentRuns.reduce((sum, r) => sum + (r.TotalTokensUsed || 0), 0);\n return promptTokens + agentTokens;\n }\n\n private calculateAverageExecutionTime(promptRuns: PromptRunRecord[], agentRuns: AgentRunRecord[]): number {\n const promptTimes = promptRuns\n .filter(r => r.ExecutionTimeMS)\n .map(r => r.ExecutionTimeMS!);\n\n const agentTimes = agentRuns\n .filter(r => r.StartedAt && r.CompletedAt)\n .map(r => new Date(r.CompletedAt!).getTime() - new Date(r.StartedAt).getTime());\n\n const allTimes = [...promptTimes, ...agentTimes];\n return allTimes.length > 0 ? allTimes.reduce((sum, time) => sum + time, 0) / allTimes.length : 0;\n }\n\n private calculateSuccessRate(promptRuns: PromptRunRecord[], agentRuns: AgentRunRecord[]): number {\n const totalExecutions = promptRuns.length + agentRuns.length;\n if (totalExecutions === 0) return 1;\n\n const successfulPrompts = promptRuns.filter(r => r.Success).length;\n const successfulAgents = agentRuns.filter(r => r.Success).length;\n\n return (successfulPrompts + successfulAgents) / totalExecutions;\n }\n\n private countErrors(promptRuns: PromptRunRecord[], agentRuns: AgentRunRecord[]): number {\n const promptErrors = promptRuns.filter(r => !r.Success).length;\n const agentErrors = agentRuns.filter(r => !r.Success).length;\n return promptErrors + agentErrors;\n }\n\n private calculateDailyCostBurn(promptRuns: PromptRunRecord[], agentRuns: AgentRunRecord[]): number {\n const now = new Date();\n const dayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n\n const todayPrompts = promptRuns.filter(r => new Date(r.RunAt) >= dayStart);\n const todayAgents = agentRuns.filter(r => new Date(r.StartedAt) >= dayStart);\n\n return this.sumCosts(todayPrompts, todayAgents);\n }\n\n private getBucketSizeMs(start: Date, end: Date): number {\n const hours = (end.getTime() - start.getTime()) / (1000 * 60 * 60);\n if (hours <= 24) return 60 * 60 * 1000; // 1 hour\n if (hours <= 24 * 7) return 4 * 60 * 60 * 1000; // 4 hours\n return 24 * 60 * 60 * 1000; // 24 hours\n }\n\n private createHourlyBuckets(start: Date, end: Date): Date[] {\n const buckets: Date[] = [];\n const current = new Date(start);\n const hours = (end.getTime() - start.getTime()) / (1000 * 60 * 60);\n\n let bucketSize: number;\n if (hours <= 24) {\n bucketSize = 1;\n current.setMinutes(0, 0, 0);\n } else if (hours <= 24 * 7) {\n bucketSize = 4;\n current.setHours(Math.floor(current.getHours() / 4) * 4, 0, 0, 0);\n } else {\n bucketSize = 24;\n current.setHours(0, 0, 0, 0);\n }\n\n while (current < end) {\n buckets.push(new Date(current));\n current.setHours(current.getHours() + bucketSize);\n }\n\n return buckets;\n }\n\n private getTopModel(promptRuns: PromptRunRecord[]): string {\n const modelCounts = new Map<string, number>();\n const modelNames = new Map<string, string>();\n\n for (const run of promptRuns) {\n if (run.ModelID && run.Model) {\n modelCounts.set(run.ModelID, (modelCounts.get(run.ModelID) || 0) + 1);\n modelNames.set(run.ModelID, run.Model);\n }\n }\n\n if (modelCounts.size === 0) return 'N/A';\n\n const topModelId = Array.from(modelCounts.entries())\n .sort(([,a], [,b]) => b - a)[0][0];\n\n return modelNames.get(topModelId) || 'Unknown Model';\n }\n\n private getTopAgent(agentRuns: AgentRunRecord[]): string {\n const agentCounts = new Map<string, number>();\n const agentNames = new Map<string, string>();\n\n for (const run of agentRuns) {\n if (run.AgentID && run.Agent) {\n agentCounts.set(run.AgentID, (agentCounts.get(run.AgentID) || 0) + 1);\n agentNames.set(run.AgentID, run.Agent);\n }\n }\n\n if (agentCounts.size === 0) return 'N/A';\n\n const topAgentId = Array.from(agentCounts.entries())\n .sort(([,a], [,b]) => b - a)[0][0];\n\n return agentNames.get(topAgentId) || 'Unknown Agent';\n }\n\n private analyzeCostByModel(promptRuns: PromptRunRecord[]): { model: string; cost: number; tokens: number }[] {\n const modelStats = new Map<string, { cost: number; tokens: number; name: string }>();\n\n for (const run of promptRuns) {\n if (run.ModelID && run.Model) {\n const existing = modelStats.get(run.ModelID) || { cost: 0, tokens: 0, name: run.Model };\n existing.cost += run.Cost || 0;\n existing.tokens += run.TokensUsed || 0;\n modelStats.set(run.ModelID, existing);\n }\n }\n\n return Array.from(modelStats.values())\n .map(stats => ({ model: stats.name, cost: stats.cost, tokens: stats.tokens }))\n .sort((a, b) => b.cost - a.cost);\n }\n\n private analyzePerformanceMatrix(promptRuns: PromptRunRecord[]): { agent: string; model: string; avgTime: number; successRate: number }[] {\n const combinations = new Map<string, { times: number[]; successes: number; total: number; agentName: string; modelName: string }>();\n\n for (const run of promptRuns) {\n if (run.AgentID && run.ModelID && run.ExecutionTimeMS) {\n const key = `${run.AgentID}:${run.ModelID}`;\n const existing = combinations.get(key) || {\n times: [], successes: 0, total: 0,\n agentName: run.Agent || 'Unknown Agent',\n modelName: run.Model || 'Unknown Model'\n };\n\n existing.times.push(run.ExecutionTimeMS);\n existing.total += 1;\n if (run.Success) existing.successes += 1;\n combinations.set(key, existing);\n }\n }\n\n return Array.from(combinations.values()).map(data => ({\n agent: data.agentName,\n model: data.modelName,\n avgTime: data.times.reduce((sum, time) => sum + time, 0) / data.times.length,\n successRate: data.successes / data.total\n }));\n }\n\n private analyzeTokenEfficiency(promptRuns: PromptRunRecord[]): { inputTokens: number; outputTokens: number; cost: number; model: string }[] {\n const modelEfficiency = new Map<string, { input: number; output: number; cost: number; name: string }>();\n\n for (const run of promptRuns) {\n if (run.ModelID && run.Model && run.TokensPrompt && run.TokensCompletion) {\n const existing = modelEfficiency.get(run.ModelID) || { input: 0, output: 0, cost: 0, name: run.Model };\n existing.input += run.TokensPrompt;\n existing.output += run.TokensCompletion;\n existing.cost += run.Cost || 0;\n modelEfficiency.set(run.ModelID, existing);\n }\n }\n\n return Array.from(modelEfficiency.values()).map(data => ({\n inputTokens: data.input,\n outputTokens: data.output,\n cost: data.cost,\n model: data.name\n }));\n }\n\n // ─── Execution Details (on-demand, not part of initial load) ──────\n\n async getExecutionDetails(executionId: string, type: 'prompt' | 'agent'): Promise<ExecutionDetails | null> {\n try {\n if (type === 'prompt') {\n return await this.getPromptExecutionDetails(executionId);\n } else {\n return await this.getAgentExecutionDetails(executionId);\n }\n } catch (error) {\n console.error('Error loading execution details:', error);\n return null;\n }\n }\n\n private async getPromptExecutionDetails(promptRunId: string): Promise<ExecutionDetails> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const [result, childrenResult] = await rv.RunViews<PromptRunRecord>([\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `ID = '${promptRunId}'`,\n Fields: PROMPT_RUN_FIELDS,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `ParentID = '${promptRunId}'`,\n Fields: PROMPT_RUN_FIELDS,\n ResultType: 'simple'\n }\n ]);\n\n const run = result.Results[0];\n if (!run) throw new Error('Prompt run not found');\n\n const children = await Promise.all(\n childrenResult.Results.map(child => this.getPromptExecutionDetails(child.ID))\n );\n\n return {\n id: run.ID,\n type: 'prompt',\n name: run.Prompt || 'Unnamed Prompt',\n status: run.Success ? 'completed' : 'failed',\n startTime: new Date(run.RunAt),\n endTime: run.CompletedAt ? new Date(run.CompletedAt) : undefined,\n cost: run.Cost || 0,\n tokens: run.TokensUsed || 0,\n success: run.Success || false,\n errorMessage: run.ErrorMessage || undefined,\n children,\n model: run.Model || undefined\n };\n }\n\n private async getAgentExecutionDetails(agentRunId: string): Promise<ExecutionDetails> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const [result, childrenResult] = await rv.RunViews<AgentRunRecord>([\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ID = '${agentRunId}'`,\n Fields: AGENT_RUN_FIELDS,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ParentRunID = '${agentRunId}'`,\n Fields: AGENT_RUN_FIELDS,\n ResultType: 'simple'\n }\n ]);\n\n const run = result.Results[0];\n if (!run) throw new Error('Agent run not found');\n\n const children = await Promise.all(\n childrenResult.Results.map(child => this.getAgentExecutionDetails(child.ID))\n );\n\n return {\n id: run.ID,\n type: 'agent',\n name: run.Agent || 'Unnamed Agent',\n status: run.Status.toLowerCase(),\n startTime: new Date(run.StartedAt),\n endTime: run.CompletedAt ? new Date(run.CompletedAt) : undefined,\n cost: run.TotalCost || 0,\n tokens: run.TotalTokensUsed || 0,\n success: run.Success || false,\n errorMessage: run.ErrorMessage || undefined,\n parentId: undefined,\n children\n };\n }\n}\n"]}
1
+ {"version":3,"file":"ai-instrumentation.service.js","sourceRoot":"","sources":["../../../src/AI/services/ai-instrumentation.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject, from, combineLatest } from 'rxjs';\nimport { switchMap, shareReplay, tap, map } from 'rxjs/operators';\nimport { RunView, Metadata, IMetadataProvider } from '@memberjunction/core';\n\n/**\n * Lightweight record types for dashboard aggregation.\n * We use ResultType: 'simple' with explicit Fields to avoid pulling\n * large text columns (InputData, OutputData, etc.) that can blow up\n * the GraphQL response beyond V8's string limit.\n */\nexport interface PromptRunRecord {\n ID: string;\n RunAt: string;\n CompletedAt: string | null;\n Success: boolean;\n Cost: number | null;\n TokensUsed: number | null;\n TokensPrompt: number | null;\n TokensCompletion: number | null;\n TokensCacheRead: number | null;\n TokensCacheWrite: number | null;\n ExecutionTimeMS: number | null;\n ModelID: string | null;\n Model: string | null;\n AgentID: string | null;\n Agent: string | null;\n Prompt: string | null;\n ErrorMessage: string | null;\n}\n\nexport interface AgentRunRecord {\n ID: string;\n StartedAt: string;\n CompletedAt: string | null;\n Status: string;\n Success: boolean;\n TotalCost: number | null;\n TotalTokensUsed: number | null;\n AgentID: string | null;\n Agent: string | null;\n ErrorMessage: string | null;\n}\n\n/** Fields to request for prompt runs — only what the dashboard needs for aggregation */\nconst PROMPT_RUN_FIELDS = [\n 'ID', 'RunAt', 'CompletedAt', 'Success', 'Cost', 'TokensUsed',\n 'TokensPrompt', 'TokensCompletion', 'TokensCacheRead', 'TokensCacheWrite', 'ExecutionTimeMS',\n 'ModelID', 'Model', 'AgentID', 'Agent', 'Prompt', 'ErrorMessage'\n];\n\n/** Fields to request for agent runs — only what the dashboard needs for aggregation */\nconst AGENT_RUN_FIELDS = [\n 'ID', 'StartedAt', 'CompletedAt', 'Status', 'Success',\n 'TotalCost', 'TotalTokensUsed', 'AgentID', 'Agent', 'ErrorMessage'\n];\n\nexport interface DashboardKPIs {\n totalExecutions: number;\n activeExecutions: number;\n totalCost: number;\n costCurrency: string;\n avgExecutionTime: number;\n successRate: number;\n totalTokens: number;\n costPerToken: number;\n topModel: string;\n topAgent: string;\n errorRate: number;\n dailyCostBurn: number;\n cacheHitRate: number;\n}\n\nexport interface TrendData {\n timestamp: Date;\n executions: number;\n cost: number;\n tokens: number;\n avgTime: number;\n errors: number;\n}\n\nexport interface LiveExecution {\n id: string;\n type: 'prompt' | 'agent';\n name: string;\n status: 'running' | 'completed' | 'failed';\n startTime: Date;\n duration?: number;\n cost?: number;\n tokens?: number;\n progress?: number;\n}\n\nexport interface ExecutionDetails {\n id: string;\n type: 'prompt' | 'agent';\n name: string;\n status: string;\n startTime: Date;\n endTime?: Date;\n cost: number;\n tokens: number;\n success: boolean;\n errorMessage?: string;\n parentId?: string;\n children: ExecutionDetails[];\n model?: string;\n vendor?: string;\n}\n\nexport interface ChartData {\n executionTrends: TrendData[];\n costByModel: { model: string; cost: number; tokens: number }[];\n performanceMatrix: { agent: string; model: string; avgTime: number; successRate: number }[];\n tokenEfficiency: { inputTokens: number; outputTokens: number; cost: number; model: string }[];\n}\n\n/** Internal shape for the single data load that all derived streams share */\ninterface DashboardRawData {\n promptRuns: PromptRunRecord[];\n agentRuns: AgentRunRecord[];\n livePromptRuns: PromptRunRecord[];\n liveAgentRuns: AgentRunRecord[];\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AIInstrumentationService {\n private _provider: IMetadataProvider | null = null;\n\n /** Set the metadata provider this service should use. Components should call this after injection. */\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n private readonly _dateRange$ = new BehaviorSubject<{ start: Date; end: Date }>({\n start: new Date(Date.now() - 24 * 60 * 60 * 1000), // Last 24 hours\n end: new Date()\n });\n\n private readonly _refreshTrigger$ = new BehaviorSubject<number>(0);\n private readonly _isLoading$ = new BehaviorSubject<boolean>(false);\n\n // Expose loading state as observable\n readonly isLoading$ = this._isLoading$.asObservable();\n\n constructor() {}\n\n /**\n * Single data load: fetches prompt runs and agent runs ONCE per refresh/date-range change.\n * All downstream streams derive from this shared dataset.\n */\n private readonly rawData$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(\n tap(() => this._isLoading$.next(true)),\n switchMap(() => from(this.loadAllData())),\n tap(() => this._isLoading$.next(false)),\n shareReplay(1)\n );\n\n // Derived streams — pure in-memory transforms, no extra DB queries\n readonly kpis$ = this.rawData$.pipe(\n map(data => this.computeKPIs(data.promptRuns, data.agentRuns)),\n shareReplay(1)\n );\n\n readonly trends$ = this.rawData$.pipe(\n map(data => this.computeTrends(data.promptRuns, data.agentRuns)),\n shareReplay(1)\n );\n\n readonly liveExecutions$ = this.rawData$.pipe(\n map(data => this.computeLiveExecutions(data.livePromptRuns, data.liveAgentRuns)),\n shareReplay(1)\n );\n\n readonly chartData$ = combineLatest([this.rawData$, this.trends$]).pipe(\n map(([data, executionTrends]) => this.computeChartData(data.promptRuns, executionTrends)),\n shareReplay(1)\n );\n\n setDateRange(start: Date, end: Date): void {\n this._dateRange$.next({ start, end });\n }\n\n refresh(): void {\n this._refreshTrigger$.next(this._refreshTrigger$.value + 1);\n }\n\n /**\n * Single batch query that loads all data needed by every dashboard widget.\n * Uses ResultType: 'simple' with explicit Fields to minimize payload size.\n */\n private async loadAllData(): Promise<DashboardRawData> {\n const { start, end } = this._dateRange$.value;\n const now = new Date();\n const recentTime = new Date(now.getTime() - 5 * 60 * 1000);\n\n const rv = RunView.FromMetadataProvider(this.Provider);\n const [promptResults, agentResults, livePromptResults, liveAgentResults] = await rv.RunViews<PromptRunRecord | AgentRunRecord>([\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `RunAt >= '${start.toISOString()}' AND RunAt <= '${end.toISOString()}'`,\n Fields: PROMPT_RUN_FIELDS,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,\n Fields: AGENT_RUN_FIELDS,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `RunAt >= '${recentTime.toISOString()}'`,\n OrderBy: 'RunAt DESC',\n Fields: PROMPT_RUN_FIELDS,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `StartedAt >= '${recentTime.toISOString()}'`,\n OrderBy: 'StartedAt DESC',\n Fields: AGENT_RUN_FIELDS,\n ResultType: 'simple'\n }\n ]);\n\n return {\n promptRuns: promptResults.Results as PromptRunRecord[],\n agentRuns: agentResults.Results as AgentRunRecord[],\n livePromptRuns: livePromptResults.Results as PromptRunRecord[],\n liveAgentRuns: liveAgentResults.Results as AgentRunRecord[]\n };\n }\n\n // ─── KPI Computation ─────────────────────────────────────────────\n\n private computeKPIs(promptRuns: PromptRunRecord[], agentRuns: AgentRunRecord[]): DashboardKPIs {\n const totalExecutions = promptRuns.length + agentRuns.length;\n const activeExecutions = this.countActiveExecutions(promptRuns, agentRuns);\n const totalCost = this.sumCosts(promptRuns, agentRuns);\n const totalTokens = this.sumTokens(promptRuns, agentRuns);\n const avgExecutionTime = this.calculateAverageExecutionTime(promptRuns, agentRuns);\n const successRate = this.calculateSuccessRate(promptRuns, agentRuns);\n\n return {\n totalExecutions,\n activeExecutions,\n totalCost,\n costCurrency: 'USD',\n avgExecutionTime,\n successRate,\n totalTokens,\n costPerToken: totalTokens > 0 ? totalCost / totalTokens : 0,\n topModel: this.getTopModel(promptRuns),\n topAgent: this.getTopAgent(agentRuns),\n errorRate: 1 - successRate,\n dailyCostBurn: this.calculateDailyCostBurn(promptRuns, agentRuns),\n cacheHitRate: this.calculateCacheHitRate(promptRuns)\n };\n }\n\n /** Share of input tokens served from the provider's prompt cache across the period's prompt runs. */\n private calculateCacheHitRate(promptRuns: PromptRunRecord[]): number {\n let uncached = 0, read = 0, write = 0;\n for (const r of promptRuns) {\n uncached += r.TokensPrompt || 0;\n read += r.TokensCacheRead || 0;\n write += r.TokensCacheWrite || 0;\n }\n const totalInput = uncached + read + write;\n return totalInput > 0 ? read / totalInput : 0;\n }\n\n // ─── Trend Computation ────────────────────────────────────────────\n\n private computeTrends(promptRuns: PromptRunRecord[], agentRuns: AgentRunRecord[]): TrendData[] {\n const { start, end } = this._dateRange$.value;\n const bucketSizeMs = this.getBucketSizeMs(start, end);\n const hourlyBuckets = this.createHourlyBuckets(start, end);\n\n return hourlyBuckets.map(bucket => {\n const bucketEnd = new Date(bucket.getTime() + bucketSizeMs);\n const bucketPrompts = promptRuns.filter(r => {\n const runAt = new Date(r.RunAt);\n return runAt >= bucket && runAt < bucketEnd;\n });\n const bucketAgents = agentRuns.filter(r => {\n const startedAt = new Date(r.StartedAt);\n return startedAt >= bucket && startedAt < bucketEnd;\n });\n\n return {\n timestamp: bucket,\n executions: bucketPrompts.length + bucketAgents.length,\n cost: this.sumCosts(bucketPrompts, bucketAgents),\n tokens: this.sumTokens(bucketPrompts, bucketAgents),\n avgTime: this.calculateAverageExecutionTime(bucketPrompts, bucketAgents),\n errors: this.countErrors(bucketPrompts, bucketAgents)\n };\n });\n }\n\n // ─── Live Executions Computation ──────────────────────────────────\n\n private computeLiveExecutions(promptRuns: PromptRunRecord[], agentRuns: AgentRunRecord[]): LiveExecution[] {\n const now = new Date();\n const liveExecutions: LiveExecution[] = [];\n\n for (const run of promptRuns) {\n const isRunning = !run.CompletedAt && run.Success !== false;\n const duration = run.CompletedAt\n ? new Date(run.CompletedAt).getTime() - new Date(run.RunAt).getTime()\n : now.getTime() - new Date(run.RunAt).getTime();\n\n liveExecutions.push({\n id: run.ID,\n type: 'prompt',\n name: run.Prompt || 'Unnamed Prompt',\n status: isRunning ? 'running' : (run.Success ? 'completed' : 'failed'),\n startTime: new Date(run.RunAt),\n duration,\n cost: run.Cost || 0,\n tokens: run.TokensUsed || 0,\n progress: isRunning ? Math.min(90, (duration / 30000) * 100) : 100\n });\n }\n\n for (const run of agentRuns) {\n const isRunning = run.Status === 'Running';\n const duration = run.CompletedAt\n ? new Date(run.CompletedAt).getTime() - new Date(run.StartedAt).getTime()\n : now.getTime() - new Date(run.StartedAt).getTime();\n\n liveExecutions.push({\n id: run.ID,\n type: 'agent',\n name: run.Agent || 'Unnamed Agent',\n status: run.Status.toLowerCase() as 'running' | 'completed' | 'failed',\n startTime: new Date(run.StartedAt),\n duration,\n cost: run.TotalCost || 0,\n tokens: run.TotalTokensUsed || 0,\n progress: isRunning ? Math.min(90, (duration / 60000) * 100) : 100\n });\n }\n\n return liveExecutions.sort((a, b) => b.startTime.getTime() - a.startTime.getTime());\n }\n\n // ─── Chart Data Computation ───────────────────────────────────────\n\n private computeChartData(promptRuns: PromptRunRecord[], executionTrends: TrendData[]): ChartData {\n return {\n executionTrends,\n costByModel: this.analyzeCostByModel(promptRuns),\n performanceMatrix: this.analyzePerformanceMatrix(promptRuns),\n tokenEfficiency: this.analyzeTokenEfficiency(promptRuns)\n };\n }\n\n // ─── Helper Methods ───────────────────────────────────────────────\n\n private countActiveExecutions(promptRuns: PromptRunRecord[], agentRuns: AgentRunRecord[]): number {\n const activePrompts = promptRuns.filter(r => !r.CompletedAt && r.Success !== false).length;\n const activeAgents = agentRuns.filter(r => r.Status === 'Running').length;\n return activePrompts + activeAgents;\n }\n\n private sumCosts(promptRuns: PromptRunRecord[], agentRuns: AgentRunRecord[]): number {\n const promptCost = promptRuns.reduce((sum, r) => sum + (r.Cost || 0), 0);\n const agentCost = agentRuns.reduce((sum, r) => sum + (r.TotalCost || 0), 0);\n return promptCost + agentCost;\n }\n\n private sumTokens(promptRuns: PromptRunRecord[], agentRuns: AgentRunRecord[]): number {\n const promptTokens = promptRuns.reduce((sum, r) => sum + (r.TokensUsed || 0), 0);\n const agentTokens = agentRuns.reduce((sum, r) => sum + (r.TotalTokensUsed || 0), 0);\n return promptTokens + agentTokens;\n }\n\n private calculateAverageExecutionTime(promptRuns: PromptRunRecord[], agentRuns: AgentRunRecord[]): number {\n const promptTimes = promptRuns\n .filter(r => r.ExecutionTimeMS)\n .map(r => r.ExecutionTimeMS!);\n\n const agentTimes = agentRuns\n .filter(r => r.StartedAt && r.CompletedAt)\n .map(r => new Date(r.CompletedAt!).getTime() - new Date(r.StartedAt).getTime());\n\n const allTimes = [...promptTimes, ...agentTimes];\n return allTimes.length > 0 ? allTimes.reduce((sum, time) => sum + time, 0) / allTimes.length : 0;\n }\n\n private calculateSuccessRate(promptRuns: PromptRunRecord[], agentRuns: AgentRunRecord[]): number {\n const totalExecutions = promptRuns.length + agentRuns.length;\n if (totalExecutions === 0) return 1;\n\n const successfulPrompts = promptRuns.filter(r => r.Success).length;\n const successfulAgents = agentRuns.filter(r => r.Success).length;\n\n return (successfulPrompts + successfulAgents) / totalExecutions;\n }\n\n private countErrors(promptRuns: PromptRunRecord[], agentRuns: AgentRunRecord[]): number {\n const promptErrors = promptRuns.filter(r => !r.Success).length;\n const agentErrors = agentRuns.filter(r => !r.Success).length;\n return promptErrors + agentErrors;\n }\n\n private calculateDailyCostBurn(promptRuns: PromptRunRecord[], agentRuns: AgentRunRecord[]): number {\n const now = new Date();\n const dayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n\n const todayPrompts = promptRuns.filter(r => new Date(r.RunAt) >= dayStart);\n const todayAgents = agentRuns.filter(r => new Date(r.StartedAt) >= dayStart);\n\n return this.sumCosts(todayPrompts, todayAgents);\n }\n\n private getBucketSizeMs(start: Date, end: Date): number {\n const hours = (end.getTime() - start.getTime()) / (1000 * 60 * 60);\n if (hours <= 24) return 60 * 60 * 1000; // 1 hour\n if (hours <= 24 * 7) return 4 * 60 * 60 * 1000; // 4 hours\n return 24 * 60 * 60 * 1000; // 24 hours\n }\n\n private createHourlyBuckets(start: Date, end: Date): Date[] {\n const buckets: Date[] = [];\n const current = new Date(start);\n const hours = (end.getTime() - start.getTime()) / (1000 * 60 * 60);\n\n let bucketSize: number;\n if (hours <= 24) {\n bucketSize = 1;\n current.setMinutes(0, 0, 0);\n } else if (hours <= 24 * 7) {\n bucketSize = 4;\n current.setHours(Math.floor(current.getHours() / 4) * 4, 0, 0, 0);\n } else {\n bucketSize = 24;\n current.setHours(0, 0, 0, 0);\n }\n\n while (current < end) {\n buckets.push(new Date(current));\n current.setHours(current.getHours() + bucketSize);\n }\n\n return buckets;\n }\n\n private getTopModel(promptRuns: PromptRunRecord[]): string {\n const modelCounts = new Map<string, number>();\n const modelNames = new Map<string, string>();\n\n for (const run of promptRuns) {\n if (run.ModelID && run.Model) {\n modelCounts.set(run.ModelID, (modelCounts.get(run.ModelID) || 0) + 1);\n modelNames.set(run.ModelID, run.Model);\n }\n }\n\n if (modelCounts.size === 0) return 'N/A';\n\n const topModelId = Array.from(modelCounts.entries())\n .sort(([,a], [,b]) => b - a)[0][0];\n\n return modelNames.get(topModelId) || 'Unknown Model';\n }\n\n private getTopAgent(agentRuns: AgentRunRecord[]): string {\n const agentCounts = new Map<string, number>();\n const agentNames = new Map<string, string>();\n\n for (const run of agentRuns) {\n if (run.AgentID && run.Agent) {\n agentCounts.set(run.AgentID, (agentCounts.get(run.AgentID) || 0) + 1);\n agentNames.set(run.AgentID, run.Agent);\n }\n }\n\n if (agentCounts.size === 0) return 'N/A';\n\n const topAgentId = Array.from(agentCounts.entries())\n .sort(([,a], [,b]) => b - a)[0][0];\n\n return agentNames.get(topAgentId) || 'Unknown Agent';\n }\n\n private analyzeCostByModel(promptRuns: PromptRunRecord[]): { model: string; cost: number; tokens: number }[] {\n const modelStats = new Map<string, { cost: number; tokens: number; name: string }>();\n\n for (const run of promptRuns) {\n if (run.ModelID && run.Model) {\n const existing = modelStats.get(run.ModelID) || { cost: 0, tokens: 0, name: run.Model };\n existing.cost += run.Cost || 0;\n existing.tokens += run.TokensUsed || 0;\n modelStats.set(run.ModelID, existing);\n }\n }\n\n return Array.from(modelStats.values())\n .map(stats => ({ model: stats.name, cost: stats.cost, tokens: stats.tokens }))\n .sort((a, b) => b.cost - a.cost);\n }\n\n private analyzePerformanceMatrix(promptRuns: PromptRunRecord[]): { agent: string; model: string; avgTime: number; successRate: number }[] {\n const combinations = new Map<string, { times: number[]; successes: number; total: number; agentName: string; modelName: string }>();\n\n for (const run of promptRuns) {\n if (run.AgentID && run.ModelID && run.ExecutionTimeMS) {\n const key = `${run.AgentID}:${run.ModelID}`;\n const existing = combinations.get(key) || {\n times: [], successes: 0, total: 0,\n agentName: run.Agent || 'Unknown Agent',\n modelName: run.Model || 'Unknown Model'\n };\n\n existing.times.push(run.ExecutionTimeMS);\n existing.total += 1;\n if (run.Success) existing.successes += 1;\n combinations.set(key, existing);\n }\n }\n\n return Array.from(combinations.values()).map(data => ({\n agent: data.agentName,\n model: data.modelName,\n avgTime: data.times.reduce((sum, time) => sum + time, 0) / data.times.length,\n successRate: data.successes / data.total\n }));\n }\n\n private analyzeTokenEfficiency(promptRuns: PromptRunRecord[]): { inputTokens: number; outputTokens: number; cost: number; model: string }[] {\n const modelEfficiency = new Map<string, { input: number; output: number; cost: number; name: string }>();\n\n for (const run of promptRuns) {\n if (run.ModelID && run.Model && run.TokensPrompt && run.TokensCompletion) {\n const existing = modelEfficiency.get(run.ModelID) || { input: 0, output: 0, cost: 0, name: run.Model };\n existing.input += run.TokensPrompt;\n existing.output += run.TokensCompletion;\n existing.cost += run.Cost || 0;\n modelEfficiency.set(run.ModelID, existing);\n }\n }\n\n return Array.from(modelEfficiency.values()).map(data => ({\n inputTokens: data.input,\n outputTokens: data.output,\n cost: data.cost,\n model: data.name\n }));\n }\n\n // ─── Execution Details (on-demand, not part of initial load) ──────\n\n async getExecutionDetails(executionId: string, type: 'prompt' | 'agent'): Promise<ExecutionDetails | null> {\n try {\n if (type === 'prompt') {\n return await this.getPromptExecutionDetails(executionId);\n } else {\n return await this.getAgentExecutionDetails(executionId);\n }\n } catch (error) {\n console.error('Error loading execution details:', error);\n return null;\n }\n }\n\n private async getPromptExecutionDetails(promptRunId: string): Promise<ExecutionDetails> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const [result, childrenResult] = await rv.RunViews<PromptRunRecord>([\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `ID = '${promptRunId}'`,\n Fields: PROMPT_RUN_FIELDS,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `ParentID = '${promptRunId}'`,\n Fields: PROMPT_RUN_FIELDS,\n ResultType: 'simple'\n }\n ]);\n\n const run = result.Results[0];\n if (!run) throw new Error('Prompt run not found');\n\n const children = await Promise.all(\n childrenResult.Results.map(child => this.getPromptExecutionDetails(child.ID))\n );\n\n return {\n id: run.ID,\n type: 'prompt',\n name: run.Prompt || 'Unnamed Prompt',\n status: run.Success ? 'completed' : 'failed',\n startTime: new Date(run.RunAt),\n endTime: run.CompletedAt ? new Date(run.CompletedAt) : undefined,\n cost: run.Cost || 0,\n tokens: run.TokensUsed || 0,\n success: run.Success || false,\n errorMessage: run.ErrorMessage || undefined,\n children,\n model: run.Model || undefined\n };\n }\n\n private async getAgentExecutionDetails(agentRunId: string): Promise<ExecutionDetails> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const [result, childrenResult] = await rv.RunViews<AgentRunRecord>([\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ID = '${agentRunId}'`,\n Fields: AGENT_RUN_FIELDS,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ParentRunID = '${agentRunId}'`,\n Fields: AGENT_RUN_FIELDS,\n ResultType: 'simple'\n }\n ]);\n\n const run = result.Results[0];\n if (!run) throw new Error('Agent run not found');\n\n const children = await Promise.all(\n childrenResult.Results.map(child => this.getAgentExecutionDetails(child.ID))\n );\n\n return {\n id: run.ID,\n type: 'agent',\n name: run.Agent || 'Unnamed Agent',\n status: run.Status.toLowerCase(),\n startTime: new Date(run.StartedAt),\n endTime: run.CompletedAt ? new Date(run.CompletedAt) : undefined,\n cost: run.TotalCost || 0,\n tokens: run.TotalTokensUsed || 0,\n success: run.Success || false,\n errorMessage: run.ErrorMessage || undefined,\n parentId: undefined,\n children\n };\n }\n}\n"]}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @fileoverview Prompt-cache metric helpers shared across the AI analytics dashboards.
3
+ *
4
+ * Pure functions (no Angular, no I/O) so every surface computes cache hit rate and dollar savings
5
+ * identically. Token inputs follow the AIPromptRun contract: TokensPrompt is UNCACHED ("net-new")
6
+ * input, with TokensCacheRead / TokensCacheWrite as disjoint cache buckets.
7
+ */
8
+ /**
9
+ * Per-unit pricing for one model+vendor, normalized so callers can price token buckets directly.
10
+ * Rates are in currency-per-token (i.e. the AIModelCost per-unit rate already divided by its
11
+ * UnitType divisor). When a model has no distinct cache rate, callers should fall back to the
12
+ * input rate (which makes the corresponding savings term zero).
13
+ */
14
+ export interface CacheRate {
15
+ /** Currency per uncached input token. */
16
+ inputRate: number;
17
+ /** Currency per cache-read token (≤ inputRate for every provider). */
18
+ cacheReadRate: number;
19
+ /** Currency per cache-write token (≥ inputRate for providers that bill writes, e.g. Anthropic). */
20
+ cacheWriteRate: number;
21
+ }
22
+ /** Aggregate cache token counts, e.g. summed across a set of runs. */
23
+ export interface CacheTokenTotals {
24
+ uncachedInputTokens: number;
25
+ cacheReadTokens: number;
26
+ cacheWriteTokens: number;
27
+ }
28
+ /**
29
+ * Fraction (0..1) of input tokens served from the provider's prompt cache.
30
+ * Denominator is the TOTAL input processed (uncached + cache reads + cache writes), so a run that
31
+ * only wrote to cache (first call) reads as 0% and a fully-cached follow-up approaches 100%.
32
+ */
33
+ export declare function cacheHitRate(totals: CacheTokenTotals): number;
34
+ /** True when caching actually engaged (any read or write), so a 0% hit rate can be shown meaningfully. */
35
+ export declare function hasCacheActivity(totals: CacheTokenTotals): boolean;
36
+ /**
37
+ * Net dollars saved by prompt caching versus the no-cache counterfactual, where every input token
38
+ * (including what was read from / written to cache) would have been billed at the full input rate:
39
+ *
40
+ * savings = cacheRead × (inputRate − cacheReadRate) [reads are cheaper → positive]
41
+ * + cacheWrite × (inputRate − cacheWriteRate) [writes cost a premium → negative]
42
+ *
43
+ * So the result is read-savings MINUS write-premium — the honest net, not gross cached tokens.
44
+ * Returns 0 when no rate is supplied (rates unconfigured); combine with {@link hasCacheActivity}
45
+ * to distinguish "no caching happened" from "caching happened but rates aren't configured yet".
46
+ */
47
+ export declare function netCacheSavings(totals: CacheTokenTotals, rate: CacheRate | undefined): number;
48
+ /** The no-cache counterfactual cost = actual cost + net savings. Useful for "X% cheaper" framing. */
49
+ export declare function uncachedCounterfactualCost(actualCost: number, savings: number): number;
50
+ //# sourceMappingURL=cache-metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-metrics.d.ts","sourceRoot":"","sources":["../../../src/AI/services/cache-metrics.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACtB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,aAAa,EAAE,MAAM,CAAC;IACtB,mGAAmG;IACnG,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED,sEAAsE;AACtE,MAAM,WAAW,gBAAgB;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAG7D;AAED,0GAA0G;AAC1G,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAElE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAQ7F;AAED,qGAAqG;AACrG,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtF"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @fileoverview Prompt-cache metric helpers shared across the AI analytics dashboards.
3
+ *
4
+ * Pure functions (no Angular, no I/O) so every surface computes cache hit rate and dollar savings
5
+ * identically. Token inputs follow the AIPromptRun contract: TokensPrompt is UNCACHED ("net-new")
6
+ * input, with TokensCacheRead / TokensCacheWrite as disjoint cache buckets.
7
+ */
8
+ /**
9
+ * Fraction (0..1) of input tokens served from the provider's prompt cache.
10
+ * Denominator is the TOTAL input processed (uncached + cache reads + cache writes), so a run that
11
+ * only wrote to cache (first call) reads as 0% and a fully-cached follow-up approaches 100%.
12
+ */
13
+ export function cacheHitRate(totals) {
14
+ const totalInput = totals.uncachedInputTokens + totals.cacheReadTokens + totals.cacheWriteTokens;
15
+ return totalInput > 0 ? totals.cacheReadTokens / totalInput : 0;
16
+ }
17
+ /** True when caching actually engaged (any read or write), so a 0% hit rate can be shown meaningfully. */
18
+ export function hasCacheActivity(totals) {
19
+ return totals.cacheReadTokens > 0 || totals.cacheWriteTokens > 0;
20
+ }
21
+ /**
22
+ * Net dollars saved by prompt caching versus the no-cache counterfactual, where every input token
23
+ * (including what was read from / written to cache) would have been billed at the full input rate:
24
+ *
25
+ * savings = cacheRead × (inputRate − cacheReadRate) [reads are cheaper → positive]
26
+ * + cacheWrite × (inputRate − cacheWriteRate) [writes cost a premium → negative]
27
+ *
28
+ * So the result is read-savings MINUS write-premium — the honest net, not gross cached tokens.
29
+ * Returns 0 when no rate is supplied (rates unconfigured); combine with {@link hasCacheActivity}
30
+ * to distinguish "no caching happened" from "caching happened but rates aren't configured yet".
31
+ */
32
+ export function netCacheSavings(totals, rate) {
33
+ if (!rate) {
34
+ return 0;
35
+ }
36
+ return (totals.cacheReadTokens * (rate.inputRate - rate.cacheReadRate) +
37
+ totals.cacheWriteTokens * (rate.inputRate - rate.cacheWriteRate));
38
+ }
39
+ /** The no-cache counterfactual cost = actual cost + net savings. Useful for "X% cheaper" framing. */
40
+ export function uncachedCounterfactualCost(actualCost, savings) {
41
+ return actualCost + savings;
42
+ }
43
+ //# sourceMappingURL=cache-metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-metrics.js","sourceRoot":"","sources":["../../../src/AI/services/cache-metrics.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAwBH;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,MAAwB;IACjD,MAAM,UAAU,GAAG,MAAM,CAAC,mBAAmB,GAAG,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACjG,OAAO,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,0GAA0G;AAC1G,MAAM,UAAU,gBAAgB,CAAC,MAAwB;IACrD,OAAO,MAAM,CAAC,eAAe,GAAG,CAAC,IAAI,MAAM,CAAC,gBAAgB,GAAG,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,MAAwB,EAAE,IAA2B;IACjF,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,CAAC,CAAC;IACb,CAAC;IACD,OAAO,CACH,MAAM,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC;QAC9D,MAAM,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,CACnE,CAAC;AACN,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,0BAA0B,CAAC,UAAkB,EAAE,OAAe;IAC1E,OAAO,UAAU,GAAG,OAAO,CAAC;AAChC,CAAC","sourcesContent":["/**\n * @fileoverview Prompt-cache metric helpers shared across the AI analytics dashboards.\n *\n * Pure functions (no Angular, no I/O) so every surface computes cache hit rate and dollar savings\n * identically. Token inputs follow the AIPromptRun contract: TokensPrompt is UNCACHED (\"net-new\")\n * input, with TokensCacheRead / TokensCacheWrite as disjoint cache buckets.\n */\n\n/**\n * Per-unit pricing for one model+vendor, normalized so callers can price token buckets directly.\n * Rates are in currency-per-token (i.e. the AIModelCost per-unit rate already divided by its\n * UnitType divisor). When a model has no distinct cache rate, callers should fall back to the\n * input rate (which makes the corresponding savings term zero).\n */\nexport interface CacheRate {\n /** Currency per uncached input token. */\n inputRate: number;\n /** Currency per cache-read token (≤ inputRate for every provider). */\n cacheReadRate: number;\n /** Currency per cache-write token (≥ inputRate for providers that bill writes, e.g. Anthropic). */\n cacheWriteRate: number;\n}\n\n/** Aggregate cache token counts, e.g. summed across a set of runs. */\nexport interface CacheTokenTotals {\n uncachedInputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n}\n\n/**\n * Fraction (0..1) of input tokens served from the provider's prompt cache.\n * Denominator is the TOTAL input processed (uncached + cache reads + cache writes), so a run that\n * only wrote to cache (first call) reads as 0% and a fully-cached follow-up approaches 100%.\n */\nexport function cacheHitRate(totals: CacheTokenTotals): number {\n const totalInput = totals.uncachedInputTokens + totals.cacheReadTokens + totals.cacheWriteTokens;\n return totalInput > 0 ? totals.cacheReadTokens / totalInput : 0;\n}\n\n/** True when caching actually engaged (any read or write), so a 0% hit rate can be shown meaningfully. */\nexport function hasCacheActivity(totals: CacheTokenTotals): boolean {\n return totals.cacheReadTokens > 0 || totals.cacheWriteTokens > 0;\n}\n\n/**\n * Net dollars saved by prompt caching versus the no-cache counterfactual, where every input token\n * (including what was read from / written to cache) would have been billed at the full input rate:\n *\n * savings = cacheRead × (inputRate − cacheReadRate) [reads are cheaper → positive]\n * + cacheWrite × (inputRate − cacheWriteRate) [writes cost a premium → negative]\n *\n * So the result is read-savings MINUS write-premium — the honest net, not gross cached tokens.\n * Returns 0 when no rate is supplied (rates unconfigured); combine with {@link hasCacheActivity}\n * to distinguish \"no caching happened\" from \"caching happened but rates aren't configured yet\".\n */\nexport function netCacheSavings(totals: CacheTokenTotals, rate: CacheRate | undefined): number {\n if (!rate) {\n return 0;\n }\n return (\n totals.cacheReadTokens * (rate.inputRate - rate.cacheReadRate) +\n totals.cacheWriteTokens * (rate.inputRate - rate.cacheWriteRate)\n );\n}\n\n/** The no-cache counterfactual cost = actual cost + net savings. Useful for \"X% cheaper\" framing. */\nexport function uncachedCounterfactualCost(actualCost: number, savings: number): number {\n return actualCost + savings;\n}\n"]}