@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
@@ -8,6 +8,7 @@
8
8
  import { Component, Input, Output, EventEmitter, ChangeDetectorRef, inject } from '@angular/core';
9
9
  import { Subject } from 'rxjs';
10
10
  import { RunView } from '@memberjunction/core';
11
+ import { cacheHitRate } from '../../../services/cache-metrics';
11
12
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
12
13
  import * as i0 from "@angular/core";
13
14
  import * as i1 from "@memberjunction/ng-shared-generic";
@@ -23,10 +24,10 @@ function AnalyticsPromptRunsComponent_Conditional_0_Template(rf, ctx) { if (rf &
23
24
  i0.ɵɵelement(1, "mj-loading", 1);
24
25
  i0.ɵɵelementEnd();
25
26
  } }
26
- function AnalyticsPromptRunsComponent_Conditional_1_For_47_Template(rf, ctx) { if (rf & 1) {
27
+ function AnalyticsPromptRunsComponent_Conditional_1_For_53_Template(rf, ctx) { if (rf & 1) {
27
28
  const _r1 = i0.ɵɵgetCurrentView();
28
- i0.ɵɵelementStart(0, "button", 31);
29
- i0.ɵɵlistener("click", function AnalyticsPromptRunsComponent_Conditional_1_For_47_Template_button_click_0_listener() { const metric_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnChartMetricChange(metric_r2.key)); });
29
+ i0.ɵɵelementStart(0, "button", 32);
30
+ i0.ɵɵlistener("click", function AnalyticsPromptRunsComponent_Conditional_1_For_53_Template_button_click_0_listener() { const metric_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnChartMetricChange(metric_r2.key)); });
30
31
  i0.ɵɵtext(1);
31
32
  i0.ɵɵelementEnd();
32
33
  } if (rf & 2) {
@@ -36,20 +37,20 @@ function AnalyticsPromptRunsComponent_Conditional_1_For_47_Template(rf, ctx) { i
36
37
  i0.ɵɵadvance();
37
38
  i0.ɵɵtextInterpolate1(" ", metric_r2.label, " ");
38
39
  } }
39
- function AnalyticsPromptRunsComponent_Conditional_1_Conditional_49_Template(rf, ctx) { if (rf & 1) {
40
- i0.ɵɵelementStart(0, "div", 15);
40
+ function AnalyticsPromptRunsComponent_Conditional_1_Conditional_55_Template(rf, ctx) { if (rf & 1) {
41
+ i0.ɵɵelementStart(0, "div", 16);
41
42
  i0.ɵɵtext(1, "No data for selected time range");
42
43
  i0.ɵɵelementEnd();
43
44
  } }
44
- function AnalyticsPromptRunsComponent_Conditional_1_Conditional_50_For_2_Template(rf, ctx) { if (rf & 1) {
45
+ function AnalyticsPromptRunsComponent_Conditional_1_Conditional_56_For_2_Template(rf, ctx) { if (rf & 1) {
45
46
  const _r4 = i0.ɵɵgetCurrentView();
46
- i0.ɵɵelementStart(0, "div", 33);
47
- i0.ɵɵlistener("click", function AnalyticsPromptRunsComponent_Conditional_1_Conditional_50_For_2_Template_div_click_0_listener() { const bucket_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OnChartBucketClick(bucket_r5)); });
48
- i0.ɵɵelementStart(1, "div", 34);
47
+ i0.ɵɵelementStart(0, "div", 34);
48
+ i0.ɵɵlistener("click", function AnalyticsPromptRunsComponent_Conditional_1_Conditional_56_For_2_Template_div_click_0_listener() { const bucket_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OnChartBucketClick(bucket_r5)); });
49
+ i0.ɵɵelementStart(1, "div", 35);
49
50
  i0.ɵɵtext(2);
50
51
  i0.ɵɵelementEnd();
51
- i0.ɵɵelement(3, "div", 35);
52
- i0.ɵɵelementStart(4, "div", 36);
52
+ i0.ɵɵelement(3, "div", 36);
53
+ i0.ɵɵelementStart(4, "div", 37);
53
54
  i0.ɵɵtext(5);
54
55
  i0.ɵɵelementEnd()();
55
56
  } if (rf & 2) {
@@ -63,27 +64,27 @@ function AnalyticsPromptRunsComponent_Conditional_1_Conditional_50_For_2_Templat
63
64
  i0.ɵɵadvance(2);
64
65
  i0.ɵɵtextInterpolate(bucket_r5.label);
65
66
  } }
66
- function AnalyticsPromptRunsComponent_Conditional_1_Conditional_50_Template(rf, ctx) { if (rf & 1) {
67
- i0.ɵɵelementStart(0, "div", 16);
68
- i0.ɵɵrepeaterCreate(1, AnalyticsPromptRunsComponent_Conditional_1_Conditional_50_For_2_Template, 6, 5, "div", 32, _forTrack5);
67
+ function AnalyticsPromptRunsComponent_Conditional_1_Conditional_56_Template(rf, ctx) { if (rf & 1) {
68
+ i0.ɵɵelementStart(0, "div", 17);
69
+ i0.ɵɵrepeaterCreate(1, AnalyticsPromptRunsComponent_Conditional_1_Conditional_56_For_2_Template, 6, 5, "div", 33, _forTrack5);
69
70
  i0.ɵɵelementEnd();
70
71
  } if (rf & 2) {
71
72
  const ctx_r2 = i0.ɵɵnextContext(2);
72
73
  i0.ɵɵadvance();
73
74
  i0.ɵɵrepeater(ctx_r2.ChartBuckets);
74
75
  } }
75
- function AnalyticsPromptRunsComponent_Conditional_1_For_56_Template(rf, ctx) { if (rf & 1) {
76
+ function AnalyticsPromptRunsComponent_Conditional_1_For_62_Template(rf, ctx) { if (rf & 1) {
76
77
  const _r6 = i0.ɵɵgetCurrentView();
77
- i0.ɵɵelementStart(0, "div", 37);
78
- i0.ɵɵlistener("click", function AnalyticsPromptRunsComponent_Conditional_1_For_56_Template_div_click_0_listener() { const item_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.ApplyModelFilter(item_r7.id)); });
79
- i0.ɵɵelementStart(1, "span", 38);
78
+ i0.ɵɵelementStart(0, "div", 38);
79
+ i0.ɵɵlistener("click", function AnalyticsPromptRunsComponent_Conditional_1_For_62_Template_div_click_0_listener() { const item_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.ApplyModelFilter(item_r7.id)); });
80
+ i0.ɵɵelementStart(1, "span", 39);
80
81
  i0.ɵɵtext(2);
81
82
  i0.ɵɵelementEnd();
82
- i0.ɵɵelementStart(3, "span", 39);
83
+ i0.ɵɵelementStart(3, "span", 40);
83
84
  i0.ɵɵtext(4);
84
85
  i0.ɵɵelementEnd();
85
- i0.ɵɵelementStart(5, "div", 40);
86
- i0.ɵɵelement(6, "div", 41);
86
+ i0.ɵɵelementStart(5, "div", 41);
87
+ i0.ɵɵelement(6, "div", 42);
87
88
  i0.ɵɵelementEnd()();
88
89
  } if (rf & 2) {
89
90
  const item_r7 = ctx.$implicit;
@@ -94,23 +95,23 @@ function AnalyticsPromptRunsComponent_Conditional_1_For_56_Template(rf, ctx) { i
94
95
  i0.ɵɵadvance(2);
95
96
  i0.ɵɵstyleProp("width", item_r7.percentage, "%");
96
97
  } }
97
- function AnalyticsPromptRunsComponent_Conditional_1_Conditional_57_Template(rf, ctx) { if (rf & 1) {
98
- i0.ɵɵelementStart(0, "div", 21);
98
+ function AnalyticsPromptRunsComponent_Conditional_1_Conditional_63_Template(rf, ctx) { if (rf & 1) {
99
+ i0.ɵɵelementStart(0, "div", 22);
99
100
  i0.ɵɵtext(1, "No data");
100
101
  i0.ɵɵelementEnd();
101
102
  } }
102
- function AnalyticsPromptRunsComponent_Conditional_1_For_62_Template(rf, ctx) { if (rf & 1) {
103
+ function AnalyticsPromptRunsComponent_Conditional_1_For_68_Template(rf, ctx) { if (rf & 1) {
103
104
  const _r8 = i0.ɵɵgetCurrentView();
104
- i0.ɵɵelementStart(0, "div", 37);
105
- i0.ɵɵlistener("click", function AnalyticsPromptRunsComponent_Conditional_1_For_62_Template_div_click_0_listener() { const item_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.ApplyPromptFilter(item_r9.id)); });
106
- i0.ɵɵelementStart(1, "span", 38);
105
+ i0.ɵɵelementStart(0, "div", 38);
106
+ i0.ɵɵlistener("click", function AnalyticsPromptRunsComponent_Conditional_1_For_68_Template_div_click_0_listener() { const item_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.ApplyPromptFilter(item_r9.id)); });
107
+ i0.ɵɵelementStart(1, "span", 39);
107
108
  i0.ɵɵtext(2);
108
109
  i0.ɵɵelementEnd();
109
- i0.ɵɵelementStart(3, "span", 39);
110
+ i0.ɵɵelementStart(3, "span", 40);
110
111
  i0.ɵɵtext(4);
111
112
  i0.ɵɵelementEnd();
112
- i0.ɵɵelementStart(5, "div", 40);
113
- i0.ɵɵelement(6, "div", 41);
113
+ i0.ɵɵelementStart(5, "div", 41);
114
+ i0.ɵɵelement(6, "div", 42);
114
115
  i0.ɵɵelementEnd()();
115
116
  } if (rf & 2) {
116
117
  const item_r9 = ctx.$implicit;
@@ -121,20 +122,20 @@ function AnalyticsPromptRunsComponent_Conditional_1_For_62_Template(rf, ctx) { i
121
122
  i0.ɵɵadvance(2);
122
123
  i0.ɵɵstyleProp("width", item_r9.percentage, "%");
123
124
  } }
124
- function AnalyticsPromptRunsComponent_Conditional_1_Conditional_63_Template(rf, ctx) { if (rf & 1) {
125
- i0.ɵɵelementStart(0, "div", 21);
125
+ function AnalyticsPromptRunsComponent_Conditional_1_Conditional_69_Template(rf, ctx) { if (rf & 1) {
126
+ i0.ɵɵelementStart(0, "div", 22);
126
127
  i0.ɵɵtext(1, "No data");
127
128
  i0.ɵɵelementEnd();
128
129
  } }
129
- function AnalyticsPromptRunsComponent_Conditional_1_For_68_Template(rf, ctx) { if (rf & 1) {
130
+ function AnalyticsPromptRunsComponent_Conditional_1_For_74_Template(rf, ctx) { if (rf & 1) {
130
131
  const _r10 = i0.ɵɵgetCurrentView();
131
- i0.ɵɵelementStart(0, "div", 37);
132
- i0.ɵɵlistener("click", function AnalyticsPromptRunsComponent_Conditional_1_For_68_Template_div_click_0_listener() { const item_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.ApplyStatusFilter(item_r11.name)); });
133
- i0.ɵɵelement(1, "span", 42);
134
- i0.ɵɵelementStart(2, "span", 38);
132
+ i0.ɵɵelementStart(0, "div", 38);
133
+ i0.ɵɵlistener("click", function AnalyticsPromptRunsComponent_Conditional_1_For_74_Template_div_click_0_listener() { const item_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.ApplyStatusFilter(item_r11.name)); });
134
+ i0.ɵɵelement(1, "span", 43);
135
+ i0.ɵɵelementStart(2, "span", 39);
135
136
  i0.ɵɵtext(3);
136
137
  i0.ɵɵelementEnd();
137
- i0.ɵɵelementStart(4, "span", 39);
138
+ i0.ɵɵelementStart(4, "span", 40);
138
139
  i0.ɵɵtext(5);
139
140
  i0.ɵɵpipe(6, "number");
140
141
  i0.ɵɵelementEnd()();
@@ -147,23 +148,23 @@ function AnalyticsPromptRunsComponent_Conditional_1_For_68_Template(rf, ctx) { i
147
148
  i0.ɵɵadvance(2);
148
149
  i0.ɵɵtextInterpolate2("", item_r11.count, " (", i0.ɵɵpipeBind2(6, 5, item_r11.percentage, "1.1-1"), "%)");
149
150
  } }
150
- function AnalyticsPromptRunsComponent_Conditional_1_Conditional_69_Template(rf, ctx) { if (rf & 1) {
151
- i0.ɵɵelementStart(0, "div", 21);
151
+ function AnalyticsPromptRunsComponent_Conditional_1_Conditional_75_Template(rf, ctx) { if (rf & 1) {
152
+ i0.ɵɵelementStart(0, "div", 22);
152
153
  i0.ɵɵtext(1, "No data");
153
154
  i0.ɵɵelementEnd();
154
155
  } }
155
- function AnalyticsPromptRunsComponent_Conditional_1_For_82_Conditional_2_Template(rf, ctx) { if (rf & 1) {
156
+ function AnalyticsPromptRunsComponent_Conditional_1_For_88_Conditional_2_Template(rf, ctx) { if (rf & 1) {
156
157
  i0.ɵɵelement(0, "i");
157
158
  } if (rf & 2) {
158
159
  const ctx_r2 = i0.ɵɵnextContext(3);
159
160
  i0.ɵɵclassMap(ctx_r2.SortDirection === "asc" ? "fa-solid fa-caret-up" : "fa-solid fa-caret-down");
160
161
  } }
161
- function AnalyticsPromptRunsComponent_Conditional_1_For_82_Template(rf, ctx) { if (rf & 1) {
162
+ function AnalyticsPromptRunsComponent_Conditional_1_For_88_Template(rf, ctx) { if (rf & 1) {
162
163
  const _r12 = i0.ɵɵgetCurrentView();
163
- i0.ɵɵelementStart(0, "th", 43);
164
- i0.ɵɵlistener("click", function AnalyticsPromptRunsComponent_Conditional_1_For_82_Template_th_click_0_listener() { const col_r13 = i0.ɵɵrestoreView(_r12).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(col_r13.sortable ? ctx_r2.OnSortChange(col_r13.field) : null); });
164
+ i0.ɵɵelementStart(0, "th", 44);
165
+ i0.ɵɵlistener("click", function AnalyticsPromptRunsComponent_Conditional_1_For_88_Template_th_click_0_listener() { const col_r13 = i0.ɵɵrestoreView(_r12).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(col_r13.sortable ? ctx_r2.OnSortChange(col_r13.field) : null); });
165
166
  i0.ɵɵtext(1);
166
- i0.ɵɵconditionalCreate(2, AnalyticsPromptRunsComponent_Conditional_1_For_82_Conditional_2_Template, 1, 2, "i", 44);
167
+ i0.ɵɵconditionalCreate(2, AnalyticsPromptRunsComponent_Conditional_1_For_88_Conditional_2_Template, 1, 2, "i", 45);
167
168
  i0.ɵɵelementEnd();
168
169
  } if (rf & 2) {
169
170
  const col_r13 = ctx.$implicit;
@@ -174,34 +175,34 @@ function AnalyticsPromptRunsComponent_Conditional_1_For_82_Template(rf, ctx) { i
174
175
  i0.ɵɵadvance();
175
176
  i0.ɵɵconditional(col_r13.sortable && ctx_r2.SortField === col_r13.field ? 2 : -1);
176
177
  } }
177
- function AnalyticsPromptRunsComponent_Conditional_1_For_85_Template(rf, ctx) { if (rf & 1) {
178
- i0.ɵɵelementStart(0, "tr")(1, "td", 45);
178
+ function AnalyticsPromptRunsComponent_Conditional_1_For_91_Template(rf, ctx) { if (rf & 1) {
179
+ i0.ɵɵelementStart(0, "tr")(1, "td", 46);
179
180
  i0.ɵɵtext(2);
180
181
  i0.ɵɵelementEnd();
181
- i0.ɵɵelementStart(3, "td", 46);
182
+ i0.ɵɵelementStart(3, "td", 47);
182
183
  i0.ɵɵtext(4);
183
184
  i0.ɵɵelementEnd();
184
- i0.ɵɵelementStart(5, "td")(6, "span", 47);
185
+ i0.ɵɵelementStart(5, "td")(6, "span", 48);
185
186
  i0.ɵɵtext(7);
186
187
  i0.ɵɵelementEnd()();
187
- i0.ɵɵelementStart(8, "td")(9, "span", 48);
188
+ i0.ɵɵelementStart(8, "td")(9, "span", 49);
188
189
  i0.ɵɵtext(10);
189
190
  i0.ɵɵelementEnd()();
190
- i0.ɵɵelementStart(11, "td", 49);
191
+ i0.ɵɵelementStart(11, "td", 50);
191
192
  i0.ɵɵtext(12);
192
193
  i0.ɵɵelementEnd();
193
- i0.ɵɵelementStart(13, "td", 49);
194
+ i0.ɵɵelementStart(13, "td", 51);
194
195
  i0.ɵɵtext(14);
195
196
  i0.ɵɵpipe(15, "number");
196
197
  i0.ɵɵelementEnd();
197
- i0.ɵɵelementStart(16, "td", 49);
198
+ i0.ɵɵelementStart(16, "td", 50);
198
199
  i0.ɵɵtext(17);
199
200
  i0.ɵɵelementEnd()();
200
201
  } if (rf & 2) {
201
202
  const run_r14 = ctx.$implicit;
202
- const ɵ$index_198_r15 = ctx.$index;
203
+ const ɵ$index_207_r15 = ctx.$index;
203
204
  const ctx_r2 = i0.ɵɵnextContext(2);
204
- i0.ɵɵclassProp("row-even", ɵ$index_198_r15 % 2 === 0);
205
+ i0.ɵɵclassProp("row-even", ɵ$index_207_r15 % 2 === 0);
205
206
  i0.ɵɵadvance(2);
206
207
  i0.ɵɵtextInterpolate(ctx_r2.FormatTimestamp(run_r14.RunAt));
207
208
  i0.ɵɵadvance(2);
@@ -215,27 +216,27 @@ function AnalyticsPromptRunsComponent_Conditional_1_For_85_Template(rf, ctx) { i
215
216
  i0.ɵɵadvance(2);
216
217
  i0.ɵɵtextInterpolate(ctx_r2.FormatDuration(run_r14.ExecutionTimeMS));
217
218
  i0.ɵɵadvance(2);
218
- i0.ɵɵtextInterpolate(run_r14.TokensUsed != null ? i0.ɵɵpipeBind1(15, 11, run_r14.TokensUsed) : "-");
219
+ i0.ɵɵtextInterpolate(run_r14.TokensUsed != null ? i0.ɵɵpipeBind1(15, 11, ctx_r2.TrueTotalTokens(run_r14)) : "-");
219
220
  i0.ɵɵadvance(3);
220
221
  i0.ɵɵtextInterpolate(ctx_r2.FormatCurrency(run_r14.Cost, 4));
221
222
  } }
222
- function AnalyticsPromptRunsComponent_Conditional_1_Conditional_86_Template(rf, ctx) { if (rf & 1) {
223
- i0.ɵɵelementStart(0, "tr")(1, "td", 50);
223
+ function AnalyticsPromptRunsComponent_Conditional_1_Conditional_92_Template(rf, ctx) { if (rf & 1) {
224
+ i0.ɵɵelementStart(0, "tr")(1, "td", 52);
224
225
  i0.ɵɵtext(2, "No prompt runs found for the selected filters.");
225
226
  i0.ɵɵelementEnd()();
226
227
  } }
227
- function AnalyticsPromptRunsComponent_Conditional_1_Conditional_87_Template(rf, ctx) { if (rf & 1) {
228
+ function AnalyticsPromptRunsComponent_Conditional_1_Conditional_93_Template(rf, ctx) { if (rf & 1) {
228
229
  const _r16 = i0.ɵɵgetCurrentView();
229
- i0.ɵɵelementStart(0, "div", 30)(1, "button", 51);
230
- i0.ɵɵlistener("click", function AnalyticsPromptRunsComponent_Conditional_1_Conditional_87_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnPageChange(ctx_r2.CurrentPage - 1)); });
231
- i0.ɵɵelement(2, "i", 52);
230
+ i0.ɵɵelementStart(0, "div", 31)(1, "button", 53);
231
+ i0.ɵɵlistener("click", function AnalyticsPromptRunsComponent_Conditional_1_Conditional_93_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnPageChange(ctx_r2.CurrentPage - 1)); });
232
+ i0.ɵɵelement(2, "i", 54);
232
233
  i0.ɵɵelementEnd();
233
- i0.ɵɵelementStart(3, "span", 53);
234
+ i0.ɵɵelementStart(3, "span", 55);
234
235
  i0.ɵɵtext(4);
235
236
  i0.ɵɵelementEnd();
236
- i0.ɵɵelementStart(5, "button", 51);
237
- i0.ɵɵlistener("click", function AnalyticsPromptRunsComponent_Conditional_1_Conditional_87_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnPageChange(ctx_r2.CurrentPage + 1)); });
238
- i0.ɵɵelement(6, "i", 54);
237
+ i0.ɵɵelementStart(5, "button", 53);
238
+ i0.ɵɵlistener("click", function AnalyticsPromptRunsComponent_Conditional_1_Conditional_93_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnPageChange(ctx_r2.CurrentPage + 1)); });
239
+ i0.ɵɵelement(6, "i", 56);
239
240
  i0.ɵɵelementEnd()();
240
241
  } if (rf & 2) {
241
242
  const ctx_r2 = i0.ɵɵnextContext(2);
@@ -293,96 +294,105 @@ function AnalyticsPromptRunsComponent_Conditional_1_Template(rf, ctx) { if (rf &
293
294
  i0.ɵɵelementEnd();
294
295
  i0.ɵɵelementStart(39, "div", 5);
295
296
  i0.ɵɵtext(40);
297
+ i0.ɵɵelementEnd()();
298
+ i0.ɵɵelementStart(41, "div", 9)(42, "div", 4);
299
+ i0.ɵɵtext(43, "Cache Hit Rate");
300
+ i0.ɵɵelementEnd();
301
+ i0.ɵɵelementStart(44, "div", 5);
302
+ i0.ɵɵtext(45);
303
+ i0.ɵɵpipe(46, "number");
296
304
  i0.ɵɵelementEnd()()();
297
- i0.ɵɵelementStart(41, "div", 9)(42, "div", 10)(43, "h3", 11);
298
- i0.ɵɵtext(44, "Runs Over Time");
305
+ i0.ɵɵelementStart(47, "div", 10)(48, "div", 11)(49, "h3", 12);
306
+ i0.ɵɵtext(50, "Runs Over Time");
299
307
  i0.ɵɵelementEnd();
300
- i0.ɵɵelementStart(45, "div", 12);
301
- i0.ɵɵrepeaterCreate(46, AnalyticsPromptRunsComponent_Conditional_1_For_47_Template, 2, 3, "button", 13, _forTrack0);
308
+ i0.ɵɵelementStart(51, "div", 13);
309
+ i0.ɵɵrepeaterCreate(52, AnalyticsPromptRunsComponent_Conditional_1_For_53_Template, 2, 3, "button", 14, _forTrack0);
302
310
  i0.ɵɵelementEnd()();
303
- i0.ɵɵelementStart(48, "div", 14);
304
- i0.ɵɵconditionalCreate(49, AnalyticsPromptRunsComponent_Conditional_1_Conditional_49_Template, 2, 0, "div", 15)(50, AnalyticsPromptRunsComponent_Conditional_1_Conditional_50_Template, 3, 0, "div", 16);
311
+ i0.ɵɵelementStart(54, "div", 15);
312
+ i0.ɵɵconditionalCreate(55, AnalyticsPromptRunsComponent_Conditional_1_Conditional_55_Template, 2, 0, "div", 16)(56, AnalyticsPromptRunsComponent_Conditional_1_Conditional_56_Template, 3, 0, "div", 17);
305
313
  i0.ɵɵelementEnd()();
306
- i0.ɵɵelementStart(51, "div", 17)(52, "div", 18)(53, "h4", 19);
307
- i0.ɵɵtext(54, "By Model");
314
+ i0.ɵɵelementStart(57, "div", 18)(58, "div", 19)(59, "h4", 20);
315
+ i0.ɵɵtext(60, "By Model");
308
316
  i0.ɵɵelementEnd();
309
- i0.ɵɵrepeaterCreate(55, AnalyticsPromptRunsComponent_Conditional_1_For_56_Template, 7, 4, "div", 20, _forTrack1);
310
- i0.ɵɵconditionalCreate(57, AnalyticsPromptRunsComponent_Conditional_1_Conditional_57_Template, 2, 0, "div", 21);
317
+ i0.ɵɵrepeaterCreate(61, AnalyticsPromptRunsComponent_Conditional_1_For_62_Template, 7, 4, "div", 21, _forTrack1);
318
+ i0.ɵɵconditionalCreate(63, AnalyticsPromptRunsComponent_Conditional_1_Conditional_63_Template, 2, 0, "div", 22);
311
319
  i0.ɵɵelementEnd();
312
- i0.ɵɵelementStart(58, "div", 18)(59, "h4", 19);
313
- i0.ɵɵtext(60, "By Prompt");
320
+ i0.ɵɵelementStart(64, "div", 19)(65, "h4", 20);
321
+ i0.ɵɵtext(66, "By Prompt");
314
322
  i0.ɵɵelementEnd();
315
- i0.ɵɵrepeaterCreate(61, AnalyticsPromptRunsComponent_Conditional_1_For_62_Template, 7, 4, "div", 20, _forTrack1);
316
- i0.ɵɵconditionalCreate(63, AnalyticsPromptRunsComponent_Conditional_1_Conditional_63_Template, 2, 0, "div", 21);
323
+ i0.ɵɵrepeaterCreate(67, AnalyticsPromptRunsComponent_Conditional_1_For_68_Template, 7, 4, "div", 21, _forTrack1);
324
+ i0.ɵɵconditionalCreate(69, AnalyticsPromptRunsComponent_Conditional_1_Conditional_69_Template, 2, 0, "div", 22);
317
325
  i0.ɵɵelementEnd();
318
- i0.ɵɵelementStart(64, "div", 18)(65, "h4", 19);
319
- i0.ɵɵtext(66, "By Status");
326
+ i0.ɵɵelementStart(70, "div", 19)(71, "h4", 20);
327
+ i0.ɵɵtext(72, "By Status");
320
328
  i0.ɵɵelementEnd();
321
- i0.ɵɵrepeaterCreate(67, AnalyticsPromptRunsComponent_Conditional_1_For_68_Template, 7, 8, "div", 20, _forTrack2);
322
- i0.ɵɵconditionalCreate(69, AnalyticsPromptRunsComponent_Conditional_1_Conditional_69_Template, 2, 0, "div", 21);
329
+ i0.ɵɵrepeaterCreate(73, AnalyticsPromptRunsComponent_Conditional_1_For_74_Template, 7, 8, "div", 21, _forTrack2);
330
+ i0.ɵɵconditionalCreate(75, AnalyticsPromptRunsComponent_Conditional_1_Conditional_75_Template, 2, 0, "div", 22);
323
331
  i0.ɵɵelementEnd()();
324
- i0.ɵɵelementStart(70, "div", 22)(71, "div", 23)(72, "h3", 24);
325
- i0.ɵɵtext(73, "Run Details");
332
+ i0.ɵɵelementStart(76, "div", 23)(77, "div", 24)(78, "h3", 25);
333
+ i0.ɵɵtext(79, "Run Details");
326
334
  i0.ɵɵelementEnd();
327
- i0.ɵɵelementStart(74, "span", 25);
328
- i0.ɵɵtext(75);
329
- i0.ɵɵpipe(76, "number");
335
+ i0.ɵɵelementStart(80, "span", 26);
336
+ i0.ɵɵtext(81);
337
+ i0.ɵɵpipe(82, "number");
330
338
  i0.ɵɵelementEnd()();
331
- i0.ɵɵelementStart(77, "div", 26)(78, "table", 27)(79, "thead")(80, "tr");
332
- i0.ɵɵrepeaterCreate(81, AnalyticsPromptRunsComponent_Conditional_1_For_82_Template, 3, 6, "th", 28, _forTrack3);
339
+ i0.ɵɵelementStart(83, "div", 27)(84, "table", 28)(85, "thead")(86, "tr");
340
+ i0.ɵɵrepeaterCreate(87, AnalyticsPromptRunsComponent_Conditional_1_For_88_Template, 3, 6, "th", 29, _forTrack3);
333
341
  i0.ɵɵelementEnd()();
334
- i0.ɵɵelementStart(83, "tbody");
335
- i0.ɵɵrepeaterCreate(84, AnalyticsPromptRunsComponent_Conditional_1_For_85_Template, 18, 13, "tr", 29, _forTrack4);
336
- i0.ɵɵconditionalCreate(86, AnalyticsPromptRunsComponent_Conditional_1_Conditional_86_Template, 3, 0, "tr");
342
+ i0.ɵɵelementStart(89, "tbody");
343
+ i0.ɵɵrepeaterCreate(90, AnalyticsPromptRunsComponent_Conditional_1_For_91_Template, 18, 13, "tr", 30, _forTrack4);
344
+ i0.ɵɵconditionalCreate(92, AnalyticsPromptRunsComponent_Conditional_1_Conditional_92_Template, 3, 0, "tr");
337
345
  i0.ɵɵelementEnd()()();
338
- i0.ɵɵconditionalCreate(87, AnalyticsPromptRunsComponent_Conditional_1_Conditional_87_Template, 7, 4, "div", 30);
346
+ i0.ɵɵconditionalCreate(93, AnalyticsPromptRunsComponent_Conditional_1_Conditional_93_Template, 7, 4, "div", 31);
339
347
  i0.ɵɵelementEnd();
340
348
  } if (rf & 2) {
341
349
  const ctx_r2 = i0.ɵɵnextContext();
342
350
  i0.ɵɵadvance(5);
343
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(6, 14, ctx_r2.Stats.TotalRuns));
351
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(6, 15, ctx_r2.Stats.TotalRuns));
344
352
  i0.ɵɵadvance(6);
345
353
  i0.ɵɵtextInterpolate(ctx_r2.FormatCurrency(ctx_r2.Stats.AvgCost, 4));
346
354
  i0.ɵɵadvance(5);
347
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(17, 16, ctx_r2.Stats.AvgTokens, "1.0-0"));
355
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(17, 17, ctx_r2.Stats.AvgTokens, "1.0-0"));
348
356
  i0.ɵɵadvance(6);
349
- i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(23, 19, ctx_r2.Stats.AvgLatencySeconds, "1.2-2"), "s");
357
+ i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(23, 20, ctx_r2.Stats.AvgLatencySeconds, "1.2-2"), "s");
350
358
  i0.ɵɵadvance(6);
351
- i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(29, 22, ctx_r2.Stats.SuccessRate, "1.1-1"), "%");
359
+ i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(29, 23, ctx_r2.Stats.SuccessRate, "1.1-1"), "%");
352
360
  i0.ɵɵadvance(6);
353
- i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(35, 25, ctx_r2.Stats.P95LatencySeconds, "1.2-2"), "s");
361
+ i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(35, 26, ctx_r2.Stats.P95LatencySeconds, "1.2-2"), "s");
354
362
  i0.ɵɵadvance(6);
355
363
  i0.ɵɵtextInterpolate(ctx_r2.FormatCurrency(ctx_r2.Stats.TotalCost, 2));
356
- i0.ɵɵadvance(6);
364
+ i0.ɵɵadvance(5);
365
+ i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(46, 29, ctx_r2.Stats.CacheHitRate * 100, "1.1-1"), "%");
366
+ i0.ɵɵadvance(7);
357
367
  i0.ɵɵrepeater(ctx_r2.ChartMetricOptions);
358
368
  i0.ɵɵadvance(3);
359
- i0.ɵɵconditional(ctx_r2.ChartBuckets.length === 0 ? 49 : 50);
369
+ i0.ɵɵconditional(ctx_r2.ChartBuckets.length === 0 ? 55 : 56);
360
370
  i0.ɵɵadvance(6);
361
371
  i0.ɵɵrepeater(ctx_r2.ModelBreakdown);
362
372
  i0.ɵɵadvance(2);
363
- i0.ɵɵconditional(ctx_r2.ModelBreakdown.length === 0 ? 57 : -1);
373
+ i0.ɵɵconditional(ctx_r2.ModelBreakdown.length === 0 ? 63 : -1);
364
374
  i0.ɵɵadvance(4);
365
375
  i0.ɵɵrepeater(ctx_r2.PromptBreakdown);
366
376
  i0.ɵɵadvance(2);
367
- i0.ɵɵconditional(ctx_r2.PromptBreakdown.length === 0 ? 63 : -1);
377
+ i0.ɵɵconditional(ctx_r2.PromptBreakdown.length === 0 ? 69 : -1);
368
378
  i0.ɵɵadvance(4);
369
379
  i0.ɵɵrepeater(ctx_r2.StatusBreakdown);
370
380
  i0.ɵɵadvance(2);
371
- i0.ɵɵconditional(ctx_r2.StatusBreakdown.length === 0 ? 69 : -1);
381
+ i0.ɵɵconditional(ctx_r2.StatusBreakdown.length === 0 ? 75 : -1);
372
382
  i0.ɵɵadvance(6);
373
- i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind1(76, 28, ctx_r2.FilteredRuns.length), " runs");
383
+ i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind1(82, 32, ctx_r2.FilteredRuns.length), " runs");
374
384
  i0.ɵɵadvance(6);
375
385
  i0.ɵɵrepeater(ctx_r2.TableColumns);
376
386
  i0.ɵɵadvance(3);
377
387
  i0.ɵɵrepeater(ctx_r2.PagedRuns);
378
388
  i0.ɵɵadvance(2);
379
- i0.ɵɵconditional(ctx_r2.PagedRuns.length === 0 ? 86 : -1);
389
+ i0.ɵɵconditional(ctx_r2.PagedRuns.length === 0 ? 92 : -1);
380
390
  i0.ɵɵadvance();
381
- i0.ɵɵconditional(ctx_r2.TotalPages > 1 ? 87 : -1);
391
+ i0.ɵɵconditional(ctx_r2.TotalPages > 1 ? 93 : -1);
382
392
  } }
383
393
  const FIELDS = [
384
394
  'ID', 'RunAt', 'CompletedAt', 'Status', 'Success', 'Cost', 'TotalCost',
385
- 'TokensUsed', 'TokensPrompt', 'TokensCompletion', 'ExecutionTimeMS',
395
+ 'TokensUsed', 'TokensPrompt', 'TokensCompletion', 'TokensCacheRead', 'TokensCacheWrite', 'ExecutionTimeMS',
386
396
  'ModelID', 'Model', 'AgentID', 'Agent', 'PromptID', 'Prompt', 'ErrorMessage'
387
397
  ];
388
398
  const PAGE_SIZE = 25;
@@ -427,6 +437,7 @@ export class AnalyticsPromptRunsComponent extends BaseAngularComponent {
427
437
  { key: 'volume', label: 'By Volume' },
428
438
  { key: 'cost', label: 'By Cost' },
429
439
  { key: 'tokens', label: 'By Tokens' },
440
+ { key: 'cacheHit', label: 'By Cache Hit %' },
430
441
  ];
431
442
  TableColumns = [
432
443
  { field: 'RunAt', label: 'Timestamp', sortable: true },
@@ -526,7 +537,7 @@ export class AnalyticsPromptRunsComponent extends BaseAngularComponent {
526
537
  r.Model ?? '',
527
538
  r.Status,
528
539
  r.ExecutionTimeMS?.toString() ?? '',
529
- r.TokensUsed?.toString() ?? '',
540
+ this.TrueTotalTokens(r).toString(),
530
541
  r.Cost?.toString() ?? ''
531
542
  ]);
532
543
  const csv = [headers, ...rows].map(r => r.join(',')).join('\n');
@@ -560,6 +571,9 @@ export class AnalyticsPromptRunsComponent extends BaseAngularComponent {
560
571
  if (this.ActiveChartMetric === 'cost') {
561
572
  return '$' + value.toFixed(2);
562
573
  }
574
+ if (this.ActiveChartMetric === 'cacheHit') {
575
+ return value.toFixed(0) + '%';
576
+ }
563
577
  if (value >= 1000) {
564
578
  return (value / 1000).toFixed(1) + 'k';
565
579
  }
@@ -615,17 +629,29 @@ export class AnalyticsPromptRunsComponent extends BaseAngularComponent {
615
629
  }
616
630
  return filtered;
617
631
  }
632
+ /**
633
+ * Total tokens the model processed for a run, INCLUDING cached input. TokensUsed excludes the
634
+ * cache buckets by design, so a heavily-cached run looks tiny; this is the true throughput.
635
+ */
636
+ TrueTotalTokens(run) {
637
+ return (run.TokensUsed ?? 0) + (run.TokensCacheRead ?? 0) + (run.TokensCacheWrite ?? 0);
638
+ }
618
639
  computeStats(runs) {
619
640
  const total = runs.length;
620
641
  if (total === 0) {
621
- return { TotalRuns: 0, AvgCost: 0, AvgTokens: 0, AvgLatencySeconds: 0, SuccessRate: 0, P95LatencySeconds: 0, TotalCost: 0 };
642
+ return { TotalRuns: 0, AvgCost: 0, AvgTokens: 0, AvgLatencySeconds: 0, SuccessRate: 0, P95LatencySeconds: 0, TotalCost: 0, CacheHitRate: 0 };
622
643
  }
623
644
  const totalCost = this.sumNullable(runs, r => r.Cost);
624
- const totalTokens = this.sumNullable(runs, r => r.TokensUsed);
645
+ const totalTokens = runs.reduce((sum, r) => sum + this.TrueTotalTokens(r), 0);
625
646
  const latencies = this.collectNonNull(runs, r => r.ExecutionTimeMS);
626
647
  const avgLatencyMs = latencies.length > 0 ? latencies.reduce((a, b) => a + b, 0) / latencies.length : 0;
627
648
  const successCount = runs.filter(r => r.Status === 'Completed').length;
628
649
  const p95 = this.percentile(latencies, 95);
650
+ const cacheHit = cacheHitRate({
651
+ uncachedInputTokens: this.sumNullable(runs, r => r.TokensPrompt),
652
+ cacheReadTokens: this.sumNullable(runs, r => r.TokensCacheRead),
653
+ cacheWriteTokens: this.sumNullable(runs, r => r.TokensCacheWrite)
654
+ });
629
655
  return {
630
656
  TotalRuns: total,
631
657
  AvgCost: totalCost / total,
@@ -634,6 +660,7 @@ export class AnalyticsPromptRunsComponent extends BaseAngularComponent {
634
660
  SuccessRate: (successCount / total) * 100,
635
661
  P95LatencySeconds: p95 / 1000,
636
662
  TotalCost: totalCost,
663
+ CacheHitRate: cacheHit,
637
664
  };
638
665
  }
639
666
  computeChartBuckets(runs) {
@@ -651,6 +678,8 @@ export class AnalyticsPromptRunsComponent extends BaseAngularComponent {
651
678
  buckets.push({
652
679
  label: this.formatBucketLabel(start),
653
680
  total: 0,
681
+ cacheRead: 0,
682
+ inputForHit: 0,
654
683
  start,
655
684
  end,
656
685
  });
@@ -660,6 +689,14 @@ export class AnalyticsPromptRunsComponent extends BaseAngularComponent {
660
689
  const idx = Math.min(Math.floor((runTime - cutoff.getTime()) / bucketMs), bucketCount - 1);
661
690
  if (idx >= 0 && idx < bucketCount) {
662
691
  buckets[idx].total += this.getChartMetricValue(run);
692
+ // Cache hit-rate is a ratio, not a sum — accumulate the components and divide below.
693
+ buckets[idx].cacheRead += run.TokensCacheRead ?? 0;
694
+ buckets[idx].inputForHit += (run.TokensPrompt ?? 0) + (run.TokensCacheRead ?? 0) + (run.TokensCacheWrite ?? 0);
695
+ }
696
+ }
697
+ if (this.ActiveChartMetric === 'cacheHit') {
698
+ for (const b of buckets) {
699
+ b.total = b.inputForHit > 0 ? (b.cacheRead / b.inputForHit) * 100 : 0;
663
700
  }
664
701
  }
665
702
  const max = Math.max(...buckets.map(b => b.total), 1);
@@ -674,7 +711,7 @@ export class AnalyticsPromptRunsComponent extends BaseAngularComponent {
674
711
  getChartMetricValue(run) {
675
712
  switch (this.ActiveChartMetric) {
676
713
  case 'cost': return run.Cost ?? 0;
677
- case 'tokens': return run.TokensUsed ?? 0;
714
+ case 'tokens': return this.TrueTotalTokens(run);
678
715
  default: return 1; // volume = count
679
716
  }
680
717
  }
@@ -801,8 +838,8 @@ export class AnalyticsPromptRunsComponent extends BaseAngularComponent {
801
838
  this.CurrentPage = 1;
802
839
  }
803
840
  static ɵfac = /*@__PURE__*/ (() => { let ɵAnalyticsPromptRunsComponent_BaseFactory; return function AnalyticsPromptRunsComponent_Factory(__ngFactoryType__) { return (ɵAnalyticsPromptRunsComponent_BaseFactory || (ɵAnalyticsPromptRunsComponent_BaseFactory = i0.ɵɵgetInheritedFactory(AnalyticsPromptRunsComponent)))(__ngFactoryType__ || AnalyticsPromptRunsComponent); }; })();
804
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AnalyticsPromptRunsComponent, selectors: [["app-analytics-prompt-runs"]], inputs: { TimeRange: "TimeRange", Filters: "Filters" }, outputs: { TimeRangeChange: "TimeRangeChange", FiltersChange: "FiltersChange" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, "loading-container"], ["text", "Loading prompt runs..."], [1, "stats-grid"], [1, "stat-card", "accent-brand"], [1, "stat-label"], [1, "stat-value"], [1, "stat-card"], [1, "stat-card", "accent-success"], [1, "stat-card", "accent-warning"], [1, "chart-panel"], [1, "chart-header"], [1, "chart-title"], [1, "chart-toggles"], [1, "toggle-chip", 3, "active"], [1, "chart-area"], [1, "chart-empty"], [1, "chart-bars"], [1, "breakdown-grid"], [1, "breakdown-card"], [1, "breakdown-title"], [1, "breakdown-row"], [1, "breakdown-empty"], [1, "table-panel"], [1, "table-header"], [1, "table-title"], [1, "table-count"], [1, "table-scroll"], [1, "runs-table"], [3, "sortable", "sorted"], [3, "row-even"], [1, "pagination"], [1, "toggle-chip", 3, "click"], [1, "chart-bar-wrapper", 3, "title"], [1, "chart-bar-wrapper", 3, "click", "title"], [1, "chart-bar-value"], [1, "chart-bar"], [1, "chart-bar-label"], [1, "breakdown-row", 3, "click"], [1, "breakdown-name"], [1, "breakdown-count"], [1, "breakdown-bar-track"], [1, "breakdown-bar-fill"], [1, "status-dot"], [3, "click"], [3, "class"], [1, "cell-timestamp"], [1, "cell-prompt"], [1, "model-tag"], [1, "status-pill"], [1, "cell-number"], ["colspan", "7", 1, "empty-row"], [1, "page-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-left"], [1, "page-info"], [1, "fa-solid", "fa-chevron-right"]], template: function AnalyticsPromptRunsComponent_Template(rf, ctx) { if (rf & 1) {
805
- i0.ɵɵconditionalCreate(0, AnalyticsPromptRunsComponent_Conditional_0_Template, 2, 0, "div", 0)(1, AnalyticsPromptRunsComponent_Conditional_1_Template, 88, 30);
841
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AnalyticsPromptRunsComponent, selectors: [["app-analytics-prompt-runs"]], inputs: { TimeRange: "TimeRange", Filters: "Filters" }, outputs: { TimeRangeChange: "TimeRangeChange", FiltersChange: "FiltersChange" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, "loading-container"], ["text", "Loading prompt runs..."], [1, "stats-grid"], [1, "stat-card", "accent-brand"], [1, "stat-label"], [1, "stat-value"], [1, "stat-card"], [1, "stat-card", "accent-success"], [1, "stat-card", "accent-warning"], ["title", "Share of input tokens served from the provider's prompt cache", 1, "stat-card"], [1, "chart-panel"], [1, "chart-header"], [1, "chart-title"], [1, "chart-toggles"], [1, "toggle-chip", 3, "active"], [1, "chart-area"], [1, "chart-empty"], [1, "chart-bars"], [1, "breakdown-grid"], [1, "breakdown-card"], [1, "breakdown-title"], [1, "breakdown-row"], [1, "breakdown-empty"], [1, "table-panel"], [1, "table-header"], [1, "table-title"], [1, "table-count"], [1, "table-scroll"], [1, "runs-table"], [3, "sortable", "sorted"], [3, "row-even"], [1, "pagination"], [1, "toggle-chip", 3, "click"], [1, "chart-bar-wrapper", 3, "title"], [1, "chart-bar-wrapper", 3, "click", "title"], [1, "chart-bar-value"], [1, "chart-bar"], [1, "chart-bar-label"], [1, "breakdown-row", 3, "click"], [1, "breakdown-name"], [1, "breakdown-count"], [1, "breakdown-bar-track"], [1, "breakdown-bar-fill"], [1, "status-dot"], [3, "click"], [3, "class"], [1, "cell-timestamp"], [1, "cell-prompt"], [1, "model-tag"], [1, "status-pill"], [1, "cell-number"], ["title", "Total tokens processed, including cached input", 1, "cell-number"], ["colspan", "7", 1, "empty-row"], [1, "page-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-left"], [1, "page-info"], [1, "fa-solid", "fa-chevron-right"]], template: function AnalyticsPromptRunsComponent_Template(rf, ctx) { if (rf & 1) {
842
+ i0.ɵɵconditionalCreate(0, AnalyticsPromptRunsComponent_Conditional_0_Template, 2, 0, "div", 0)(1, AnalyticsPromptRunsComponent_Conditional_1_Template, 94, 34);
806
843
  } if (rf & 2) {
807
844
  i0.ɵɵconditional(ctx.IsLoading ? 0 : 1);
808
845
  } }, dependencies: [i1.LoadingComponent, i2.DecimalPipe], styles: ["[_nghost-%COMP%] {\n display: block;\n }\n\n .loading-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 80px 0;\n }\n\n \n\n\n .stats-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-top: 16px;\n }\n\n .stat-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 14px 16px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .stat-card.accent-brand[_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-brand-primary);\n }\n\n .stat-card.accent-success[_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-status-success);\n }\n\n .stat-card.accent-warning[_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-status-warning);\n }\n\n .stat-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n }\n\n .stat-value[_ngcontent-%COMP%] {\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n\n \n\n\n .chart-panel[_ngcontent-%COMP%] {\n margin-top: 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n }\n\n .chart-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n }\n\n .chart-title[_ngcontent-%COMP%] {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0;\n }\n\n .chart-toggles[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n }\n\n .toggle-chip[_ngcontent-%COMP%] {\n padding: 4px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 16px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s, color 0.15s, border-color 0.15s;\n }\n\n .toggle-chip[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n .toggle-chip.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n font-weight: 600;\n }\n\n .chart-area[_ngcontent-%COMP%] {\n height: 220px;\n display: flex;\n align-items: flex-end;\n }\n\n .chart-empty[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n color: var(--mj-text-muted);\n font-size: 13px;\n }\n\n .chart-bars[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-end;\n gap: 4px;\n width: 100%;\n height: 100%;\n padding-bottom: 24px;\n }\n\n .chart-bar-wrapper[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n cursor: pointer;\n position: relative;\n height: 100%;\n justify-content: flex-end;\n }\n\n .chart-bar-value[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n margin-bottom: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n }\n\n .chart-bar[_ngcontent-%COMP%] {\n width: 80%;\n min-height: 2px;\n background: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n border-radius: 4px 4px 0 0;\n transition: background 0.15s, height 0.3s;\n }\n\n .chart-bar-wrapper[_ngcontent-%COMP%]:hover .chart-bar[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 50%, var(--mj-bg-surface));\n }\n\n .chart-bar-label[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n margin-top: 6px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n text-align: center;\n position: absolute;\n bottom: 0;\n }\n\n \n\n\n .breakdown-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 12px;\n margin-top: 16px;\n }\n\n .breakdown-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 16px;\n }\n\n .breakdown-title[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 12px;\n }\n\n .breakdown-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 0;\n cursor: pointer;\n border-radius: 4px;\n transition: background 0.1s;\n }\n\n .breakdown-row[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .breakdown-name[_ngcontent-%COMP%] {\n flex: 1;\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n }\n\n .breakdown-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n font-weight: 600;\n white-space: nowrap;\n }\n\n .breakdown-bar-track[_ngcontent-%COMP%] {\n width: 60px;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n flex-shrink: 0;\n }\n\n .breakdown-bar-fill[_ngcontent-%COMP%] {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n transition: width 0.3s;\n }\n\n .breakdown-empty[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n padding: 8px 0;\n }\n\n .status-dot[_ngcontent-%COMP%] {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .status-dot.dot-completed[_ngcontent-%COMP%] { background: var(--mj-status-success); }\n .status-dot.dot-failed[_ngcontent-%COMP%] { background: var(--mj-status-error); }\n .status-dot.dot-running[_ngcontent-%COMP%] { background: var(--mj-brand-primary); }\n .status-dot.dot-pending[_ngcontent-%COMP%] { background: var(--mj-status-warning); }\n .status-dot.dot-cancelled[_ngcontent-%COMP%] { background: var(--mj-text-muted); }\n\n \n\n\n .table-panel[_ngcontent-%COMP%] {\n margin-top: 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n }\n\n .table-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .table-title[_ngcontent-%COMP%] {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0;\n }\n\n .table-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n\n .table-scroll[_ngcontent-%COMP%] {\n overflow-x: auto;\n }\n\n .runs-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n }\n\n .runs-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 10px 14px;\n text-align: left;\n font-weight: 600;\n font-size: 12px;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n white-space: nowrap;\n user-select: none;\n }\n\n .runs-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%] {\n cursor: pointer;\n }\n\n .runs-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n }\n\n .runs-table[_ngcontent-%COMP%] th.sorted[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n\n .runs-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-left: 4px;\n font-size: 10px;\n }\n\n .runs-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 10px 14px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .runs-table[_ngcontent-%COMP%] tr.row-even[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n }\n\n .runs-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .cell-timestamp[_ngcontent-%COMP%] {\n white-space: nowrap;\n color: var(--mj-text-secondary);\n font-size: 12px;\n }\n\n .cell-prompt[_ngcontent-%COMP%] {\n font-weight: 600;\n max-width: 220px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .cell-number[_ngcontent-%COMP%] {\n text-align: right;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n }\n\n .model-tag[_ngcontent-%COMP%] {\n display: inline-flex;\n padding: 2px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n }\n\n .status-pill[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 10px;\n border-radius: 10px;\n font-size: 12px;\n font-weight: 600;\n white-space: nowrap;\n }\n\n .pill-completed[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n }\n\n .pill-failed[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n }\n\n .pill-running[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .pill-pending[_ngcontent-%COMP%] {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n }\n\n .pill-cancelled[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n .empty-row[_ngcontent-%COMP%] {\n text-align: center;\n color: var(--mj-text-muted);\n padding: 24px 14px;\n }\n\n \n\n\n .pagination[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 12px 20px;\n border-top: 1px solid var(--mj-border-subtle);\n }\n\n .page-btn[_ngcontent-%COMP%] {\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 13px;\n transition: background 0.15s, color 0.15s;\n }\n\n .page-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n .page-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.4;\n cursor: default;\n }\n\n .page-info[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n \n\n\n @media (max-width: 1200px) {\n .breakdown-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n }\n\n @media (max-width: 768px) {\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .breakdown-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .chart-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n }"] });
@@ -846,6 +883,10 @@ export class AnalyticsPromptRunsComponent extends BaseAngularComponent {
846
883
  <div class="stat-label">Total Cost</div>
847
884
  <div class="stat-value">{{ FormatCurrency(Stats.TotalCost, 2) }}</div>
848
885
  </div>
886
+ <div class="stat-card" title="Share of input tokens served from the provider's prompt cache">
887
+ <div class="stat-label">Cache Hit Rate</div>
888
+ <div class="stat-value">{{ Stats.CacheHitRate * 100 | number:'1.1-1' }}%</div>
889
+ </div>
849
890
  </div>
850
891
 
851
892
  <!-- Chart Panel -->
@@ -966,7 +1007,7 @@ export class AnalyticsPromptRunsComponent extends BaseAngularComponent {
966
1007
  <td><span class="model-tag">{{ run.Model ?? 'N/A' }}</span></td>
967
1008
  <td><span class="status-pill" [class]="GetStatusClass(run.Status)">{{ run.Status }}</span></td>
968
1009
  <td class="cell-number">{{ FormatDuration(run.ExecutionTimeMS) }}</td>
969
- <td class="cell-number">{{ run.TokensUsed != null ? (run.TokensUsed | number) : '-' }}</td>
1010
+ <td class="cell-number" title="Total tokens processed, including cached input">{{ run.TokensUsed != null ? (TrueTotalTokens(run) | number) : '-' }}</td>
970
1011
  <td class="cell-number">{{ FormatCurrency(run.Cost, 4) }}</td>
971
1012
  </tr>
972
1013
  }
@@ -1008,7 +1049,7 @@ export class AnalyticsPromptRunsComponent extends BaseAngularComponent {
1008
1049
  }], FiltersChange: [{
1009
1050
  type: Output
1010
1051
  }] }); })();
1011
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AnalyticsPromptRunsComponent, { className: "AnalyticsPromptRunsComponent", filePath: "src/AI/components/analytics/prompt-runs/prompt-run-analysis.component.ts", lineNumber: 765 }); })();
1052
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AnalyticsPromptRunsComponent, { className: "AnalyticsPromptRunsComponent", filePath: "src/AI/components/analytics/prompt-runs/prompt-run-analysis.component.ts", lineNumber: 773 }); })();
1012
1053
  export function LoadAnalyticsPromptRuns() {
1013
1054
  // Prevents tree-shaking of the component
1014
1055
  }