@memberjunction/ng-dashboards 6.2.0-edge.6 → 6.2.0-edge.7

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 (212) hide show
  1. package/README.md +23 -16
  2. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +2 -2
  3. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
  4. package/dist/AI/components/analytics/realtime/realtime-management.component.d.ts.map +1 -1
  5. package/dist/AI/components/analytics/realtime/realtime-management.component.js +3 -1
  6. package/dist/AI/components/analytics/realtime/realtime-management.component.js.map +1 -1
  7. package/dist/AI/components/analytics/realtime/realtime-overview.component.d.ts +1 -1
  8. package/dist/AI/components/analytics/realtime/realtime-overview.component.js +3 -3
  9. package/dist/AI/components/analytics/realtime/realtime-overview.component.js.map +1 -1
  10. package/dist/AI/components/analytics/realtime/realtime-session-data.d.ts +6 -4
  11. package/dist/AI/components/analytics/realtime/realtime-session-data.d.ts.map +1 -1
  12. package/dist/AI/components/analytics/realtime/realtime-session-data.js +8 -2
  13. package/dist/AI/components/analytics/realtime/realtime-session-data.js.map +1 -1
  14. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +6 -6
  15. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  16. package/dist/AI/components/autotagging/components/classify-item-grid.component.js +1 -1
  17. package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -1
  18. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -1
  19. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +1 -0
  20. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -1
  21. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -1
  22. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +1 -0
  23. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -1
  24. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -1
  25. package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1 -0
  26. package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
  27. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  28. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +1 -0
  29. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  30. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +2 -2
  31. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  32. package/dist/AI/components/tags/tags-resource.component.js +3 -2
  33. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  34. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  35. package/dist/AI/components/vectors/vector-management-resource.component.js +12 -6
  36. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  37. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  38. package/dist/AI/services/ai-instrumentation.service.js +4 -2
  39. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  40. package/dist/Actions/action-result-code.d.ts +80 -0
  41. package/dist/Actions/action-result-code.d.ts.map +1 -0
  42. package/dist/Actions/action-result-code.js +163 -0
  43. package/dist/Actions/action-result-code.js.map +1 -0
  44. package/dist/Actions/components/actions-overview.component.d.ts +8 -0
  45. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  46. package/dist/Actions/components/actions-overview.component.js +12 -9
  47. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  48. package/dist/Actions/components/execution-monitoring.component.d.ts +29 -9
  49. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
  50. package/dist/Actions/components/execution-monitoring.component.js +65 -42
  51. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  52. package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -1
  53. package/dist/Actions/components/explorer/action-card.component.js +5 -4
  54. package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
  55. package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts +92 -130
  56. package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts.map +1 -1
  57. package/dist/ChiefOfStaff/chief-of-staff-agent-context.js +189 -274
  58. package/dist/ChiefOfStaff/chief-of-staff-agent-context.js.map +1 -1
  59. package/dist/ChiefOfStaff/chief-of-staff-approvals.component.d.ts +29 -0
  60. package/dist/ChiefOfStaff/chief-of-staff-approvals.component.d.ts.map +1 -0
  61. package/dist/ChiefOfStaff/chief-of-staff-approvals.component.js +666 -0
  62. package/dist/ChiefOfStaff/chief-of-staff-approvals.component.js.map +1 -0
  63. package/dist/ChiefOfStaff/chief-of-staff-governance.component.d.ts +56 -0
  64. package/dist/ChiefOfStaff/chief-of-staff-governance.component.d.ts.map +1 -0
  65. package/dist/ChiefOfStaff/chief-of-staff-governance.component.js +515 -0
  66. package/dist/ChiefOfStaff/chief-of-staff-governance.component.js.map +1 -0
  67. package/dist/ChiefOfStaff/chief-of-staff-live-refresh.d.ts +14 -0
  68. package/dist/ChiefOfStaff/chief-of-staff-live-refresh.d.ts.map +1 -0
  69. package/dist/ChiefOfStaff/chief-of-staff-live-refresh.js +39 -0
  70. package/dist/ChiefOfStaff/chief-of-staff-live-refresh.js.map +1 -0
  71. package/dist/ChiefOfStaff/chief-of-staff-overview.component.d.ts +17 -0
  72. package/dist/ChiefOfStaff/chief-of-staff-overview.component.d.ts.map +1 -0
  73. package/dist/ChiefOfStaff/chief-of-staff-overview.component.js +485 -0
  74. package/dist/ChiefOfStaff/chief-of-staff-overview.component.js.map +1 -0
  75. package/dist/ChiefOfStaff/chief-of-staff-page-base.d.ts +139 -0
  76. package/dist/ChiefOfStaff/chief-of-staff-page-base.d.ts.map +1 -0
  77. package/dist/ChiefOfStaff/chief-of-staff-page-base.js +602 -0
  78. package/dist/ChiefOfStaff/chief-of-staff-page-base.js.map +1 -0
  79. package/dist/ChiefOfStaff/index.d.ts +4 -1
  80. package/dist/ChiefOfStaff/index.d.ts.map +1 -1
  81. package/dist/ChiefOfStaff/index.js +4 -1
  82. package/dist/ChiefOfStaff/index.js.map +1 -1
  83. package/dist/Communication/communication-monitor-resource.component.js +3 -3
  84. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  85. package/dist/Communication/communication-runs-resource.component.js +3 -3
  86. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  87. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  88. package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
  89. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  90. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  91. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +2 -1
  92. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  93. package/dist/ComponentStudio/services/component-version.service.d.ts.map +1 -1
  94. package/dist/ComponentStudio/services/component-version.service.js +3 -0
  95. package/dist/ComponentStudio/services/component-version.service.js.map +1 -1
  96. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +21 -2
  97. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  98. package/dist/DataExplorer/data-explorer-dashboard.component.js +32 -5
  99. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  100. package/dist/DevTools/graphql-console.component.js +2 -2
  101. package/dist/DevTools/lazy-module-status.component.js +2 -2
  102. package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -1
  103. package/dist/FormBuilder/form-builder-resource.component.js +5 -0
  104. package/dist/FormBuilder/form-builder-resource.component.js.map +1 -1
  105. package/dist/Integration/components/connections/connections.component.js +2 -2
  106. package/dist/Integration/services/integration-data.service.d.ts +1 -1
  107. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  108. package/dist/Integration/services/integration-data.service.js +4 -3
  109. package/dist/Integration/services/integration-data.service.js.map +1 -1
  110. package/dist/Lists/components/lists-browse-resource.component.js +1 -1
  111. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  112. package/dist/Lists/components/lists-my-lists-resource.component.js +1 -1
  113. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  114. package/dist/LoginStudio/login-studio-resource.component.d.ts.map +1 -1
  115. package/dist/LoginStudio/login-studio-resource.component.js +1 -0
  116. package/dist/LoginStudio/login-studio-resource.component.js.map +1 -1
  117. package/dist/PredictiveStudio/components/ps-experiments.component.d.ts.map +1 -1
  118. package/dist/PredictiveStudio/components/ps-experiments.component.js +1 -0
  119. package/dist/PredictiveStudio/components/ps-experiments.component.js.map +1 -1
  120. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js +2 -2
  121. package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts.map +1 -1
  122. package/dist/PredictiveStudio/components/ps-predictions-grid.component.js +3 -0
  123. package/dist/PredictiveStudio/components/ps-predictions-grid.component.js.map +1 -1
  124. package/dist/PredictiveStudio/engine/predictive-studio.engine.d.ts.map +1 -1
  125. package/dist/PredictiveStudio/engine/predictive-studio.engine.js +1 -0
  126. package/dist/PredictiveStudio/engine/predictive-studio.engine.js.map +1 -1
  127. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts.map +1 -1
  128. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js +1 -0
  129. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js.map +1 -1
  130. package/dist/QueryBrowser/query-browser-resource.component.d.ts +26 -0
  131. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  132. package/dist/QueryBrowser/query-browser-resource.component.js +375 -252
  133. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  134. package/dist/UserRoutines/user-routines-resource.component.d.ts +8 -1
  135. package/dist/UserRoutines/user-routines-resource.component.d.ts.map +1 -1
  136. package/dist/UserRoutines/user-routines-resource.component.js +22 -4
  137. package/dist/UserRoutines/user-routines-resource.component.js.map +1 -1
  138. package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
  139. package/dist/VersionHistory/components/diff-resource.component.js +1 -0
  140. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  141. package/dist/VideoStudio/components/vs-archetype-editor.component.d.ts +162 -0
  142. package/dist/VideoStudio/components/vs-archetype-editor.component.d.ts.map +1 -0
  143. package/dist/VideoStudio/components/vs-archetype-editor.component.js +1105 -0
  144. package/dist/VideoStudio/components/vs-archetype-editor.component.js.map +1 -0
  145. package/dist/VideoStudio/components/vs-audio-options.component.d.ts +27 -0
  146. package/dist/VideoStudio/components/vs-audio-options.component.d.ts.map +1 -0
  147. package/dist/VideoStudio/components/vs-audio-options.component.js +119 -0
  148. package/dist/VideoStudio/components/vs-audio-options.component.js.map +1 -0
  149. package/dist/VideoStudio/components/vs-copilot-panel.component.d.ts +105 -0
  150. package/dist/VideoStudio/components/vs-copilot-panel.component.d.ts.map +1 -0
  151. package/dist/VideoStudio/components/vs-copilot-panel.component.js +560 -0
  152. package/dist/VideoStudio/components/vs-copilot-panel.component.js.map +1 -0
  153. package/dist/VideoStudio/components/vs-production-brief.component.d.ts +163 -0
  154. package/dist/VideoStudio/components/vs-production-brief.component.d.ts.map +1 -0
  155. package/dist/VideoStudio/components/vs-production-brief.component.js +1054 -0
  156. package/dist/VideoStudio/components/vs-production-brief.component.js.map +1 -0
  157. package/dist/VideoStudio/components/vs-setup-health-card.component.d.ts +43 -0
  158. package/dist/VideoStudio/components/vs-setup-health-card.component.d.ts.map +1 -0
  159. package/dist/VideoStudio/components/vs-setup-health-card.component.js +412 -0
  160. package/dist/VideoStudio/components/vs-setup-health-card.component.js.map +1 -0
  161. package/dist/VideoStudio/components/vs-studio-slide-in.component.d.ts +73 -0
  162. package/dist/VideoStudio/components/vs-studio-slide-in.component.d.ts.map +1 -0
  163. package/dist/VideoStudio/components/vs-studio-slide-in.component.js +271 -0
  164. package/dist/VideoStudio/components/vs-studio-slide-in.component.js.map +1 -0
  165. package/dist/VideoStudio/index.d.ts +12 -0
  166. package/dist/VideoStudio/index.d.ts.map +1 -0
  167. package/dist/VideoStudio/index.js +12 -0
  168. package/dist/VideoStudio/index.js.map +1 -0
  169. package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.d.ts +118 -0
  170. package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.d.ts.map +1 -0
  171. package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.js +964 -0
  172. package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.js.map +1 -0
  173. package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.d.ts +70 -0
  174. package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.d.ts.map +1 -0
  175. package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.js +600 -0
  176. package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.js.map +1 -0
  177. package/dist/VideoStudio/resources/video-studio-productions-resource.component.d.ts +182 -0
  178. package/dist/VideoStudio/resources/video-studio-productions-resource.component.d.ts.map +1 -0
  179. package/dist/VideoStudio/resources/video-studio-productions-resource.component.js +1481 -0
  180. package/dist/VideoStudio/resources/video-studio-productions-resource.component.js.map +1 -0
  181. package/dist/VideoStudio/services/vs-studio-slide-in-state.service.d.ts +102 -0
  182. package/dist/VideoStudio/services/vs-studio-slide-in-state.service.d.ts.map +1 -0
  183. package/dist/VideoStudio/services/vs-studio-slide-in-state.service.js +240 -0
  184. package/dist/VideoStudio/services/vs-studio-slide-in-state.service.js.map +1 -0
  185. package/dist/VideoStudio/video-studio-agent-context.d.ts +495 -0
  186. package/dist/VideoStudio/video-studio-agent-context.d.ts.map +1 -0
  187. package/dist/VideoStudio/video-studio-agent-context.js +992 -0
  188. package/dist/VideoStudio/video-studio-agent-context.js.map +1 -0
  189. package/dist/ai-dashboards.module.d.ts +25 -22
  190. package/dist/ai-dashboards.module.d.ts.map +1 -1
  191. package/dist/ai-dashboards.module.js +23 -7
  192. package/dist/ai-dashboards.module.js.map +1 -1
  193. package/dist/module.d.ts +13 -12
  194. package/dist/module.d.ts.map +1 -1
  195. package/dist/module.js +7 -0
  196. package/dist/module.js.map +1 -1
  197. package/dist/public-api.d.ts +7 -1
  198. package/dist/public-api.d.ts.map +1 -1
  199. package/dist/public-api.js +9 -2
  200. package/dist/public-api.js.map +1 -1
  201. package/dist/shared/action-scheduled-job.d.ts.map +1 -1
  202. package/dist/shared/action-scheduled-job.js +2 -0
  203. package/dist/shared/action-scheduled-job.js.map +1 -1
  204. package/dist/video-studio-dashboards.module.d.ts +40 -0
  205. package/dist/video-studio-dashboards.module.d.ts.map +1 -0
  206. package/dist/video-studio-dashboards.module.js +159 -0
  207. package/dist/video-studio-dashboards.module.js.map +1 -0
  208. package/package.json +77 -71
  209. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts +0 -195
  210. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts.map +0 -1
  211. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.js +0 -2910
  212. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ai-instrumentation.service.d.ts","sourceRoot":"","sources":["../../../src/AI/services/ai-instrumentation.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-instrumentation.service.d.ts","sourceRoot":"","sources":["../../../src/AI/services/ai-instrumentation.service.ts"],"names":[],"mappings":"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"}
@@ -277,7 +277,8 @@ export class AIInstrumentationService {
277
277
  ExtraFilter: `ID = '${promptRunId}'`,
278
278
  Fields: PROMPT_RUN_FIELDS,
279
279
  ResultType: 'simple',
280
- MaxRows: 1
280
+ MaxRows: 1,
281
+ SkipTotalRowCount: true
281
282
  },
282
283
  ...(loadChildren ? [{
283
284
  EntityName: 'MJ: AI Prompt Runs',
@@ -324,7 +325,8 @@ export class AIInstrumentationService {
324
325
  ExtraFilter: `ID = '${agentRunId}'`,
325
326
  Fields: AGENT_RUN_FIELDS,
326
327
  ResultType: 'simple',
327
- MaxRows: 1
328
+ MaxRows: 1,
329
+ SkipTotalRowCount: true
328
330
  },
329
331
  ...(loadChildren ? [{
330
332
  EntityName: 'MJ: AI Agent Runs',
@@ -1 +1 @@
1
- {"version":3,"file":"ai-instrumentation.service.js","sourceRoot":"","sources":["../../../src/AI/services/ai-instrumentation.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject, from, combineLatest, of } from 'rxjs';\nimport { switchMap, shareReplay, tap, map, catchError } from 'rxjs/operators';\nimport { RunView, RunQuery, IMetadataProvider, IRunQueryProvider, RunViewResult } from '@memberjunction/core';\nimport { NormalizeUUID } from '@memberjunction/global';\nimport { TOKEN_PRICE_UNIT_TYPE_DIVISORS } from '@memberjunction/ai-engine-base';\nimport { CacheRate } from './cache-metrics';\nimport { AIUsageCoverage, AIUsageHourlyRow, AIUsageDailyRow, AIUsageByModelRow, AIAgentRunSubtreeCost } from './ai-usage-analytics.types';\nimport {\n DashboardKPIs,\n TrendData,\n LiveExecution,\n LiveExecutionStatus,\n CostInputRow,\n ComputeTotalCost,\n ComputeKPIs,\n ComputeTrends,\n ComputeLiveExecutions,\n ComputeCostByModel,\n ComputePerformanceMatrix,\n ComputeTokenEfficiency,\n CountActiveExecutions,\n ResolveCostCurrency\n} from './ai-usage-analytics.compute';\n\nexport {\n DashboardKPIs,\n TrendData,\n LiveExecution,\n LiveExecutionStatus,\n AIUsageCoverage,\n AIUsageHourlyRow,\n AIUsageDailyRow,\n AIUsageByModelRow,\n AIAgentRunSubtreeCost,\n CostInputRow,\n ComputeTotalCost,\n CacheRate\n};\n\n/**\n * True when a metadata provider can also run saved queries. At runtime MJ's providers (ProviderBase\n * subclasses) implement both interfaces, but IMetadataProvider does not extend IRunQueryProvider, so\n * this is checked rather than asserted — a provider that cannot run queries fails loudly here\n * instead of at the first RunQuery call.\n */\nfunction IsRunQueryProvider(provider: IMetadataProvider): provider is IMetadataProvider & IRunQueryProvider {\n return 'RunQuery' in provider && typeof provider.RunQuery === 'function'\n && 'RunQueries' in provider && typeof provider.RunQueries === 'function';\n}\n\n/** How deep an execution drill-down follows child runs, and how many it will load in total. */\nconst EXECUTION_DETAIL_MAX_DEPTH = 4;\nconst EXECUTION_DETAIL_MAX_NODES = 200;\n\n/**\n * Lightweight record types for live run monitoring and execution drill-down.\n * We use ResultType: 'simple' with explicit Fields and MaxRows bounds\n * to avoid unbounded reads and large payload transfers.\n */\nexport interface PromptRunRecord {\n ID: string;\n RunAt: string;\n CompletedAt: string | null;\n Success: boolean;\n Cost: number | null;\n TokensUsed: number | null;\n TokensPrompt: number | null;\n TokensCompletion: number | null;\n TokensCacheRead: number | null;\n TokensCacheWrite: number | null;\n ExecutionTimeMS: number | null;\n ModelID: string | null;\n Model: string | null;\n AgentID: string | null;\n Agent: string | null;\n Prompt: string | null;\n ErrorMessage: string | null;\n}\n\nexport interface AgentRunRecord {\n ID: string;\n StartedAt: string;\n CompletedAt: string | null;\n Status: string;\n Success: boolean;\n TotalCost: number | null;\n TotalTokensUsed: number | null;\n AgentID: string | null;\n Agent: string | null;\n ErrorMessage: string | null;\n}\n\n/** Fields to request for prompt runs — only what is needed for drilldown and live monitoring */\nexport const PROMPT_RUN_FIELDS = [\n 'ID', 'RunAt', 'CompletedAt', 'Success', 'Cost', 'TokensUsed',\n 'TokensPrompt', 'TokensCompletion', 'TokensCacheRead', 'TokensCacheWrite', 'ExecutionTimeMS',\n 'ModelID', 'Model', 'AgentID', 'Agent', 'Prompt', 'ErrorMessage'\n];\n\n/** Fields to request for agent runs — only what is needed for drilldown and live monitoring */\nexport const AGENT_RUN_FIELDS = [\n 'ID', 'StartedAt', 'CompletedAt', 'Status', 'Success',\n 'TotalCost', 'TotalTokensUsed', 'AgentID', 'Agent', 'ErrorMessage'\n];\n\nexport interface ExecutionDetails {\n id: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n type: 'prompt' | 'agent'; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n name: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n status: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n startTime: Date; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n endTime?: Date; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n cost: number | null; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n tokens: number; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n success: boolean; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n errorMessage?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n parentId?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n children: ExecutionDetails[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n model?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n vendor?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n}\n\nexport interface ChartData {\n executionTrends: TrendData[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n costByModel: { model: string; cost: number | null; tokens: number }[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n performanceMatrix: { agent: string; model: string; avgTime: number; successRate: number; FailedRuns: number }[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n tokenEfficiency: { inputTokens: number; outputTokens: number; cost: number | null; model: string }[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n}\n\n/** Internal shape for the single data load that all derived streams share */\ninterface DashboardRawData {\n hourlyRows: AIUsageHourlyRow[];\n livePromptRuns: PromptRunRecord[];\n liveAgentRuns: AgentRunRecord[];\n modelNames: Map<string, string>;\n agentNames: Map<string, string>;\n start: Date;\n end: Date;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AIInstrumentationService {\n private _provider: IMetadataProvider | null = null;\n\n /** Set the metadata provider this service should use. Components should call this after injection. */\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n if (this._provider) {\n return this._provider;\n }\n throw new Error('AIInstrumentationService: MetadataProvider must be set before use');\n }\n\n public get ProviderToUse(): IMetadataProvider {\n return this.Provider;\n }\n\n public get RunQueryToUse(): IRunQueryProvider {\n const provider = this.ProviderToUse;\n if (IsRunQueryProvider(provider)) {\n return provider;\n }\n throw new Error('AIInstrumentationService: the configured MetadataProvider cannot run queries');\n }\n\n private readonly _dateRange$ = new BehaviorSubject<{ start: Date; end: Date }>({\n start: new Date(Date.now() - 24 * 60 * 60 * 1000), // Last 24 hours\n end: new Date()\n });\n\n private readonly _refreshTrigger$ = new BehaviorSubject<number>(0);\n private readonly _isLoading$ = new BehaviorSubject<boolean>(false);\n\n // Expose loading state as observable\n readonly IsLoading$ = this._isLoading$.asObservable();\n\n /** @deprecated Use {@link IsLoading$}. */\n get isLoading$() {\n return this.IsLoading$;\n }\n\n constructor() {}\n\n /**\n * Single data load: fetches aggregated hourly facts via RunQuery and\n * live runs via bounded RunViews once per refresh or date-range change.\n *\n * A failed load is contained INSIDE the switchMap. Left to reach shareReplay, one rejected load\n * (a transient network blip, a RunQuery 500) terminates the shared subject for the life of this\n * root-provided service: every derived stream replays the error, Refresh() and SetDateRange()\n * push into a combineLatest nobody is subscribed to any more, and IsLoading$ sticks at true.\n */\n private readonly rawData$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(\n tap(() => this._isLoading$.next(true)),\n switchMap(([, range]) => from(this.loadAllData()).pipe(\n catchError((error: unknown) => {\n console.error('AI analytics: dashboard data failed to load; showing an empty period until the next refresh.', error);\n return of(this.emptyRawData(range.start, range.end));\n })\n )),\n tap(() => this._isLoading$.next(false)),\n shareReplay(1)\n );\n\n // Derived streams — pure in-memory transforms via ai-usage-analytics.compute.ts\n readonly Kpis$ = this.rawData$.pipe(\n map(data => {\n const activeExecutions = CountActiveExecutions(data.livePromptRuns, data.liveAgentRuns);\n return ComputeKPIs(data.hourlyRows, activeExecutions, data.modelNames, data.agentNames);\n }),\n shareReplay(1)\n );\n\n /** @deprecated Use {@link Kpis$}. */\n get kpis$() {\n return this.Kpis$;\n }\n\n readonly Trends$ = this.rawData$.pipe(\n map(data => ComputeTrends(data.hourlyRows, data.start, data.end, ResolveCostCurrency(data.hourlyRows).Currency)),\n shareReplay(1)\n );\n\n /** @deprecated Use {@link Trends$}. */\n get trends$() {\n return this.Trends$;\n }\n\n readonly LiveExecutions$ = this.rawData$.pipe(\n map(data => ComputeLiveExecutions(data.livePromptRuns, data.liveAgentRuns)),\n shareReplay(1)\n );\n\n /** @deprecated Use {@link LiveExecutions$}. */\n get liveExecutions$() {\n return this.LiveExecutions$;\n }\n\n readonly ChartData$ = combineLatest([this.rawData$, this.Trends$]).pipe(\n map(([data, executionTrends]) => {\n // One currency for every cost on the page — the same one the KPIs report in.\n const currency = ResolveCostCurrency(data.hourlyRows).Currency;\n return {\n executionTrends,\n costByModel: ComputeCostByModel(data.hourlyRows, data.modelNames, currency),\n performanceMatrix: ComputePerformanceMatrix(data.hourlyRows, data.modelNames, data.agentNames),\n tokenEfficiency: ComputeTokenEfficiency(data.hourlyRows, data.modelNames, currency)\n };\n }),\n shareReplay(1)\n );\n\n /** @deprecated Use {@link ChartData$}. */\n get chartData$() {\n return this.ChartData$;\n }\n\n SetDateRange(start: Date, end: Date): void {\n this._dateRange$.next({ start, end });\n }\n\n /** @deprecated Use {@link SetDateRange}. */\n setDateRange(start: Date, end: Date): void {\n return this.SetDateRange(start, end);\n }\n\n Refresh(): void {\n this._refreshTrigger$.next(this._refreshTrigger$.value + 1);\n }\n\n /** @deprecated Use {@link Refresh}. */\n refresh(): void {\n return this.Refresh();\n }\n\n /**\n * Single batch query that loads all data needed by every dashboard widget.\n * AIUsageHourly runs through RunQuery.\n * Live runs and dimension names are loaded with explicit MaxRows bounds.\n */\n private async loadAllData(): Promise<DashboardRawData> {\n const { start, end } = this._dateRange$.value;\n const now = new Date();\n const recentTime = new Date(now.getTime() - 5 * 60 * 1000);\n\n const rq = new RunQuery(this.RunQueryToUse);\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n const [queryResult, rvResults] = await Promise.all([\n rq.RunQuery({\n QueryName: 'AIUsageHourly',\n CategoryPath: '/MJ/AI/',\n Parameters: {\n start: start.toISOString(),\n end: end.toISOString()\n }\n }),\n rv.RunViews<PromptRunRecord | AgentRunRecord | { ID: string; Name: string }>([\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `RunAt >= '${recentTime.toISOString()}'`,\n OrderBy: 'RunAt DESC',\n Fields: PROMPT_RUN_FIELDS,\n ResultType: 'simple',\n MaxRows: 50\n },\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `StartedAt >= '${recentTime.toISOString()}'`,\n OrderBy: 'StartedAt DESC',\n Fields: AGENT_RUN_FIELDS,\n ResultType: 'simple',\n MaxRows: 50\n },\n {\n EntityName: 'MJ: AI Models',\n Fields: ['ID', 'Name'],\n ResultType: 'simple',\n MaxRows: 500\n },\n {\n EntityName: 'MJ: AI Agents',\n Fields: ['ID', 'Name'],\n ResultType: 'simple',\n MaxRows: 500\n }\n ])\n ]);\n\n if (!queryResult.Success) {\n // A failed aggregate read is not an empty period. Say so rather than let every KPI read zero.\n console.error(`AI analytics: AIUsageHourly failed to load; usage figures will be empty. ${queryResult.ErrorMessage}`);\n }\n const hourlyRows = (queryResult.Success && Array.isArray(queryResult.Results) ? queryResult.Results : []) as AIUsageHourlyRow[];\n\n const livePromptRuns = this.resultRows<PromptRunRecord>(rvResults[0], 'live prompt runs');\n const liveAgentRuns = this.resultRows<AgentRunRecord>(rvResults[1], 'live agent runs');\n\n const modelNames = new Map<string, string>();\n for (const m of this.resultRows<{ ID: string; Name: string }>(rvResults[2], 'model names')) {\n if (m && m.ID && m.Name) {\n modelNames.set(m.ID, m.Name);\n }\n }\n\n const agentNames = new Map<string, string>();\n for (const a of this.resultRows<{ ID: string; Name: string }>(rvResults[3], 'agent names')) {\n if (a && a.ID && a.Name) {\n agentNames.set(a.ID, a.Name);\n }\n }\n\n return {\n hourlyRows,\n livePromptRuns,\n liveAgentRuns,\n modelNames,\n agentNames,\n start,\n end\n };\n }\n\n /** The payload a failed load degrades to: an empty period over the requested range. */\n private emptyRawData(start: Date, end: Date): DashboardRawData {\n return {\n hourlyRows: [],\n livePromptRuns: [],\n liveAgentRuns: [],\n modelNames: new Map<string, string>(),\n agentNames: new Map<string, string>(),\n start,\n end\n };\n }\n\n /**\n * The rows of a RunView result, logging when the view FAILED. A failed view and an empty one both\n * yield no rows, but only the empty one means \"nothing there\" — without the log, a failure reads\n * as a confident zero on whatever figure the rows feed.\n */\n private resultRows<T>(result: RunViewResult<unknown> | undefined, what: string): T[] {\n if (!result) {\n console.error(`AI analytics: no result returned for ${what}`);\n return [];\n }\n if (!result.Success) {\n console.error(`AI analytics: ${what} failed to load. ${result.ErrorMessage}`);\n return [];\n }\n return (Array.isArray(result.Results) ? result.Results : []) as T[];\n }\n\n // ─── Execution Details (on-demand, not part of initial load) ──────\n\n async GetExecutionDetails(executionId: string, type: 'prompt' | 'agent'): Promise<ExecutionDetails | null> {\n try {\n const budget = { visited: new Set<string>(), remaining: EXECUTION_DETAIL_MAX_NODES };\n if (type === 'prompt') {\n return await this.getPromptExecutionDetails(executionId, 0, budget);\n } else {\n return await this.getAgentExecutionDetails(executionId, 0, budget);\n }\n } catch (error) {\n console.error('Error loading execution details:', error);\n return null;\n }\n }\n\n /** @deprecated Use {@link GetExecutionDetails}. */\n async getExecutionDetails(executionId: string, type: 'prompt' | 'agent'): Promise<ExecutionDetails | null> {\n return this.GetExecutionDetails(executionId, type);\n }\n\n /**\n * Claims a node for the drill-down: false when it was already visited (a ParentID cycle) or the\n * total node budget is spent. Bounded because each node costs a RunViews round trip and children\n * fan out — an uncapped 3-level tree of 20 children each is thousands of requests from one click.\n */\n private claimDetailNode(id: string, budget: { visited: Set<string>; remaining: number }): boolean {\n const key = NormalizeUUID(id);\n if (budget.visited.has(key) || budget.remaining <= 0) {\n return false;\n }\n budget.visited.add(key);\n budget.remaining--;\n return true;\n }\n\n private async getPromptExecutionDetails(\n promptRunId: string,\n depth: number,\n budget: { visited: Set<string>; remaining: number }\n ): Promise<ExecutionDetails> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const loadChildren = depth < EXECUTION_DETAIL_MAX_DEPTH;\n const [result, childrenResult] = await rv.RunViews<PromptRunRecord>([\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `ID = '${promptRunId}'`,\n Fields: PROMPT_RUN_FIELDS,\n ResultType: 'simple',\n MaxRows: 1\n },\n ...(loadChildren ? [{\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `ParentID = '${promptRunId}'`,\n Fields: PROMPT_RUN_FIELDS,\n ResultType: 'simple' as const,\n MaxRows: 100\n }] : [])\n ]);\n\n const run = this.resultRows<PromptRunRecord>(result, 'prompt run detail')[0];\n if (!run) throw new Error('Prompt run not found');\n\n const childrenList = loadChildren ? this.resultRows<PromptRunRecord>(childrenResult, 'prompt run children') : [];\n const children = await Promise.all(\n childrenList\n .filter(child => this.claimDetailNode(child.ID, budget))\n .map(child => this.getPromptExecutionDetails(child.ID, depth + 1, budget))\n );\n\n const costVal = run.Cost !== null && run.Cost !== undefined ? run.Cost : null;\n const tokensVal = typeof run.TokensUsed === 'number' ? run.TokensUsed : 0;\n const promptName = run.Prompt ? run.Prompt : 'Unnamed Prompt';\n const statusStr = run.Success ? 'completed' : 'failed';\n const errMsg = run.ErrorMessage ? run.ErrorMessage : undefined;\n const modelStr = run.Model ? run.Model : undefined;\n\n return {\n id: run.ID,\n type: 'prompt',\n name: promptName,\n status: statusStr,\n startTime: new Date(run.RunAt),\n endTime: run.CompletedAt ? new Date(run.CompletedAt) : undefined,\n cost: costVal,\n tokens: tokensVal,\n success: run.Success ? true : false,\n errorMessage: errMsg,\n children,\n model: modelStr\n };\n }\n\n private async getAgentExecutionDetails(\n agentRunId: string,\n depth: number,\n budget: { visited: Set<string>; remaining: number }\n ): Promise<ExecutionDetails> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const loadChildren = depth < EXECUTION_DETAIL_MAX_DEPTH;\n const [result, childrenResult] = await rv.RunViews<AgentRunRecord>([\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ID = '${agentRunId}'`,\n Fields: AGENT_RUN_FIELDS,\n ResultType: 'simple',\n MaxRows: 1\n },\n ...(loadChildren ? [{\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ParentRunID = '${agentRunId}'`,\n Fields: AGENT_RUN_FIELDS,\n ResultType: 'simple' as const,\n MaxRows: 100\n }] : [])\n ]);\n\n const run = this.resultRows<AgentRunRecord>(result, 'agent run detail')[0];\n if (!run) throw new Error('Agent run not found');\n\n const childrenList = loadChildren ? this.resultRows<AgentRunRecord>(childrenResult, 'agent run children') : [];\n const children = await Promise.all(\n childrenList\n .filter(child => this.claimDetailNode(child.ID, budget))\n .map(child => this.getAgentExecutionDetails(child.ID, depth + 1, budget))\n );\n\n const costVal = run.TotalCost !== null && run.TotalCost !== undefined ? run.TotalCost : null;\n const tokensVal = typeof run.TotalTokensUsed === 'number' ? run.TotalTokensUsed : 0;\n const agentName = run.Agent ? run.Agent : 'Unnamed Agent';\n const statusStr = run.Status ? run.Status.toLowerCase() : 'unknown';\n const errMsg = run.ErrorMessage ? run.ErrorMessage : undefined;\n\n return {\n id: run.ID,\n type: 'agent',\n name: agentName,\n status: statusStr,\n startTime: new Date(run.StartedAt),\n endTime: run.CompletedAt ? new Date(run.CompletedAt) : undefined,\n cost: costVal,\n tokens: tokensVal,\n success: run.Success ? true : false,\n errorMessage: errMsg,\n parentId: undefined,\n children\n };\n }\n\n /**\n * Runs one of the AI usage aggregate queries, logging a failure rather than letting it read as an\n * empty (zero-usage) period.\n */\n private async runUsageQuery<T>(queryName: string, start: Date, end: Date): Promise<T[]> {\n const rq = new RunQuery(this.RunQueryToUse);\n const res = await rq.RunQuery({\n QueryName: queryName,\n CategoryPath: '/MJ/AI/',\n Parameters: {\n start: start.toISOString(),\n end: end.toISOString()\n }\n });\n if (!res.Success) {\n console.error(`AI analytics: ${queryName} failed to load. ${res.ErrorMessage}`);\n return [];\n }\n return (Array.isArray(res.Results) ? res.Results : []) as T[];\n }\n\n /**\n * Fetch hourly aggregate usage for a date range via stored query AIUsageHourly.\n */\n async GetUsageHourly(start: Date, end: Date): Promise<AIUsageHourlyRow[]> {\n return this.runUsageQuery<AIUsageHourlyRow>('AIUsageHourly', start, end);\n }\n\n /**\n * Fetch daily aggregate usage for a date range via stored query AIUsageDaily.\n */\n async GetUsageDaily(start: Date, end: Date): Promise<AIUsageDailyRow[]> {\n return this.runUsageQuery<AIUsageDailyRow>('AIUsageDaily', start, end);\n }\n\n /**\n * Fetch model-level aggregate usage for a date range via stored query AIUsageByModel.\n */\n async GetUsageByModel(start: Date, end: Date): Promise<AIUsageByModelRow[]> {\n return this.runUsageQuery<AIUsageByModelRow>('AIUsageByModel', start, end);\n }\n\n /**\n * Calculate recursive subtree cost and token metrics for an agent run via CalculateRunCost.\n */\n async CalculateAgentRunCost(agentRunId: string): Promise<AIAgentRunSubtreeCost | null> {\n const rq = new RunQuery(this.RunQueryToUse);\n const res = await rq.RunQuery({\n QueryName: 'CalculateRunCost',\n CategoryPath: '/MJ/AI/Agents/',\n Parameters: {\n AIAgentRunID: agentRunId,\n AgentRunID: agentRunId\n }\n });\n if (!res.Success) {\n console.error(`AI analytics: CalculateRunCost failed for agent run ${agentRunId}. ${res.ErrorMessage}`);\n return null;\n }\n if (Array.isArray(res.Results) && res.Results.length > 0) {\n const raw = res.Results[0] as AIAgentRunSubtreeCost;\n const cost = raw.TotalCost !== null && raw.TotalCost !== undefined ? Number(raw.TotalCost) : null;\n const toFiniteNum = (v: unknown): number => {\n const n = Number(v);\n return Number.isFinite(n) ? n : 0;\n };\n return {\n AgentRunID: raw.AgentRunID,\n TotalCost: cost,\n TotalPrompts: toFiniteNum(raw.TotalPrompts),\n TotalTokensInput: toFiniteNum(raw.TotalTokensInput),\n TotalTokensOutput: toFiniteNum(raw.TotalTokensOutput),\n TotalTokens: toFiniteNum(raw.TotalTokens)\n };\n }\n return null;\n }\n\n /**\n * Fetch model and vendor lookups for mapping IDs to display names.\n */\n async GetModelAndVendorLookups(): Promise<{\n models: Map<string, string>;\n modelVendors: Map<string, string>;\n vendors: Map<string, string>;\n agents: Map<string, string>;\n }> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [modelsRes, vendorsRes, agentsRes] = await rv.RunViews([\n {\n EntityName: 'MJ: AI Models',\n Fields: ['ID', 'Name', 'VendorID'],\n MaxRows: 500,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Vendors',\n Fields: ['ID', 'Name'],\n MaxRows: 500,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Agents',\n Fields: ['ID', 'Name'],\n MaxRows: 500,\n ResultType: 'simple'\n }\n ]);\n const models = new Map<string, string>();\n const modelVendors = new Map<string, string>();\n const vendors = new Map<string, string>();\n const agents = new Map<string, string>();\n\n for (const m of this.resultRows<{ ID: string; Name: string; VendorID?: string | null }>(modelsRes, 'model names')) {\n if (m.ID) {\n models.set(m.ID.toLowerCase(), m.Name);\n if (m.VendorID) {\n modelVendors.set(m.ID.toLowerCase(), m.VendorID);\n }\n }\n }\n for (const v of this.resultRows<{ ID: string; Name: string }>(vendorsRes, 'vendor names')) {\n if (v.ID) {\n vendors.set(v.ID.toLowerCase(), v.Name);\n }\n }\n for (const a of this.resultRows<{ ID: string; Name: string }>(agentsRes, 'agent names')) {\n if (a.ID) {\n agents.set(a.ID.toLowerCase(), a.Name);\n }\n }\n return { models, modelVendors, vendors, agents };\n }\n\n /**\n * Fetch active realtime model pricing rates and compute currency-per-token divisors.\n */\n async GetCacheRates(): Promise<Map<string, CacheRate>> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [rateResult, unitTypeResult] = await rv.RunViews([\n {\n EntityName: 'MJ: AI Model Costs',\n ExtraFilter: `Status='Active' AND ProcessingType='Realtime'`,\n Fields: ['ModelID', 'VendorID', 'InputPricePerUnit', 'OutputPricePerUnit', 'CacheReadPricePerUnit', 'CacheWritePricePerUnit', 'UnitTypeID'],\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Model Price Unit Types',\n Fields: ['ID', 'DriverClass'],\n ResultType: 'simple'\n }\n ]);\n\n // A failed unit-type view is NOT the same as \"these rows are unpriceable\". Without the driver\n // classes every rate row falls into the `continue` below, and cache savings render as a\n // confident 0 instead of an error — the figure most likely to be believed. Say so rather than\n // let the empty map speak for it.\n if (unitTypeResult && !unitTypeResult.Success) {\n console.error('AI analytics: price unit types failed to load; cache-savings figures will read 0. ' +\n unitTypeResult.ErrorMessage);\n }\n\n const cacheRates = new Map<string, CacheRate>();\n const unitTypes = this.resultRows<{ ID: string; DriverClass: string | null }>(unitTypeResult, 'price unit types');\n const driverClassByUnitType = new Map<string, string>(\n unitTypes.filter(u => u.DriverClass).map(u => [NormalizeUUID(u.ID), u.DriverClass!])\n );\n const rows = this.resultRows<{\n ModelID: string | null;\n VendorID: string | null;\n InputPricePerUnit: number | null;\n OutputPricePerUnit: number | null;\n CacheReadPricePerUnit: number | null;\n CacheWritePricePerUnit: number | null;\n UnitTypeID: string | null;\n }>(rateResult, 'model cost rates');\n\n for (const row of rows) {\n const unitTypeId = row.UnitTypeID !== null && row.UnitTypeID !== undefined ? row.UnitTypeID : '';\n const driverClass = driverClassByUnitType.get(NormalizeUUID(unitTypeId));\n const divisor = driverClass ? TOKEN_PRICE_UNIT_TYPE_DIVISORS[driverClass] : undefined;\n if (divisor === undefined) {\n continue;\n }\n const inputP = typeof row.InputPricePerUnit === 'number' ? row.InputPricePerUnit : 0;\n const readP = typeof row.CacheReadPricePerUnit === 'number' ? row.CacheReadPricePerUnit : inputP;\n const writeP = typeof row.CacheWritePricePerUnit === 'number' ? row.CacheWritePricePerUnit : inputP;\n const inputRate = inputP / divisor;\n const cacheReadRate = readP / divisor;\n const cacheWriteRate = writeP / divisor;\n const modelId = row.ModelID !== null && row.ModelID !== undefined ? row.ModelID : '';\n const vendorId = row.VendorID !== null && row.VendorID !== undefined ? row.VendorID : '';\n const key = `${NormalizeUUID(modelId)}|${NormalizeUUID(vendorId)}`;\n cacheRates.set(key, { InputRate: inputRate, CacheReadRate: cacheReadRate, CacheWriteRate: cacheWriteRate });\n }\n return cacheRates;\n }\n}\n"]}
1
+ {"version":3,"file":"ai-instrumentation.service.js","sourceRoot":"","sources":["../../../src/AI/services/ai-instrumentation.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject, from, combineLatest, of } from 'rxjs';\nimport { switchMap, shareReplay, tap, map, catchError } from 'rxjs/operators';\nimport { RunView, RunQuery, IMetadataProvider, IRunQueryProvider, RunViewResult } from '@memberjunction/core';\nimport { NormalizeUUID } from '@memberjunction/global';\nimport { TOKEN_PRICE_UNIT_TYPE_DIVISORS } from '@memberjunction/ai-engine-base';\nimport { CacheRate } from './cache-metrics';\nimport { AIUsageCoverage, AIUsageHourlyRow, AIUsageDailyRow, AIUsageByModelRow, AIAgentRunSubtreeCost } from './ai-usage-analytics.types';\nimport {\n DashboardKPIs,\n TrendData,\n LiveExecution,\n LiveExecutionStatus,\n CostInputRow,\n ComputeTotalCost,\n ComputeKPIs,\n ComputeTrends,\n ComputeLiveExecutions,\n ComputeCostByModel,\n ComputePerformanceMatrix,\n ComputeTokenEfficiency,\n CountActiveExecutions,\n ResolveCostCurrency\n} from './ai-usage-analytics.compute';\n\nexport {\n DashboardKPIs,\n TrendData,\n LiveExecution,\n LiveExecutionStatus,\n AIUsageCoverage,\n AIUsageHourlyRow,\n AIUsageDailyRow,\n AIUsageByModelRow,\n AIAgentRunSubtreeCost,\n CostInputRow,\n ComputeTotalCost,\n CacheRate\n};\n\n/**\n * True when a metadata provider can also run saved queries. At runtime MJ's providers (ProviderBase\n * subclasses) implement both interfaces, but IMetadataProvider does not extend IRunQueryProvider, so\n * this is checked rather than asserted — a provider that cannot run queries fails loudly here\n * instead of at the first RunQuery call.\n */\nfunction IsRunQueryProvider(provider: IMetadataProvider): provider is IMetadataProvider & IRunQueryProvider {\n return 'RunQuery' in provider && typeof provider.RunQuery === 'function'\n && 'RunQueries' in provider && typeof provider.RunQueries === 'function';\n}\n\n/** How deep an execution drill-down follows child runs, and how many it will load in total. */\nconst EXECUTION_DETAIL_MAX_DEPTH = 4;\nconst EXECUTION_DETAIL_MAX_NODES = 200;\n\n/**\n * Lightweight record types for live run monitoring and execution drill-down.\n * We use ResultType: 'simple' with explicit Fields and MaxRows bounds\n * to avoid unbounded reads and large payload transfers.\n */\nexport interface PromptRunRecord {\n ID: string;\n RunAt: string;\n CompletedAt: string | null;\n Success: boolean;\n Cost: number | null;\n TokensUsed: number | null;\n TokensPrompt: number | null;\n TokensCompletion: number | null;\n TokensCacheRead: number | null;\n TokensCacheWrite: number | null;\n ExecutionTimeMS: number | null;\n ModelID: string | null;\n Model: string | null;\n AgentID: string | null;\n Agent: string | null;\n Prompt: string | null;\n ErrorMessage: string | null;\n}\n\nexport interface AgentRunRecord {\n ID: string;\n StartedAt: string;\n CompletedAt: string | null;\n Status: string;\n Success: boolean;\n TotalCost: number | null;\n TotalTokensUsed: number | null;\n AgentID: string | null;\n Agent: string | null;\n ErrorMessage: string | null;\n}\n\n/** Fields to request for prompt runs — only what is needed for drilldown and live monitoring */\nexport const PROMPT_RUN_FIELDS = [\n 'ID', 'RunAt', 'CompletedAt', 'Success', 'Cost', 'TokensUsed',\n 'TokensPrompt', 'TokensCompletion', 'TokensCacheRead', 'TokensCacheWrite', 'ExecutionTimeMS',\n 'ModelID', 'Model', 'AgentID', 'Agent', 'Prompt', 'ErrorMessage'\n];\n\n/** Fields to request for agent runs — only what is needed for drilldown and live monitoring */\nexport const AGENT_RUN_FIELDS = [\n 'ID', 'StartedAt', 'CompletedAt', 'Status', 'Success',\n 'TotalCost', 'TotalTokensUsed', 'AgentID', 'Agent', 'ErrorMessage'\n];\n\nexport interface ExecutionDetails {\n id: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n type: 'prompt' | 'agent'; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n name: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n status: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n startTime: Date; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n endTime?: Date; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n cost: number | null; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n tokens: number; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n success: boolean; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n errorMessage?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n parentId?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n children: ExecutionDetails[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n model?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n vendor?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n}\n\nexport interface ChartData {\n executionTrends: TrendData[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n costByModel: { model: string; cost: number | null; tokens: number }[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n performanceMatrix: { agent: string; model: string; avgTime: number; successRate: number; FailedRuns: number }[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n tokenEfficiency: { inputTokens: number; outputTokens: number; cost: number | null; model: string }[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n}\n\n/** Internal shape for the single data load that all derived streams share */\ninterface DashboardRawData {\n hourlyRows: AIUsageHourlyRow[];\n livePromptRuns: PromptRunRecord[];\n liveAgentRuns: AgentRunRecord[];\n modelNames: Map<string, string>;\n agentNames: Map<string, string>;\n start: Date;\n end: Date;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AIInstrumentationService {\n private _provider: IMetadataProvider | null = null;\n\n /** Set the metadata provider this service should use. Components should call this after injection. */\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n if (this._provider) {\n return this._provider;\n }\n throw new Error('AIInstrumentationService: MetadataProvider must be set before use');\n }\n\n public get ProviderToUse(): IMetadataProvider {\n return this.Provider;\n }\n\n public get RunQueryToUse(): IRunQueryProvider {\n const provider = this.ProviderToUse;\n if (IsRunQueryProvider(provider)) {\n return provider;\n }\n throw new Error('AIInstrumentationService: the configured MetadataProvider cannot run queries');\n }\n\n private readonly _dateRange$ = new BehaviorSubject<{ start: Date; end: Date }>({\n start: new Date(Date.now() - 24 * 60 * 60 * 1000), // Last 24 hours\n end: new Date()\n });\n\n private readonly _refreshTrigger$ = new BehaviorSubject<number>(0);\n private readonly _isLoading$ = new BehaviorSubject<boolean>(false);\n\n // Expose loading state as observable\n readonly IsLoading$ = this._isLoading$.asObservable();\n\n /** @deprecated Use {@link IsLoading$}. */\n get isLoading$() {\n return this.IsLoading$;\n }\n\n constructor() {}\n\n /**\n * Single data load: fetches aggregated hourly facts via RunQuery and\n * live runs via bounded RunViews once per refresh or date-range change.\n *\n * A failed load is contained INSIDE the switchMap. Left to reach shareReplay, one rejected load\n * (a transient network blip, a RunQuery 500) terminates the shared subject for the life of this\n * root-provided service: every derived stream replays the error, Refresh() and SetDateRange()\n * push into a combineLatest nobody is subscribed to any more, and IsLoading$ sticks at true.\n */\n private readonly rawData$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(\n tap(() => this._isLoading$.next(true)),\n switchMap(([, range]) => from(this.loadAllData()).pipe(\n catchError((error: unknown) => {\n console.error('AI analytics: dashboard data failed to load; showing an empty period until the next refresh.', error);\n return of(this.emptyRawData(range.start, range.end));\n })\n )),\n tap(() => this._isLoading$.next(false)),\n shareReplay(1)\n );\n\n // Derived streams — pure in-memory transforms via ai-usage-analytics.compute.ts\n readonly Kpis$ = this.rawData$.pipe(\n map(data => {\n const activeExecutions = CountActiveExecutions(data.livePromptRuns, data.liveAgentRuns);\n return ComputeKPIs(data.hourlyRows, activeExecutions, data.modelNames, data.agentNames);\n }),\n shareReplay(1)\n );\n\n /** @deprecated Use {@link Kpis$}. */\n get kpis$() {\n return this.Kpis$;\n }\n\n readonly Trends$ = this.rawData$.pipe(\n map(data => ComputeTrends(data.hourlyRows, data.start, data.end, ResolveCostCurrency(data.hourlyRows).Currency)),\n shareReplay(1)\n );\n\n /** @deprecated Use {@link Trends$}. */\n get trends$() {\n return this.Trends$;\n }\n\n readonly LiveExecutions$ = this.rawData$.pipe(\n map(data => ComputeLiveExecutions(data.livePromptRuns, data.liveAgentRuns)),\n shareReplay(1)\n );\n\n /** @deprecated Use {@link LiveExecutions$}. */\n get liveExecutions$() {\n return this.LiveExecutions$;\n }\n\n readonly ChartData$ = combineLatest([this.rawData$, this.Trends$]).pipe(\n map(([data, executionTrends]) => {\n // One currency for every cost on the page — the same one the KPIs report in.\n const currency = ResolveCostCurrency(data.hourlyRows).Currency;\n return {\n executionTrends,\n costByModel: ComputeCostByModel(data.hourlyRows, data.modelNames, currency),\n performanceMatrix: ComputePerformanceMatrix(data.hourlyRows, data.modelNames, data.agentNames),\n tokenEfficiency: ComputeTokenEfficiency(data.hourlyRows, data.modelNames, currency)\n };\n }),\n shareReplay(1)\n );\n\n /** @deprecated Use {@link ChartData$}. */\n get chartData$() {\n return this.ChartData$;\n }\n\n SetDateRange(start: Date, end: Date): void {\n this._dateRange$.next({ start, end });\n }\n\n /** @deprecated Use {@link SetDateRange}. */\n setDateRange(start: Date, end: Date): void {\n return this.SetDateRange(start, end);\n }\n\n Refresh(): void {\n this._refreshTrigger$.next(this._refreshTrigger$.value + 1);\n }\n\n /** @deprecated Use {@link Refresh}. */\n refresh(): void {\n return this.Refresh();\n }\n\n /**\n * Single batch query that loads all data needed by every dashboard widget.\n * AIUsageHourly runs through RunQuery.\n * Live runs and dimension names are loaded with explicit MaxRows bounds.\n */\n private async loadAllData(): Promise<DashboardRawData> {\n const { start, end } = this._dateRange$.value;\n const now = new Date();\n const recentTime = new Date(now.getTime() - 5 * 60 * 1000);\n\n const rq = new RunQuery(this.RunQueryToUse);\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n const [queryResult, rvResults] = await Promise.all([\n rq.RunQuery({\n QueryName: 'AIUsageHourly',\n CategoryPath: '/MJ/AI/',\n Parameters: {\n start: start.toISOString(),\n end: end.toISOString()\n }\n }),\n rv.RunViews<PromptRunRecord | AgentRunRecord | { ID: string; Name: string }>([\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `RunAt >= '${recentTime.toISOString()}'`,\n OrderBy: 'RunAt DESC',\n Fields: PROMPT_RUN_FIELDS,\n ResultType: 'simple',\n MaxRows: 50\n },\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `StartedAt >= '${recentTime.toISOString()}'`,\n OrderBy: 'StartedAt DESC',\n Fields: AGENT_RUN_FIELDS,\n ResultType: 'simple',\n MaxRows: 50\n },\n {\n EntityName: 'MJ: AI Models',\n Fields: ['ID', 'Name'],\n ResultType: 'simple',\n MaxRows: 500\n },\n {\n EntityName: 'MJ: AI Agents',\n Fields: ['ID', 'Name'],\n ResultType: 'simple',\n MaxRows: 500\n }\n ])\n ]);\n\n if (!queryResult.Success) {\n // A failed aggregate read is not an empty period. Say so rather than let every KPI read zero.\n console.error(`AI analytics: AIUsageHourly failed to load; usage figures will be empty. ${queryResult.ErrorMessage}`);\n }\n const hourlyRows = (queryResult.Success && Array.isArray(queryResult.Results) ? queryResult.Results : []) as AIUsageHourlyRow[];\n\n const livePromptRuns = this.resultRows<PromptRunRecord>(rvResults[0], 'live prompt runs');\n const liveAgentRuns = this.resultRows<AgentRunRecord>(rvResults[1], 'live agent runs');\n\n const modelNames = new Map<string, string>();\n for (const m of this.resultRows<{ ID: string; Name: string }>(rvResults[2], 'model names')) {\n if (m && m.ID && m.Name) {\n modelNames.set(m.ID, m.Name);\n }\n }\n\n const agentNames = new Map<string, string>();\n for (const a of this.resultRows<{ ID: string; Name: string }>(rvResults[3], 'agent names')) {\n if (a && a.ID && a.Name) {\n agentNames.set(a.ID, a.Name);\n }\n }\n\n return {\n hourlyRows,\n livePromptRuns,\n liveAgentRuns,\n modelNames,\n agentNames,\n start,\n end\n };\n }\n\n /** The payload a failed load degrades to: an empty period over the requested range. */\n private emptyRawData(start: Date, end: Date): DashboardRawData {\n return {\n hourlyRows: [],\n livePromptRuns: [],\n liveAgentRuns: [],\n modelNames: new Map<string, string>(),\n agentNames: new Map<string, string>(),\n start,\n end\n };\n }\n\n /**\n * The rows of a RunView result, logging when the view FAILED. A failed view and an empty one both\n * yield no rows, but only the empty one means \"nothing there\" — without the log, a failure reads\n * as a confident zero on whatever figure the rows feed.\n */\n private resultRows<T>(result: RunViewResult<unknown> | undefined, what: string): T[] {\n if (!result) {\n console.error(`AI analytics: no result returned for ${what}`);\n return [];\n }\n if (!result.Success) {\n console.error(`AI analytics: ${what} failed to load. ${result.ErrorMessage}`);\n return [];\n }\n return (Array.isArray(result.Results) ? result.Results : []) as T[];\n }\n\n // ─── Execution Details (on-demand, not part of initial load) ──────\n\n async GetExecutionDetails(executionId: string, type: 'prompt' | 'agent'): Promise<ExecutionDetails | null> {\n try {\n const budget = { visited: new Set<string>(), remaining: EXECUTION_DETAIL_MAX_NODES };\n if (type === 'prompt') {\n return await this.getPromptExecutionDetails(executionId, 0, budget);\n } else {\n return await this.getAgentExecutionDetails(executionId, 0, budget);\n }\n } catch (error) {\n console.error('Error loading execution details:', error);\n return null;\n }\n }\n\n /** @deprecated Use {@link GetExecutionDetails}. */\n async getExecutionDetails(executionId: string, type: 'prompt' | 'agent'): Promise<ExecutionDetails | null> {\n return this.GetExecutionDetails(executionId, type);\n }\n\n /**\n * Claims a node for the drill-down: false when it was already visited (a ParentID cycle) or the\n * total node budget is spent. Bounded because each node costs a RunViews round trip and children\n * fan out — an uncapped 3-level tree of 20 children each is thousands of requests from one click.\n */\n private claimDetailNode(id: string, budget: { visited: Set<string>; remaining: number }): boolean {\n const key = NormalizeUUID(id);\n if (budget.visited.has(key) || budget.remaining <= 0) {\n return false;\n }\n budget.visited.add(key);\n budget.remaining--;\n return true;\n }\n\n private async getPromptExecutionDetails(\n promptRunId: string,\n depth: number,\n budget: { visited: Set<string>; remaining: number }\n ): Promise<ExecutionDetails> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const loadChildren = depth < EXECUTION_DETAIL_MAX_DEPTH;\n const [result, childrenResult] = await rv.RunViews<PromptRunRecord>([\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `ID = '${promptRunId}'`,\n Fields: PROMPT_RUN_FIELDS,\n ResultType: 'simple',\n MaxRows: 1,\n SkipTotalRowCount: true\n },\n ...(loadChildren ? [{\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `ParentID = '${promptRunId}'`,\n Fields: PROMPT_RUN_FIELDS,\n ResultType: 'simple' as const,\n MaxRows: 100\n }] : [])\n ]);\n\n const run = this.resultRows<PromptRunRecord>(result, 'prompt run detail')[0];\n if (!run) throw new Error('Prompt run not found');\n\n const childrenList = loadChildren ? this.resultRows<PromptRunRecord>(childrenResult, 'prompt run children') : [];\n const children = await Promise.all(\n childrenList\n .filter(child => this.claimDetailNode(child.ID, budget))\n .map(child => this.getPromptExecutionDetails(child.ID, depth + 1, budget))\n );\n\n const costVal = run.Cost !== null && run.Cost !== undefined ? run.Cost : null;\n const tokensVal = typeof run.TokensUsed === 'number' ? run.TokensUsed : 0;\n const promptName = run.Prompt ? run.Prompt : 'Unnamed Prompt';\n const statusStr = run.Success ? 'completed' : 'failed';\n const errMsg = run.ErrorMessage ? run.ErrorMessage : undefined;\n const modelStr = run.Model ? run.Model : undefined;\n\n return {\n id: run.ID,\n type: 'prompt',\n name: promptName,\n status: statusStr,\n startTime: new Date(run.RunAt),\n endTime: run.CompletedAt ? new Date(run.CompletedAt) : undefined,\n cost: costVal,\n tokens: tokensVal,\n success: run.Success ? true : false,\n errorMessage: errMsg,\n children,\n model: modelStr\n };\n }\n\n private async getAgentExecutionDetails(\n agentRunId: string,\n depth: number,\n budget: { visited: Set<string>; remaining: number }\n ): Promise<ExecutionDetails> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const loadChildren = depth < EXECUTION_DETAIL_MAX_DEPTH;\n const [result, childrenResult] = await rv.RunViews<AgentRunRecord>([\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ID = '${agentRunId}'`,\n Fields: AGENT_RUN_FIELDS,\n ResultType: 'simple',\n MaxRows: 1,\n SkipTotalRowCount: true\n },\n ...(loadChildren ? [{\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ParentRunID = '${agentRunId}'`,\n Fields: AGENT_RUN_FIELDS,\n ResultType: 'simple' as const,\n MaxRows: 100\n }] : [])\n ]);\n\n const run = this.resultRows<AgentRunRecord>(result, 'agent run detail')[0];\n if (!run) throw new Error('Agent run not found');\n\n const childrenList = loadChildren ? this.resultRows<AgentRunRecord>(childrenResult, 'agent run children') : [];\n const children = await Promise.all(\n childrenList\n .filter(child => this.claimDetailNode(child.ID, budget))\n .map(child => this.getAgentExecutionDetails(child.ID, depth + 1, budget))\n );\n\n const costVal = run.TotalCost !== null && run.TotalCost !== undefined ? run.TotalCost : null;\n const tokensVal = typeof run.TotalTokensUsed === 'number' ? run.TotalTokensUsed : 0;\n const agentName = run.Agent ? run.Agent : 'Unnamed Agent';\n const statusStr = run.Status ? run.Status.toLowerCase() : 'unknown';\n const errMsg = run.ErrorMessage ? run.ErrorMessage : undefined;\n\n return {\n id: run.ID,\n type: 'agent',\n name: agentName,\n status: statusStr,\n startTime: new Date(run.StartedAt),\n endTime: run.CompletedAt ? new Date(run.CompletedAt) : undefined,\n cost: costVal,\n tokens: tokensVal,\n success: run.Success ? true : false,\n errorMessage: errMsg,\n parentId: undefined,\n children\n };\n }\n\n /**\n * Runs one of the AI usage aggregate queries, logging a failure rather than letting it read as an\n * empty (zero-usage) period.\n */\n private async runUsageQuery<T>(queryName: string, start: Date, end: Date): Promise<T[]> {\n const rq = new RunQuery(this.RunQueryToUse);\n const res = await rq.RunQuery({\n QueryName: queryName,\n CategoryPath: '/MJ/AI/',\n Parameters: {\n start: start.toISOString(),\n end: end.toISOString()\n }\n });\n if (!res.Success) {\n console.error(`AI analytics: ${queryName} failed to load. ${res.ErrorMessage}`);\n return [];\n }\n return (Array.isArray(res.Results) ? res.Results : []) as T[];\n }\n\n /**\n * Fetch hourly aggregate usage for a date range via stored query AIUsageHourly.\n */\n async GetUsageHourly(start: Date, end: Date): Promise<AIUsageHourlyRow[]> {\n return this.runUsageQuery<AIUsageHourlyRow>('AIUsageHourly', start, end);\n }\n\n /**\n * Fetch daily aggregate usage for a date range via stored query AIUsageDaily.\n */\n async GetUsageDaily(start: Date, end: Date): Promise<AIUsageDailyRow[]> {\n return this.runUsageQuery<AIUsageDailyRow>('AIUsageDaily', start, end);\n }\n\n /**\n * Fetch model-level aggregate usage for a date range via stored query AIUsageByModel.\n */\n async GetUsageByModel(start: Date, end: Date): Promise<AIUsageByModelRow[]> {\n return this.runUsageQuery<AIUsageByModelRow>('AIUsageByModel', start, end);\n }\n\n /**\n * Calculate recursive subtree cost and token metrics for an agent run via CalculateRunCost.\n */\n async CalculateAgentRunCost(agentRunId: string): Promise<AIAgentRunSubtreeCost | null> {\n const rq = new RunQuery(this.RunQueryToUse);\n const res = await rq.RunQuery({\n QueryName: 'CalculateRunCost',\n CategoryPath: '/MJ/AI/Agents/',\n Parameters: {\n AIAgentRunID: agentRunId,\n AgentRunID: agentRunId\n }\n });\n if (!res.Success) {\n console.error(`AI analytics: CalculateRunCost failed for agent run ${agentRunId}. ${res.ErrorMessage}`);\n return null;\n }\n if (Array.isArray(res.Results) && res.Results.length > 0) {\n const raw = res.Results[0] as AIAgentRunSubtreeCost;\n const cost = raw.TotalCost !== null && raw.TotalCost !== undefined ? Number(raw.TotalCost) : null;\n const toFiniteNum = (v: unknown): number => {\n const n = Number(v);\n return Number.isFinite(n) ? n : 0;\n };\n return {\n AgentRunID: raw.AgentRunID,\n TotalCost: cost,\n TotalPrompts: toFiniteNum(raw.TotalPrompts),\n TotalTokensInput: toFiniteNum(raw.TotalTokensInput),\n TotalTokensOutput: toFiniteNum(raw.TotalTokensOutput),\n TotalTokens: toFiniteNum(raw.TotalTokens)\n };\n }\n return null;\n }\n\n /**\n * Fetch model and vendor lookups for mapping IDs to display names.\n */\n async GetModelAndVendorLookups(): Promise<{\n models: Map<string, string>;\n modelVendors: Map<string, string>;\n vendors: Map<string, string>;\n agents: Map<string, string>;\n }> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [modelsRes, vendorsRes, agentsRes] = await rv.RunViews([\n {\n EntityName: 'MJ: AI Models',\n Fields: ['ID', 'Name', 'VendorID'],\n MaxRows: 500,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Vendors',\n Fields: ['ID', 'Name'],\n MaxRows: 500,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Agents',\n Fields: ['ID', 'Name'],\n MaxRows: 500,\n ResultType: 'simple'\n }\n ]);\n const models = new Map<string, string>();\n const modelVendors = new Map<string, string>();\n const vendors = new Map<string, string>();\n const agents = new Map<string, string>();\n\n for (const m of this.resultRows<{ ID: string; Name: string; VendorID?: string | null }>(modelsRes, 'model names')) {\n if (m.ID) {\n models.set(m.ID.toLowerCase(), m.Name);\n if (m.VendorID) {\n modelVendors.set(m.ID.toLowerCase(), m.VendorID);\n }\n }\n }\n for (const v of this.resultRows<{ ID: string; Name: string }>(vendorsRes, 'vendor names')) {\n if (v.ID) {\n vendors.set(v.ID.toLowerCase(), v.Name);\n }\n }\n for (const a of this.resultRows<{ ID: string; Name: string }>(agentsRes, 'agent names')) {\n if (a.ID) {\n agents.set(a.ID.toLowerCase(), a.Name);\n }\n }\n return { models, modelVendors, vendors, agents };\n }\n\n /**\n * Fetch active realtime model pricing rates and compute currency-per-token divisors.\n */\n async GetCacheRates(): Promise<Map<string, CacheRate>> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [rateResult, unitTypeResult] = await rv.RunViews([\n {\n EntityName: 'MJ: AI Model Costs',\n ExtraFilter: `Status='Active' AND ProcessingType='Realtime'`,\n Fields: ['ModelID', 'VendorID', 'InputPricePerUnit', 'OutputPricePerUnit', 'CacheReadPricePerUnit', 'CacheWritePricePerUnit', 'UnitTypeID'],\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Model Price Unit Types',\n Fields: ['ID', 'DriverClass'],\n ResultType: 'simple'\n }\n ]);\n\n // A failed unit-type view is NOT the same as \"these rows are unpriceable\". Without the driver\n // classes every rate row falls into the `continue` below, and cache savings render as a\n // confident 0 instead of an error — the figure most likely to be believed. Say so rather than\n // let the empty map speak for it.\n if (unitTypeResult && !unitTypeResult.Success) {\n console.error('AI analytics: price unit types failed to load; cache-savings figures will read 0. ' +\n unitTypeResult.ErrorMessage);\n }\n\n const cacheRates = new Map<string, CacheRate>();\n const unitTypes = this.resultRows<{ ID: string; DriverClass: string | null }>(unitTypeResult, 'price unit types');\n const driverClassByUnitType = new Map<string, string>(\n unitTypes.filter(u => u.DriverClass).map(u => [NormalizeUUID(u.ID), u.DriverClass!])\n );\n const rows = this.resultRows<{\n ModelID: string | null;\n VendorID: string | null;\n InputPricePerUnit: number | null;\n OutputPricePerUnit: number | null;\n CacheReadPricePerUnit: number | null;\n CacheWritePricePerUnit: number | null;\n UnitTypeID: string | null;\n }>(rateResult, 'model cost rates');\n\n for (const row of rows) {\n const unitTypeId = row.UnitTypeID !== null && row.UnitTypeID !== undefined ? row.UnitTypeID : '';\n const driverClass = driverClassByUnitType.get(NormalizeUUID(unitTypeId));\n const divisor = driverClass ? TOKEN_PRICE_UNIT_TYPE_DIVISORS[driverClass] : undefined;\n if (divisor === undefined) {\n continue;\n }\n const inputP = typeof row.InputPricePerUnit === 'number' ? row.InputPricePerUnit : 0;\n const readP = typeof row.CacheReadPricePerUnit === 'number' ? row.CacheReadPricePerUnit : inputP;\n const writeP = typeof row.CacheWritePricePerUnit === 'number' ? row.CacheWritePricePerUnit : inputP;\n const inputRate = inputP / divisor;\n const cacheReadRate = readP / divisor;\n const cacheWriteRate = writeP / divisor;\n const modelId = row.ModelID !== null && row.ModelID !== undefined ? row.ModelID : '';\n const vendorId = row.VendorID !== null && row.VendorID !== undefined ? row.VendorID : '';\n const key = `${NormalizeUUID(modelId)}|${NormalizeUUID(vendorId)}`;\n cacheRates.set(key, { InputRate: inputRate, CacheReadRate: cacheReadRate, CacheWriteRate: cacheWriteRate });\n }\n return cacheRates;\n }\n}\n"]}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * @fileoverview One place that decides what an `ActionExecutionLog.ResultCode` MEANS.
3
+ *
4
+ * ## Why this exists
5
+ *
6
+ * `ResultCode` is free text: the column has no CHECK constraint, and the value is whatever
7
+ * the executing runtime wrote. The Runtime action executor emits UPPER_SNAKE codes
8
+ * (`SUCCESS`, `RUNTIME_ERROR`, `TIMEOUT`, `NOT_APPROVED`, … — see
9
+ * `packages/Actions/Runtime/src/types.ts`, passed through verbatim by `ActionEngine`), while
10
+ * older/custom actions wrote Title Case (`Success`, `Failed`, `Error`).
11
+ *
12
+ * Every dashboard then invented its own comparison:
13
+ *
14
+ * - the Execution Monitor compared `=== 'Success'` and `['Failed','Error']` — so on a
15
+ * database of `SUCCESS` rows it reported **0 % (0/181)**…
16
+ * - …while its own `getResultColor` / `getResultIcon` lowercased first, which is why 181
17
+ * green rows rendered directly beneath that 0 % tile;
18
+ * - the Actions Overview lowercased and accepted `success|ok|completed|200`, which is why
19
+ * *its* success rate was the believable one;
20
+ * - the Action Card looked codes up in `MJ: Action Result Codes.IsSuccess` and fell back to
21
+ * a third, narrower heuristic.
22
+ *
23
+ * Four vocabularies, one column. This module is the single one.
24
+ *
25
+ * ## How classification works
26
+ *
27
+ * The code is normalised (trimmed, upper-cased, separators folded to `_`) and then matched
28
+ * by SHAPE rather than against a copied list of the runtime's constants. That is deliberate:
29
+ * this package does not depend on `@memberjunction/action-runtime`, so a copied list would
30
+ * silently drift the first time a new failure code is added upstream. Every failure code the
31
+ * runtime can emit contains one of the failure markers below, and the test file pins that
32
+ * claim against the actual constant list.
33
+ *
34
+ * `'unknown'` is a real answer, not a bucket for laziness: a code this module does not
35
+ * recognise must not be counted as a success (inflating the rate) or as a failure (inventing
36
+ * an incident). It is excluded from both numerator and denominator of the success rate.
37
+ */
38
+ /** What a result code says about the run that produced it. */
39
+ export type ActionResultClass =
40
+ /** The action completed and reported success. */
41
+ 'success'
42
+ /** The action ended without succeeding — failed, errored, refused, timed out. */
43
+ | 'failure'
44
+ /** The action had not finished when the row was written. */
45
+ | 'running'
46
+ /** Recognised as nothing: a custom code, or a code from a newer writer. */
47
+ | 'unknown';
48
+ /**
49
+ * Classify a raw `ResultCode`.
50
+ *
51
+ * Order matters: the success and running lists are exact matches checked FIRST, so a
52
+ * hypothetical `SUCCESS_NO_FAILURES` cannot be dragged into `'failure'` by a marker, and a
53
+ * genuine `NOT_SUCCESSFUL` is not dragged into `'success'` by a substring. Null, undefined
54
+ * and blank all classify as `'unknown'` — a row with no code recorded says nothing.
55
+ */
56
+ export declare function ClassifyActionResultCode(code: string | null | undefined): ActionResultClass;
57
+ /** Convenience predicate — `ClassifyActionResultCode(code) === 'success'`. */
58
+ export declare function IsActionResultSuccess(code: string | null | undefined): boolean;
59
+ /** Convenience predicate — `ClassifyActionResultCode(code) === 'failure'`. */
60
+ export declare function IsActionResultFailure(code: string | null | undefined): boolean;
61
+ /**
62
+ * Success rate over a set of coded runs, as a whole percentage.
63
+ *
64
+ * Runs whose code classifies as `'unknown'` or `'running'` are excluded from BOTH halves of
65
+ * the fraction: a run still in flight has not succeeded or failed yet, and a code we cannot
66
+ * read is not evidence either way. Counting them in the denominator is what makes a healthy
67
+ * system look broken; counting them as successes is what hides a broken one.
68
+ *
69
+ * Returns 0 when nothing in the set has settled — there is no rate to report, and 0 with an
70
+ * accompanying `0/0` detail is the honest rendering of that.
71
+ */
72
+ export declare function ActionSuccessRate(codes: readonly (string | null | undefined)[]): number;
73
+ /**
74
+ * The colour token a code should render with. Shared by the status chips and the row icons so
75
+ * a chip can never disagree with the tile that counted it.
76
+ */
77
+ export declare function ActionResultColor(code: string | null | undefined): 'success' | 'warning' | 'error' | 'info';
78
+ /** The Font Awesome class a code should render with. Paired with {@link ActionResultColor}. */
79
+ export declare function ActionResultIcon(code: string | null | undefined): string;
80
+ //# sourceMappingURL=action-result-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-result-code.d.ts","sourceRoot":"","sources":["../../src/Actions/action-result-code.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,8DAA8D;AAC9D,MAAM,MAAM,iBAAiB;AACzB,iDAAiD;AAC/C,SAAS;AACX,iFAAiF;GAC/E,SAAS;AACX,4DAA4D;GAC1D,SAAS;AACX,2EAA2E;GACzE,SAAS,CAAC;AAyChB;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,iBAAiB,CA2B3F;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE9E;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE9E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,GAAG,MAAM,CAgBvF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAO3G;AAED,+FAA+F;AAC/F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAOxE"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * @fileoverview One place that decides what an `ActionExecutionLog.ResultCode` MEANS.
3
+ *
4
+ * ## Why this exists
5
+ *
6
+ * `ResultCode` is free text: the column has no CHECK constraint, and the value is whatever
7
+ * the executing runtime wrote. The Runtime action executor emits UPPER_SNAKE codes
8
+ * (`SUCCESS`, `RUNTIME_ERROR`, `TIMEOUT`, `NOT_APPROVED`, … — see
9
+ * `packages/Actions/Runtime/src/types.ts`, passed through verbatim by `ActionEngine`), while
10
+ * older/custom actions wrote Title Case (`Success`, `Failed`, `Error`).
11
+ *
12
+ * Every dashboard then invented its own comparison:
13
+ *
14
+ * - the Execution Monitor compared `=== 'Success'` and `['Failed','Error']` — so on a
15
+ * database of `SUCCESS` rows it reported **0 % (0/181)**…
16
+ * - …while its own `getResultColor` / `getResultIcon` lowercased first, which is why 181
17
+ * green rows rendered directly beneath that 0 % tile;
18
+ * - the Actions Overview lowercased and accepted `success|ok|completed|200`, which is why
19
+ * *its* success rate was the believable one;
20
+ * - the Action Card looked codes up in `MJ: Action Result Codes.IsSuccess` and fell back to
21
+ * a third, narrower heuristic.
22
+ *
23
+ * Four vocabularies, one column. This module is the single one.
24
+ *
25
+ * ## How classification works
26
+ *
27
+ * The code is normalised (trimmed, upper-cased, separators folded to `_`) and then matched
28
+ * by SHAPE rather than against a copied list of the runtime's constants. That is deliberate:
29
+ * this package does not depend on `@memberjunction/action-runtime`, so a copied list would
30
+ * silently drift the first time a new failure code is added upstream. Every failure code the
31
+ * runtime can emit contains one of the failure markers below, and the test file pins that
32
+ * claim against the actual constant list.
33
+ *
34
+ * `'unknown'` is a real answer, not a bucket for laziness: a code this module does not
35
+ * recognise must not be counted as a success (inflating the rate) or as a failure (inventing
36
+ * an incident). It is excluded from both numerator and denominator of the success rate.
37
+ */
38
+ /** Normalise a raw code for matching: trim, upper-case, fold `-`/space/`.`/`/` to `_`. */
39
+ function normalize(code) {
40
+ return code.trim().toUpperCase().replace(/[\s\-./]+/g, '_');
41
+ }
42
+ /** Codes that mean the action succeeded. */
43
+ const SUCCESS_CODES = ['SUCCESS', 'SUCCEEDED', 'OK', 'COMPLETE', 'COMPLETED'];
44
+ /** Codes that mean the action had not finished. */
45
+ const RUNNING_CODES = ['RUNNING', 'IN_PROGRESS', 'STARTED'];
46
+ /**
47
+ * Substrings that mark a code as a failure.
48
+ *
49
+ * Covers every failure constant the Runtime executor can write without naming them:
50
+ * `INVALID_TYPE`→INVALID, `MISSING_CODE`→MISSING, `NOT_APPROVED`→NOT_APPROVED,
51
+ * `INACTIVE`→INACTIVE, `RUNTIME_ERROR`/`SYNTAX_ERROR`/`SECURITY_ERROR`/`UNEXPECTED_ERROR`→ERROR,
52
+ * `TIMEOUT`→TIMEOUT, `MEMORY_LIMIT`→LIMIT — plus the legacy `Failed` / `Error` pair.
53
+ */
54
+ const FAILURE_MARKERS = [
55
+ 'ERROR',
56
+ 'FAIL',
57
+ 'TIMEOUT',
58
+ 'TIMED_OUT',
59
+ 'LIMIT',
60
+ 'NOT_APPROVED',
61
+ 'UNAPPROVED',
62
+ 'INACTIVE',
63
+ 'INVALID',
64
+ 'MISSING',
65
+ 'REJECTED',
66
+ 'REFUSED',
67
+ 'DENIED',
68
+ 'CANCELLED',
69
+ 'CANCELED',
70
+ 'ABORTED',
71
+ 'EXCEPTION',
72
+ ];
73
+ /**
74
+ * Classify a raw `ResultCode`.
75
+ *
76
+ * Order matters: the success and running lists are exact matches checked FIRST, so a
77
+ * hypothetical `SUCCESS_NO_FAILURES` cannot be dragged into `'failure'` by a marker, and a
78
+ * genuine `NOT_SUCCESSFUL` is not dragged into `'success'` by a substring. Null, undefined
79
+ * and blank all classify as `'unknown'` — a row with no code recorded says nothing.
80
+ */
81
+ export function ClassifyActionResultCode(code) {
82
+ if (code == null) {
83
+ return 'unknown';
84
+ }
85
+ const normalized = normalize(code);
86
+ if (normalized.length === 0) {
87
+ return 'unknown';
88
+ }
89
+ if (SUCCESS_CODES.includes(normalized)) {
90
+ return 'success';
91
+ }
92
+ if (RUNNING_CODES.includes(normalized)) {
93
+ return 'running';
94
+ }
95
+ // Bare HTTP-style numerics: some integrations write the status they got back.
96
+ if (/^\d{3}$/.test(normalized)) {
97
+ const status = Number(normalized);
98
+ return status >= 200 && status < 300 ? 'success' : 'failure';
99
+ }
100
+ if (FAILURE_MARKERS.some(marker => normalized.includes(marker))) {
101
+ return 'failure';
102
+ }
103
+ return 'unknown';
104
+ }
105
+ /** Convenience predicate — `ClassifyActionResultCode(code) === 'success'`. */
106
+ export function IsActionResultSuccess(code) {
107
+ return ClassifyActionResultCode(code) === 'success';
108
+ }
109
+ /** Convenience predicate — `ClassifyActionResultCode(code) === 'failure'`. */
110
+ export function IsActionResultFailure(code) {
111
+ return ClassifyActionResultCode(code) === 'failure';
112
+ }
113
+ /**
114
+ * Success rate over a set of coded runs, as a whole percentage.
115
+ *
116
+ * Runs whose code classifies as `'unknown'` or `'running'` are excluded from BOTH halves of
117
+ * the fraction: a run still in flight has not succeeded or failed yet, and a code we cannot
118
+ * read is not evidence either way. Counting them in the denominator is what makes a healthy
119
+ * system look broken; counting them as successes is what hides a broken one.
120
+ *
121
+ * Returns 0 when nothing in the set has settled — there is no rate to report, and 0 with an
122
+ * accompanying `0/0` detail is the honest rendering of that.
123
+ */
124
+ export function ActionSuccessRate(codes) {
125
+ let succeeded = 0;
126
+ let settled = 0;
127
+ for (const code of codes) {
128
+ const klass = ClassifyActionResultCode(code);
129
+ if (klass === 'success') {
130
+ succeeded++;
131
+ settled++;
132
+ }
133
+ else if (klass === 'failure') {
134
+ settled++;
135
+ }
136
+ }
137
+ if (settled === 0) {
138
+ return 0;
139
+ }
140
+ return Math.round((succeeded / settled) * 100);
141
+ }
142
+ /**
143
+ * The colour token a code should render with. Shared by the status chips and the row icons so
144
+ * a chip can never disagree with the tile that counted it.
145
+ */
146
+ export function ActionResultColor(code) {
147
+ switch (ClassifyActionResultCode(code)) {
148
+ case 'success': return 'success';
149
+ case 'failure': return 'error';
150
+ case 'running': return 'warning';
151
+ default: return 'info';
152
+ }
153
+ }
154
+ /** The Font Awesome class a code should render with. Paired with {@link ActionResultColor}. */
155
+ export function ActionResultIcon(code) {
156
+ switch (ClassifyActionResultCode(code)) {
157
+ case 'success': return 'fa-solid fa-check-circle';
158
+ case 'failure': return 'fa-solid fa-exclamation-circle';
159
+ case 'running': return 'fa-solid fa-spinner fa-spin';
160
+ default: return 'fa-solid fa-info-circle';
161
+ }
162
+ }
163
+ //# sourceMappingURL=action-result-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-result-code.js","sourceRoot":"","sources":["../../src/Actions/action-result-code.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview One place that decides what an `ActionExecutionLog.ResultCode` MEANS.\n *\n * ## Why this exists\n *\n * `ResultCode` is free text: the column has no CHECK constraint, and the value is whatever\n * the executing runtime wrote. The Runtime action executor emits UPPER_SNAKE codes\n * (`SUCCESS`, `RUNTIME_ERROR`, `TIMEOUT`, `NOT_APPROVED`, … — see\n * `packages/Actions/Runtime/src/types.ts`, passed through verbatim by `ActionEngine`), while\n * older/custom actions wrote Title Case (`Success`, `Failed`, `Error`).\n *\n * Every dashboard then invented its own comparison:\n *\n * - the Execution Monitor compared `=== 'Success'` and `['Failed','Error']` — so on a\n * database of `SUCCESS` rows it reported **0 % (0/181)**…\n * - …while its own `getResultColor` / `getResultIcon` lowercased first, which is why 181\n * green rows rendered directly beneath that 0 % tile;\n * - the Actions Overview lowercased and accepted `success|ok|completed|200`, which is why\n * *its* success rate was the believable one;\n * - the Action Card looked codes up in `MJ: Action Result Codes.IsSuccess` and fell back to\n * a third, narrower heuristic.\n *\n * Four vocabularies, one column. This module is the single one.\n *\n * ## How classification works\n *\n * The code is normalised (trimmed, upper-cased, separators folded to `_`) and then matched\n * by SHAPE rather than against a copied list of the runtime's constants. That is deliberate:\n * this package does not depend on `@memberjunction/action-runtime`, so a copied list would\n * silently drift the first time a new failure code is added upstream. Every failure code the\n * runtime can emit contains one of the failure markers below, and the test file pins that\n * claim against the actual constant list.\n *\n * `'unknown'` is a real answer, not a bucket for laziness: a code this module does not\n * recognise must not be counted as a success (inflating the rate) or as a failure (inventing\n * an incident). It is excluded from both numerator and denominator of the success rate.\n */\n\n/** What a result code says about the run that produced it. */\nexport type ActionResultClass =\n /** The action completed and reported success. */\n | 'success'\n /** The action ended without succeeding — failed, errored, refused, timed out. */\n | 'failure'\n /** The action had not finished when the row was written. */\n | 'running'\n /** Recognised as nothing: a custom code, or a code from a newer writer. */\n | 'unknown';\n\n/** Normalise a raw code for matching: trim, upper-case, fold `-`/space/`.`/`/` to `_`. */\nfunction normalize(code: string): string {\n return code.trim().toUpperCase().replace(/[\\s\\-./]+/g, '_');\n}\n\n/** Codes that mean the action succeeded. */\nconst SUCCESS_CODES: readonly string[] = ['SUCCESS', 'SUCCEEDED', 'OK', 'COMPLETE', 'COMPLETED'];\n\n/** Codes that mean the action had not finished. */\nconst RUNNING_CODES: readonly string[] = ['RUNNING', 'IN_PROGRESS', 'STARTED'];\n\n/**\n * Substrings that mark a code as a failure.\n *\n * Covers every failure constant the Runtime executor can write without naming them:\n * `INVALID_TYPE`→INVALID, `MISSING_CODE`→MISSING, `NOT_APPROVED`→NOT_APPROVED,\n * `INACTIVE`→INACTIVE, `RUNTIME_ERROR`/`SYNTAX_ERROR`/`SECURITY_ERROR`/`UNEXPECTED_ERROR`→ERROR,\n * `TIMEOUT`→TIMEOUT, `MEMORY_LIMIT`→LIMIT — plus the legacy `Failed` / `Error` pair.\n */\nconst FAILURE_MARKERS: readonly string[] = [\n 'ERROR',\n 'FAIL',\n 'TIMEOUT',\n 'TIMED_OUT',\n 'LIMIT',\n 'NOT_APPROVED',\n 'UNAPPROVED',\n 'INACTIVE',\n 'INVALID',\n 'MISSING',\n 'REJECTED',\n 'REFUSED',\n 'DENIED',\n 'CANCELLED',\n 'CANCELED',\n 'ABORTED',\n 'EXCEPTION',\n];\n\n/**\n * Classify a raw `ResultCode`.\n *\n * Order matters: the success and running lists are exact matches checked FIRST, so a\n * hypothetical `SUCCESS_NO_FAILURES` cannot be dragged into `'failure'` by a marker, and a\n * genuine `NOT_SUCCESSFUL` is not dragged into `'success'` by a substring. Null, undefined\n * and blank all classify as `'unknown'` — a row with no code recorded says nothing.\n */\nexport function ClassifyActionResultCode(code: string | null | undefined): ActionResultClass {\n if (code == null) {\n return 'unknown';\n }\n const normalized = normalize(code);\n if (normalized.length === 0) {\n return 'unknown';\n }\n\n if (SUCCESS_CODES.includes(normalized)) {\n return 'success';\n }\n if (RUNNING_CODES.includes(normalized)) {\n return 'running';\n }\n\n // Bare HTTP-style numerics: some integrations write the status they got back.\n if (/^\\d{3}$/.test(normalized)) {\n const status = Number(normalized);\n return status >= 200 && status < 300 ? 'success' : 'failure';\n }\n\n if (FAILURE_MARKERS.some(marker => normalized.includes(marker))) {\n return 'failure';\n }\n\n return 'unknown';\n}\n\n/** Convenience predicate — `ClassifyActionResultCode(code) === 'success'`. */\nexport function IsActionResultSuccess(code: string | null | undefined): boolean {\n return ClassifyActionResultCode(code) === 'success';\n}\n\n/** Convenience predicate — `ClassifyActionResultCode(code) === 'failure'`. */\nexport function IsActionResultFailure(code: string | null | undefined): boolean {\n return ClassifyActionResultCode(code) === 'failure';\n}\n\n/**\n * Success rate over a set of coded runs, as a whole percentage.\n *\n * Runs whose code classifies as `'unknown'` or `'running'` are excluded from BOTH halves of\n * the fraction: a run still in flight has not succeeded or failed yet, and a code we cannot\n * read is not evidence either way. Counting them in the denominator is what makes a healthy\n * system look broken; counting them as successes is what hides a broken one.\n *\n * Returns 0 when nothing in the set has settled — there is no rate to report, and 0 with an\n * accompanying `0/0` detail is the honest rendering of that.\n */\nexport function ActionSuccessRate(codes: readonly (string | null | undefined)[]): number {\n let succeeded = 0;\n let settled = 0;\n for (const code of codes) {\n const klass = ClassifyActionResultCode(code);\n if (klass === 'success') {\n succeeded++;\n settled++;\n } else if (klass === 'failure') {\n settled++;\n }\n }\n if (settled === 0) {\n return 0;\n }\n return Math.round((succeeded / settled) * 100);\n}\n\n/**\n * The colour token a code should render with. Shared by the status chips and the row icons so\n * a chip can never disagree with the tile that counted it.\n */\nexport function ActionResultColor(code: string | null | undefined): 'success' | 'warning' | 'error' | 'info' {\n switch (ClassifyActionResultCode(code)) {\n case 'success': return 'success';\n case 'failure': return 'error';\n case 'running': return 'warning';\n default: return 'info';\n }\n}\n\n/** The Font Awesome class a code should render with. Paired with {@link ActionResultColor}. */\nexport function ActionResultIcon(code: string | null | undefined): string {\n switch (ClassifyActionResultCode(code)) {\n case 'success': return 'fa-solid fa-check-circle';\n case 'failure': return 'fa-solid fa-exclamation-circle';\n case 'running': return 'fa-solid fa-spinner fa-spin';\n default: return 'fa-solid fa-info-circle';\n }\n}\n"]}
@@ -99,6 +99,14 @@ export declare class ActionsOverviewComponent extends BaseResourceComponent impl
99
99
  private registerAgentTools;
100
100
  private loadData;
101
101
  private calculateMetrics;
102
+ /**
103
+ * Successes as a share of SETTLED runs, through the shared classifier.
104
+ *
105
+ * This was the *believable* number on the Actions surfaces — it at least lowercased — but it
106
+ * was still its own private vocabulary (`success|ok|completed|200`), and it divided by every
107
+ * row including still-running ones. Both halves now come from `action-result-code.ts`, so
108
+ * this rate and the Execution Monitor's can no longer disagree.
109
+ */
102
110
  private calculateSuccessRate;
103
111
  private calculateCategoryStats;
104
112
  private loadFilteredData;
@@ -1 +1 @@
1
- {"version":3,"file":"actions-overview.component.d.ts","sourceRoot":"","sources":["../../../src/Actions/components/actions-overview.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"actions-overview.component.d.ts","sourceRoot":"","sources":["../../../src/Actions/components/actions-overview.component.ts"],"names":[],"mappings":"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"}