@memberjunction/ng-dashboards 5.21.0 → 5.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/README.md +51 -0
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +364 -362
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.js +2 -2
  6. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +313 -0
  7. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -0
  8. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2792 -0
  9. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -0
  10. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +382 -0
  11. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -0
  12. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +2683 -0
  13. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -0
  14. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  15. package/dist/AI/components/execution-monitoring.component.js +191 -197
  16. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  17. package/dist/AI/components/models/model-management.component.js +9 -8
  18. package/dist/AI/components/models/model-management.component.js.map +1 -1
  19. package/dist/AI/components/prompts/prompt-management.component.js +305 -299
  20. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  21. package/dist/AI/components/system/system-configuration.component.js +319 -313
  22. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  23. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +240 -0
  24. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -0
  25. package/dist/AI/components/vectors/vector-management-resource.component.js +1767 -0
  26. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -0
  27. package/dist/AI/index.d.ts +3 -0
  28. package/dist/AI/index.d.ts.map +1 -1
  29. package/dist/AI/index.js +6 -0
  30. package/dist/AI/index.js.map +1 -1
  31. package/dist/AI/services/ai-instrumentation.service.d.ts +50 -7
  32. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  33. package/dist/AI/services/ai-instrumentation.service.js +161 -193
  34. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  35. package/dist/APIKeys/api-applications-panel.component.js +10 -12
  36. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  37. package/dist/APIKeys/api-key-create-dialog.component.js +13 -19
  38. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  39. package/dist/APIKeys/api-key-edit-panel.component.js +12 -14
  40. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  41. package/dist/APIKeys/api-scopes-panel.component.js +61 -68
  42. package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
  43. package/dist/APIKeys/api-usage-panel.component.js +10 -11
  44. package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
  45. package/dist/Actions/components/actions-list-view.component.js +82 -96
  46. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  47. package/dist/Actions/components/actions-overview.component.js +130 -134
  48. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  49. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  50. package/dist/Actions/components/categories-list-view.component.js +40 -46
  51. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  52. package/dist/Actions/components/code-management.component.js +2 -2
  53. package/dist/Actions/components/code-management.component.js.map +1 -1
  54. package/dist/Actions/components/entity-integration.component.js +2 -2
  55. package/dist/Actions/components/entity-integration.component.js.map +1 -1
  56. package/dist/Actions/components/execution-monitoring.component.js +127 -132
  57. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  58. package/dist/Actions/components/executions-list-view.component.js +2 -2
  59. package/dist/Actions/components/executions-list-view.component.js.map +1 -1
  60. package/dist/Actions/components/explorer/action-card.component.js +11 -17
  61. package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
  62. package/dist/Actions/components/explorer/action-explorer.component.js +5 -11
  63. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  64. package/dist/Actions/components/explorer/action-list-item.component.js +8 -10
  65. package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -1
  66. package/dist/Actions/components/explorer/action-toolbar.component.js +112 -133
  67. package/dist/Actions/components/explorer/action-toolbar.component.js.map +1 -1
  68. package/dist/Actions/components/explorer/action-tree-panel.component.js +63 -83
  69. package/dist/Actions/components/explorer/action-tree-panel.component.js.map +1 -1
  70. package/dist/Actions/components/explorer/new-action-panel.component.js +17 -21
  71. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  72. package/dist/Actions/components/explorer/new-category-panel.component.js +17 -21
  73. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  74. package/dist/Actions/components/scheduled-actions.component.js +2 -2
  75. package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
  76. package/dist/Actions/components/security-permissions.component.js +2 -2
  77. package/dist/Actions/components/security-permissions.component.js.map +1 -1
  78. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +13 -5
  79. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  80. package/dist/ComponentStudio/component-studio-dashboard.component.js +168 -145
  81. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  82. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +4 -5
  83. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  84. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +197 -200
  85. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  86. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +5 -7
  87. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  88. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +142 -148
  89. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  90. package/dist/ComponentStudio/components/browser/component-browser.component.js +153 -166
  91. package/dist/ComponentStudio/components/browser/component-browser.component.js.map +1 -1
  92. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +15 -20
  93. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
  94. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +16 -21
  95. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
  96. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +18 -23
  97. package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
  98. package/dist/ComponentStudio/components/editors/spec-editor.component.js +25 -30
  99. package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
  100. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +10 -11
  101. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js.map +1 -1
  102. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts.map +1 -1
  103. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +24 -35
  104. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
  105. package/dist/ComponentStudio/components/text-import-dialog.component.js +15 -17
  106. package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
  107. package/dist/Credentials/components/credentials-categories-resource.component.js +7 -6
  108. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  109. package/dist/Credentials/components/credentials-list-resource.component.js +6 -5
  110. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  111. package/dist/Credentials/components/credentials-types-resource.component.js +7 -6
  112. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  113. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +11 -0
  114. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  115. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +57 -0
  116. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  117. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +9 -9
  118. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  119. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +1 -1
  120. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +10 -2
  121. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  122. package/dist/DataExplorer/data-explorer-dashboard.component.js +35 -11
  123. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  124. package/dist/DataExplorer/data-explorer-resource.component.d.ts +1 -0
  125. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  126. package/dist/DataExplorer/data-explorer-resource.component.js +8 -4
  127. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  128. package/dist/Home/home-dashboard.component.d.ts +181 -1
  129. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  130. package/dist/Home/home-dashboard.component.js +1704 -182
  131. package/dist/Home/home-dashboard.component.js.map +1 -1
  132. package/dist/Integration/components/connections/connections.component.js +4 -4
  133. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  134. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +246 -259
  135. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  136. package/dist/Integration/components/widgets/integration-card.component.js +7 -9
  137. package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
  138. package/dist/Integration/integration.module.d.ts +6 -10
  139. package/dist/Integration/integration.module.d.ts.map +1 -1
  140. package/dist/Integration/integration.module.js +12 -20
  141. package/dist/Integration/integration.module.js.map +1 -1
  142. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +106 -0
  143. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -0
  144. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +607 -0
  145. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -0
  146. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +126 -0
  147. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -0
  148. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +1086 -0
  149. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -0
  150. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.d.ts +56 -0
  151. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.d.ts.map +1 -0
  152. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.js +291 -0
  153. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.js.map +1 -0
  154. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +85 -0
  155. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +1 -0
  156. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +461 -0
  157. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +1 -0
  158. package/dist/KnowledgeHub/index.d.ts +5 -0
  159. package/dist/KnowledgeHub/index.d.ts.map +1 -0
  160. package/dist/KnowledgeHub/index.js +6 -0
  161. package/dist/KnowledgeHub/index.js.map +1 -0
  162. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  163. package/dist/Lists/components/lists-browse-resource.component.js +9 -7
  164. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  165. package/dist/Lists/components/lists-my-lists-resource.component.js +5 -4
  166. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  167. package/dist/Lists/components/lists-operations-resource.component.js +10 -9
  168. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  169. package/dist/MCP/components/mcp-connection-dialog.component.js +141 -132
  170. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  171. package/dist/MCP/components/mcp-log-detail-panel.component.js +4 -4
  172. package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
  173. package/dist/MCP/components/mcp-server-dialog.component.js +141 -128
  174. package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
  175. package/dist/MCP/components/mcp-test-tool-dialog.component.js +210 -218
  176. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
  177. package/dist/MCP/mcp-dashboard.component.js +2 -2
  178. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  179. package/dist/MCP/mcp.module.d.ts +6 -9
  180. package/dist/MCP/mcp.module.d.ts.map +1 -1
  181. package/dist/MCP/mcp.module.js +20 -22
  182. package/dist/MCP/mcp.module.js.map +1 -1
  183. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  184. package/dist/QueryBrowser/query-browser-resource.component.js +5 -1
  185. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  186. package/dist/Scheduling/components/scheduling-activity.component.js +5 -4
  187. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  188. package/dist/Scheduling/components/scheduling-jobs.component.js +6 -5
  189. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  190. package/dist/Scheduling/components/scheduling-overview.component.js +93 -92
  191. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  192. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  193. package/dist/SystemDiagnostics/system-diagnostics.component.js +1 -0
  194. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  195. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +7 -1
  196. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
  197. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +63 -8
  198. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
  199. package/dist/Testing/components/testing-dashboard-tab.component.d.ts +9 -1
  200. package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
  201. package/dist/Testing/components/testing-dashboard-tab.component.js +109 -62
  202. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  203. package/dist/Testing/components/testing-explorer.component.d.ts +2 -1
  204. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  205. package/dist/Testing/components/testing-explorer.component.js +241 -200
  206. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  207. package/dist/Testing/components/testing-runs-resource.component.d.ts +7 -1
  208. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
  209. package/dist/Testing/components/testing-runs-resource.component.js +63 -8
  210. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
  211. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
  212. package/dist/Testing/components/testing-runs.component.js +7 -5
  213. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  214. package/dist/Testing/testing-dashboard.component.d.ts +9 -1
  215. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  216. package/dist/Testing/testing-dashboard.component.js +122 -54
  217. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  218. package/dist/actions-dashboards.module.d.ts +8 -13
  219. package/dist/actions-dashboards.module.d.ts.map +1 -1
  220. package/dist/actions-dashboards.module.js +6 -27
  221. package/dist/actions-dashboards.module.js.map +1 -1
  222. package/dist/ai-dashboards.module.d.ts +14 -11
  223. package/dist/ai-dashboards.module.d.ts.map +1 -1
  224. package/dist/ai-dashboards.module.js +58 -44
  225. package/dist/ai-dashboards.module.js.map +1 -1
  226. package/dist/communication-dashboards.module.d.ts +4 -8
  227. package/dist/communication-dashboards.module.d.ts.map +1 -1
  228. package/dist/communication-dashboards.module.js +0 -19
  229. package/dist/communication-dashboards.module.js.map +1 -1
  230. package/dist/component-studio-dashboards.module.d.ts +7 -11
  231. package/dist/component-studio-dashboards.module.d.ts.map +1 -1
  232. package/dist/component-studio-dashboards.module.js +22 -34
  233. package/dist/component-studio-dashboards.module.js.map +1 -1
  234. package/dist/core-dashboards.module.d.ts +13 -18
  235. package/dist/core-dashboards.module.d.ts.map +1 -1
  236. package/dist/core-dashboards.module.js +18 -31
  237. package/dist/core-dashboards.module.js.map +1 -1
  238. package/dist/credentials-dashboards.module.d.ts +5 -8
  239. package/dist/credentials-dashboards.module.d.ts.map +1 -1
  240. package/dist/credentials-dashboards.module.js +3 -19
  241. package/dist/credentials-dashboards.module.js.map +1 -1
  242. package/dist/data-explorer-dashboards.module.d.ts +7 -13
  243. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  244. package/dist/data-explorer-dashboards.module.js +0 -27
  245. package/dist/data-explorer-dashboards.module.js.map +1 -1
  246. package/dist/lists-dashboards.module.d.ts +5 -8
  247. package/dist/lists-dashboards.module.d.ts.map +1 -1
  248. package/dist/lists-dashboards.module.js +3 -19
  249. package/dist/lists-dashboards.module.js.map +1 -1
  250. package/dist/public-api.d.ts +5 -1
  251. package/dist/public-api.d.ts.map +1 -1
  252. package/dist/public-api.js +6 -1
  253. package/dist/public-api.js.map +1 -1
  254. package/dist/scheduling-dashboards.module.d.ts +6 -10
  255. package/dist/scheduling-dashboards.module.d.ts.map +1 -1
  256. package/dist/scheduling-dashboards.module.js +3 -23
  257. package/dist/scheduling-dashboards.module.js.map +1 -1
  258. package/dist/testing-dashboards.module.d.ts +7 -12
  259. package/dist/testing-dashboards.module.d.ts.map +1 -1
  260. package/dist/testing-dashboards.module.js +4 -27
  261. package/dist/testing-dashboards.module.js.map +1 -1
  262. package/package.json +47 -53
@@ -1,8 +1,19 @@
1
1
  import { Injectable } from '@angular/core';
2
2
  import { BehaviorSubject, from, combineLatest } from 'rxjs';
3
- import { switchMap, shareReplay, tap } from 'rxjs/operators';
4
- import { RunView, Metadata } from '@memberjunction/core';
3
+ import { switchMap, shareReplay, tap, map } from 'rxjs/operators';
4
+ import { RunView } from '@memberjunction/core';
5
5
  import * as i0 from "@angular/core";
6
+ /** Fields to request for prompt runs — only what the dashboard needs for aggregation */
7
+ const PROMPT_RUN_FIELDS = [
8
+ 'ID', 'RunAt', 'CompletedAt', 'Success', 'Cost', 'TokensUsed',
9
+ 'TokensPrompt', 'TokensCompletion', 'ExecutionTimeMS',
10
+ 'ModelID', 'Model', 'AgentID', 'Agent', 'Prompt', 'ErrorMessage'
11
+ ];
12
+ /** Fields to request for agent runs — only what the dashboard needs for aggregation */
13
+ const AGENT_RUN_FIELDS = [
14
+ 'ID', 'StartedAt', 'CompletedAt', 'Status', 'Success',
15
+ 'TotalCost', 'TotalTokensUsed', 'AgentID', 'Agent', 'ErrorMessage'
16
+ ];
6
17
  export class AIInstrumentationService {
7
18
  _dateRange$ = new BehaviorSubject({
8
19
  start: new Date(Date.now() - 24 * 60 * 60 * 1000), // Last 24 hours
@@ -10,57 +21,77 @@ export class AIInstrumentationService {
10
21
  });
11
22
  _refreshTrigger$ = new BehaviorSubject(0);
12
23
  _isLoading$ = new BehaviorSubject(false);
13
- metadata = new Metadata();
14
24
  // Expose loading state as observable
15
25
  isLoading$ = this._isLoading$.asObservable();
16
26
  constructor() { }
17
- // Main data streams - trigger on refresh or date range change
18
- kpis$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(tap(() => this._isLoading$.next(true)), switchMap(() => from(this.loadKPIs())), tap(() => this.checkLoadingComplete()), shareReplay(1));
19
- trends$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(tap(() => this._isLoading$.next(true)), switchMap(() => from(this.loadTrends())), tap(() => this.checkLoadingComplete()), shareReplay(1));
20
- liveExecutions$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(tap(() => this._isLoading$.next(true)), switchMap(() => from(this.loadLiveExecutions())), tap(() => this.checkLoadingComplete()), shareReplay(1));
21
- chartData$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(tap(() => this._isLoading$.next(true)), switchMap(() => from(this.loadChartData())), tap(() => this.checkLoadingComplete()), shareReplay(1));
22
- loadingCount = 0;
23
- checkLoadingComplete() {
24
- // Simple mechanism to track when all streams have completed
25
- setTimeout(() => {
26
- this._isLoading$.next(false);
27
- }, 100);
28
- }
27
+ /**
28
+ * Single data load: fetches prompt runs and agent runs ONCE per refresh/date-range change.
29
+ * All downstream streams derive from this shared dataset.
30
+ */
31
+ rawData$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(tap(() => this._isLoading$.next(true)), switchMap(() => from(this.loadAllData())), tap(() => this._isLoading$.next(false)), shareReplay(1));
32
+ // Derived streams — pure in-memory transforms, no extra DB queries
33
+ kpis$ = this.rawData$.pipe(map(data => this.computeKPIs(data.promptRuns, data.agentRuns)), shareReplay(1));
34
+ trends$ = this.rawData$.pipe(map(data => this.computeTrends(data.promptRuns, data.agentRuns)), shareReplay(1));
35
+ liveExecutions$ = this.rawData$.pipe(map(data => this.computeLiveExecutions(data.livePromptRuns, data.liveAgentRuns)), shareReplay(1));
36
+ chartData$ = combineLatest([this.rawData$, this.trends$]).pipe(map(([data, executionTrends]) => this.computeChartData(data.promptRuns, executionTrends)), shareReplay(1));
29
37
  setDateRange(start, end) {
30
38
  this._dateRange$.next({ start, end });
31
- // No need to manually refresh - streams now react to date range changes
32
39
  }
33
40
  refresh() {
34
41
  this._refreshTrigger$.next(this._refreshTrigger$.value + 1);
35
42
  }
36
- async loadKPIs() {
43
+ /**
44
+ * Single batch query that loads all data needed by every dashboard widget.
45
+ * Uses ResultType: 'simple' with explicit Fields to minimize payload size.
46
+ */
47
+ async loadAllData() {
37
48
  const { start, end } = this._dateRange$.value;
49
+ const now = new Date();
50
+ const recentTime = new Date(now.getTime() - 5 * 60 * 1000);
38
51
  const rv = new RunView();
39
- // Use RunViews to batch the queries
40
- const [promptResults, agentResults] = await rv.RunViews([
52
+ const [promptResults, agentResults, livePromptResults, liveAgentResults] = await rv.RunViews([
53
+ {
54
+ EntityName: 'MJ: AI Prompt Runs',
55
+ ExtraFilter: `RunAt >= '${start.toISOString()}' AND RunAt <= '${end.toISOString()}'`,
56
+ Fields: PROMPT_RUN_FIELDS,
57
+ ResultType: 'simple'
58
+ },
59
+ {
60
+ EntityName: 'MJ: AI Agent Runs',
61
+ ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,
62
+ Fields: AGENT_RUN_FIELDS,
63
+ ResultType: 'simple'
64
+ },
41
65
  {
42
66
  EntityName: 'MJ: AI Prompt Runs',
43
- ExtraFilter: `RunAt >= '${start.toISOString()}' AND RunAt <= '${end.toISOString()}'`
67
+ ExtraFilter: `RunAt >= '${recentTime.toISOString()}'`,
68
+ OrderBy: 'RunAt DESC',
69
+ Fields: PROMPT_RUN_FIELDS,
70
+ ResultType: 'simple'
44
71
  },
45
72
  {
46
73
  EntityName: 'MJ: AI Agent Runs',
47
- ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`
74
+ ExtraFilter: `StartedAt >= '${recentTime.toISOString()}'`,
75
+ OrderBy: 'StartedAt DESC',
76
+ Fields: AGENT_RUN_FIELDS,
77
+ ResultType: 'simple'
48
78
  }
49
79
  ]);
50
- const promptRuns = promptResults.Results;
51
- const agentRuns = agentResults.Results;
52
- // Calculate KPIs
80
+ return {
81
+ promptRuns: promptResults.Results,
82
+ agentRuns: agentResults.Results,
83
+ livePromptRuns: livePromptResults.Results,
84
+ liveAgentRuns: liveAgentResults.Results
85
+ };
86
+ }
87
+ // ─── KPI Computation ─────────────────────────────────────────────
88
+ computeKPIs(promptRuns, agentRuns) {
53
89
  const totalExecutions = promptRuns.length + agentRuns.length;
54
90
  const activeExecutions = this.countActiveExecutions(promptRuns, agentRuns);
55
91
  const totalCost = this.sumCosts(promptRuns, agentRuns);
56
92
  const totalTokens = this.sumTokens(promptRuns, agentRuns);
57
93
  const avgExecutionTime = this.calculateAverageExecutionTime(promptRuns, agentRuns);
58
94
  const successRate = this.calculateSuccessRate(promptRuns, agentRuns);
59
- const errorRate = 1 - successRate;
60
- const costPerToken = totalTokens > 0 ? totalCost / totalTokens : 0;
61
- const dailyCostBurn = this.calculateDailyCostBurn(promptRuns, agentRuns);
62
- const topModel = await this.getTopModel(promptRuns);
63
- const topAgent = await this.getTopAgent(agentRuns);
64
95
  return {
65
96
  totalExecutions,
66
97
  activeExecutions,
@@ -69,118 +100,71 @@ export class AIInstrumentationService {
69
100
  avgExecutionTime,
70
101
  successRate,
71
102
  totalTokens,
72
- costPerToken,
73
- topModel,
74
- topAgent,
75
- errorRate,
76
- dailyCostBurn
103
+ costPerToken: totalTokens > 0 ? totalCost / totalTokens : 0,
104
+ topModel: this.getTopModel(promptRuns),
105
+ topAgent: this.getTopAgent(agentRuns),
106
+ errorRate: 1 - successRate,
107
+ dailyCostBurn: this.calculateDailyCostBurn(promptRuns, agentRuns)
77
108
  };
78
109
  }
79
- async loadTrends() {
110
+ // ─── Trend Computation ────────────────────────────────────────────
111
+ computeTrends(promptRuns, agentRuns) {
80
112
  const { start, end } = this._dateRange$.value;
113
+ const bucketSizeMs = this.getBucketSizeMs(start, end);
81
114
  const hourlyBuckets = this.createHourlyBuckets(start, end);
82
- // Calculate bucket size based on the number of buckets
83
- const duration = end.getTime() - start.getTime();
84
- const hours = duration / (1000 * 60 * 60);
85
- let bucketSizeMs;
86
- if (hours <= 24) {
87
- bucketSizeMs = 60 * 60 * 1000; // 1 hour
88
- }
89
- else if (hours <= 24 * 7) {
90
- bucketSizeMs = 4 * 60 * 60 * 1000; // 4 hours
91
- }
92
- else {
93
- bucketSizeMs = 24 * 60 * 60 * 1000; // 24 hours
94
- }
95
- // Load all data in a single query instead of per-bucket
96
- const rv = new RunView();
97
- const [promptResults, agentResults] = await rv.RunViews([
98
- {
99
- EntityName: 'MJ: AI Prompt Runs',
100
- ExtraFilter: `RunAt >= '${start.toISOString()}' AND RunAt <= '${end.toISOString()}'`
101
- },
102
- {
103
- EntityName: 'MJ: AI Agent Runs',
104
- ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`
105
- }
106
- ]);
107
- const allPromptRuns = promptResults.Results;
108
- const allAgentRuns = agentResults.Results;
109
- // Now aggregate data into buckets on the client side
110
- const trends = [];
111
- for (const bucket of hourlyBuckets) {
112
- const bucketStart = bucket;
115
+ return hourlyBuckets.map(bucket => {
113
116
  const bucketEnd = new Date(bucket.getTime() + bucketSizeMs);
114
- // Filter runs for this bucket
115
- const promptRuns = allPromptRuns.filter(r => {
117
+ const bucketPrompts = promptRuns.filter(r => {
116
118
  const runAt = new Date(r.RunAt);
117
- return runAt >= bucketStart && runAt < bucketEnd;
119
+ return runAt >= bucket && runAt < bucketEnd;
118
120
  });
119
- const agentRuns = allAgentRuns.filter(r => {
121
+ const bucketAgents = agentRuns.filter(r => {
120
122
  const startedAt = new Date(r.StartedAt);
121
- return startedAt >= bucketStart && startedAt < bucketEnd;
123
+ return startedAt >= bucket && startedAt < bucketEnd;
122
124
  });
123
- trends.push({
125
+ return {
124
126
  timestamp: bucket,
125
- executions: promptRuns.length + agentRuns.length,
126
- cost: this.sumCosts(promptRuns, agentRuns),
127
- tokens: this.sumTokens(promptRuns, agentRuns),
128
- avgTime: this.calculateAverageExecutionTime(promptRuns, agentRuns),
129
- errors: this.countErrors(promptRuns, agentRuns)
130
- });
131
- }
132
- return trends;
127
+ executions: bucketPrompts.length + bucketAgents.length,
128
+ cost: this.sumCosts(bucketPrompts, bucketAgents),
129
+ tokens: this.sumTokens(bucketPrompts, bucketAgents),
130
+ avgTime: this.calculateAverageExecutionTime(bucketPrompts, bucketAgents),
131
+ errors: this.countErrors(bucketPrompts, bucketAgents)
132
+ };
133
+ });
133
134
  }
134
- async loadLiveExecutions() {
135
+ // ─── Live Executions Computation ──────────────────────────────────
136
+ computeLiveExecutions(promptRuns, agentRuns) {
135
137
  const now = new Date();
136
- const recentTime = new Date(now.getTime() - 5 * 60 * 1000);
137
- const rv = new RunView();
138
- const [promptResults, agentResults] = await rv.RunViews([
139
- {
140
- EntityName: 'MJ: AI Prompt Runs',
141
- ExtraFilter: `RunAt >= '${recentTime.toISOString()}'`,
142
- OrderBy: 'RunAt DESC'
143
- },
144
- {
145
- EntityName: 'MJ: AI Agent Runs',
146
- ExtraFilter: `StartedAt >= '${recentTime.toISOString()}'`,
147
- OrderBy: 'StartedAt DESC'
148
- }
149
- ]);
150
- const promptRuns = promptResults.Results;
151
- const agentRuns = agentResults.Results;
152
138
  const liveExecutions = [];
153
- // Process prompt runs - they already have the prompt name in the Prompt field
154
139
  for (const run of promptRuns) {
155
140
  const isRunning = !run.CompletedAt && run.Success !== false;
156
- const duration = run.CompletedAt ?
157
- new Date(run.CompletedAt).getTime() - new Date(run.RunAt).getTime() :
158
- now.getTime() - new Date(run.RunAt).getTime();
141
+ const duration = run.CompletedAt
142
+ ? new Date(run.CompletedAt).getTime() - new Date(run.RunAt).getTime()
143
+ : now.getTime() - new Date(run.RunAt).getTime();
159
144
  liveExecutions.push({
160
145
  id: run.ID,
161
146
  type: 'prompt',
162
- name: run.Prompt || 'Unnamed Prompt', // Use the Prompt field directly
147
+ name: run.Prompt || 'Unnamed Prompt',
163
148
  status: isRunning ? 'running' : (run.Success ? 'completed' : 'failed'),
164
149
  startTime: new Date(run.RunAt),
165
- duration: duration,
150
+ duration,
166
151
  cost: run.Cost || 0,
167
152
  tokens: run.TokensUsed || 0,
168
153
  progress: isRunning ? Math.min(90, (duration / 30000) * 100) : 100
169
154
  });
170
155
  }
171
- // Process agent runs - they already have the agent name in the Agent field
172
156
  for (const run of agentRuns) {
173
157
  const isRunning = run.Status === 'Running';
174
- const duration = run.CompletedAt ?
175
- new Date(run.CompletedAt).getTime() - new Date(run.StartedAt).getTime() :
176
- now.getTime() - new Date(run.StartedAt).getTime();
158
+ const duration = run.CompletedAt
159
+ ? new Date(run.CompletedAt).getTime() - new Date(run.StartedAt).getTime()
160
+ : now.getTime() - new Date(run.StartedAt).getTime();
177
161
  liveExecutions.push({
178
162
  id: run.ID,
179
163
  type: 'agent',
180
- name: run.Agent || 'Unnamed Agent', // Use the Agent field directly
164
+ name: run.Agent || 'Unnamed Agent',
181
165
  status: run.Status.toLowerCase(),
182
166
  startTime: new Date(run.StartedAt),
183
- duration: duration,
167
+ duration,
184
168
  cost: run.TotalCost || 0,
185
169
  tokens: run.TotalTokensUsed || 0,
186
170
  progress: isRunning ? Math.min(90, (duration / 60000) * 100) : 100
@@ -188,27 +172,16 @@ export class AIInstrumentationService {
188
172
  }
189
173
  return liveExecutions.sort((a, b) => b.startTime.getTime() - a.startTime.getTime());
190
174
  }
191
- async loadChartData() {
192
- const { start, end } = this._dateRange$.value;
193
- const dateFilter = `RunAt >= '${start.toISOString()}' AND RunAt <= '${end.toISOString()}'`;
194
- const promptRv = new RunView();
195
- const promptResults = await promptRv.RunView({
196
- EntityName: 'MJ: AI Prompt Runs',
197
- ExtraFilter: dateFilter
198
- });
199
- const promptRuns = promptResults.Results;
200
- const executionTrends = await this.loadTrends();
201
- const costByModel = await this.analyzeCostByModel(promptRuns);
202
- const performanceMatrix = await this.analyzePerformanceMatrix(promptRuns);
203
- const tokenEfficiency = await this.analyzeTokenEfficiency(promptRuns);
175
+ // ─── Chart Data Computation ───────────────────────────────────────
176
+ computeChartData(promptRuns, executionTrends) {
204
177
  return {
205
178
  executionTrends,
206
- costByModel,
207
- performanceMatrix,
208
- tokenEfficiency
179
+ costByModel: this.analyzeCostByModel(promptRuns),
180
+ performanceMatrix: this.analyzePerformanceMatrix(promptRuns),
181
+ tokenEfficiency: this.analyzeTokenEfficiency(promptRuns)
209
182
  };
210
183
  }
211
- // Helper methods
184
+ // ─── Helper Methods ───────────────────────────────────────────────
212
185
  countActiveExecutions(promptRuns, agentRuns) {
213
186
  const activePrompts = promptRuns.filter(r => !r.CompletedAt && r.Success !== false).length;
214
187
  const activeAgents = agentRuns.filter(r => r.Status === 'Running').length;
@@ -254,25 +227,28 @@ export class AIInstrumentationService {
254
227
  const todayAgents = agentRuns.filter(r => new Date(r.StartedAt) >= dayStart);
255
228
  return this.sumCosts(todayPrompts, todayAgents);
256
229
  }
230
+ getBucketSizeMs(start, end) {
231
+ const hours = (end.getTime() - start.getTime()) / (1000 * 60 * 60);
232
+ if (hours <= 24)
233
+ return 60 * 60 * 1000; // 1 hour
234
+ if (hours <= 24 * 7)
235
+ return 4 * 60 * 60 * 1000; // 4 hours
236
+ return 24 * 60 * 60 * 1000; // 24 hours
237
+ }
257
238
  createHourlyBuckets(start, end) {
258
239
  const buckets = [];
259
240
  const current = new Date(start);
260
- const duration = end.getTime() - start.getTime();
261
- const hours = duration / (1000 * 60 * 60);
262
- // Determine bucket size based on duration
241
+ const hours = (end.getTime() - start.getTime()) / (1000 * 60 * 60);
263
242
  let bucketSize;
264
243
  if (hours <= 24) {
265
- // For up to 24 hours, use hourly buckets
266
244
  bucketSize = 1;
267
245
  current.setMinutes(0, 0, 0);
268
246
  }
269
247
  else if (hours <= 24 * 7) {
270
- // For up to 7 days, use 4-hour buckets
271
248
  bucketSize = 4;
272
249
  current.setHours(Math.floor(current.getHours() / 4) * 4, 0, 0, 0);
273
250
  }
274
251
  else {
275
- // For more than 7 days, use daily buckets
276
252
  bucketSize = 24;
277
253
  current.setHours(0, 0, 0, 0);
278
254
  }
@@ -282,14 +258,12 @@ export class AIInstrumentationService {
282
258
  }
283
259
  return buckets;
284
260
  }
285
- async getTopModel(promptRuns) {
261
+ getTopModel(promptRuns) {
286
262
  const modelCounts = new Map();
287
263
  const modelNames = new Map();
288
- // Count models and track their names from the Model field
289
264
  for (const run of promptRuns) {
290
265
  if (run.ModelID && run.Model) {
291
- const count = modelCounts.get(run.ModelID) || 0;
292
- modelCounts.set(run.ModelID, count + 1);
266
+ modelCounts.set(run.ModelID, (modelCounts.get(run.ModelID) || 0) + 1);
293
267
  modelNames.set(run.ModelID, run.Model);
294
268
  }
295
269
  }
@@ -299,14 +273,12 @@ export class AIInstrumentationService {
299
273
  .sort(([, a], [, b]) => b - a)[0][0];
300
274
  return modelNames.get(topModelId) || 'Unknown Model';
301
275
  }
302
- async getTopAgent(agentRuns) {
276
+ getTopAgent(agentRuns) {
303
277
  const agentCounts = new Map();
304
278
  const agentNames = new Map();
305
- // Count agents and track their names from the Agent field
306
279
  for (const run of agentRuns) {
307
280
  if (run.AgentID && run.Agent) {
308
- const count = agentCounts.get(run.AgentID) || 0;
309
- agentCounts.set(run.AgentID, count + 1);
281
+ agentCounts.set(run.AgentID, (agentCounts.get(run.AgentID) || 0) + 1);
310
282
  agentNames.set(run.AgentID, run.Agent);
311
283
  }
312
284
  }
@@ -316,7 +288,7 @@ export class AIInstrumentationService {
316
288
  .sort(([, a], [, b]) => b - a)[0][0];
317
289
  return agentNames.get(topAgentId) || 'Unknown Agent';
318
290
  }
319
- async analyzeCostByModel(promptRuns) {
291
+ analyzeCostByModel(promptRuns) {
320
292
  const modelStats = new Map();
321
293
  for (const run of promptRuns) {
322
294
  if (run.ModelID && run.Model) {
@@ -326,25 +298,17 @@ export class AIInstrumentationService {
326
298
  modelStats.set(run.ModelID, existing);
327
299
  }
328
300
  }
329
- const results = [];
330
- for (const [modelId, stats] of modelStats.entries()) {
331
- results.push({
332
- model: stats.name,
333
- cost: stats.cost,
334
- tokens: stats.tokens
335
- });
336
- }
337
- return results.sort((a, b) => b.cost - a.cost);
301
+ return Array.from(modelStats.values())
302
+ .map(stats => ({ model: stats.name, cost: stats.cost, tokens: stats.tokens }))
303
+ .sort((a, b) => b.cost - a.cost);
338
304
  }
339
- async analyzePerformanceMatrix(promptRuns) {
305
+ analyzePerformanceMatrix(promptRuns) {
340
306
  const combinations = new Map();
341
307
  for (const run of promptRuns) {
342
308
  if (run.AgentID && run.ModelID && run.ExecutionTimeMS) {
343
309
  const key = `${run.AgentID}:${run.ModelID}`;
344
310
  const existing = combinations.get(key) || {
345
- times: [],
346
- successes: 0,
347
- total: 0,
311
+ times: [], successes: 0, total: 0,
348
312
  agentName: run.Agent || 'Unknown Agent',
349
313
  modelName: run.Model || 'Unknown Model'
350
314
  };
@@ -355,18 +319,14 @@ export class AIInstrumentationService {
355
319
  combinations.set(key, existing);
356
320
  }
357
321
  }
358
- const results = [];
359
- for (const [key, data] of combinations.entries()) {
360
- results.push({
361
- agent: data.agentName,
362
- model: data.modelName,
363
- avgTime: data.times.reduce((sum, time) => sum + time, 0) / data.times.length,
364
- successRate: data.successes / data.total
365
- });
366
- }
367
- return results;
322
+ return Array.from(combinations.values()).map(data => ({
323
+ agent: data.agentName,
324
+ model: data.modelName,
325
+ avgTime: data.times.reduce((sum, time) => sum + time, 0) / data.times.length,
326
+ successRate: data.successes / data.total
327
+ }));
368
328
  }
369
- async analyzeTokenEfficiency(promptRuns) {
329
+ analyzeTokenEfficiency(promptRuns) {
370
330
  const modelEfficiency = new Map();
371
331
  for (const run of promptRuns) {
372
332
  if (run.ModelID && run.Model && run.TokensPrompt && run.TokensCompletion) {
@@ -377,17 +337,14 @@ export class AIInstrumentationService {
377
337
  modelEfficiency.set(run.ModelID, existing);
378
338
  }
379
339
  }
380
- const results = [];
381
- for (const [modelId, data] of modelEfficiency.entries()) {
382
- results.push({
383
- inputTokens: data.input,
384
- outputTokens: data.output,
385
- cost: data.cost,
386
- model: data.name
387
- });
388
- }
389
- return results;
340
+ return Array.from(modelEfficiency.values()).map(data => ({
341
+ inputTokens: data.input,
342
+ outputTokens: data.output,
343
+ cost: data.cost,
344
+ model: data.name
345
+ }));
390
346
  }
347
+ // ─── Execution Details (on-demand, not part of initial load) ──────
391
348
  async getExecutionDetails(executionId, type) {
392
349
  try {
393
350
  if (type === 'prompt') {
@@ -404,17 +361,23 @@ export class AIInstrumentationService {
404
361
  }
405
362
  async getPromptExecutionDetails(promptRunId) {
406
363
  const rv = new RunView();
407
- const result = await rv.RunView({
408
- EntityName: 'MJ: AI Prompt Runs',
409
- ExtraFilter: `ID = '${promptRunId}'`
410
- });
364
+ const [result, childrenResult] = await rv.RunViews([
365
+ {
366
+ EntityName: 'MJ: AI Prompt Runs',
367
+ ExtraFilter: `ID = '${promptRunId}'`,
368
+ Fields: PROMPT_RUN_FIELDS,
369
+ ResultType: 'simple'
370
+ },
371
+ {
372
+ EntityName: 'MJ: AI Prompt Runs',
373
+ ExtraFilter: `ParentID = '${promptRunId}'`,
374
+ Fields: PROMPT_RUN_FIELDS,
375
+ ResultType: 'simple'
376
+ }
377
+ ]);
411
378
  const run = result.Results[0];
412
379
  if (!run)
413
380
  throw new Error('Prompt run not found');
414
- const childrenResult = await rv.RunView({
415
- EntityName: 'MJ: AI Prompt Runs',
416
- ExtraFilter: `ParentID = '${promptRunId}'`
417
- });
418
381
  const children = await Promise.all(childrenResult.Results.map(child => this.getPromptExecutionDetails(child.ID)));
419
382
  return {
420
383
  id: run.ID,
@@ -427,24 +390,29 @@ export class AIInstrumentationService {
427
390
  tokens: run.TokensUsed || 0,
428
391
  success: run.Success || false,
429
392
  errorMessage: run.ErrorMessage || undefined,
430
- parentId: run.ParentID || undefined,
431
393
  children,
432
394
  model: run.Model || undefined
433
395
  };
434
396
  }
435
397
  async getAgentExecutionDetails(agentRunId) {
436
398
  const rv = new RunView();
437
- const result = await rv.RunView({
438
- EntityName: 'MJ: AI Agent Runs',
439
- ExtraFilter: `ID = '${agentRunId}'`
440
- });
399
+ const [result, childrenResult] = await rv.RunViews([
400
+ {
401
+ EntityName: 'MJ: AI Agent Runs',
402
+ ExtraFilter: `ID = '${agentRunId}'`,
403
+ Fields: AGENT_RUN_FIELDS,
404
+ ResultType: 'simple'
405
+ },
406
+ {
407
+ EntityName: 'MJ: AI Agent Runs',
408
+ ExtraFilter: `ParentRunID = '${agentRunId}'`,
409
+ Fields: AGENT_RUN_FIELDS,
410
+ ResultType: 'simple'
411
+ }
412
+ ]);
441
413
  const run = result.Results[0];
442
414
  if (!run)
443
415
  throw new Error('Agent run not found');
444
- const childrenResult = await rv.RunView({
445
- EntityName: 'MJ: AI Agent Runs',
446
- ExtraFilter: `ParentRunID = '${agentRunId}'`
447
- });
448
416
  const children = await Promise.all(childrenResult.Results.map(child => this.getAgentExecutionDetails(child.ID)));
449
417
  return {
450
418
  id: run.ID,
@@ -457,7 +425,7 @@ export class AIInstrumentationService {
457
425
  tokens: run.TotalTokensUsed || 0,
458
426
  success: run.Success || false,
459
427
  errorMessage: run.ErrorMessage || undefined,
460
- parentId: run.ParentRunID || undefined,
428
+ parentId: undefined,
461
429
  children
462
430
  };
463
431
  }