@memberjunction/ng-dashboards 5.30.1 → 5.31.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 (424) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  2. package/dist/AI/components/agents/agent-configuration.component.js +4 -4
  3. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  4. package/dist/AI/components/agents/agent-editor.component.d.ts +2 -1
  5. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  6. package/dist/AI/components/agents/agent-editor.component.js +8 -6
  7. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  8. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +2 -1
  9. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
  10. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +6 -5
  11. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
  12. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +2 -1
  13. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
  14. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +6 -5
  15. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
  16. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +2 -1
  17. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
  18. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +6 -5
  19. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
  20. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts +2 -1
  21. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
  22. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +7 -4
  23. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
  24. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +3 -2
  25. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
  26. package/dist/AI/components/analytics/model-performance/model-performance.component.js +10 -6
  27. package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
  28. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +2 -1
  29. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  30. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +6 -5
  31. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  32. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +2 -1
  33. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
  34. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +6 -5
  35. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
  36. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  37. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +55 -52
  38. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  39. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +15 -15
  40. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  41. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  42. package/dist/AI/components/execution-monitoring.component.js +4 -3
  43. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  44. package/dist/AI/components/models/model-management.component.js +2 -2
  45. package/dist/AI/components/models/model-management.component.js.map +1 -1
  46. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +2 -1
  47. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  48. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +10 -8
  49. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  50. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  51. package/dist/AI/components/prompts/prompt-management.component.js +2 -2
  52. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  53. package/dist/AI/components/prompts/prompt-version-control.component.d.ts +2 -1
  54. package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
  55. package/dist/AI/components/prompts/prompt-version-control.component.js +13 -10
  56. package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
  57. package/dist/AI/components/requests/agent-requests-resource.component.js +1 -1
  58. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  59. package/dist/AI/components/tags/tags-resource.component.d.ts +1181 -0
  60. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -0
  61. package/dist/AI/components/tags/tags-resource.component.js +7487 -0
  62. package/dist/AI/components/tags/tags-resource.component.js.map +1 -0
  63. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  64. package/dist/AI/components/vectors/vector-management-resource.component.js +25 -21
  65. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  66. package/dist/AI/index.d.ts +1 -0
  67. package/dist/AI/index.d.ts.map +1 -1
  68. package/dist/AI/index.js +5 -0
  69. package/dist/AI/index.js.map +1 -1
  70. package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
  71. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  72. package/dist/AI/services/ai-instrumentation.service.js +12 -4
  73. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  74. package/dist/APIKeys/api-applications-panel.component.d.ts +3 -2
  75. package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
  76. package/dist/APIKeys/api-applications-panel.component.js +5 -4
  77. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  78. package/dist/APIKeys/api-key-create-dialog.component.d.ts +2 -1
  79. package/dist/APIKeys/api-key-create-dialog.component.d.ts.map +1 -1
  80. package/dist/APIKeys/api-key-create-dialog.component.js +5 -5
  81. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  82. package/dist/APIKeys/api-key-edit-panel.component.d.ts +3 -2
  83. package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
  84. package/dist/APIKeys/api-key-edit-panel.component.js +11 -10
  85. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  86. package/dist/APIKeys/api-key-list.component.d.ts +2 -1
  87. package/dist/APIKeys/api-key-list.component.d.ts.map +1 -1
  88. package/dist/APIKeys/api-key-list.component.js +6 -5
  89. package/dist/APIKeys/api-key-list.component.js.map +1 -1
  90. package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
  91. package/dist/APIKeys/api-keys-resource.component.js +4 -4
  92. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  93. package/dist/APIKeys/api-scopes-panel.component.d.ts +3 -2
  94. package/dist/APIKeys/api-scopes-panel.component.d.ts.map +1 -1
  95. package/dist/APIKeys/api-scopes-panel.component.js +8 -6
  96. package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
  97. package/dist/APIKeys/api-usage-panel.component.d.ts +3 -2
  98. package/dist/APIKeys/api-usage-panel.component.d.ts.map +1 -1
  99. package/dist/APIKeys/api-usage-panel.component.js +10 -8
  100. package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
  101. package/dist/Actions/components/actions-list-view.component.d.ts +2 -1
  102. package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -1
  103. package/dist/Actions/components/actions-list-view.component.js +6 -5
  104. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  105. package/dist/Actions/components/actions-overview.component.js +2 -2
  106. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  107. package/dist/Actions/components/categories-list-view.component.d.ts +2 -1
  108. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  109. package/dist/Actions/components/categories-list-view.component.js +6 -5
  110. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  111. package/dist/Actions/components/execution-monitoring.component.js +1 -1
  112. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  113. package/dist/Actions/components/explorer/action-card.component.d.ts +2 -1
  114. package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -1
  115. package/dist/Actions/components/explorer/action-card.component.js +6 -4
  116. package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
  117. package/dist/Actions/components/explorer/action-explorer.component.js +1 -1
  118. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  119. package/dist/Actions/components/explorer/new-action-panel.component.d.ts +2 -1
  120. package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -1
  121. package/dist/Actions/components/explorer/new-action-panel.component.js +7 -5
  122. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  123. package/dist/Actions/components/explorer/new-category-panel.component.d.ts +2 -1
  124. package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -1
  125. package/dist/Actions/components/explorer/new-category-panel.component.js +7 -5
  126. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  127. package/dist/ApplicationRoles/application-roles-resource.component.js +4 -4
  128. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  129. package/dist/Communication/communication-logs-resource.component.js +1 -1
  130. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  131. package/dist/Communication/communication-monitor-resource.component.js +1 -1
  132. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  133. package/dist/Communication/communication-providers-resource.component.js +3 -3
  134. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  135. package/dist/Communication/communication-runs-resource.component.js +1 -1
  136. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  137. package/dist/Communication/communication-templates-resource.component.js +3 -3
  138. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  139. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +1 -1
  140. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  141. package/dist/ComponentStudio/component-studio-dashboard.component.js +5 -4
  142. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  143. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +2 -1
  144. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
  145. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +6 -4
  146. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
  147. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +11 -2
  148. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  149. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +61 -27
  150. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  151. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +4 -2
  152. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  153. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +19 -11
  154. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  155. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts +4 -2
  156. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts.map +1 -1
  157. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +11 -3
  158. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
  159. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +10 -1
  160. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -1
  161. package/dist/ComponentStudio/components/workspace/component-preview.component.js +18 -9
  162. package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
  163. package/dist/ComponentStudio/services/component-studio-state.service.d.ts +11 -1
  164. package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -1
  165. package/dist/ComponentStudio/services/component-studio-state.service.js +23 -3
  166. package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
  167. package/dist/ComponentStudio/services/component-version.service.d.ts +6 -1
  168. package/dist/ComponentStudio/services/component-version.service.d.ts.map +1 -1
  169. package/dist/ComponentStudio/services/component-version.service.js +16 -6
  170. package/dist/ComponentStudio/services/component-version.service.js.map +1 -1
  171. package/dist/Credentials/components/credentials-audit-resource.component.js +1 -1
  172. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  173. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  174. package/dist/Credentials/components/credentials-categories-resource.component.js +3 -3
  175. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  176. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  177. package/dist/Credentials/components/credentials-list-resource.component.js +3 -3
  178. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  179. package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
  180. package/dist/Credentials/components/credentials-overview-resource.component.js +3 -3
  181. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  182. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  183. package/dist/Credentials/components/credentials-types-resource.component.js +3 -3
  184. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  185. package/dist/Credentials/credentials-dashboard.component.js +1 -1
  186. package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
  187. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +13 -13
  188. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  189. package/dist/DashboardBrowser/dashboard-share-adapter.d.ts +4 -0
  190. package/dist/DashboardBrowser/dashboard-share-adapter.d.ts.map +1 -1
  191. package/dist/DashboardBrowser/dashboard-share-adapter.js +5 -2
  192. package/dist/DashboardBrowser/dashboard-share-adapter.js.map +1 -1
  193. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +3 -1
  194. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
  195. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +9 -4
  196. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  197. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +3 -2
  198. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
  199. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +7 -6
  200. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
  201. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +3 -2
  202. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
  203. package/dist/DataExplorer/components/view-selector/view-selector.component.js +6 -5
  204. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
  205. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  206. package/dist/DataExplorer/data-explorer-dashboard.component.js +10 -9
  207. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  208. package/dist/DataExplorer/services/explorer-state.service.d.ts +6 -1
  209. package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
  210. package/dist/DataExplorer/services/explorer-state.service.js +15 -5
  211. package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
  212. package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.d.ts +64 -0
  213. package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.d.ts.map +1 -0
  214. package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.js +400 -0
  215. package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.js.map +1 -0
  216. package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.d.ts +42 -0
  217. package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.d.ts.map +1 -0
  218. package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.js +232 -0
  219. package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.js.map +1 -0
  220. package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.d.ts +14 -0
  221. package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.d.ts.map +1 -0
  222. package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.js +38 -0
  223. package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.js.map +1 -0
  224. package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.d.ts +24 -0
  225. package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.d.ts.map +1 -0
  226. package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.js +77 -0
  227. package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.js.map +1 -0
  228. package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.d.ts +88 -0
  229. package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.d.ts.map +1 -0
  230. package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.js +404 -0
  231. package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.js.map +1 -0
  232. package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.d.ts +12 -0
  233. package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.d.ts.map +1 -0
  234. package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.js +116 -0
  235. package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.js.map +1 -0
  236. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +55 -0
  237. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -0
  238. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +204 -0
  239. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -0
  240. package/dist/DatabaseDesigner/components/entity-list.component.d.ts +61 -0
  241. package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -0
  242. package/dist/DatabaseDesigner/components/entity-list.component.js +485 -0
  243. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -0
  244. package/dist/DatabaseDesigner/components/modify/database-modify.component.d.ts +52 -0
  245. package/dist/DatabaseDesigner/components/modify/database-modify.component.d.ts.map +1 -0
  246. package/dist/DatabaseDesigner/components/modify/database-modify.component.js +320 -0
  247. package/dist/DatabaseDesigner/components/modify/database-modify.component.js.map +1 -0
  248. package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.d.ts +79 -0
  249. package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.d.ts.map +1 -0
  250. package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.js +378 -0
  251. package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.js.map +1 -0
  252. package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.d.ts +85 -0
  253. package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.d.ts.map +1 -0
  254. package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.js +429 -0
  255. package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.js.map +1 -0
  256. package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.d.ts +58 -0
  257. package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.d.ts.map +1 -0
  258. package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.js +333 -0
  259. package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.js.map +1 -0
  260. package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.d.ts +36 -0
  261. package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.d.ts.map +1 -0
  262. package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.js +345 -0
  263. package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.js.map +1 -0
  264. package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.d.ts +13 -0
  265. package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.d.ts.map +1 -0
  266. package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.js +81 -0
  267. package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.js.map +1 -0
  268. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +30 -0
  269. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -0
  270. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +131 -0
  271. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -0
  272. package/dist/DatabaseDesigner/database-designer-erd.d.ts +19 -0
  273. package/dist/DatabaseDesigner/database-designer-erd.d.ts.map +1 -0
  274. package/dist/DatabaseDesigner/database-designer-erd.js +84 -0
  275. package/dist/DatabaseDesigner/database-designer-erd.js.map +1 -0
  276. package/dist/DatabaseDesigner/database-designer.types.d.ts +167 -0
  277. package/dist/DatabaseDesigner/database-designer.types.d.ts.map +1 -0
  278. package/dist/DatabaseDesigner/database-designer.types.js +26 -0
  279. package/dist/DatabaseDesigner/database-designer.types.js.map +1 -0
  280. package/dist/DatabaseDesigner/services/database-designer.engine.d.ts +94 -0
  281. package/dist/DatabaseDesigner/services/database-designer.engine.d.ts.map +1 -0
  282. package/dist/DatabaseDesigner/services/database-designer.engine.js +392 -0
  283. package/dist/DatabaseDesigner/services/database-designer.engine.js.map +1 -0
  284. package/dist/DatabaseDesigner/services/database-designer.service.d.ts +78 -0
  285. package/dist/DatabaseDesigner/services/database-designer.service.d.ts.map +1 -0
  286. package/dist/DatabaseDesigner/services/database-designer.service.js +273 -0
  287. package/dist/DatabaseDesigner/services/database-designer.service.js.map +1 -0
  288. package/dist/DatabaseDesigner/services/entity-wizard-state.service.d.ts +79 -0
  289. package/dist/DatabaseDesigner/services/entity-wizard-state.service.d.ts.map +1 -0
  290. package/dist/DatabaseDesigner/services/entity-wizard-state.service.js +204 -0
  291. package/dist/DatabaseDesigner/services/entity-wizard-state.service.js.map +1 -0
  292. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  293. package/dist/EntityAdmin/entity-admin-dashboard.component.js +2 -2
  294. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  295. package/dist/Home/action-pin-config-dialog.component.d.ts +2 -1
  296. package/dist/Home/action-pin-config-dialog.component.d.ts.map +1 -1
  297. package/dist/Home/action-pin-config-dialog.component.js +6 -4
  298. package/dist/Home/action-pin-config-dialog.component.js.map +1 -1
  299. package/dist/Home/action-pin-runner-dialog.component.d.ts +2 -1
  300. package/dist/Home/action-pin-runner-dialog.component.d.ts.map +1 -1
  301. package/dist/Home/action-pin-runner-dialog.component.js +5 -4
  302. package/dist/Home/action-pin-runner-dialog.component.js.map +1 -1
  303. package/dist/Home/home-application.d.ts.map +1 -1
  304. package/dist/Home/home-application.js +10 -12
  305. package/dist/Home/home-application.js.map +1 -1
  306. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  307. package/dist/Home/home-dashboard.component.js +3 -3
  308. package/dist/Home/home-dashboard.component.js.map +1 -1
  309. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  310. package/dist/Integration/components/activity/activity.component.js +1 -0
  311. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  312. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  313. package/dist/Integration/components/connections/connections.component.js +11 -10
  314. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  315. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
  316. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +2 -2
  317. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  318. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
  319. package/dist/Integration/components/overview/overview.component.js +1 -0
  320. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  321. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
  322. package/dist/Integration/components/pipelines/pipelines.component.js +1 -0
  323. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  324. package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
  325. package/dist/Integration/components/schedules/schedules.component.js +5 -4
  326. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  327. package/dist/Integration/services/integration-data.service.d.ts +5 -1
  328. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  329. package/dist/Integration/services/integration-data.service.js +27 -19
  330. package/dist/Integration/services/integration-data.service.js.map +1 -1
  331. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +6 -6
  332. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  333. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
  334. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +8 -6
  335. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  336. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +6 -6
  337. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  338. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +3 -3
  339. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  340. package/dist/Lists/components/lists-browse-resource.component.js +6 -6
  341. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  342. package/dist/Lists/components/lists-categories-resource.component.js +4 -4
  343. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  344. package/dist/Lists/components/lists-my-lists-resource.component.js +6 -6
  345. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  346. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  347. package/dist/Lists/components/lists-operations-resource.component.js +11 -10
  348. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  349. package/dist/Lists/services/list-set-operations.service.d.ts +5 -0
  350. package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
  351. package/dist/Lists/services/list-set-operations.service.js +11 -3
  352. package/dist/Lists/services/list-set-operations.service.js.map +1 -1
  353. package/dist/MCP/components/mcp-connection-dialog.component.d.ts +2 -1
  354. package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -1
  355. package/dist/MCP/components/mcp-connection-dialog.component.js +8 -6
  356. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  357. package/dist/MCP/components/mcp-server-dialog.component.d.ts +2 -1
  358. package/dist/MCP/components/mcp-server-dialog.component.d.ts.map +1 -1
  359. package/dist/MCP/components/mcp-server-dialog.component.js +7 -5
  360. package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
  361. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  362. package/dist/MCP/mcp-dashboard.component.js +12 -12
  363. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  364. package/dist/Permissions/permissions-shared.d.ts +3 -3
  365. package/dist/Permissions/permissions-shared.d.ts.map +1 -1
  366. package/dist/Permissions/permissions-shared.js +5 -5
  367. package/dist/Permissions/permissions-shared.js.map +1 -1
  368. package/dist/Permissions/resource-access-resource.component.js +1 -1
  369. package/dist/Permissions/resource-access-resource.component.js.map +1 -1
  370. package/dist/Permissions/user-access-resource.component.js +1 -2
  371. package/dist/Permissions/user-access-resource.component.js.map +1 -1
  372. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  373. package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
  374. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  375. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  376. package/dist/Scheduling/scheduling-dashboard.component.js +1 -0
  377. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  378. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +5 -0
  379. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  380. package/dist/Scheduling/services/scheduling-instrumentation.service.js +21 -13
  381. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  382. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  383. package/dist/SystemDiagnostics/system-diagnostics.component.js +2 -2
  384. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  385. package/dist/Testing/components/testing-explorer.component.d.ts +2 -1
  386. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  387. package/dist/Testing/components/testing-explorer.component.js +9 -7
  388. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  389. package/dist/Testing/services/testing-instrumentation.service.d.ts +6 -1
  390. package/dist/Testing/services/testing-instrumentation.service.d.ts.map +1 -1
  391. package/dist/Testing/services/testing-instrumentation.service.js +21 -11
  392. package/dist/Testing/services/testing-instrumentation.service.js.map +1 -1
  393. package/dist/Testing/testing-dashboard.component.d.ts +3 -1
  394. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  395. package/dist/Testing/testing-dashboard.component.js +15 -11
  396. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  397. package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
  398. package/dist/VersionHistory/components/diff-resource.component.js +5 -5
  399. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  400. package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -1
  401. package/dist/VersionHistory/components/graph-resource.component.js +1 -2
  402. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  403. package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
  404. package/dist/VersionHistory/components/labels-resource.component.js +3 -3
  405. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  406. package/dist/VersionHistory/components/restore-resource.component.js +1 -1
  407. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  408. package/dist/ai-dashboards.module.d.ts +35 -34
  409. package/dist/ai-dashboards.module.d.ts.map +1 -1
  410. package/dist/ai-dashboards.module.js +6 -0
  411. package/dist/ai-dashboards.module.js.map +1 -1
  412. package/dist/module.d.ts +13 -12
  413. package/dist/module.d.ts.map +1 -1
  414. package/dist/module.js +7 -0
  415. package/dist/module.js.map +1 -1
  416. package/dist/public-api.d.ts +3 -1
  417. package/dist/public-api.d.ts.map +1 -1
  418. package/dist/public-api.js +3 -1
  419. package/dist/public-api.js.map +1 -1
  420. package/dist/shared/entity-field-display.d.ts +4 -3
  421. package/dist/shared/entity-field-display.d.ts.map +1 -1
  422. package/dist/shared/entity-field-display.js +9 -9
  423. package/dist/shared/entity-field-display.js.map +1 -1
  424. package/package.json +52 -51
@@ -1 +1 @@
1
- {"version":3,"file":"cost-budget.component.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/cost-budget/cost-budget.component.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACuB,YAAY,EACtC,MAAM,EAAE,SAAS,EACpB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qDAAqD,CAAC;;AAmBxF,UAAU,OAAO;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,cAAc,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,QAAQ;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;CACtB;AAED,UAAU,WAAW;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,cAAc;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CAC1B;AAkBD,qBAogBa,4BAA6B,YAAW,MAAM,EAAE,SAAS;IACzD,SAAS,SAAQ;IACjB,OAAO,EAAE,iBAAiB,CAAyD;IAElF,eAAe,uBAA8B;IAC7C,aAAa,kCAAyC;IAEhE,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,QAAQ,CAAuB;IAEhC,SAAS,UAAS;IAClB,oBAAoB,WAAsB;IAE1C,QAAQ,EAAE,OAAO,EAAE,CAAM;IACzB,SAAS,EAAE,QAAQ,EAAE,CAAM;IAC3B,cAAc,SAAK;IACnB,YAAY,EAAE,WAAW,EAAE,CAAM;IACjC,eAAe,EAAE,cAAc,EAAE,CAAM;IAE9C,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,kBAAkB,CAAyB;IAEnD,QAAQ,IAAI,IAAI;IAIhB,WAAW,IAAI,IAAI;IAOZ,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMtC,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAMjD,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM;IAMnD,SAAS,IAAI,IAAI;YAWV,QAAQ;IA8CtB,OAAO,CAAC,WAAW;IAuDnB,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,kBAAkB;IAuC1B,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,yBAAyB;IASjC,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,WAAW;yCAxSV,4BAA4B;2CAA5B,4BAA4B;CAiTxC;AAED,wBAAgB,uBAAuB,SAAoC"}
1
+ {"version":3,"file":"cost-budget.component.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/cost-budget/cost-budget.component.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACuB,YAAY,EACtC,MAAM,EAAE,SAAS,EACpB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qDAAqD,CAAC;;AAmBxF,UAAU,OAAO;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,cAAc,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,QAAQ;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;CACtB;AAED,UAAU,WAAW;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,cAAc;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CAC1B;AAkBD,qBAogBa,4BAA6B,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IACtF,SAAS,SAAQ;IACjB,OAAO,EAAE,iBAAiB,CAAyD;IAElF,eAAe,uBAA8B;IAC7C,aAAa,kCAAyC;IAEhE,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,QAAQ,CAAuB;IAEhC,SAAS,UAAS;IAClB,oBAAoB,WAAsB;IAE1C,QAAQ,EAAE,OAAO,EAAE,CAAM;IACzB,SAAS,EAAE,QAAQ,EAAE,CAAM;IAC3B,cAAc,SAAK;IACnB,YAAY,EAAE,WAAW,EAAE,CAAM;IACjC,eAAe,EAAE,cAAc,EAAE,CAAM;IAE9C,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,kBAAkB,CAAyB;IAEnD,QAAQ,IAAI,IAAI;IAIhB,WAAW,IAAI,IAAI;IAOZ,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMtC,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAMjD,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM;IAMnD,SAAS,IAAI,IAAI;YAWV,QAAQ;IA8CtB,OAAO,CAAC,WAAW;IAuDnB,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,kBAAkB;IAuC1B,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,yBAAyB;IASjC,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,WAAW;yCAxSV,4BAA4B;2CAA5B,4BAA4B;CAiTxC;AAED,wBAAgB,uBAAuB,SAAoC"}
@@ -7,6 +7,7 @@
7
7
  import { Component, Input, Output, EventEmitter, ChangeDetectorRef, inject } from '@angular/core';
8
8
  import { Subject } from 'rxjs';
9
9
  import { RunView } from '@memberjunction/core';
10
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
10
11
  import * as i0 from "@angular/core";
11
12
  import * as i1 from "@memberjunction/ng-shared-generic";
12
13
  import * as i2 from "../analytics-filter-bar.component";
@@ -287,7 +288,7 @@ const TREEMAP_COLORS = [
287
288
  'var(--mj-status-warning)',
288
289
  'var(--mj-text-disabled)'
289
290
  ];
290
- export class AnalyticsCostBudgetComponent {
291
+ export class AnalyticsCostBudgetComponent extends BaseAngularComponent {
291
292
  TimeRange = '7d';
292
293
  Filters = { Models: [], Agents: [], Prompts: [], Statuses: [] };
293
294
  TimeRangeChange = new EventEmitter();
@@ -339,7 +340,7 @@ export class AnalyticsCostBudgetComponent {
339
340
  this.IsLoading = true;
340
341
  this.cdr.detectChanges();
341
342
  try {
342
- const rv = new RunView();
343
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
343
344
  const { currentStart, previousStart } = this.getDateBounds();
344
345
  const now = new Date();
345
346
  const modelFilter = this.buildModelFilter();
@@ -551,8 +552,8 @@ export class AnalyticsCostBudgetComponent {
551
552
  link.click();
552
553
  URL.revokeObjectURL(url);
553
554
  }
554
- static ɵfac = function AnalyticsCostBudgetComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AnalyticsCostBudgetComponent)(); };
555
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AnalyticsCostBudgetComponent, selectors: [["app-analytics-cost-budget"]], inputs: { TimeRange: "TimeRange", Filters: "Filters" }, outputs: { TimeRangeChange: "TimeRangeChange", FiltersChange: "FiltersChange" }, standalone: false, decls: 3, vars: 10, consts: [[3, "TimeRangeChange", "FiltersChange", "TimeRange", "TimeRangeOptions", "Filters", "ShowAgentFilter", "ShowPromptFilter", "ShowModelFilter", "ShowStatusFilter", "ShowCompareToggle", "ShowExportButton"], [1, "loading-container"], ["text", "Loading cost data..."], [1, "kpi-row"], [1, "kpi-card", 3, "kpi-card--highlighted"], [1, "two-col"], [1, "panel", "panel-chart"], [1, "panel-header"], [1, "panel-header__title"], [1, "fa-solid", "fa-chart-column", "panel-header__icon"], [1, "chart-body"], [1, "panel-empty"], [1, "bar-chart"], [1, "panel", "panel-treemap"], [1, "fa-solid", "fa-chart-pie", "panel-header__icon"], [1, "treemap-body"], [1, "treemap-grid"], [1, "panel"], [1, "fa-solid", "fa-table", "panel-header__icon"], [1, "export-btn", 3, "click"], [1, "fa-solid", "fa-download"], [1, "table-wrapper"], [1, "data-table"], [1, "col-numeric"], [1, "kpi-card"], [1, "kpi-icon"], [1, "kpi-content"], [1, "kpi-label"], [1, "kpi-value"], [1, "kpi-delta", 3, "kpi-delta--up", "kpi-delta--down"], [1, "kpi-delta"], [1, "fa-solid", "fa-arrow-up"], [1, "fa-solid", "fa-arrow-down"], [1, "bar-chart-area"], [1, "avg-line", 3, "bottom"], [1, "bar-col", 3, "title"], [1, "avg-line"], [1, "avg-label"], [1, "bar"], [1, "bar-label"], [1, "treemap-cell", 3, "background", "flex-basis", "title"], [1, "treemap-cell", 3, "title"], [1, "treemap-label"], [1, "treemap-value"], [1, "treemap-pct"], ["colspan", "9", 1, "empty-row"], [1, "cell-model"], [1, "cell-vendor"], [1, "cell-numeric"], [1, "cell-numeric", "cell-cost"]], template: function AnalyticsCostBudgetComponent_Template(rf, ctx) { if (rf & 1) {
555
+ static ɵfac = /*@__PURE__*/ (() => { let ɵAnalyticsCostBudgetComponent_BaseFactory; return function AnalyticsCostBudgetComponent_Factory(__ngFactoryType__) { return (ɵAnalyticsCostBudgetComponent_BaseFactory || (ɵAnalyticsCostBudgetComponent_BaseFactory = i0.ɵɵgetInheritedFactory(AnalyticsCostBudgetComponent)))(__ngFactoryType__ || AnalyticsCostBudgetComponent); }; })();
556
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AnalyticsCostBudgetComponent, selectors: [["app-analytics-cost-budget"]], inputs: { TimeRange: "TimeRange", Filters: "Filters" }, outputs: { TimeRangeChange: "TimeRangeChange", FiltersChange: "FiltersChange" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 10, consts: [[3, "TimeRangeChange", "FiltersChange", "TimeRange", "TimeRangeOptions", "Filters", "ShowAgentFilter", "ShowPromptFilter", "ShowModelFilter", "ShowStatusFilter", "ShowCompareToggle", "ShowExportButton"], [1, "loading-container"], ["text", "Loading cost data..."], [1, "kpi-row"], [1, "kpi-card", 3, "kpi-card--highlighted"], [1, "two-col"], [1, "panel", "panel-chart"], [1, "panel-header"], [1, "panel-header__title"], [1, "fa-solid", "fa-chart-column", "panel-header__icon"], [1, "chart-body"], [1, "panel-empty"], [1, "bar-chart"], [1, "panel", "panel-treemap"], [1, "fa-solid", "fa-chart-pie", "panel-header__icon"], [1, "treemap-body"], [1, "treemap-grid"], [1, "panel"], [1, "fa-solid", "fa-table", "panel-header__icon"], [1, "export-btn", 3, "click"], [1, "fa-solid", "fa-download"], [1, "table-wrapper"], [1, "data-table"], [1, "col-numeric"], [1, "kpi-card"], [1, "kpi-icon"], [1, "kpi-content"], [1, "kpi-label"], [1, "kpi-value"], [1, "kpi-delta", 3, "kpi-delta--up", "kpi-delta--down"], [1, "kpi-delta"], [1, "fa-solid", "fa-arrow-up"], [1, "fa-solid", "fa-arrow-down"], [1, "bar-chart-area"], [1, "avg-line", 3, "bottom"], [1, "bar-col", 3, "title"], [1, "avg-line"], [1, "avg-label"], [1, "bar"], [1, "bar-label"], [1, "treemap-cell", 3, "background", "flex-basis", "title"], [1, "treemap-cell", 3, "title"], [1, "treemap-label"], [1, "treemap-value"], [1, "treemap-pct"], ["colspan", "9", 1, "empty-row"], [1, "cell-model"], [1, "cell-vendor"], [1, "cell-numeric"], [1, "cell-numeric", "cell-cost"]], template: function AnalyticsCostBudgetComponent_Template(rf, ctx) { if (rf & 1) {
556
557
  i0.ɵɵelementStart(0, "app-analytics-filter-bar", 0);
557
558
  i0.ɵɵlistener("TimeRangeChange", function AnalyticsCostBudgetComponent_Template_app_analytics_filter_bar_TimeRangeChange_0_listener($event) { return ctx.OnTimeRangeChange($event); })("FiltersChange", function AnalyticsCostBudgetComponent_Template_app_analytics_filter_bar_FiltersChange_0_listener($event) { return ctx.OnFiltersChange($event); });
558
559
  i0.ɵɵelementEnd();
@@ -739,6 +740,6 @@ export class AnalyticsCostBudgetComponent {
739
740
  }], FiltersChange: [{
740
741
  type: Output
741
742
  }] }); })();
742
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AnalyticsCostBudgetComponent, { className: "AnalyticsCostBudgetComponent", filePath: "src/AI/components/analytics/cost-budget/cost-budget.component.ts", lineNumber: 602 }); })();
743
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AnalyticsCostBudgetComponent, { className: "AnalyticsCostBudgetComponent", filePath: "src/AI/components/analytics/cost-budget/cost-budget.component.ts", lineNumber: 603 }); })();
743
744
  export function LoadAnalyticsCostBudget() { }
744
745
  //# sourceMappingURL=cost-budget.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cost-budget.component.js","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/cost-budget/cost-budget.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Cost & Budget Analytics -- Option B.\n *\n * Displays cost KPIs with period deltas, a daily cost bar chart with anomaly detection,\n * a cost breakdown treemap, and a detailed cost-by-model table with CSV export.\n */\n\nimport {\n Component, Input, Output, EventEmitter,\n OnInit, OnDestroy, ChangeDetectorRef, inject\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RunView } from '@memberjunction/core';\nimport { GlobalFilterState } from '../../../interfaces/analytics-preferences.interface';\n\n// ── Interfaces ──\n\ninterface PromptRunRecord {\n ID: string;\n RunAt: string;\n Cost: number | null;\n TotalCost: number | null;\n TokensPrompt: number | null;\n TokensCompletion: number | null;\n TokensUsed: number | null;\n ModelID: string | null;\n Model: string | null;\n VendorID: string | null;\n Vendor: string | null;\n Success: boolean;\n}\n\ninterface CostKpi {\n Label: string;\n Value: string;\n Delta: number | null;\n DeltaDirection: 'up' | 'down' | 'stable';\n Highlighted: boolean;\n Icon: string;\n}\n\ninterface DailyBar {\n Date: string;\n Label: string;\n Cost: number;\n HeightPercent: number;\n IsAnomaly: boolean;\n}\n\ninterface TreemapCell {\n Label: string;\n Cost: number;\n Percent: number;\n Color: string;\n GridArea: string;\n}\n\ninterface CostByModelRow {\n Model: string;\n Vendor: string;\n Runs: number;\n InputTokens: number;\n OutputTokens: number;\n InputCost: number;\n OutputCost: number;\n TotalCost: number;\n PercentOfTotal: number;\n}\n\nconst FIELDS = [\n 'ID', 'RunAt', 'Cost', 'TotalCost', 'TokensPrompt', 'TokensCompletion',\n 'TokensUsed', 'ModelID', 'Model', 'VendorID', 'Vendor', 'Success'\n];\n\nconst TIME_RANGE_OPTIONS = ['Today', '7d', '30d', 'MTD'];\n\nconst TREEMAP_COLORS = [\n 'var(--mj-brand-primary)',\n 'var(--mj-brand-accent, var(--mj-brand-primary-hover))',\n 'var(--mj-status-info)',\n 'var(--mj-status-success)',\n 'var(--mj-status-warning)',\n 'var(--mj-text-disabled)'\n];\n\n@Component({\n standalone: false,\n selector: 'app-analytics-cost-budget',\n template: `\n <!-- Filter Bar -->\n <app-analytics-filter-bar\n [TimeRange]=\"TimeRange\"\n [TimeRangeOptions]=\"TimeRangeOptionsList\"\n [Filters]=\"Filters\"\n [ShowAgentFilter]=\"false\"\n [ShowPromptFilter]=\"false\"\n [ShowModelFilter]=\"true\"\n [ShowStatusFilter]=\"false\"\n [ShowCompareToggle]=\"false\"\n [ShowExportButton]=\"false\"\n (TimeRangeChange)=\"OnTimeRangeChange($event)\"\n (FiltersChange)=\"OnFiltersChange($event)\"\n ></app-analytics-filter-bar>\n\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading cost data...\"></mj-loading>\n </div>\n } @else {\n <!-- Cost KPI Row -->\n <div class=\"kpi-row\">\n @for (kpi of CostKpis; track kpi.Label) {\n <div class=\"kpi-card\" [class.kpi-card--highlighted]=\"kpi.Highlighted\">\n <div class=\"kpi-icon\">\n <i [class]=\"kpi.Icon\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-label\">{{ kpi.Label }}</div>\n <div class=\"kpi-value\">{{ kpi.Value }}</div>\n @if (kpi.Delta != null) {\n <div class=\"kpi-delta\"\n [class.kpi-delta--up]=\"kpi.DeltaDirection === 'up'\"\n [class.kpi-delta--down]=\"kpi.DeltaDirection === 'down'\">\n @if (kpi.DeltaDirection === 'up') {\n <i class=\"fa-solid fa-arrow-up\"></i>\n } @else if (kpi.DeltaDirection === 'down') {\n <i class=\"fa-solid fa-arrow-down\"></i>\n }\n {{ kpi.Delta | number:'1.1-1' }}% vs prev\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Two-Column Layout -->\n <div class=\"two-col\">\n <!-- Daily Cost Trend -->\n <div class=\"panel panel-chart\">\n <div class=\"panel-header\">\n <div class=\"panel-header__title\">\n <i class=\"fa-solid fa-chart-column panel-header__icon\"></i>\n Daily Cost Trend\n </div>\n </div>\n <div class=\"chart-body\">\n @if (DailyBars.length === 0) {\n <div class=\"panel-empty\">No cost data for selected period</div>\n } @else {\n <div class=\"bar-chart\">\n <div class=\"bar-chart-area\">\n @if (AvgLinePercent > 0) {\n <div class=\"avg-line\" [style.bottom.%]=\"AvgLinePercent\">\n <span class=\"avg-label\">avg</span>\n </div>\n }\n @for (bar of DailyBars; track bar.Date) {\n <div class=\"bar-col\" [title]=\"bar.Label + ': ' + FormatCurrency(bar.Cost)\">\n <div\n class=\"bar\"\n [class.bar--anomaly]=\"bar.IsAnomaly\"\n [style.height.%]=\"bar.HeightPercent\"\n ></div>\n <div class=\"bar-label\">{{ bar.Label }}</div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Cost Breakdown Treemap -->\n <div class=\"panel panel-treemap\">\n <div class=\"panel-header\">\n <div class=\"panel-header__title\">\n <i class=\"fa-solid fa-chart-pie panel-header__icon\"></i>\n Cost by Vendor\n </div>\n </div>\n <div class=\"treemap-body\">\n @if (TreemapCells.length === 0) {\n <div class=\"panel-empty\">No vendor cost data</div>\n } @else {\n <div class=\"treemap-grid\">\n @for (cell of TreemapCells; track cell.Label) {\n <div\n class=\"treemap-cell\"\n [style.background]=\"cell.Color\"\n [style.flex-basis.%]=\"cell.Percent\"\n [title]=\"cell.Label + ': ' + FormatCurrency(cell.Cost) + ' (' + (cell.Percent | number:'1.0-0') + '%)'\">\n <span class=\"treemap-label\">{{ cell.Label }}</span>\n <span class=\"treemap-value\">{{ FormatCurrency(cell.Cost) }}</span>\n <span class=\"treemap-pct\">{{ cell.Percent | number:'1.0-0' }}%</span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n\n <!-- Cost by Model Table -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-header__title\">\n <i class=\"fa-solid fa-table panel-header__icon\"></i>\n Cost by Model\n </div>\n <button class=\"export-btn\" (click)=\"ExportCSV()\">\n <i class=\"fa-solid fa-download\"></i>\n Export CSV\n </button>\n </div>\n <div class=\"table-wrapper\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Model</th>\n <th>Vendor</th>\n <th class=\"col-numeric\">Runs</th>\n <th class=\"col-numeric\">Input Tokens</th>\n <th class=\"col-numeric\">Output Tokens</th>\n <th class=\"col-numeric\">Input Cost</th>\n <th class=\"col-numeric\">Output Cost</th>\n <th class=\"col-numeric\">Total Cost</th>\n <th class=\"col-numeric\">% of Total</th>\n </tr>\n </thead>\n <tbody>\n @if (CostByModelRows.length === 0) {\n <tr><td colspan=\"9\" class=\"empty-row\">No data available</td></tr>\n }\n @for (row of CostByModelRows; track row.Model) {\n <tr>\n <td class=\"cell-model\">{{ row.Model }}</td>\n <td class=\"cell-vendor\">{{ row.Vendor }}</td>\n <td class=\"cell-numeric\">{{ row.Runs | number }}</td>\n <td class=\"cell-numeric\">{{ row.InputTokens | number }}</td>\n <td class=\"cell-numeric\">{{ row.OutputTokens | number }}</td>\n <td class=\"cell-numeric\">{{ FormatCurrency(row.InputCost, 4) }}</td>\n <td class=\"cell-numeric\">{{ FormatCurrency(row.OutputCost, 4) }}</td>\n <td class=\"cell-numeric cell-cost\">{{ FormatCurrency(row.TotalCost) }}</td>\n <td class=\"cell-numeric\">{{ row.PercentOfTotal | number:'1.1-1' }}%</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n `,\n styles: [`\n :host { display: block; }\n\n .loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n }\n\n /* ── KPI Row ── */\n .kpi-row {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 12px;\n margin: 16px 0;\n }\n\n .kpi-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 16px;\n display: flex;\n align-items: flex-start;\n gap: 12px;\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n\n .kpi-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n }\n\n .kpi-card--highlighted {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n }\n\n .kpi-icon {\n width: 36px;\n height: 36px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .kpi-card--highlighted .kpi-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface));\n }\n\n .kpi-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .kpi-value {\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 2px 0;\n letter-spacing: -0.02em;\n }\n\n .kpi-delta {\n font-size: 11px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 3px;\n }\n\n .kpi-delta--up {\n color: var(--mj-status-error);\n }\n\n .kpi-delta--down {\n color: var(--mj-status-success);\n }\n\n /* ── Two-Column Layout ── */\n .two-col {\n display: grid;\n grid-template-columns: 3fr 2fr;\n gap: 16px;\n margin-bottom: 16px;\n }\n\n /* ── Panel ── */\n .panel {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n margin-bottom: 16px;\n }\n\n .panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 18px;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .panel-header__title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .panel-header__icon {\n font-size: 13px;\n color: var(--mj-brand-primary);\n }\n\n .panel-empty {\n text-align: center;\n padding: 32px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n }\n\n .export-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 5px 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 font-size: 13px;\n cursor: pointer;\n transition: background 0.15s, color 0.15s;\n }\n\n .export-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n /* ── Bar Chart ── */\n .chart-body {\n padding: 16px 18px;\n }\n\n .bar-chart {\n width: 100%;\n }\n\n .bar-chart-area {\n display: flex;\n align-items: flex-end;\n gap: 4px;\n height: 180px;\n position: relative;\n padding-bottom: 24px;\n }\n\n .bar-col {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n justify-content: flex-end;\n }\n\n .bar {\n width: 100%;\n max-width: 32px;\n border-radius: 4px 4px 0 0;\n background: var(--mj-brand-primary);\n transition: height 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n min-height: 2px;\n }\n\n .bar--anomaly {\n background: var(--mj-status-error);\n }\n\n .bar-label {\n font-size: 10px;\n color: var(--mj-text-muted);\n margin-top: 4px;\n white-space: nowrap;\n }\n\n .avg-line {\n position: absolute;\n left: 0;\n right: 0;\n border-top: 2px dashed var(--mj-text-disabled);\n z-index: 1;\n pointer-events: none;\n }\n\n .avg-label {\n position: absolute;\n right: 0;\n top: -14px;\n font-size: 10px;\n color: var(--mj-text-disabled);\n font-weight: 600;\n }\n\n /* ── Treemap ── */\n .treemap-body {\n padding: 16px 18px;\n }\n\n .treemap-grid {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n min-height: 160px;\n }\n\n .treemap-cell {\n border-radius: 8px;\n padding: 12px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n min-width: 80px;\n min-height: 70px;\n flex-grow: 1;\n color: var(--mj-text-inverse, white);\n transition: opacity 0.2s;\n }\n\n .treemap-cell:hover {\n opacity: 0.85;\n }\n\n .treemap-label {\n font-size: 12px;\n font-weight: 600;\n opacity: 0.95;\n }\n\n .treemap-value {\n font-size: 16px;\n font-weight: 700;\n margin-top: 2px;\n }\n\n .treemap-pct {\n font-size: 11px;\n opacity: 0.8;\n }\n\n /* ── Table ── */\n .table-wrapper {\n overflow-x: auto;\n }\n\n .data-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n }\n\n .data-table th,\n .data-table td {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .data-table th {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n white-space: nowrap;\n }\n\n .col-numeric { text-align: right; }\n\n .data-table tbody tr {\n transition: background 0.15s;\n }\n\n .data-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .cell-model {\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .cell-vendor {\n color: var(--mj-text-secondary);\n }\n\n .cell-numeric {\n text-align: right;\n font-variant-numeric: tabular-nums;\n color: var(--mj-text-secondary);\n }\n\n .cell-cost {\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .empty-row {\n text-align: center;\n color: var(--mj-text-disabled);\n padding: 24px;\n }\n\n /* ── Responsive ── */\n @media (max-width: 1200px) {\n .two-col {\n grid-template-columns: 1fr;\n }\n }\n\n @media (max-width: 768px) {\n .kpi-row {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .kpi-value {\n font-size: 18px;\n }\n }\n `]\n})\nexport class AnalyticsCostBudgetComponent implements OnInit, OnDestroy {\n @Input() TimeRange = '7d';\n @Input() Filters: GlobalFilterState = { Models: [], Agents: [], Prompts: [], Statuses: [] };\n\n @Output() TimeRangeChange = new EventEmitter<string>();\n @Output() FiltersChange = new EventEmitter<GlobalFilterState>();\n\n private cdr = inject(ChangeDetectorRef);\n private destroy$ = new Subject<void>();\n\n public IsLoading = false;\n public TimeRangeOptionsList = TIME_RANGE_OPTIONS;\n\n public CostKpis: CostKpi[] = [];\n public DailyBars: DailyBar[] = [];\n public AvgLinePercent = 0;\n public TreemapCells: TreemapCell[] = [];\n public CostByModelRows: CostByModelRow[] = [];\n\n private allRuns: PromptRunRecord[] = [];\n private previousPeriodRuns: PromptRunRecord[] = [];\n\n ngOnInit(): void {\n this.LoadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ── Public Handlers ──\n\n public OnTimeRangeChange(range: string): void {\n this.TimeRange = range;\n this.TimeRangeChange.emit(range);\n this.LoadData();\n }\n\n public OnFiltersChange(filters: GlobalFilterState): void {\n this.Filters = filters;\n this.FiltersChange.emit(filters);\n this.LoadData();\n }\n\n public FormatCurrency(value: number, decimals = 2): string {\n if (value === 0) return '$0.00';\n if (value < 0.01 && decimals < 4) decimals = 4;\n return '$' + value.toFixed(decimals);\n }\n\n public ExportCSV(): void {\n const header = 'Model,Vendor,Runs,Input Tokens,Output Tokens,Input Cost,Output Cost,Total Cost,% of Total';\n const rows = this.CostByModelRows.map(r =>\n `\"${r.Model}\",\"${r.Vendor}\",${r.Runs},${r.InputTokens},${r.OutputTokens},${r.InputCost.toFixed(6)},${r.OutputCost.toFixed(6)},${r.TotalCost.toFixed(6)},${r.PercentOfTotal.toFixed(1)}`\n );\n const csv = [header, ...rows].join('\\n');\n this.downloadCSV(csv, 'cost-by-model.csv');\n }\n\n // ── Data Loading ──\n\n private async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const rv = new RunView();\n const { currentStart, previousStart } = this.getDateBounds();\n const now = new Date();\n const modelFilter = this.buildModelFilter();\n const currentFilter = this.combineDateAndModelFilter(currentStart, now, modelFilter);\n const prevFilter = this.combineDateAndModelFilter(previousStart, currentStart, modelFilter);\n\n const [currentResult, prevResult] = await rv.RunViews([\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: currentFilter,\n Fields: FIELDS,\n OrderBy: 'RunAt ASC',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: prevFilter,\n Fields: FIELDS,\n OrderBy: 'RunAt ASC',\n ResultType: 'simple'\n }\n ]);\n\n this.allRuns = (currentResult?.Results ?? []) as PromptRunRecord[];\n this.previousPeriodRuns = (prevResult?.Results ?? []) as PromptRunRecord[];\n\n this.computeKpis();\n this.computeDailyBars();\n this.computeTreemap();\n this.computeCostByModel();\n } catch (e) {\n console.error('Cost & Budget load error:', e);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ── Computations ──\n\n private computeKpis(): void {\n const now = new Date();\n const todayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const weekStart = new Date(todayStart.getTime() - 6 * 86400000);\n const monthStart = new Date(now.getFullYear(), now.getMonth(), 1);\n\n const todaySpend = this.sumCostInRange(this.allRuns, todayStart, now);\n const weekSpend = this.sumCostInRange(this.allRuns, weekStart, now);\n const monthSpend = this.sumCostInRange(this.allRuns, monthStart, now);\n\n const prevTotalCost = this.previousPeriodRuns.reduce((s, r) => s + (r.Cost ?? r.TotalCost ?? 0), 0);\n const currentTotalCost = this.allRuns.reduce((s, r) => s + (r.Cost ?? r.TotalCost ?? 0), 0);\n\n // Project monthly cost based on current daily average\n const daysIntoMonth = Math.max(1, now.getDate());\n const projectedMonthly = (monthSpend / daysIntoMonth) * new Date(now.getFullYear(), now.getMonth() + 1, 0).getDate();\n\n const delta = prevTotalCost > 0 ? ((currentTotalCost - prevTotalCost) / prevTotalCost) * 100 : null;\n\n this.CostKpis = [\n {\n Label: \"Today's Spend\",\n Value: this.FormatCurrency(todaySpend),\n Delta: null,\n DeltaDirection: 'stable',\n Highlighted: false,\n Icon: 'fa-solid fa-calendar-day'\n },\n {\n Label: 'This Week',\n Value: this.FormatCurrency(weekSpend),\n Delta: null,\n DeltaDirection: 'stable',\n Highlighted: false,\n Icon: 'fa-solid fa-calendar-week'\n },\n {\n Label: 'This Month',\n Value: this.FormatCurrency(monthSpend),\n Delta: delta,\n DeltaDirection: delta != null ? (delta > 0 ? 'up' : delta < 0 ? 'down' : 'stable') : 'stable',\n Highlighted: false,\n Icon: 'fa-solid fa-calendar'\n },\n {\n Label: 'Projected Monthly',\n Value: this.FormatCurrency(projectedMonthly),\n Delta: null,\n DeltaDirection: 'stable',\n Highlighted: true,\n Icon: 'fa-solid fa-chart-line'\n }\n ];\n }\n\n private computeDailyBars(): void {\n const buckets = new Map<string, number>();\n for (const run of this.allRuns) {\n const date = new Date(run.RunAt);\n const key = date.toISOString().slice(0, 10);\n buckets.set(key, (buckets.get(key) ?? 0) + (run.Cost ?? run.TotalCost ?? 0));\n }\n\n const sortedKeys = Array.from(buckets.keys()).sort();\n const values = sortedKeys.map(k => buckets.get(k) ?? 0);\n const maxVal = Math.max(...values, 0.001);\n\n // Anomaly detection: > 2 standard deviations from mean\n const mean = values.length > 0 ? values.reduce((s, v) => s + v, 0) / values.length : 0;\n const variance = values.length > 1\n ? values.reduce((s, v) => s + Math.pow(v - mean, 2), 0) / values.length\n : 0;\n const stdDev = Math.sqrt(variance);\n const anomalyThreshold = mean + 2 * stdDev;\n\n this.DailyBars = sortedKeys.map((key, i) => ({\n Date: key,\n Label: this.formatBarLabel(key),\n Cost: values[i],\n HeightPercent: maxVal > 0 ? (values[i] / maxVal) * 100 : 0,\n IsAnomaly: stdDev > 0 && values[i] > anomalyThreshold\n }));\n\n this.AvgLinePercent = maxVal > 0 ? (mean / maxVal) * 100 : 0;\n }\n\n private computeTreemap(): void {\n const vendorCosts = new Map<string, number>();\n for (const run of this.allRuns) {\n const vendor = run.Vendor ?? 'Other';\n vendorCosts.set(vendor, (vendorCosts.get(vendor) ?? 0) + (run.Cost ?? run.TotalCost ?? 0));\n }\n\n const total = Array.from(vendorCosts.values()).reduce((s, v) => s + v, 0);\n const sorted = Array.from(vendorCosts.entries()).sort((a, b) => b[1] - a[1]);\n\n this.TreemapCells = sorted.map(([vendor, cost], i) => ({\n Label: vendor,\n Cost: cost,\n Percent: total > 0 ? (cost / total) * 100 : 0,\n Color: TREEMAP_COLORS[i % TREEMAP_COLORS.length],\n GridArea: ''\n }));\n }\n\n private computeCostByModel(): void {\n const groups = new Map<string, PromptRunRecord[]>();\n for (const run of this.allRuns) {\n const key = run.ModelID ?? 'unknown';\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(run);\n }\n\n const totalCost = this.allRuns.reduce((s, r) => s + (r.Cost ?? r.TotalCost ?? 0), 0);\n\n const rows: CostByModelRow[] = [];\n for (const [, modelRuns] of groups) {\n const inputTokens = modelRuns.reduce((s, r) => s + (r.TokensPrompt ?? 0), 0);\n const outputTokens = modelRuns.reduce((s, r) => s + (r.TokensCompletion ?? 0), 0);\n const cost = modelRuns.reduce((s, r) => s + (r.Cost ?? r.TotalCost ?? 0), 0);\n\n // Approximate input/output cost split based on token ratio\n const totalTk = inputTokens + outputTokens;\n const inputCost = totalTk > 0 ? cost * (inputTokens / totalTk) : 0;\n const outputCost = totalTk > 0 ? cost * (outputTokens / totalTk) : 0;\n\n rows.push({\n Model: modelRuns[0].Model ?? 'Unknown',\n Vendor: modelRuns[0].Vendor ?? 'Unknown',\n Runs: modelRuns.length,\n InputTokens: inputTokens,\n OutputTokens: outputTokens,\n InputCost: inputCost,\n OutputCost: outputCost,\n TotalCost: cost,\n PercentOfTotal: totalCost > 0 ? (cost / totalCost) * 100 : 0\n });\n }\n\n this.CostByModelRows = rows.sort((a, b) => b.TotalCost - a.TotalCost);\n }\n\n // ── Helpers ──\n\n private sumCostInRange(runs: PromptRunRecord[], start: Date, end: Date): number {\n return runs\n .filter(r => {\n const d = new Date(r.RunAt);\n return d >= start && d <= end;\n })\n .reduce((s, r) => s + (r.Cost ?? r.TotalCost ?? 0), 0);\n }\n\n private getDateBounds(): { currentStart: Date; previousStart: Date } {\n const now = new Date();\n const msMap: Record<string, number> = {\n 'Today': 86400000,\n '7d': 604800000,\n '30d': 2592000000,\n 'MTD': now.getDate() * 86400000\n };\n const ms = msMap[this.TimeRange] ?? 604800000;\n const currentStart = new Date(now.getTime() - ms);\n const previousStart = new Date(currentStart.getTime() - ms);\n return { currentStart, previousStart };\n }\n\n private buildModelFilter(): string {\n if (this.Filters.Models.length === 0) return '';\n const ids = this.Filters.Models.map(id => `'${id}'`).join(',');\n return `ModelID IN (${ids})`;\n }\n\n private combineDateAndModelFilter(start: Date, end: Date, modelFilter: string): string {\n const parts = [\n `RunAt >= '${start.toISOString()}'`,\n `RunAt <= '${end.toISOString()}'`\n ];\n if (modelFilter) parts.push(modelFilter);\n return parts.join(' AND ');\n }\n\n private formatBarLabel(dateStr: string): string {\n const d = new Date(dateStr + 'T00:00:00');\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return months[d.getMonth()] + ' ' + d.getDate();\n }\n\n private downloadCSV(csv: string, filename: string): void {\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n link.click();\n URL.revokeObjectURL(url);\n }\n}\n\nexport function LoadAnalyticsCostBudget() { /* tree-shaking prevention */ }\n"]}
1
+ {"version":3,"file":"cost-budget.component.js","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/cost-budget/cost-budget.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Cost & Budget Analytics -- Option B.\n *\n * Displays cost KPIs with period deltas, a daily cost bar chart with anomaly detection,\n * a cost breakdown treemap, and a detailed cost-by-model table with CSV export.\n */\n\nimport {\n Component, Input, Output, EventEmitter,\n OnInit, OnDestroy, ChangeDetectorRef, inject\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RunView } from '@memberjunction/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { GlobalFilterState } from '../../../interfaces/analytics-preferences.interface';\n\n// ── Interfaces ──\n\ninterface PromptRunRecord {\n ID: string;\n RunAt: string;\n Cost: number | null;\n TotalCost: number | null;\n TokensPrompt: number | null;\n TokensCompletion: number | null;\n TokensUsed: number | null;\n ModelID: string | null;\n Model: string | null;\n VendorID: string | null;\n Vendor: string | null;\n Success: boolean;\n}\n\ninterface CostKpi {\n Label: string;\n Value: string;\n Delta: number | null;\n DeltaDirection: 'up' | 'down' | 'stable';\n Highlighted: boolean;\n Icon: string;\n}\n\ninterface DailyBar {\n Date: string;\n Label: string;\n Cost: number;\n HeightPercent: number;\n IsAnomaly: boolean;\n}\n\ninterface TreemapCell {\n Label: string;\n Cost: number;\n Percent: number;\n Color: string;\n GridArea: string;\n}\n\ninterface CostByModelRow {\n Model: string;\n Vendor: string;\n Runs: number;\n InputTokens: number;\n OutputTokens: number;\n InputCost: number;\n OutputCost: number;\n TotalCost: number;\n PercentOfTotal: number;\n}\n\nconst FIELDS = [\n 'ID', 'RunAt', 'Cost', 'TotalCost', 'TokensPrompt', 'TokensCompletion',\n 'TokensUsed', 'ModelID', 'Model', 'VendorID', 'Vendor', 'Success'\n];\n\nconst TIME_RANGE_OPTIONS = ['Today', '7d', '30d', 'MTD'];\n\nconst TREEMAP_COLORS = [\n 'var(--mj-brand-primary)',\n 'var(--mj-brand-accent, var(--mj-brand-primary-hover))',\n 'var(--mj-status-info)',\n 'var(--mj-status-success)',\n 'var(--mj-status-warning)',\n 'var(--mj-text-disabled)'\n];\n\n@Component({\n standalone: false,\n selector: 'app-analytics-cost-budget',\n template: `\n <!-- Filter Bar -->\n <app-analytics-filter-bar\n [TimeRange]=\"TimeRange\"\n [TimeRangeOptions]=\"TimeRangeOptionsList\"\n [Filters]=\"Filters\"\n [ShowAgentFilter]=\"false\"\n [ShowPromptFilter]=\"false\"\n [ShowModelFilter]=\"true\"\n [ShowStatusFilter]=\"false\"\n [ShowCompareToggle]=\"false\"\n [ShowExportButton]=\"false\"\n (TimeRangeChange)=\"OnTimeRangeChange($event)\"\n (FiltersChange)=\"OnFiltersChange($event)\"\n ></app-analytics-filter-bar>\n\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading cost data...\"></mj-loading>\n </div>\n } @else {\n <!-- Cost KPI Row -->\n <div class=\"kpi-row\">\n @for (kpi of CostKpis; track kpi.Label) {\n <div class=\"kpi-card\" [class.kpi-card--highlighted]=\"kpi.Highlighted\">\n <div class=\"kpi-icon\">\n <i [class]=\"kpi.Icon\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-label\">{{ kpi.Label }}</div>\n <div class=\"kpi-value\">{{ kpi.Value }}</div>\n @if (kpi.Delta != null) {\n <div class=\"kpi-delta\"\n [class.kpi-delta--up]=\"kpi.DeltaDirection === 'up'\"\n [class.kpi-delta--down]=\"kpi.DeltaDirection === 'down'\">\n @if (kpi.DeltaDirection === 'up') {\n <i class=\"fa-solid fa-arrow-up\"></i>\n } @else if (kpi.DeltaDirection === 'down') {\n <i class=\"fa-solid fa-arrow-down\"></i>\n }\n {{ kpi.Delta | number:'1.1-1' }}% vs prev\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Two-Column Layout -->\n <div class=\"two-col\">\n <!-- Daily Cost Trend -->\n <div class=\"panel panel-chart\">\n <div class=\"panel-header\">\n <div class=\"panel-header__title\">\n <i class=\"fa-solid fa-chart-column panel-header__icon\"></i>\n Daily Cost Trend\n </div>\n </div>\n <div class=\"chart-body\">\n @if (DailyBars.length === 0) {\n <div class=\"panel-empty\">No cost data for selected period</div>\n } @else {\n <div class=\"bar-chart\">\n <div class=\"bar-chart-area\">\n @if (AvgLinePercent > 0) {\n <div class=\"avg-line\" [style.bottom.%]=\"AvgLinePercent\">\n <span class=\"avg-label\">avg</span>\n </div>\n }\n @for (bar of DailyBars; track bar.Date) {\n <div class=\"bar-col\" [title]=\"bar.Label + ': ' + FormatCurrency(bar.Cost)\">\n <div\n class=\"bar\"\n [class.bar--anomaly]=\"bar.IsAnomaly\"\n [style.height.%]=\"bar.HeightPercent\"\n ></div>\n <div class=\"bar-label\">{{ bar.Label }}</div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Cost Breakdown Treemap -->\n <div class=\"panel panel-treemap\">\n <div class=\"panel-header\">\n <div class=\"panel-header__title\">\n <i class=\"fa-solid fa-chart-pie panel-header__icon\"></i>\n Cost by Vendor\n </div>\n </div>\n <div class=\"treemap-body\">\n @if (TreemapCells.length === 0) {\n <div class=\"panel-empty\">No vendor cost data</div>\n } @else {\n <div class=\"treemap-grid\">\n @for (cell of TreemapCells; track cell.Label) {\n <div\n class=\"treemap-cell\"\n [style.background]=\"cell.Color\"\n [style.flex-basis.%]=\"cell.Percent\"\n [title]=\"cell.Label + ': ' + FormatCurrency(cell.Cost) + ' (' + (cell.Percent | number:'1.0-0') + '%)'\">\n <span class=\"treemap-label\">{{ cell.Label }}</span>\n <span class=\"treemap-value\">{{ FormatCurrency(cell.Cost) }}</span>\n <span class=\"treemap-pct\">{{ cell.Percent | number:'1.0-0' }}%</span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n\n <!-- Cost by Model Table -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-header__title\">\n <i class=\"fa-solid fa-table panel-header__icon\"></i>\n Cost by Model\n </div>\n <button class=\"export-btn\" (click)=\"ExportCSV()\">\n <i class=\"fa-solid fa-download\"></i>\n Export CSV\n </button>\n </div>\n <div class=\"table-wrapper\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Model</th>\n <th>Vendor</th>\n <th class=\"col-numeric\">Runs</th>\n <th class=\"col-numeric\">Input Tokens</th>\n <th class=\"col-numeric\">Output Tokens</th>\n <th class=\"col-numeric\">Input Cost</th>\n <th class=\"col-numeric\">Output Cost</th>\n <th class=\"col-numeric\">Total Cost</th>\n <th class=\"col-numeric\">% of Total</th>\n </tr>\n </thead>\n <tbody>\n @if (CostByModelRows.length === 0) {\n <tr><td colspan=\"9\" class=\"empty-row\">No data available</td></tr>\n }\n @for (row of CostByModelRows; track row.Model) {\n <tr>\n <td class=\"cell-model\">{{ row.Model }}</td>\n <td class=\"cell-vendor\">{{ row.Vendor }}</td>\n <td class=\"cell-numeric\">{{ row.Runs | number }}</td>\n <td class=\"cell-numeric\">{{ row.InputTokens | number }}</td>\n <td class=\"cell-numeric\">{{ row.OutputTokens | number }}</td>\n <td class=\"cell-numeric\">{{ FormatCurrency(row.InputCost, 4) }}</td>\n <td class=\"cell-numeric\">{{ FormatCurrency(row.OutputCost, 4) }}</td>\n <td class=\"cell-numeric cell-cost\">{{ FormatCurrency(row.TotalCost) }}</td>\n <td class=\"cell-numeric\">{{ row.PercentOfTotal | number:'1.1-1' }}%</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n `,\n styles: [`\n :host { display: block; }\n\n .loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n }\n\n /* ── KPI Row ── */\n .kpi-row {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 12px;\n margin: 16px 0;\n }\n\n .kpi-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 16px;\n display: flex;\n align-items: flex-start;\n gap: 12px;\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n\n .kpi-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n }\n\n .kpi-card--highlighted {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n }\n\n .kpi-icon {\n width: 36px;\n height: 36px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .kpi-card--highlighted .kpi-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface));\n }\n\n .kpi-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .kpi-value {\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 2px 0;\n letter-spacing: -0.02em;\n }\n\n .kpi-delta {\n font-size: 11px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 3px;\n }\n\n .kpi-delta--up {\n color: var(--mj-status-error);\n }\n\n .kpi-delta--down {\n color: var(--mj-status-success);\n }\n\n /* ── Two-Column Layout ── */\n .two-col {\n display: grid;\n grid-template-columns: 3fr 2fr;\n gap: 16px;\n margin-bottom: 16px;\n }\n\n /* ── Panel ── */\n .panel {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n margin-bottom: 16px;\n }\n\n .panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 18px;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .panel-header__title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .panel-header__icon {\n font-size: 13px;\n color: var(--mj-brand-primary);\n }\n\n .panel-empty {\n text-align: center;\n padding: 32px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n }\n\n .export-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 5px 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 font-size: 13px;\n cursor: pointer;\n transition: background 0.15s, color 0.15s;\n }\n\n .export-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n /* ── Bar Chart ── */\n .chart-body {\n padding: 16px 18px;\n }\n\n .bar-chart {\n width: 100%;\n }\n\n .bar-chart-area {\n display: flex;\n align-items: flex-end;\n gap: 4px;\n height: 180px;\n position: relative;\n padding-bottom: 24px;\n }\n\n .bar-col {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n justify-content: flex-end;\n }\n\n .bar {\n width: 100%;\n max-width: 32px;\n border-radius: 4px 4px 0 0;\n background: var(--mj-brand-primary);\n transition: height 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n min-height: 2px;\n }\n\n .bar--anomaly {\n background: var(--mj-status-error);\n }\n\n .bar-label {\n font-size: 10px;\n color: var(--mj-text-muted);\n margin-top: 4px;\n white-space: nowrap;\n }\n\n .avg-line {\n position: absolute;\n left: 0;\n right: 0;\n border-top: 2px dashed var(--mj-text-disabled);\n z-index: 1;\n pointer-events: none;\n }\n\n .avg-label {\n position: absolute;\n right: 0;\n top: -14px;\n font-size: 10px;\n color: var(--mj-text-disabled);\n font-weight: 600;\n }\n\n /* ── Treemap ── */\n .treemap-body {\n padding: 16px 18px;\n }\n\n .treemap-grid {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n min-height: 160px;\n }\n\n .treemap-cell {\n border-radius: 8px;\n padding: 12px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n min-width: 80px;\n min-height: 70px;\n flex-grow: 1;\n color: var(--mj-text-inverse, white);\n transition: opacity 0.2s;\n }\n\n .treemap-cell:hover {\n opacity: 0.85;\n }\n\n .treemap-label {\n font-size: 12px;\n font-weight: 600;\n opacity: 0.95;\n }\n\n .treemap-value {\n font-size: 16px;\n font-weight: 700;\n margin-top: 2px;\n }\n\n .treemap-pct {\n font-size: 11px;\n opacity: 0.8;\n }\n\n /* ── Table ── */\n .table-wrapper {\n overflow-x: auto;\n }\n\n .data-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n }\n\n .data-table th,\n .data-table td {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .data-table th {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n white-space: nowrap;\n }\n\n .col-numeric { text-align: right; }\n\n .data-table tbody tr {\n transition: background 0.15s;\n }\n\n .data-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .cell-model {\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .cell-vendor {\n color: var(--mj-text-secondary);\n }\n\n .cell-numeric {\n text-align: right;\n font-variant-numeric: tabular-nums;\n color: var(--mj-text-secondary);\n }\n\n .cell-cost {\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .empty-row {\n text-align: center;\n color: var(--mj-text-disabled);\n padding: 24px;\n }\n\n /* ── Responsive ── */\n @media (max-width: 1200px) {\n .two-col {\n grid-template-columns: 1fr;\n }\n }\n\n @media (max-width: 768px) {\n .kpi-row {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .kpi-value {\n font-size: 18px;\n }\n }\n `]\n})\nexport class AnalyticsCostBudgetComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n @Input() TimeRange = '7d';\n @Input() Filters: GlobalFilterState = { Models: [], Agents: [], Prompts: [], Statuses: [] };\n\n @Output() TimeRangeChange = new EventEmitter<string>();\n @Output() FiltersChange = new EventEmitter<GlobalFilterState>();\n\n private cdr = inject(ChangeDetectorRef);\n private destroy$ = new Subject<void>();\n\n public IsLoading = false;\n public TimeRangeOptionsList = TIME_RANGE_OPTIONS;\n\n public CostKpis: CostKpi[] = [];\n public DailyBars: DailyBar[] = [];\n public AvgLinePercent = 0;\n public TreemapCells: TreemapCell[] = [];\n public CostByModelRows: CostByModelRow[] = [];\n\n private allRuns: PromptRunRecord[] = [];\n private previousPeriodRuns: PromptRunRecord[] = [];\n\n ngOnInit(): void {\n this.LoadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ── Public Handlers ──\n\n public OnTimeRangeChange(range: string): void {\n this.TimeRange = range;\n this.TimeRangeChange.emit(range);\n this.LoadData();\n }\n\n public OnFiltersChange(filters: GlobalFilterState): void {\n this.Filters = filters;\n this.FiltersChange.emit(filters);\n this.LoadData();\n }\n\n public FormatCurrency(value: number, decimals = 2): string {\n if (value === 0) return '$0.00';\n if (value < 0.01 && decimals < 4) decimals = 4;\n return '$' + value.toFixed(decimals);\n }\n\n public ExportCSV(): void {\n const header = 'Model,Vendor,Runs,Input Tokens,Output Tokens,Input Cost,Output Cost,Total Cost,% of Total';\n const rows = this.CostByModelRows.map(r =>\n `\"${r.Model}\",\"${r.Vendor}\",${r.Runs},${r.InputTokens},${r.OutputTokens},${r.InputCost.toFixed(6)},${r.OutputCost.toFixed(6)},${r.TotalCost.toFixed(6)},${r.PercentOfTotal.toFixed(1)}`\n );\n const csv = [header, ...rows].join('\\n');\n this.downloadCSV(csv, 'cost-by-model.csv');\n }\n\n // ── Data Loading ──\n\n private async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const { currentStart, previousStart } = this.getDateBounds();\n const now = new Date();\n const modelFilter = this.buildModelFilter();\n const currentFilter = this.combineDateAndModelFilter(currentStart, now, modelFilter);\n const prevFilter = this.combineDateAndModelFilter(previousStart, currentStart, modelFilter);\n\n const [currentResult, prevResult] = await rv.RunViews([\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: currentFilter,\n Fields: FIELDS,\n OrderBy: 'RunAt ASC',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: prevFilter,\n Fields: FIELDS,\n OrderBy: 'RunAt ASC',\n ResultType: 'simple'\n }\n ]);\n\n this.allRuns = (currentResult?.Results ?? []) as PromptRunRecord[];\n this.previousPeriodRuns = (prevResult?.Results ?? []) as PromptRunRecord[];\n\n this.computeKpis();\n this.computeDailyBars();\n this.computeTreemap();\n this.computeCostByModel();\n } catch (e) {\n console.error('Cost & Budget load error:', e);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ── Computations ──\n\n private computeKpis(): void {\n const now = new Date();\n const todayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const weekStart = new Date(todayStart.getTime() - 6 * 86400000);\n const monthStart = new Date(now.getFullYear(), now.getMonth(), 1);\n\n const todaySpend = this.sumCostInRange(this.allRuns, todayStart, now);\n const weekSpend = this.sumCostInRange(this.allRuns, weekStart, now);\n const monthSpend = this.sumCostInRange(this.allRuns, monthStart, now);\n\n const prevTotalCost = this.previousPeriodRuns.reduce((s, r) => s + (r.Cost ?? r.TotalCost ?? 0), 0);\n const currentTotalCost = this.allRuns.reduce((s, r) => s + (r.Cost ?? r.TotalCost ?? 0), 0);\n\n // Project monthly cost based on current daily average\n const daysIntoMonth = Math.max(1, now.getDate());\n const projectedMonthly = (monthSpend / daysIntoMonth) * new Date(now.getFullYear(), now.getMonth() + 1, 0).getDate();\n\n const delta = prevTotalCost > 0 ? ((currentTotalCost - prevTotalCost) / prevTotalCost) * 100 : null;\n\n this.CostKpis = [\n {\n Label: \"Today's Spend\",\n Value: this.FormatCurrency(todaySpend),\n Delta: null,\n DeltaDirection: 'stable',\n Highlighted: false,\n Icon: 'fa-solid fa-calendar-day'\n },\n {\n Label: 'This Week',\n Value: this.FormatCurrency(weekSpend),\n Delta: null,\n DeltaDirection: 'stable',\n Highlighted: false,\n Icon: 'fa-solid fa-calendar-week'\n },\n {\n Label: 'This Month',\n Value: this.FormatCurrency(monthSpend),\n Delta: delta,\n DeltaDirection: delta != null ? (delta > 0 ? 'up' : delta < 0 ? 'down' : 'stable') : 'stable',\n Highlighted: false,\n Icon: 'fa-solid fa-calendar'\n },\n {\n Label: 'Projected Monthly',\n Value: this.FormatCurrency(projectedMonthly),\n Delta: null,\n DeltaDirection: 'stable',\n Highlighted: true,\n Icon: 'fa-solid fa-chart-line'\n }\n ];\n }\n\n private computeDailyBars(): void {\n const buckets = new Map<string, number>();\n for (const run of this.allRuns) {\n const date = new Date(run.RunAt);\n const key = date.toISOString().slice(0, 10);\n buckets.set(key, (buckets.get(key) ?? 0) + (run.Cost ?? run.TotalCost ?? 0));\n }\n\n const sortedKeys = Array.from(buckets.keys()).sort();\n const values = sortedKeys.map(k => buckets.get(k) ?? 0);\n const maxVal = Math.max(...values, 0.001);\n\n // Anomaly detection: > 2 standard deviations from mean\n const mean = values.length > 0 ? values.reduce((s, v) => s + v, 0) / values.length : 0;\n const variance = values.length > 1\n ? values.reduce((s, v) => s + Math.pow(v - mean, 2), 0) / values.length\n : 0;\n const stdDev = Math.sqrt(variance);\n const anomalyThreshold = mean + 2 * stdDev;\n\n this.DailyBars = sortedKeys.map((key, i) => ({\n Date: key,\n Label: this.formatBarLabel(key),\n Cost: values[i],\n HeightPercent: maxVal > 0 ? (values[i] / maxVal) * 100 : 0,\n IsAnomaly: stdDev > 0 && values[i] > anomalyThreshold\n }));\n\n this.AvgLinePercent = maxVal > 0 ? (mean / maxVal) * 100 : 0;\n }\n\n private computeTreemap(): void {\n const vendorCosts = new Map<string, number>();\n for (const run of this.allRuns) {\n const vendor = run.Vendor ?? 'Other';\n vendorCosts.set(vendor, (vendorCosts.get(vendor) ?? 0) + (run.Cost ?? run.TotalCost ?? 0));\n }\n\n const total = Array.from(vendorCosts.values()).reduce((s, v) => s + v, 0);\n const sorted = Array.from(vendorCosts.entries()).sort((a, b) => b[1] - a[1]);\n\n this.TreemapCells = sorted.map(([vendor, cost], i) => ({\n Label: vendor,\n Cost: cost,\n Percent: total > 0 ? (cost / total) * 100 : 0,\n Color: TREEMAP_COLORS[i % TREEMAP_COLORS.length],\n GridArea: ''\n }));\n }\n\n private computeCostByModel(): void {\n const groups = new Map<string, PromptRunRecord[]>();\n for (const run of this.allRuns) {\n const key = run.ModelID ?? 'unknown';\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(run);\n }\n\n const totalCost = this.allRuns.reduce((s, r) => s + (r.Cost ?? r.TotalCost ?? 0), 0);\n\n const rows: CostByModelRow[] = [];\n for (const [, modelRuns] of groups) {\n const inputTokens = modelRuns.reduce((s, r) => s + (r.TokensPrompt ?? 0), 0);\n const outputTokens = modelRuns.reduce((s, r) => s + (r.TokensCompletion ?? 0), 0);\n const cost = modelRuns.reduce((s, r) => s + (r.Cost ?? r.TotalCost ?? 0), 0);\n\n // Approximate input/output cost split based on token ratio\n const totalTk = inputTokens + outputTokens;\n const inputCost = totalTk > 0 ? cost * (inputTokens / totalTk) : 0;\n const outputCost = totalTk > 0 ? cost * (outputTokens / totalTk) : 0;\n\n rows.push({\n Model: modelRuns[0].Model ?? 'Unknown',\n Vendor: modelRuns[0].Vendor ?? 'Unknown',\n Runs: modelRuns.length,\n InputTokens: inputTokens,\n OutputTokens: outputTokens,\n InputCost: inputCost,\n OutputCost: outputCost,\n TotalCost: cost,\n PercentOfTotal: totalCost > 0 ? (cost / totalCost) * 100 : 0\n });\n }\n\n this.CostByModelRows = rows.sort((a, b) => b.TotalCost - a.TotalCost);\n }\n\n // ── Helpers ──\n\n private sumCostInRange(runs: PromptRunRecord[], start: Date, end: Date): number {\n return runs\n .filter(r => {\n const d = new Date(r.RunAt);\n return d >= start && d <= end;\n })\n .reduce((s, r) => s + (r.Cost ?? r.TotalCost ?? 0), 0);\n }\n\n private getDateBounds(): { currentStart: Date; previousStart: Date } {\n const now = new Date();\n const msMap: Record<string, number> = {\n 'Today': 86400000,\n '7d': 604800000,\n '30d': 2592000000,\n 'MTD': now.getDate() * 86400000\n };\n const ms = msMap[this.TimeRange] ?? 604800000;\n const currentStart = new Date(now.getTime() - ms);\n const previousStart = new Date(currentStart.getTime() - ms);\n return { currentStart, previousStart };\n }\n\n private buildModelFilter(): string {\n if (this.Filters.Models.length === 0) return '';\n const ids = this.Filters.Models.map(id => `'${id}'`).join(',');\n return `ModelID IN (${ids})`;\n }\n\n private combineDateAndModelFilter(start: Date, end: Date, modelFilter: string): string {\n const parts = [\n `RunAt >= '${start.toISOString()}'`,\n `RunAt <= '${end.toISOString()}'`\n ];\n if (modelFilter) parts.push(modelFilter);\n return parts.join(' AND ');\n }\n\n private formatBarLabel(dateStr: string): string {\n const d = new Date(dateStr + 'T00:00:00');\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return months[d.getMonth()] + ' ' + d.getDate();\n }\n\n private downloadCSV(csv: string, filename: string): void {\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n link.click();\n URL.revokeObjectURL(url);\n }\n}\n\nexport function LoadAnalyticsCostBudget() { /* tree-shaking prevention */ }\n"]}
@@ -6,6 +6,7 @@
6
6
  * Data loaded from MJ: AI Prompt Runs where Success=false.
7
7
  */
8
8
  import { OnInit, OnDestroy } from '@angular/core';
9
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
9
10
  import { GlobalFilterState } from '../../../interfaces/analytics-preferences.interface';
10
11
  import * as i0 from "@angular/core";
11
12
  interface ErrorSummary {
@@ -29,7 +30,7 @@ interface ErrorDetail {
29
30
  ErrorMessage: string;
30
31
  Duration: string;
31
32
  }
32
- export declare class AnalyticsErrorAnalysisComponent implements OnInit, OnDestroy {
33
+ export declare class AnalyticsErrorAnalysisComponent extends BaseAngularComponent implements OnInit, OnDestroy {
33
34
  TimeRange: string;
34
35
  Filters: GlobalFilterState;
35
36
  private cdr;
@@ -1 +1 @@
1
- {"version":3,"file":"error-analysis.component.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/error-analysis/error-analysis.component.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAEH,MAAM,EAAE,SAAS,EACpB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qDAAqD,CAAC;;AAexF,UAAU,YAAY;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CAC3B;AAED,UAAU,UAAU;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,UAAU,WAAW;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAOD,qBAoYa,+BAAgC,YAAW,MAAM,EAAE,SAAS;IAC5D,SAAS,SAAQ;IACjB,OAAO,EAAE,iBAAiB,CAAyD;IAE5F,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,QAAQ,CAAuB;IAEhC,SAAS,UAAS;IAElB,OAAO,EAAE,YAAY,CAI1B;IAEK,WAAW,EAAE,UAAU,EAAE,CAAM;IAEtC,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,aAAa,CAAK;IAE1B,QAAQ,IAAI,IAAI;IAIhB,WAAW,IAAI,IAAI;IAOZ,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKtC,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAKjD,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;YAO7B,QAAQ;IA0CtB,OAAO,CAAC,cAAc;IA2BtB,OAAO,CAAC,gBAAgB;IAsCxB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,cAAc;yCAvMb,+BAA+B;2CAA/B,+BAA+B;CA8M3C;AAED,wBAAgB,0BAA0B,SAAoC"}
1
+ {"version":3,"file":"error-analysis.component.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/error-analysis/error-analysis.component.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAEH,MAAM,EAAE,SAAS,EACpB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qDAAqD,CAAC;;AAexF,UAAU,YAAY;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CAC3B;AAED,UAAU,UAAU;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,UAAU,WAAW;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAOD,qBAoYa,+BAAgC,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IACzF,SAAS,SAAQ;IACjB,OAAO,EAAE,iBAAiB,CAAyD;IAE5F,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,QAAQ,CAAuB;IAEhC,SAAS,UAAS;IAElB,OAAO,EAAE,YAAY,CAI1B;IAEK,WAAW,EAAE,UAAU,EAAE,CAAM;IAEtC,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,aAAa,CAAK;IAE1B,QAAQ,IAAI,IAAI;IAIhB,WAAW,IAAI,IAAI;IAOZ,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKtC,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAKjD,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;YAO7B,QAAQ;IA0CtB,OAAO,CAAC,cAAc;IA2BtB,OAAO,CAAC,gBAAgB;IAsCxB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,cAAc;yCAvMb,+BAA+B;2CAA/B,+BAA+B;CA8M3C;AAED,wBAAgB,0BAA0B,SAAoC"}
@@ -8,6 +8,7 @@
8
8
  import { Component, Input, ChangeDetectorRef, inject } from '@angular/core';
9
9
  import { Subject } from 'rxjs';
10
10
  import { RunView } from '@memberjunction/core';
11
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
11
12
  import * as i0 from "@angular/core";
12
13
  import * as i1 from "@memberjunction/ng-shared-generic";
13
14
  import * as i2 from "../analytics-filter-bar.component";
@@ -174,7 +175,7 @@ const FIELDS = [
174
175
  'ID', 'RunAt', 'ErrorMessage', 'Model', 'Prompt',
175
176
  'Vendor', 'ExecutionTimeMS', 'Status'
176
177
  ];
177
- export class AnalyticsErrorAnalysisComponent {
178
+ export class AnalyticsErrorAnalysisComponent extends BaseAngularComponent {
178
179
  TimeRange = '7d';
179
180
  Filters = { Models: [], Agents: [], Prompts: [], Statuses: [] };
180
181
  cdr = inject(ChangeDetectorRef);
@@ -213,7 +214,7 @@ export class AnalyticsErrorAnalysisComponent {
213
214
  this.IsLoading = true;
214
215
  this.cdr.detectChanges();
215
216
  try {
216
- const rv = new RunView();
217
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
217
218
  const dateFilter = this.buildDateFilter();
218
219
  const extraFilters = this.buildExtraFilters();
219
220
  const baseFilter = [dateFilter, ...extraFilters].filter(Boolean).join(' AND ');
@@ -352,8 +353,8 @@ export class AnalyticsErrorAnalysisComponent {
352
353
  const mm = d.getMinutes().toString().padStart(2, '0');
353
354
  return `${months[d.getMonth()]} ${d.getDate()} ${hh}:${mm}`;
354
355
  }
355
- static ɵfac = function AnalyticsErrorAnalysisComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AnalyticsErrorAnalysisComponent)(); };
356
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AnalyticsErrorAnalysisComponent, selectors: [["app-analytics-error-analysis"]], inputs: { TimeRange: "TimeRange", Filters: "Filters" }, standalone: false, decls: 3, vars: 9, consts: [[3, "TimeRangeChange", "FiltersChange", "TimeRange", "Filters", "ShowAgentFilter", "ShowPromptFilter", "ShowModelFilter", "ShowStatusFilter", "ShowCompareToggle", "ShowExportButton"], [1, "loading-container"], ["text", "Loading error data..."], [1, "summary-row"], [1, "summary-card", "summary-card--error"], [1, "summary-icon"], [1, "fa-solid", "fa-circle-exclamation"], [1, "summary-content"], [1, "summary-label"], [1, "summary-value"], [1, "summary-card"], [1, "summary-icon", "summary-icon--warning"], [1, "fa-solid", "fa-percentage"], [1, "summary-icon", "summary-icon--info"], [1, "fa-solid", "fa-bug"], [1, "summary-value", "summary-value--text", 3, "title"], [1, "empty-state"], [1, "error-group", 3, "error-group--expanded"], [1, "fa-solid", "fa-check-circle", "empty-state__icon"], [1, "empty-state__title"], [1, "empty-state__subtitle"], [1, "error-group"], ["role", "button", "tabindex", "0", 1, "error-group__header", 3, "click", "keydown.enter"], [1, "error-group__left"], [1, "expand-icon"], [1, "error-group__source"], [1, "source-name"], [1, "source-details"], [1, "source-prompt"], [1, "source-separator"], [1, "source-model"], [1, "error-group__right"], [1, "error-count-badge"], [1, "last-error-time"], [1, "error-group__preview"], [1, "error-group__body"], [1, "preview-label"], [1, "error-detail"], [1, "error-detail__header"], [1, "error-detail__time"], [1, "error-detail__duration"], [1, "error-detail__message"]], template: function AnalyticsErrorAnalysisComponent_Template(rf, ctx) { if (rf & 1) {
356
+ static ɵfac = /*@__PURE__*/ (() => { let ɵAnalyticsErrorAnalysisComponent_BaseFactory; return function AnalyticsErrorAnalysisComponent_Factory(__ngFactoryType__) { return (ɵAnalyticsErrorAnalysisComponent_BaseFactory || (ɵAnalyticsErrorAnalysisComponent_BaseFactory = i0.ɵɵgetInheritedFactory(AnalyticsErrorAnalysisComponent)))(__ngFactoryType__ || AnalyticsErrorAnalysisComponent); }; })();
357
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AnalyticsErrorAnalysisComponent, selectors: [["app-analytics-error-analysis"]], inputs: { TimeRange: "TimeRange", Filters: "Filters" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 9, consts: [[3, "TimeRangeChange", "FiltersChange", "TimeRange", "Filters", "ShowAgentFilter", "ShowPromptFilter", "ShowModelFilter", "ShowStatusFilter", "ShowCompareToggle", "ShowExportButton"], [1, "loading-container"], ["text", "Loading error data..."], [1, "summary-row"], [1, "summary-card", "summary-card--error"], [1, "summary-icon"], [1, "fa-solid", "fa-circle-exclamation"], [1, "summary-content"], [1, "summary-label"], [1, "summary-value"], [1, "summary-card"], [1, "summary-icon", "summary-icon--warning"], [1, "fa-solid", "fa-percentage"], [1, "summary-icon", "summary-icon--info"], [1, "fa-solid", "fa-bug"], [1, "summary-value", "summary-value--text", 3, "title"], [1, "empty-state"], [1, "error-group", 3, "error-group--expanded"], [1, "fa-solid", "fa-check-circle", "empty-state__icon"], [1, "empty-state__title"], [1, "empty-state__subtitle"], [1, "error-group"], ["role", "button", "tabindex", "0", 1, "error-group__header", 3, "click", "keydown.enter"], [1, "error-group__left"], [1, "expand-icon"], [1, "error-group__source"], [1, "source-name"], [1, "source-details"], [1, "source-prompt"], [1, "source-separator"], [1, "source-model"], [1, "error-group__right"], [1, "error-count-badge"], [1, "last-error-time"], [1, "error-group__preview"], [1, "error-group__body"], [1, "preview-label"], [1, "error-detail"], [1, "error-detail__header"], [1, "error-detail__time"], [1, "error-detail__duration"], [1, "error-detail__message"]], template: function AnalyticsErrorAnalysisComponent_Template(rf, ctx) { if (rf & 1) {
357
358
  i0.ɵɵelementStart(0, "app-analytics-filter-bar", 0);
358
359
  i0.ɵɵlistener("TimeRangeChange", function AnalyticsErrorAnalysisComponent_Template_app_analytics_filter_bar_TimeRangeChange_0_listener($event) { return ctx.OnTimeRangeChange($event); })("FiltersChange", function AnalyticsErrorAnalysisComponent_Template_app_analytics_filter_bar_FiltersChange_0_listener($event) { return ctx.OnFiltersChange($event); });
359
360
  i0.ɵɵelementEnd();
@@ -485,6 +486,6 @@ export class AnalyticsErrorAnalysisComponent {
485
486
  }], Filters: [{
486
487
  type: Input
487
488
  }] }); })();
488
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AnalyticsErrorAnalysisComponent, { className: "AnalyticsErrorAnalysisComponent", filePath: "src/AI/components/analytics/error-analysis/error-analysis.component.ts", lineNumber: 447 }); })();
489
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AnalyticsErrorAnalysisComponent, { className: "AnalyticsErrorAnalysisComponent", filePath: "src/AI/components/analytics/error-analysis/error-analysis.component.ts", lineNumber: 448 }); })();
489
490
  export function LoadAnalyticsErrorAnalysis() { }
490
491
  //# sourceMappingURL=error-analysis.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"error-analysis.component.js","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/error-analysis/error-analysis.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Error Analysis -- Basic.\n *\n * Displays error summary cards, and errors grouped by source (Prompt+Model combination).\n * Each group can be expanded to show individual error details.\n * Data loaded from MJ: AI Prompt Runs where Success=false.\n */\n\nimport {\n Component, Input, Output, EventEmitter,\n OnInit, OnDestroy, ChangeDetectorRef, inject\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RunView } from '@memberjunction/core';\nimport { GlobalFilterState } from '../../../interfaces/analytics-preferences.interface';\n\n// ── Interfaces ──\n\ninterface FailedRunRecord {\n ID: string;\n RunAt: string;\n ErrorMessage: string | null;\n Model: string | null;\n Prompt: string | null;\n Vendor: string | null;\n ExecutionTimeMS: number | null;\n Status: string;\n}\n\ninterface ErrorSummary {\n TotalErrors: number;\n ErrorRate: number;\n MostCommonError: string;\n}\n\ninterface ErrorGroup {\n Source: string;\n PromptName: string;\n ModelName: string;\n Count: number;\n LastErrorMessage: string;\n LastErrorTime: string;\n IsExpanded: boolean;\n Errors: ErrorDetail[];\n}\n\ninterface ErrorDetail {\n ID: string;\n Time: string;\n ErrorMessage: string;\n Duration: string;\n}\n\nconst FIELDS = [\n 'ID', 'RunAt', 'ErrorMessage', 'Model', 'Prompt',\n 'Vendor', 'ExecutionTimeMS', 'Status'\n];\n\n@Component({\n standalone: false,\n selector: 'app-analytics-error-analysis',\n template: `\n <!-- Filter Bar -->\n <app-analytics-filter-bar\n [TimeRange]=\"TimeRange\"\n [Filters]=\"Filters\"\n [ShowAgentFilter]=\"false\"\n [ShowPromptFilter]=\"true\"\n [ShowModelFilter]=\"true\"\n [ShowStatusFilter]=\"false\"\n [ShowCompareToggle]=\"false\"\n [ShowExportButton]=\"false\"\n (TimeRangeChange)=\"OnTimeRangeChange($event)\"\n (FiltersChange)=\"OnFiltersChange($event)\"\n ></app-analytics-filter-bar>\n\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading error data...\"></mj-loading>\n </div>\n } @else {\n <!-- Summary Cards -->\n <div class=\"summary-row\">\n <div class=\"summary-card summary-card--error\">\n <div class=\"summary-icon\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n </div>\n <div class=\"summary-content\">\n <div class=\"summary-label\">Total Errors</div>\n <div class=\"summary-value\">{{ Summary.TotalErrors | number }}</div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-icon summary-icon--warning\">\n <i class=\"fa-solid fa-percentage\"></i>\n </div>\n <div class=\"summary-content\">\n <div class=\"summary-label\">Error Rate</div>\n <div class=\"summary-value\">{{ Summary.ErrorRate | number:'1.1-1' }}%</div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-icon summary-icon--info\">\n <i class=\"fa-solid fa-bug\"></i>\n </div>\n <div class=\"summary-content\">\n <div class=\"summary-label\">Most Common</div>\n <div class=\"summary-value summary-value--text\" [title]=\"Summary.MostCommonError\">\n {{ Summary.MostCommonError || 'N/A' }}\n </div>\n </div>\n </div>\n </div>\n\n <!-- Error Groups -->\n @if (ErrorGroups.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-check-circle empty-state__icon\"></i>\n <div class=\"empty-state__title\">No Errors Found</div>\n <div class=\"empty-state__subtitle\">No errors detected in the selected time range.</div>\n </div>\n }\n\n @for (group of ErrorGroups; track group.Source) {\n <div class=\"error-group\" [class.error-group--expanded]=\"group.IsExpanded\">\n <div\n class=\"error-group__header\"\n (click)=\"ToggleGroup(group)\"\n role=\"button\"\n tabindex=\"0\"\n (keydown.enter)=\"ToggleGroup(group)\">\n <div class=\"error-group__left\">\n <i [class]=\"group.IsExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"\n class=\"expand-icon\"></i>\n <div class=\"error-group__source\">\n <div class=\"source-name\">{{ group.Source }}</div>\n <div class=\"source-details\">\n <span class=\"source-prompt\">{{ group.PromptName }}</span>\n <span class=\"source-separator\">+</span>\n <span class=\"source-model\">{{ group.ModelName }}</span>\n </div>\n </div>\n </div>\n <div class=\"error-group__right\">\n <span class=\"error-count-badge\">{{ group.Count }}</span>\n <div class=\"last-error-time\">{{ group.LastErrorTime }}</div>\n </div>\n </div>\n\n @if (!group.IsExpanded) {\n <div class=\"error-group__preview\">\n <span class=\"preview-label\">Last error:</span>\n {{ group.LastErrorMessage }}\n </div>\n }\n\n @if (group.IsExpanded) {\n <div class=\"error-group__body\">\n @for (err of group.Errors; track err.ID) {\n <div class=\"error-detail\">\n <div class=\"error-detail__header\">\n <span class=\"error-detail__time\">{{ err.Time }}</span>\n @if (err.Duration) {\n <span class=\"error-detail__duration\">{{ err.Duration }}</span>\n }\n </div>\n <div class=\"error-detail__message\">{{ err.ErrorMessage }}</div>\n </div>\n }\n </div>\n }\n </div>\n }\n }\n `,\n styles: [`\n :host { display: block; }\n\n .loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n }\n\n /* ── Summary Row ── */\n .summary-row {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n margin: 16px 0;\n }\n\n .summary-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 16px;\n display: flex;\n align-items: center;\n gap: 14px;\n }\n\n .summary-card--error {\n border-left: 4px solid var(--mj-status-error);\n }\n\n .summary-icon {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n font-size: 16px;\n flex-shrink: 0;\n }\n\n .summary-icon--warning {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n .summary-icon--info {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .summary-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .summary-value {\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n letter-spacing: -0.02em;\n }\n\n .summary-value--text {\n font-size: 13px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 220px;\n }\n\n /* ── Empty State ── */\n .empty-state {\n text-align: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n }\n\n .empty-state__icon {\n font-size: 40px;\n color: var(--mj-status-success);\n margin-bottom: 12px;\n }\n\n .empty-state__title {\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n }\n\n .empty-state__subtitle {\n font-size: 13px;\n color: var(--mj-text-muted);\n }\n\n /* ── Error Groups ── */\n .error-group {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n margin-bottom: 8px;\n overflow: hidden;\n transition: border-color 0.2s;\n }\n\n .error-group--expanded {\n border-color: var(--mj-status-error);\n }\n\n .error-group__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 16px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .error-group__header:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .error-group__left {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n }\n\n .expand-icon {\n font-size: 11px;\n color: var(--mj-text-muted);\n width: 16px;\n flex-shrink: 0;\n transition: transform 0.2s;\n }\n\n .error-group__source {\n min-width: 0;\n }\n\n .source-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .source-details {\n font-size: 12px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 4px;\n margin-top: 2px;\n }\n\n .source-separator {\n color: var(--mj-text-disabled);\n }\n\n .error-group__right {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n }\n\n .error-count-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n height: 24px;\n padding: 0 8px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n font-size: 12px;\n font-weight: 700;\n }\n\n .last-error-time {\n font-size: 12px;\n color: var(--mj-text-disabled);\n white-space: nowrap;\n }\n\n .error-group__preview {\n padding: 0 16px 12px 42px;\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .preview-label {\n color: var(--mj-text-disabled);\n margin-right: 4px;\n }\n\n .error-group__body {\n border-top: 1px solid var(--mj-border-subtle);\n max-height: 400px;\n overflow-y: auto;\n }\n\n .error-detail {\n padding: 12px 16px 12px 42px;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .error-detail:last-child {\n border-bottom: none;\n }\n\n .error-detail__header {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 4px;\n }\n\n .error-detail__time {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n }\n\n .error-detail__duration {\n font-size: 11px;\n color: var(--mj-text-disabled);\n font-variant-numeric: tabular-nums;\n }\n\n .error-detail__message {\n font-size: 13px;\n color: var(--mj-status-error-text, var(--mj-status-error));\n line-height: 1.5;\n word-break: break-word;\n font-family: monospace;\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n padding: 8px 10px;\n border-radius: 6px;\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n }\n\n /* ── Responsive ── */\n @media (max-width: 768px) {\n .summary-row {\n grid-template-columns: 1fr;\n }\n\n .summary-value {\n font-size: 18px;\n }\n }\n `]\n})\nexport class AnalyticsErrorAnalysisComponent implements OnInit, OnDestroy {\n @Input() TimeRange = '7d';\n @Input() Filters: GlobalFilterState = { Models: [], Agents: [], Prompts: [], Statuses: [] };\n\n private cdr = inject(ChangeDetectorRef);\n private destroy$ = new Subject<void>();\n\n public IsLoading = false;\n\n public Summary: ErrorSummary = {\n TotalErrors: 0,\n ErrorRate: 0,\n MostCommonError: ''\n };\n\n public ErrorGroups: ErrorGroup[] = [];\n\n private failedRuns: FailedRunRecord[] = [];\n private totalRunCount = 0;\n\n ngOnInit(): void {\n this.LoadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ── Public Handlers ──\n\n public OnTimeRangeChange(range: string): void {\n this.TimeRange = range;\n this.LoadData();\n }\n\n public OnFiltersChange(filters: GlobalFilterState): void {\n this.Filters = filters;\n this.LoadData();\n }\n\n public ToggleGroup(group: ErrorGroup): void {\n group.IsExpanded = !group.IsExpanded;\n this.cdr.detectChanges();\n }\n\n // ── Data Loading ──\n\n private async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const rv = new RunView();\n const dateFilter = this.buildDateFilter();\n const extraFilters = this.buildExtraFilters();\n const baseFilter = [dateFilter, ...extraFilters].filter(Boolean).join(' AND ');\n const errorFilter = baseFilter + ' AND Success = 0';\n\n const [errorResult, totalResult] = await rv.RunViews([\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: errorFilter,\n Fields: FIELDS,\n OrderBy: 'RunAt DESC',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: baseFilter,\n Fields: ['ID'],\n ResultType: 'simple'\n }\n ]);\n\n this.failedRuns = (errorResult?.Results ?? []) as FailedRunRecord[];\n this.totalRunCount = totalResult?.Results?.length ?? 0;\n\n this.computeSummary();\n this.buildErrorGroups();\n } catch (e) {\n console.error('Error Analysis load error:', e);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ── Computations ──\n\n private computeSummary(): void {\n const errorCount = this.failedRuns.length;\n const errorRate = this.totalRunCount > 0 ? (errorCount / this.totalRunCount) * 100 : 0;\n\n // Find most common error by grouping error messages\n const messageCounts = new Map<string, number>();\n for (const run of this.failedRuns) {\n const msg = this.normalizeErrorMessage(run.ErrorMessage ?? 'Unknown error');\n messageCounts.set(msg, (messageCounts.get(msg) ?? 0) + 1);\n }\n\n let mostCommon = '';\n let maxCount = 0;\n for (const [msg, count] of messageCounts) {\n if (count > maxCount) {\n maxCount = count;\n mostCommon = msg;\n }\n }\n\n this.Summary = {\n TotalErrors: errorCount,\n ErrorRate: errorRate,\n MostCommonError: mostCommon\n };\n }\n\n private buildErrorGroups(): void {\n const groups = new Map<string, FailedRunRecord[]>();\n\n for (const run of this.failedRuns) {\n const prompt = run.Prompt ?? 'Unknown Prompt';\n const model = run.Model ?? 'Unknown Model';\n const key = prompt + ' + ' + model;\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(run);\n }\n\n this.ErrorGroups = Array.from(groups.entries())\n .map(([source, runs]) => {\n const sortedRuns = runs.sort((a, b) =>\n new Date(b.RunAt).getTime() - new Date(a.RunAt).getTime()\n );\n\n return {\n Source: source,\n PromptName: sortedRuns[0].Prompt ?? 'Unknown',\n ModelName: sortedRuns[0].Model ?? 'Unknown',\n Count: sortedRuns.length,\n LastErrorMessage: this.truncateMessage(sortedRuns[0].ErrorMessage ?? 'No message'),\n LastErrorTime: this.formatRelativeTime(sortedRuns[0].RunAt),\n IsExpanded: false,\n Errors: sortedRuns.slice(0, 20).map(r => ({\n ID: r.ID,\n Time: this.formatDateTime(r.RunAt),\n ErrorMessage: r.ErrorMessage ?? 'No error message',\n Duration: r.ExecutionTimeMS != null ? r.ExecutionTimeMS + 'ms' : ''\n }))\n };\n })\n .sort((a, b) => b.Count - a.Count);\n }\n\n // ── Helpers ──\n\n private buildDateFilter(): string {\n const now = new Date();\n const msMap: Record<string, number> = {\n '1h': 3600000, '6h': 21600000, '24h': 86400000,\n '7d': 604800000, '30d': 2592000000\n };\n const ms = msMap[this.TimeRange] ?? 604800000;\n const start = new Date(now.getTime() - ms);\n return `RunAt >= '${start.toISOString()}'`;\n }\n\n private buildExtraFilters(): string[] {\n const filters: string[] = [];\n if (this.Filters.Models.length > 0) {\n filters.push(`ModelID IN (${this.Filters.Models.map(id => `'${id}'`).join(',')})`);\n }\n if (this.Filters.Prompts.length > 0) {\n filters.push(`PromptID IN (${this.Filters.Prompts.map(id => `'${id}'`).join(',')})`);\n }\n return filters;\n }\n\n private normalizeErrorMessage(msg: string): string {\n // Truncate and normalize for grouping\n return msg.slice(0, 100).trim().toLowerCase();\n }\n\n private truncateMessage(msg: string): string {\n if (msg.length <= 120) return msg;\n return msg.slice(0, 120) + '...';\n }\n\n private formatRelativeTime(dateStr: string): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diffMin = Math.floor((now - then) / 60000);\n if (diffMin < 1) return 'just now';\n if (diffMin < 60) return diffMin + 'm ago';\n const diffHr = Math.floor(diffMin / 60);\n if (diffHr < 24) return diffHr + 'h ago';\n const diffDay = Math.floor(diffHr / 24);\n return diffDay + 'd ago';\n }\n\n private formatDateTime(dateStr: string): string {\n const d = new Date(dateStr);\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const hh = d.getHours().toString().padStart(2, '0');\n const mm = d.getMinutes().toString().padStart(2, '0');\n return `${months[d.getMonth()]} ${d.getDate()} ${hh}:${mm}`;\n }\n}\n\nexport function LoadAnalyticsErrorAnalysis() { /* tree-shaking prevention */ }\n"]}
1
+ {"version":3,"file":"error-analysis.component.js","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/error-analysis/error-analysis.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Error Analysis -- Basic.\n *\n * Displays error summary cards, and errors grouped by source (Prompt+Model combination).\n * Each group can be expanded to show individual error details.\n * Data loaded from MJ: AI Prompt Runs where Success=false.\n */\n\nimport {\n Component, Input, Output, EventEmitter,\n OnInit, OnDestroy, ChangeDetectorRef, inject\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RunView } from '@memberjunction/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { GlobalFilterState } from '../../../interfaces/analytics-preferences.interface';\n\n// ── Interfaces ──\n\ninterface FailedRunRecord {\n ID: string;\n RunAt: string;\n ErrorMessage: string | null;\n Model: string | null;\n Prompt: string | null;\n Vendor: string | null;\n ExecutionTimeMS: number | null;\n Status: string;\n}\n\ninterface ErrorSummary {\n TotalErrors: number;\n ErrorRate: number;\n MostCommonError: string;\n}\n\ninterface ErrorGroup {\n Source: string;\n PromptName: string;\n ModelName: string;\n Count: number;\n LastErrorMessage: string;\n LastErrorTime: string;\n IsExpanded: boolean;\n Errors: ErrorDetail[];\n}\n\ninterface ErrorDetail {\n ID: string;\n Time: string;\n ErrorMessage: string;\n Duration: string;\n}\n\nconst FIELDS = [\n 'ID', 'RunAt', 'ErrorMessage', 'Model', 'Prompt',\n 'Vendor', 'ExecutionTimeMS', 'Status'\n];\n\n@Component({\n standalone: false,\n selector: 'app-analytics-error-analysis',\n template: `\n <!-- Filter Bar -->\n <app-analytics-filter-bar\n [TimeRange]=\"TimeRange\"\n [Filters]=\"Filters\"\n [ShowAgentFilter]=\"false\"\n [ShowPromptFilter]=\"true\"\n [ShowModelFilter]=\"true\"\n [ShowStatusFilter]=\"false\"\n [ShowCompareToggle]=\"false\"\n [ShowExportButton]=\"false\"\n (TimeRangeChange)=\"OnTimeRangeChange($event)\"\n (FiltersChange)=\"OnFiltersChange($event)\"\n ></app-analytics-filter-bar>\n\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading error data...\"></mj-loading>\n </div>\n } @else {\n <!-- Summary Cards -->\n <div class=\"summary-row\">\n <div class=\"summary-card summary-card--error\">\n <div class=\"summary-icon\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n </div>\n <div class=\"summary-content\">\n <div class=\"summary-label\">Total Errors</div>\n <div class=\"summary-value\">{{ Summary.TotalErrors | number }}</div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-icon summary-icon--warning\">\n <i class=\"fa-solid fa-percentage\"></i>\n </div>\n <div class=\"summary-content\">\n <div class=\"summary-label\">Error Rate</div>\n <div class=\"summary-value\">{{ Summary.ErrorRate | number:'1.1-1' }}%</div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-icon summary-icon--info\">\n <i class=\"fa-solid fa-bug\"></i>\n </div>\n <div class=\"summary-content\">\n <div class=\"summary-label\">Most Common</div>\n <div class=\"summary-value summary-value--text\" [title]=\"Summary.MostCommonError\">\n {{ Summary.MostCommonError || 'N/A' }}\n </div>\n </div>\n </div>\n </div>\n\n <!-- Error Groups -->\n @if (ErrorGroups.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-check-circle empty-state__icon\"></i>\n <div class=\"empty-state__title\">No Errors Found</div>\n <div class=\"empty-state__subtitle\">No errors detected in the selected time range.</div>\n </div>\n }\n\n @for (group of ErrorGroups; track group.Source) {\n <div class=\"error-group\" [class.error-group--expanded]=\"group.IsExpanded\">\n <div\n class=\"error-group__header\"\n (click)=\"ToggleGroup(group)\"\n role=\"button\"\n tabindex=\"0\"\n (keydown.enter)=\"ToggleGroup(group)\">\n <div class=\"error-group__left\">\n <i [class]=\"group.IsExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"\n class=\"expand-icon\"></i>\n <div class=\"error-group__source\">\n <div class=\"source-name\">{{ group.Source }}</div>\n <div class=\"source-details\">\n <span class=\"source-prompt\">{{ group.PromptName }}</span>\n <span class=\"source-separator\">+</span>\n <span class=\"source-model\">{{ group.ModelName }}</span>\n </div>\n </div>\n </div>\n <div class=\"error-group__right\">\n <span class=\"error-count-badge\">{{ group.Count }}</span>\n <div class=\"last-error-time\">{{ group.LastErrorTime }}</div>\n </div>\n </div>\n\n @if (!group.IsExpanded) {\n <div class=\"error-group__preview\">\n <span class=\"preview-label\">Last error:</span>\n {{ group.LastErrorMessage }}\n </div>\n }\n\n @if (group.IsExpanded) {\n <div class=\"error-group__body\">\n @for (err of group.Errors; track err.ID) {\n <div class=\"error-detail\">\n <div class=\"error-detail__header\">\n <span class=\"error-detail__time\">{{ err.Time }}</span>\n @if (err.Duration) {\n <span class=\"error-detail__duration\">{{ err.Duration }}</span>\n }\n </div>\n <div class=\"error-detail__message\">{{ err.ErrorMessage }}</div>\n </div>\n }\n </div>\n }\n </div>\n }\n }\n `,\n styles: [`\n :host { display: block; }\n\n .loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n }\n\n /* ── Summary Row ── */\n .summary-row {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n margin: 16px 0;\n }\n\n .summary-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 16px;\n display: flex;\n align-items: center;\n gap: 14px;\n }\n\n .summary-card--error {\n border-left: 4px solid var(--mj-status-error);\n }\n\n .summary-icon {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n font-size: 16px;\n flex-shrink: 0;\n }\n\n .summary-icon--warning {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n .summary-icon--info {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .summary-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .summary-value {\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n letter-spacing: -0.02em;\n }\n\n .summary-value--text {\n font-size: 13px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 220px;\n }\n\n /* ── Empty State ── */\n .empty-state {\n text-align: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n }\n\n .empty-state__icon {\n font-size: 40px;\n color: var(--mj-status-success);\n margin-bottom: 12px;\n }\n\n .empty-state__title {\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n }\n\n .empty-state__subtitle {\n font-size: 13px;\n color: var(--mj-text-muted);\n }\n\n /* ── Error Groups ── */\n .error-group {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n margin-bottom: 8px;\n overflow: hidden;\n transition: border-color 0.2s;\n }\n\n .error-group--expanded {\n border-color: var(--mj-status-error);\n }\n\n .error-group__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 16px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .error-group__header:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .error-group__left {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n }\n\n .expand-icon {\n font-size: 11px;\n color: var(--mj-text-muted);\n width: 16px;\n flex-shrink: 0;\n transition: transform 0.2s;\n }\n\n .error-group__source {\n min-width: 0;\n }\n\n .source-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .source-details {\n font-size: 12px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 4px;\n margin-top: 2px;\n }\n\n .source-separator {\n color: var(--mj-text-disabled);\n }\n\n .error-group__right {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n }\n\n .error-count-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n height: 24px;\n padding: 0 8px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n font-size: 12px;\n font-weight: 700;\n }\n\n .last-error-time {\n font-size: 12px;\n color: var(--mj-text-disabled);\n white-space: nowrap;\n }\n\n .error-group__preview {\n padding: 0 16px 12px 42px;\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .preview-label {\n color: var(--mj-text-disabled);\n margin-right: 4px;\n }\n\n .error-group__body {\n border-top: 1px solid var(--mj-border-subtle);\n max-height: 400px;\n overflow-y: auto;\n }\n\n .error-detail {\n padding: 12px 16px 12px 42px;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .error-detail:last-child {\n border-bottom: none;\n }\n\n .error-detail__header {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 4px;\n }\n\n .error-detail__time {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n }\n\n .error-detail__duration {\n font-size: 11px;\n color: var(--mj-text-disabled);\n font-variant-numeric: tabular-nums;\n }\n\n .error-detail__message {\n font-size: 13px;\n color: var(--mj-status-error-text, var(--mj-status-error));\n line-height: 1.5;\n word-break: break-word;\n font-family: monospace;\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n padding: 8px 10px;\n border-radius: 6px;\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n }\n\n /* ── Responsive ── */\n @media (max-width: 768px) {\n .summary-row {\n grid-template-columns: 1fr;\n }\n\n .summary-value {\n font-size: 18px;\n }\n }\n `]\n})\nexport class AnalyticsErrorAnalysisComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n @Input() TimeRange = '7d';\n @Input() Filters: GlobalFilterState = { Models: [], Agents: [], Prompts: [], Statuses: [] };\n\n private cdr = inject(ChangeDetectorRef);\n private destroy$ = new Subject<void>();\n\n public IsLoading = false;\n\n public Summary: ErrorSummary = {\n TotalErrors: 0,\n ErrorRate: 0,\n MostCommonError: ''\n };\n\n public ErrorGroups: ErrorGroup[] = [];\n\n private failedRuns: FailedRunRecord[] = [];\n private totalRunCount = 0;\n\n ngOnInit(): void {\n this.LoadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ── Public Handlers ──\n\n public OnTimeRangeChange(range: string): void {\n this.TimeRange = range;\n this.LoadData();\n }\n\n public OnFiltersChange(filters: GlobalFilterState): void {\n this.Filters = filters;\n this.LoadData();\n }\n\n public ToggleGroup(group: ErrorGroup): void {\n group.IsExpanded = !group.IsExpanded;\n this.cdr.detectChanges();\n }\n\n // ── Data Loading ──\n\n private async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const dateFilter = this.buildDateFilter();\n const extraFilters = this.buildExtraFilters();\n const baseFilter = [dateFilter, ...extraFilters].filter(Boolean).join(' AND ');\n const errorFilter = baseFilter + ' AND Success = 0';\n\n const [errorResult, totalResult] = await rv.RunViews([\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: errorFilter,\n Fields: FIELDS,\n OrderBy: 'RunAt DESC',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: baseFilter,\n Fields: ['ID'],\n ResultType: 'simple'\n }\n ]);\n\n this.failedRuns = (errorResult?.Results ?? []) as FailedRunRecord[];\n this.totalRunCount = totalResult?.Results?.length ?? 0;\n\n this.computeSummary();\n this.buildErrorGroups();\n } catch (e) {\n console.error('Error Analysis load error:', e);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ── Computations ──\n\n private computeSummary(): void {\n const errorCount = this.failedRuns.length;\n const errorRate = this.totalRunCount > 0 ? (errorCount / this.totalRunCount) * 100 : 0;\n\n // Find most common error by grouping error messages\n const messageCounts = new Map<string, number>();\n for (const run of this.failedRuns) {\n const msg = this.normalizeErrorMessage(run.ErrorMessage ?? 'Unknown error');\n messageCounts.set(msg, (messageCounts.get(msg) ?? 0) + 1);\n }\n\n let mostCommon = '';\n let maxCount = 0;\n for (const [msg, count] of messageCounts) {\n if (count > maxCount) {\n maxCount = count;\n mostCommon = msg;\n }\n }\n\n this.Summary = {\n TotalErrors: errorCount,\n ErrorRate: errorRate,\n MostCommonError: mostCommon\n };\n }\n\n private buildErrorGroups(): void {\n const groups = new Map<string, FailedRunRecord[]>();\n\n for (const run of this.failedRuns) {\n const prompt = run.Prompt ?? 'Unknown Prompt';\n const model = run.Model ?? 'Unknown Model';\n const key = prompt + ' + ' + model;\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(run);\n }\n\n this.ErrorGroups = Array.from(groups.entries())\n .map(([source, runs]) => {\n const sortedRuns = runs.sort((a, b) =>\n new Date(b.RunAt).getTime() - new Date(a.RunAt).getTime()\n );\n\n return {\n Source: source,\n PromptName: sortedRuns[0].Prompt ?? 'Unknown',\n ModelName: sortedRuns[0].Model ?? 'Unknown',\n Count: sortedRuns.length,\n LastErrorMessage: this.truncateMessage(sortedRuns[0].ErrorMessage ?? 'No message'),\n LastErrorTime: this.formatRelativeTime(sortedRuns[0].RunAt),\n IsExpanded: false,\n Errors: sortedRuns.slice(0, 20).map(r => ({\n ID: r.ID,\n Time: this.formatDateTime(r.RunAt),\n ErrorMessage: r.ErrorMessage ?? 'No error message',\n Duration: r.ExecutionTimeMS != null ? r.ExecutionTimeMS + 'ms' : ''\n }))\n };\n })\n .sort((a, b) => b.Count - a.Count);\n }\n\n // ── Helpers ──\n\n private buildDateFilter(): string {\n const now = new Date();\n const msMap: Record<string, number> = {\n '1h': 3600000, '6h': 21600000, '24h': 86400000,\n '7d': 604800000, '30d': 2592000000\n };\n const ms = msMap[this.TimeRange] ?? 604800000;\n const start = new Date(now.getTime() - ms);\n return `RunAt >= '${start.toISOString()}'`;\n }\n\n private buildExtraFilters(): string[] {\n const filters: string[] = [];\n if (this.Filters.Models.length > 0) {\n filters.push(`ModelID IN (${this.Filters.Models.map(id => `'${id}'`).join(',')})`);\n }\n if (this.Filters.Prompts.length > 0) {\n filters.push(`PromptID IN (${this.Filters.Prompts.map(id => `'${id}'`).join(',')})`);\n }\n return filters;\n }\n\n private normalizeErrorMessage(msg: string): string {\n // Truncate and normalize for grouping\n return msg.slice(0, 100).trim().toLowerCase();\n }\n\n private truncateMessage(msg: string): string {\n if (msg.length <= 120) return msg;\n return msg.slice(0, 120) + '...';\n }\n\n private formatRelativeTime(dateStr: string): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diffMin = Math.floor((now - then) / 60000);\n if (diffMin < 1) return 'just now';\n if (diffMin < 60) return diffMin + 'm ago';\n const diffHr = Math.floor(diffMin / 60);\n if (diffHr < 24) return diffHr + 'h ago';\n const diffDay = Math.floor(diffHr / 24);\n return diffDay + 'd ago';\n }\n\n private formatDateTime(dateStr: string): string {\n const d = new Date(dateStr);\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const hh = d.getHours().toString().padStart(2, '0');\n const mm = d.getMinutes().toString().padStart(2, '0');\n return `${months[d.getMonth()]} ${d.getDate()} ${hh}:${mm}`;\n }\n}\n\nexport function LoadAnalyticsErrorAnalysis() { /* tree-shaking prevention */ }\n"]}
@@ -2,6 +2,7 @@ import { EventEmitter, OnInit, OnDestroy } from '@angular/core';
2
2
  import { TrendData } from '../../../services/ai-instrumentation.service';
3
3
  import { GlobalFilterState } from '../../../interfaces/analytics-preferences.interface';
4
4
  import { TimeSeriesConfig } from '../../charts/time-series-chart.component';
5
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
5
6
  import * as i0 from "@angular/core";
6
7
  interface KpiDisplayCard {
7
8
  Label: string;
@@ -24,7 +25,7 @@ interface ErrorHotspot {
24
25
  ErrorMessage: string;
25
26
  Count: number;
26
27
  }
27
- export declare class AnalyticsExecutiveSummaryComponent implements OnInit, OnDestroy {
28
+ export declare class AnalyticsExecutiveSummaryComponent extends BaseAngularComponent implements OnInit, OnDestroy {
28
29
  private _timeRange;
29
30
  set TimeRange(value: string);
30
31
  get TimeRange(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"executive-summary.component.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/executive-summary/executive-summary.component.ts"],"names":[],"mappings":"AAAA,OAAO,EACqB,YAAY,EAAE,MAAM,EAAE,SAAS,EAE1D,MAAM,eAAe,CAAC;AAGvB,OAAO,EAGL,SAAS,EAEV,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qDAAqD,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;;AAI5E,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAID,qBAqba,kCAAmC,YAAW,MAAM,EAAE,SAAS;IAG1E,OAAO,CAAC,UAAU,CAAS;IAC3B,IACI,SAAS,CAAC,KAAK,EAAE,MAAM,EAO1B;IACD,IAAI,SAAS,IAAI,MAAM,CAA4B;IAE1C,OAAO,EAAE,iBAAiB,CAAyD;IAElF,eAAe,uBAA8B;IAC7C,aAAa,kCAAyC;IACtD,eAAe,uBAA8B;IAIvD,OAAO,CAAC,sBAAsB,CAAoC;IAClE,OAAO,CAAC,GAAG,CAA6B;IAIxC,QAAQ,EAAE,cAAc,EAAE,CAAM;IAChC,UAAU,EAAE,SAAS,EAAE,CAAM;IAC7B,YAAY,EAAE,WAAW,EAAE,CAAM;IACjC,aAAa,EAAE,YAAY,EAAE,CAAM;IACnC,SAAS,UAAS;IAClB,iBAAiB,UAAS;IAC1B,WAAW,SAAY;IAEvB,gBAAgB,EAAE,gBAAgB,CAKhC;IAIF,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAA8B;IAIlD,QAAQ,IAAI,IAAI;IAMhB,WAAW,IAAI,IAAI;IAOnB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKtC,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAKjD,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAUvC,SAAS,IAAI,IAAI;IAOjB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAMxC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAYhC,OAAO,CAAC,UAAU,CAA8B;IAEhD,OAAO,CAAC,kBAAkB;IAkC1B,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,gBAAgB;IAyBxB,OAAO,CAAC,cAAc;YAaR,kBAAkB;IAuBhC,OAAO,CAAC,eAAe;IA+CvB,OAAO,CAAC,YAAY;IAuBpB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,iBAAiB;IAoCzB,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,aAAa;yCA/YV,kCAAkC;2CAAlC,kCAAkC;CAoZ9C;AAED,wBAAgB,6BAA6B,SAE5C"}
1
+ {"version":3,"file":"executive-summary.component.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/executive-summary/executive-summary.component.ts"],"names":[],"mappings":"AAAA,OAAO,EACqB,YAAY,EAAE,MAAM,EAAE,SAAS,EAE1D,MAAM,eAAe,CAAC;AAGvB,OAAO,EAGL,SAAS,EAEV,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qDAAqD,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AAIrE,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAID,qBAqba,kCAAmC,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAGvG,OAAO,CAAC,UAAU,CAAS;IAC3B,IACI,SAAS,CAAC,KAAK,EAAE,MAAM,EAO1B;IACD,IAAI,SAAS,IAAI,MAAM,CAA4B;IAE1C,OAAO,EAAE,iBAAiB,CAAyD;IAElF,eAAe,uBAA8B;IAC7C,aAAa,kCAAyC;IACtD,eAAe,uBAA8B;IAIvD,OAAO,CAAC,sBAAsB,CAAoC;IAClE,OAAO,CAAC,GAAG,CAA6B;IAIxC,QAAQ,EAAE,cAAc,EAAE,CAAM;IAChC,UAAU,EAAE,SAAS,EAAE,CAAM;IAC7B,YAAY,EAAE,WAAW,EAAE,CAAM;IACjC,aAAa,EAAE,YAAY,EAAE,CAAM;IACnC,SAAS,UAAS;IAClB,iBAAiB,UAAS;IAC1B,WAAW,SAAY;IAEvB,gBAAgB,EAAE,gBAAgB,CAKhC;IAIF,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAA8B;IAIlD,QAAQ,IAAI,IAAI;IAOhB,WAAW,IAAI,IAAI;IAOnB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKtC,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAKjD,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAUvC,SAAS,IAAI,IAAI;IAOjB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAMxC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAYhC,OAAO,CAAC,UAAU,CAA8B;IAEhD,OAAO,CAAC,kBAAkB;IAkC1B,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,gBAAgB;IAyBxB,OAAO,CAAC,cAAc;YAaR,kBAAkB;IAwBhC,OAAO,CAAC,eAAe;IA+CvB,OAAO,CAAC,YAAY;IAuBpB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,iBAAiB;IAoCzB,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,aAAa;yCAjZV,kCAAkC;2CAAlC,kCAAkC;CAsZ9C;AAED,wBAAgB,6BAA6B,SAE5C"}