@memberjunction/ng-core-entity-forms 5.30.0 → 5.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/dist/lib/__tests__/content-source-form.test.d.ts +2 -0
  2. package/dist/lib/__tests__/content-source-form.test.d.ts.map +1 -0
  3. package/dist/lib/__tests__/content-source-form.test.js +183 -0
  4. package/dist/lib/__tests__/content-source-form.test.js.map +1 -0
  5. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts +2 -1
  6. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts.map +1 -1
  7. package/dist/lib/custom/AIAgents/add-action-dialog.component.js +6 -4
  8. package/dist/lib/custom/AIAgents/add-action-dialog.component.js.map +1 -1
  9. package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js +2 -2
  10. package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js.map +1 -1
  11. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts +2 -1
  12. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts.map +1 -1
  13. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +6 -4
  14. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js.map +1 -1
  15. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +15 -15
  16. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  17. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts +2 -1
  18. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts.map +1 -1
  19. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +9 -7
  20. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js.map +1 -1
  21. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts +2 -1
  22. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts.map +1 -1
  23. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +11 -9
  24. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -1
  25. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts +2 -1
  26. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts.map +1 -1
  27. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +6 -5
  28. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js.map +1 -1
  29. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts +2 -1
  30. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts.map +1 -1
  31. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +6 -4
  32. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
  33. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts +2 -1
  34. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts.map +1 -1
  35. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +6 -4
  36. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js.map +1 -1
  37. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +2 -1
  38. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -1
  39. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +6 -4
  40. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
  41. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +3 -3
  42. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  43. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +1 -1
  44. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
  45. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +6 -6
  46. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  47. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts +2 -1
  48. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts.map +1 -1
  49. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +7 -5
  50. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js.map +1 -1
  51. package/dist/lib/custom/Actions/action-execution-log-form.component.js +3 -3
  52. package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
  53. package/dist/lib/custom/Actions/action-form.component.js +12 -12
  54. package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
  55. package/dist/lib/custom/ContentSources/content-source-form.component.d.ts +59 -5
  56. package/dist/lib/custom/ContentSources/content-source-form.component.d.ts.map +1 -1
  57. package/dist/lib/custom/ContentSources/content-source-form.component.js +379 -34
  58. package/dist/lib/custom/ContentSources/content-source-form.component.js.map +1 -1
  59. package/dist/lib/custom/Entities/entity-form.component.d.ts +1 -1
  60. package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
  61. package/dist/lib/custom/Entities/entity-form.component.js +5 -5
  62. package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
  63. package/dist/lib/custom/Lists/list-form.component.d.ts +1 -1
  64. package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
  65. package/dist/lib/custom/Lists/list-form.component.js +10 -10
  66. package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
  67. package/dist/lib/custom/Queries/query-category-dialog.component.d.ts +2 -1
  68. package/dist/lib/custom/Queries/query-category-dialog.component.d.ts.map +1 -1
  69. package/dist/lib/custom/Queries/query-category-dialog.component.js +9 -7
  70. package/dist/lib/custom/Queries/query-category-dialog.component.js.map +1 -1
  71. package/dist/lib/custom/Queries/query-form.component.js +17 -17
  72. package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
  73. package/dist/lib/custom/Queries/query-run-dialog.component.d.ts +2 -1
  74. package/dist/lib/custom/Queries/query-run-dialog.component.d.ts.map +1 -1
  75. package/dist/lib/custom/Queries/query-run-dialog.component.js +7 -6
  76. package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
  77. package/dist/lib/custom/Templates/template-param-dialog.component.d.ts +2 -1
  78. package/dist/lib/custom/Templates/template-param-dialog.component.d.ts.map +1 -1
  79. package/dist/lib/custom/Templates/template-param-dialog.component.js +10 -8
  80. package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
  81. package/dist/lib/custom/Templates/template-params-grid.component.d.ts +2 -1
  82. package/dist/lib/custom/Templates/template-params-grid.component.d.ts.map +1 -1
  83. package/dist/lib/custom/Templates/template-params-grid.component.js +9 -7
  84. package/dist/lib/custom/Templates/template-params-grid.component.js.map +1 -1
  85. package/dist/lib/custom/Templates/templates-form.component.js +8 -8
  86. package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
  87. package/dist/lib/custom/Tests/entity-link-pill.component.d.ts +3 -2
  88. package/dist/lib/custom/Tests/entity-link-pill.component.d.ts.map +1 -1
  89. package/dist/lib/custom/Tests/entity-link-pill.component.js +8 -6
  90. package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
  91. package/dist/lib/custom/Tests/test-form.component.d.ts +1 -1
  92. package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
  93. package/dist/lib/custom/Tests/test-form.component.js +7 -7
  94. package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
  95. package/dist/lib/custom/Tests/test-run-form.component.js +5 -5
  96. package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
  97. package/dist/lib/custom/Tests/test-suite-form.component.d.ts +1 -1
  98. package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
  99. package/dist/lib/custom/Tests/test-suite-form.component.js +8 -8
  100. package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
  101. package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts +1 -1
  102. package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts.map +1 -1
  103. package/dist/lib/custom/Tests/test-suite-run-form.component.js +6 -6
  104. package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
  105. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +2 -1
  106. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
  107. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +8 -6
  108. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
  109. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts +9 -0
  110. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
  111. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +15 -3
  112. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
  113. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +3 -2
  114. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
  115. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +10 -5
  116. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  117. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +2 -2
  118. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  119. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts +2 -1
  120. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts.map +1 -1
  121. package/dist/lib/custom/shared/entity-selector-dialog.component.js +6 -4
  122. package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
  123. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.d.ts.map +1 -1
  124. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js +46 -28
  125. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js.map +1 -1
  126. package/dist/lib/generated/Entities/MJCompanyIntegrationEntityMap/mjcompanyintegrationentitymap.form.component.js +10 -10
  127. package/dist/lib/generated/Entities/MJCompanyIntegrationEntityMap/mjcompanyintegrationentitymap.form.component.js.map +1 -1
  128. package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.d.ts.map +1 -1
  129. package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js +25 -7
  130. package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js.map +1 -1
  131. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.d.ts.map +1 -1
  132. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js +25 -7
  133. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js.map +1 -1
  134. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
  135. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +106 -88
  136. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
  137. package/dist/lib/generated/Entities/MJTag/mjtag.form.component.d.ts.map +1 -1
  138. package/dist/lib/generated/Entities/MJTag/mjtag.form.component.js +181 -61
  139. package/dist/lib/generated/Entities/MJTag/mjtag.form.component.js.map +1 -1
  140. package/dist/lib/generated/Entities/MJTagScope/mjtagscope.form.component.d.ts +10 -0
  141. package/dist/lib/generated/Entities/MJTagScope/mjtagscope.form.component.d.ts.map +1 -0
  142. package/dist/lib/generated/Entities/MJTagScope/mjtagscope.form.component.js +63 -0
  143. package/dist/lib/generated/Entities/MJTagScope/mjtagscope.form.component.js.map +1 -0
  144. package/dist/lib/generated/Entities/MJTagSuggestion/mjtagsuggestion.form.component.d.ts +10 -0
  145. package/dist/lib/generated/Entities/MJTagSuggestion/mjtagsuggestion.form.component.d.ts.map +1 -0
  146. package/dist/lib/generated/Entities/MJTagSuggestion/mjtagsuggestion.form.component.js +95 -0
  147. package/dist/lib/generated/Entities/MJTagSuggestion/mjtagsuggestion.form.component.js.map +1 -0
  148. package/dist/lib/generated/Entities/MJTagSynonym/mjtagsynonym.form.component.d.ts +10 -0
  149. package/dist/lib/generated/Entities/MJTagSynonym/mjtagsynonym.form.component.d.ts.map +1 -0
  150. package/dist/lib/generated/Entities/MJTagSynonym/mjtagsynonym.form.component.js +63 -0
  151. package/dist/lib/generated/Entities/MJTagSynonym/mjtagsynonym.form.component.js.map +1 -0
  152. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  153. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +199 -181
  154. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  155. package/dist/lib/generated/generated-forms.module.d.ts +51 -48
  156. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  157. package/dist/lib/generated/generated-forms.module.js +27 -18
  158. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  159. package/dist/lib/shared/components/template-editor.component.d.ts +3 -2
  160. package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
  161. package/dist/lib/shared/components/template-editor.component.js +8 -6
  162. package/dist/lib/shared/components/template-editor.component.js.map +1 -1
  163. package/package.json +37 -35
@@ -1,4 +1,5 @@
1
1
  import { Observable } from 'rxjs';
2
+ import { IMetadataProvider } from '@memberjunction/core';
2
3
  import { MJAIAgentRunEntity, MJAIAgentRunStepEntity, MJActionExecutionLogEntity, MJAIPromptRunEntity } from '@memberjunction/core-entities';
3
4
  export interface AgentRunData {
4
5
  steps: MJAIAgentRunStepEntity[];
@@ -28,6 +29,14 @@ export declare class AIAgentRunDataHelper {
28
29
  private subAgentDataCache;
29
30
  private cacheAccessOrder;
30
31
  private currentAgentRunId;
32
+ /**
33
+ * Optional explicit metadata provider. Set via `setProvider()` by the
34
+ * owning component (which has provider context via BaseAngularComponent).
35
+ * Falls back to `Metadata.Provider` when not set.
36
+ */
37
+ private _provider;
38
+ set Provider(value: IMetadataProvider | null);
39
+ get Provider(): IMetadataProvider;
31
40
  constructor();
32
41
  /**
33
42
  * Load all data for an agent run
@@ -1 +1 @@
1
- {"version":3,"file":"ai-agent-run-data.service.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-data.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,UAAU,EAAE,MAAM,MAAM,CAAC;AAEnD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAE5I,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,sBAAsB,EAAE,CAAC;IAChC,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,UAAU,EAAE,0BAA0B,EAAE,CAAC;IACzC,UAAU,EAAE,mBAAmB,EAAE,CAAC;CACnC;AAED;;;GAGG;AACH,qBAAa,oBAAoB;IAE/B,OAAO,CAAC,aAAa,CAAqD;IAC1E,OAAO,CAAC,eAAe,CAAiD;IACxE,OAAO,CAAC,kBAAkB,CAAyD;IACnF,OAAO,CAAC,kBAAkB,CAAkD;IAC5E,OAAO,CAAC,eAAe,CAAsC;IAC7D,OAAO,CAAC,aAAa,CAA4C;IAGjE,MAAM,uCAAqC;IAC3C,QAAQ,mCAAuC;IAC/C,WAAW,2CAA0C;IACrD,WAAW,oCAA0C;IACrD,QAAQ,sBAAuC;IAC/C,MAAM,4BAAqC;IAG3C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAO;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkB;IAE/C,OAAO,CAAC,iBAAiB,CAIpB;IAGL,OAAO,CAAC,gBAAgB,CAAgB;IAExC,OAAO,CAAC,iBAAiB,CAAuB;;IAIhD;;OAEG;IACG,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;YA4BhE,mBAAmB;IA6FjC;;OAEG;IACG,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;QAAC,UAAU,EAAE,mBAAmB,EAAE,CAAA;KAAE,CAAC;IAsE9H;;OAEG;IACH,SAAS;IAST;;OAEG;IACH,oBAAoB;IAYpB;;OAEG;IACH,OAAO,CAAC,UAAU;IAKlB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAQ9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;IACH,aAAa;;;;;;IASb;;OAEG;IACH,cAAc,IAAI,YAAY;CAQ/B"}
1
+ {"version":3,"file":"ai-agent-run-data.service.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-data.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,UAAU,EAAE,MAAM,MAAM,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAqB,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAE5I,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,sBAAsB,EAAE,CAAC;IAChC,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,UAAU,EAAE,0BAA0B,EAAE,CAAC;IACzC,UAAU,EAAE,mBAAmB,EAAE,CAAC;CACnC;AAED;;;GAGG;AACH,qBAAa,oBAAoB;IAE/B,OAAO,CAAC,aAAa,CAAqD;IAC1E,OAAO,CAAC,eAAe,CAAiD;IACxE,OAAO,CAAC,kBAAkB,CAAyD;IACnF,OAAO,CAAC,kBAAkB,CAAkD;IAC5E,OAAO,CAAC,eAAe,CAAsC;IAC7D,OAAO,CAAC,aAAa,CAA4C;IAGjE,MAAM,uCAAqC;IAC3C,QAAQ,mCAAuC;IAC/C,WAAW,2CAA0C;IACrD,WAAW,oCAA0C;IACrD,QAAQ,sBAAuC;IAC/C,MAAM,4BAAqC;IAG3C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAO;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkB;IAE/C,OAAO,CAAC,iBAAiB,CAIpB;IAGL,OAAO,CAAC,gBAAgB,CAAgB;IAExC,OAAO,CAAC,iBAAiB,CAAuB;IAEhD;;;;OAIG;IACH,OAAO,CAAC,SAAS,CAAkC;IAEnD,IAAW,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,EAElD;IAED,IAAW,QAAQ,IAAI,iBAAiB,CAEvC;;IAID;;OAEG;IACG,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;YA4BhE,mBAAmB;IA6FjC;;OAEG;IACG,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;QAAC,UAAU,EAAE,mBAAmB,EAAE,CAAA;KAAE,CAAC;IAsE9H;;OAEG;IACH,SAAS;IAST;;OAEG;IACH,oBAAoB;IAYpB;;OAEG;IACH,OAAO,CAAC,UAAU;IAKlB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAQ9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;IACH,aAAa;;;;;;IASb;;OAEG;IACH,cAAc,IAAI,YAAY;CAQ/B"}
@@ -1,10 +1,16 @@
1
1
  import { BehaviorSubject } from 'rxjs';
2
- import { RunView } from '@memberjunction/core';
2
+ import { Metadata, RunView } from '@memberjunction/core';
3
3
  /**
4
4
  * Helper class for managing AI Agent Run data per component instance
5
5
  * No longer a singleton Angular service - instantiated per component
6
6
  */
7
7
  export class AIAgentRunDataHelper {
8
+ set Provider(value) {
9
+ this._provider = value;
10
+ }
11
+ get Provider() {
12
+ return this._provider ?? Metadata.Provider;
13
+ }
8
14
  constructor() {
9
15
  // Data subjects
10
16
  this.stepsSubject$ = new BehaviorSubject([]);
@@ -27,6 +33,12 @@ export class AIAgentRunDataHelper {
27
33
  // Track cache access order for LRU eviction
28
34
  this.cacheAccessOrder = [];
29
35
  this.currentAgentRunId = null;
36
+ /**
37
+ * Optional explicit metadata provider. Set via `setProvider()` by the
38
+ * owning component (which has provider context via BaseAngularComponent).
39
+ * Falls back to `Metadata.Provider` when not set.
40
+ */
41
+ this._provider = null;
30
42
  }
31
43
  /**
32
44
  * Load all data for an agent run
@@ -57,7 +69,7 @@ export class AIAgentRunDataHelper {
57
69
  }
58
70
  }
59
71
  async loadStepsAndSubRuns(agentRunId) {
60
- const rv = new RunView();
72
+ const rv = RunView.FromMetadataProvider(this.Provider);
61
73
  // First, get all steps to determine what additional data we need
62
74
  const stepsResult = await rv.RunView({
63
75
  EntityName: 'MJ: AI Agent Run Steps',
@@ -153,7 +165,7 @@ export class AIAgentRunDataHelper {
153
165
  this.removeCacheEntry(subAgentRunId);
154
166
  }
155
167
  }
156
- const rv = new RunView();
168
+ const rv = RunView.FromMetadataProvider(this.Provider);
157
169
  // Load steps first to determine what else we need
158
170
  const stepsResult = await rv.RunView({
159
171
  EntityName: 'MJ: AI Agent Run Steps',
@@ -1 +1 @@
1
- {"version":3,"file":"ai-agent-run-data.service.js","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-data.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BehaviorSubject, Observable } from 'rxjs';\nimport { RunView } from '@memberjunction/core';\nimport { MJAIAgentRunEntity, MJAIAgentRunStepEntity, MJActionExecutionLogEntity, MJAIPromptRunEntity } from '@memberjunction/core-entities';\n\nexport interface AgentRunData {\n steps: MJAIAgentRunStepEntity[];\n subRuns: MJAIAgentRunEntity[];\n actionLogs: MJActionExecutionLogEntity[];\n promptRuns: MJAIPromptRunEntity[];\n}\n\n/**\n * Helper class for managing AI Agent Run data per component instance\n * No longer a singleton Angular service - instantiated per component\n */\nexport class AIAgentRunDataHelper {\n // Data subjects\n private stepsSubject$ = new BehaviorSubject<MJAIAgentRunStepEntity[]>([]);\n private subRunsSubject$ = new BehaviorSubject<MJAIAgentRunEntity[]>([]);\n private actionLogsSubject$ = new BehaviorSubject<MJActionExecutionLogEntity[]>([]);\n private promptRunsSubject$ = new BehaviorSubject<MJAIPromptRunEntity[]>([]);\n private loadingSubject$ = new BehaviorSubject<boolean>(true);\n private errorSubject$ = new BehaviorSubject<string | null>(null);\n \n // Public observables\n steps$ = this.stepsSubject$.asObservable();\n subRuns$ = this.subRunsSubject$.asObservable();\n actionLogs$ = this.actionLogsSubject$.asObservable();\n promptRuns$ = this.promptRunsSubject$.asObservable();\n loading$ = this.loadingSubject$.asObservable();\n error$ = this.errorSubject$.asObservable();\n \n // Cache for sub-agent data with size limit\n private readonly MAX_CACHE_SIZE = 100; // Maximum 100 sub-agent entries\n private readonly CACHE_TTL_MS = 15 * 60 * 1000; // 15 minute TTL\n \n private subAgentDataCache = new Map<string, {\n steps: MJAIAgentRunStepEntity[];\n promptRuns: MJAIPromptRunEntity[];\n timestamp: number;\n }>();\n \n // Track cache access order for LRU eviction\n private cacheAccessOrder: string[] = [];\n \n private currentAgentRunId: string | null = null;\n \n constructor() {}\n \n /**\n * Load all data for an agent run\n */\n async loadAgentRunData(agentRunId: string, forceReload = false): Promise<void> {\n if (!agentRunId) {\n this.errorSubject$.next('No agent run ID provided');\n return;\n }\n \n // Skip cache check when force reloading\n if (!forceReload && this.currentAgentRunId === agentRunId && this.stepsSubject$.value.length > 0) {\n return;\n }\n \n this.currentAgentRunId = agentRunId;\n this.loadingSubject$.next(true);\n this.errorSubject$.next(null);\n \n // Clear cache when loading new run\n this.subAgentDataCache.clear();\n \n try {\n await this.loadStepsAndSubRuns(agentRunId);\n } catch (error) {\n this.errorSubject$.next('Failed to load agent run data');\n console.error('Error loading agent run data:', error);\n } finally {\n this.loadingSubject$.next(false);\n }\n }\n \n private async loadStepsAndSubRuns(agentRunId: string) {\n const rv = new RunView();\n \n // First, get all steps to determine what additional data we need\n const stepsResult = await rv.RunView<MJAIAgentRunStepEntity>({\n EntityName: 'MJ: AI Agent Run Steps',\n ExtraFilter: `AgentRunID='${agentRunId}'`,\n OrderBy: '__mj_CreatedAt, StepNumber'\n });\n \n if (!stepsResult.Success) {\n throw new Error('Failed to load agent run steps');\n }\n \n const steps = stepsResult.Results as MJAIAgentRunStepEntity[] || [];\n \n // Build filters for batch loading\n const actionLogIds = steps\n .filter(s => s.StepType === 'Actions' && s.TargetLogID)\n .map(s => s.TargetLogID)\n .filter(id => id != null);\n \n const promptRunIds = steps\n .filter(s => s.StepType === 'Prompt' && s.TargetLogID)\n .map(s => s.TargetLogID)\n .filter(id => id != null);\n \n // Build batch queries array\n const batchQueries: any[] = [\n // Sub-runs query\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ParentRunID='${agentRunId}'`,\n OrderBy: 'StartedAt'\n },\n // Current run query\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ID='${agentRunId}'`\n }\n ];\n \n // Add action logs query if needed\n if (actionLogIds.length > 0) {\n batchQueries.push({\n EntityName: 'MJ: Action Execution Logs',\n ExtraFilter: `ID IN ('${actionLogIds.join(\"','\")}')`,\n OrderBy: 'StartedAt'\n });\n }\n \n // Add prompt runs query if needed\n if (promptRunIds.length > 0) {\n batchQueries.push({\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `ID IN ('${promptRunIds.join(\"','\")}')`,\n OrderBy: '__mj_CreatedAt'\n });\n }\n \n // Execute all queries in one batch\n const batchResults = await rv.RunViews(batchQueries);\n \n // Process results\n let resultIndex = 0;\n \n // Sub-runs\n const subRuns = batchResults[resultIndex].Success \n ? (batchResults[resultIndex].Results as MJAIAgentRunEntity[] || [])\n : [];\n resultIndex++;\n \n // Skip current run result\n resultIndex++;\n \n // Action logs\n const actionLogs = actionLogIds.length > 0 && batchResults[resultIndex]?.Success\n ? (batchResults[resultIndex].Results as MJActionExecutionLogEntity[] || [])\n : [];\n if (actionLogIds.length > 0) resultIndex++;\n \n // Prompt runs\n const promptRuns = promptRunIds.length > 0 && batchResults[resultIndex]?.Success\n ? (batchResults[resultIndex].Results as MJAIPromptRunEntity[] || [])\n : [];\n \n // Update all subjects\n this.stepsSubject$.next(steps);\n this.subRunsSubject$.next(subRuns);\n this.actionLogsSubject$.next(actionLogs);\n this.promptRunsSubject$.next(promptRuns);\n }\n \n /**\n * Load sub-agent data (for expanding sub-agent nodes)\n */\n async loadSubAgentData(subAgentRunId: string): Promise<{ steps: MJAIAgentRunStepEntity[], promptRuns: MJAIPromptRunEntity[] }> {\n // Check cache first\n const cachedData = this.subAgentDataCache.get(subAgentRunId);\n if (cachedData) {\n // Check if cache is still valid\n const now = Date.now();\n if (now - cachedData.timestamp < this.CACHE_TTL_MS) {\n // Update access order for LRU\n this.updateCacheAccessOrder(subAgentRunId);\n return { steps: cachedData.steps, promptRuns: cachedData.promptRuns };\n } else {\n // Cache expired, remove it\n this.removeCacheEntry(subAgentRunId);\n }\n }\n \n const rv = new RunView();\n \n // Load steps first to determine what else we need\n const stepsResult = await rv.RunView<MJAIAgentRunStepEntity>({\n EntityName: 'MJ: AI Agent Run Steps',\n ExtraFilter: `AgentRunID = '${subAgentRunId}'`,\n OrderBy: '__mj_CreatedAt, StepNumber'\n });\n \n if (!stepsResult.Success || !stepsResult.Results) {\n return { steps: [], promptRuns: [] };\n }\n \n const steps = stepsResult.Results;\n \n // Get prompt run IDs\n const promptRunIds = steps\n .filter(s => s.StepType === 'Prompt' && s.TargetLogID)\n .map(s => s.TargetLogID)\n .filter(id => id != null);\n \n let promptRuns: MJAIPromptRunEntity[] = [];\n \n // Load prompt runs if needed\n if (promptRunIds.length > 0) {\n const promptResult = await rv.RunView<MJAIPromptRunEntity>({\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `ID IN ('${promptRunIds.join(\"','\")}')`,\n OrderBy: '__mj_CreatedAt'\n });\n \n if (promptResult.Success) {\n promptRuns = promptResult.Results || [];\n }\n }\n \n // Cache the data with timestamp\n const data = { steps, promptRuns, timestamp: Date.now() };\n \n // Enforce cache size limit\n if (this.subAgentDataCache.size >= this.MAX_CACHE_SIZE) {\n // Remove least recently used entry\n const lruKey = this.cacheAccessOrder[0];\n if (lruKey && lruKey !== subAgentRunId) {\n this.removeCacheEntry(lruKey);\n }\n }\n \n this.subAgentDataCache.set(subAgentRunId, data);\n this.updateCacheAccessOrder(subAgentRunId);\n \n return data;\n }\n \n /**\n * Clear all data\n */\n clearData() {\n this.stepsSubject$.next([]);\n this.subRunsSubject$.next([]);\n this.actionLogsSubject$.next([]);\n this.promptRunsSubject$.next([]);\n this.clearCache();\n this.currentAgentRunId = null;\n }\n \n /**\n * Clear just the cache for the current agent run\n */\n clearCurrentRunCache() {\n // Clear all cache entries related to current run\n if (this.currentAgentRunId) {\n const keysToRemove: string[] = [];\n for (const [key, value] of this.subAgentDataCache.entries()) {\n // You might want to add logic here to identify related entries\n keysToRemove.push(key);\n }\n keysToRemove.forEach(key => this.removeCacheEntry(key));\n }\n }\n \n /**\n * Clear entire cache\n */\n private clearCache() {\n this.subAgentDataCache.clear();\n this.cacheAccessOrder = [];\n }\n \n /**\n * Update cache access order for LRU eviction\n */\n private updateCacheAccessOrder(key: string) {\n const index = this.cacheAccessOrder.indexOf(key);\n if (index > -1) {\n this.cacheAccessOrder.splice(index, 1);\n }\n this.cacheAccessOrder.push(key);\n }\n \n /**\n * Remove a cache entry\n */\n private removeCacheEntry(key: string) {\n this.subAgentDataCache.delete(key);\n const index = this.cacheAccessOrder.indexOf(key);\n if (index > -1) {\n this.cacheAccessOrder.splice(index, 1);\n }\n }\n \n /**\n * Get cache statistics for monitoring\n */\n getCacheStats() {\n return {\n size: this.subAgentDataCache.size,\n maxSize: this.MAX_CACHE_SIZE,\n ttlMs: this.CACHE_TTL_MS,\n accessOrder: [...this.cacheAccessOrder]\n };\n }\n \n /**\n * Get current data snapshot\n */\n getCurrentData(): AgentRunData {\n return {\n steps: this.stepsSubject$.value,\n subRuns: this.subRunsSubject$.value,\n actionLogs: this.actionLogsSubject$.value,\n promptRuns: this.promptRunsSubject$.value\n };\n }\n}"]}
1
+ {"version":3,"file":"ai-agent-run-data.service.js","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-data.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BehaviorSubject, Observable } from 'rxjs';\nimport { IMetadataProvider, Metadata, RunView } from '@memberjunction/core';\nimport { MJAIAgentRunEntity, MJAIAgentRunStepEntity, MJActionExecutionLogEntity, MJAIPromptRunEntity } from '@memberjunction/core-entities';\n\nexport interface AgentRunData {\n steps: MJAIAgentRunStepEntity[];\n subRuns: MJAIAgentRunEntity[];\n actionLogs: MJActionExecutionLogEntity[];\n promptRuns: MJAIPromptRunEntity[];\n}\n\n/**\n * Helper class for managing AI Agent Run data per component instance\n * No longer a singleton Angular service - instantiated per component\n */\nexport class AIAgentRunDataHelper {\n // Data subjects\n private stepsSubject$ = new BehaviorSubject<MJAIAgentRunStepEntity[]>([]);\n private subRunsSubject$ = new BehaviorSubject<MJAIAgentRunEntity[]>([]);\n private actionLogsSubject$ = new BehaviorSubject<MJActionExecutionLogEntity[]>([]);\n private promptRunsSubject$ = new BehaviorSubject<MJAIPromptRunEntity[]>([]);\n private loadingSubject$ = new BehaviorSubject<boolean>(true);\n private errorSubject$ = new BehaviorSubject<string | null>(null);\n \n // Public observables\n steps$ = this.stepsSubject$.asObservable();\n subRuns$ = this.subRunsSubject$.asObservable();\n actionLogs$ = this.actionLogsSubject$.asObservable();\n promptRuns$ = this.promptRunsSubject$.asObservable();\n loading$ = this.loadingSubject$.asObservable();\n error$ = this.errorSubject$.asObservable();\n \n // Cache for sub-agent data with size limit\n private readonly MAX_CACHE_SIZE = 100; // Maximum 100 sub-agent entries\n private readonly CACHE_TTL_MS = 15 * 60 * 1000; // 15 minute TTL\n \n private subAgentDataCache = new Map<string, {\n steps: MJAIAgentRunStepEntity[];\n promptRuns: MJAIPromptRunEntity[];\n timestamp: number;\n }>();\n \n // Track cache access order for LRU eviction\n private cacheAccessOrder: string[] = [];\n \n private currentAgentRunId: string | null = null;\n\n /**\n * Optional explicit metadata provider. Set via `setProvider()` by the\n * owning component (which has provider context via BaseAngularComponent).\n * Falls back to `Metadata.Provider` when not set.\n */\n private _provider: IMetadataProvider | null = null;\n\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n constructor() {}\n \n /**\n * Load all data for an agent run\n */\n async loadAgentRunData(agentRunId: string, forceReload = false): Promise<void> {\n if (!agentRunId) {\n this.errorSubject$.next('No agent run ID provided');\n return;\n }\n \n // Skip cache check when force reloading\n if (!forceReload && this.currentAgentRunId === agentRunId && this.stepsSubject$.value.length > 0) {\n return;\n }\n \n this.currentAgentRunId = agentRunId;\n this.loadingSubject$.next(true);\n this.errorSubject$.next(null);\n \n // Clear cache when loading new run\n this.subAgentDataCache.clear();\n \n try {\n await this.loadStepsAndSubRuns(agentRunId);\n } catch (error) {\n this.errorSubject$.next('Failed to load agent run data');\n console.error('Error loading agent run data:', error);\n } finally {\n this.loadingSubject$.next(false);\n }\n }\n \n private async loadStepsAndSubRuns(agentRunId: string) {\n const rv = RunView.FromMetadataProvider(this.Provider);\n \n // First, get all steps to determine what additional data we need\n const stepsResult = await rv.RunView<MJAIAgentRunStepEntity>({\n EntityName: 'MJ: AI Agent Run Steps',\n ExtraFilter: `AgentRunID='${agentRunId}'`,\n OrderBy: '__mj_CreatedAt, StepNumber'\n });\n \n if (!stepsResult.Success) {\n throw new Error('Failed to load agent run steps');\n }\n \n const steps = stepsResult.Results as MJAIAgentRunStepEntity[] || [];\n \n // Build filters for batch loading\n const actionLogIds = steps\n .filter(s => s.StepType === 'Actions' && s.TargetLogID)\n .map(s => s.TargetLogID)\n .filter(id => id != null);\n \n const promptRunIds = steps\n .filter(s => s.StepType === 'Prompt' && s.TargetLogID)\n .map(s => s.TargetLogID)\n .filter(id => id != null);\n \n // Build batch queries array\n const batchQueries: any[] = [\n // Sub-runs query\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ParentRunID='${agentRunId}'`,\n OrderBy: 'StartedAt'\n },\n // Current run query\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ID='${agentRunId}'`\n }\n ];\n \n // Add action logs query if needed\n if (actionLogIds.length > 0) {\n batchQueries.push({\n EntityName: 'MJ: Action Execution Logs',\n ExtraFilter: `ID IN ('${actionLogIds.join(\"','\")}')`,\n OrderBy: 'StartedAt'\n });\n }\n \n // Add prompt runs query if needed\n if (promptRunIds.length > 0) {\n batchQueries.push({\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `ID IN ('${promptRunIds.join(\"','\")}')`,\n OrderBy: '__mj_CreatedAt'\n });\n }\n \n // Execute all queries in one batch\n const batchResults = await rv.RunViews(batchQueries);\n \n // Process results\n let resultIndex = 0;\n \n // Sub-runs\n const subRuns = batchResults[resultIndex].Success \n ? (batchResults[resultIndex].Results as MJAIAgentRunEntity[] || [])\n : [];\n resultIndex++;\n \n // Skip current run result\n resultIndex++;\n \n // Action logs\n const actionLogs = actionLogIds.length > 0 && batchResults[resultIndex]?.Success\n ? (batchResults[resultIndex].Results as MJActionExecutionLogEntity[] || [])\n : [];\n if (actionLogIds.length > 0) resultIndex++;\n \n // Prompt runs\n const promptRuns = promptRunIds.length > 0 && batchResults[resultIndex]?.Success\n ? (batchResults[resultIndex].Results as MJAIPromptRunEntity[] || [])\n : [];\n \n // Update all subjects\n this.stepsSubject$.next(steps);\n this.subRunsSubject$.next(subRuns);\n this.actionLogsSubject$.next(actionLogs);\n this.promptRunsSubject$.next(promptRuns);\n }\n \n /**\n * Load sub-agent data (for expanding sub-agent nodes)\n */\n async loadSubAgentData(subAgentRunId: string): Promise<{ steps: MJAIAgentRunStepEntity[], promptRuns: MJAIPromptRunEntity[] }> {\n // Check cache first\n const cachedData = this.subAgentDataCache.get(subAgentRunId);\n if (cachedData) {\n // Check if cache is still valid\n const now = Date.now();\n if (now - cachedData.timestamp < this.CACHE_TTL_MS) {\n // Update access order for LRU\n this.updateCacheAccessOrder(subAgentRunId);\n return { steps: cachedData.steps, promptRuns: cachedData.promptRuns };\n } else {\n // Cache expired, remove it\n this.removeCacheEntry(subAgentRunId);\n }\n }\n \n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Load steps first to determine what else we need\n const stepsResult = await rv.RunView<MJAIAgentRunStepEntity>({\n EntityName: 'MJ: AI Agent Run Steps',\n ExtraFilter: `AgentRunID = '${subAgentRunId}'`,\n OrderBy: '__mj_CreatedAt, StepNumber'\n });\n \n if (!stepsResult.Success || !stepsResult.Results) {\n return { steps: [], promptRuns: [] };\n }\n \n const steps = stepsResult.Results;\n \n // Get prompt run IDs\n const promptRunIds = steps\n .filter(s => s.StepType === 'Prompt' && s.TargetLogID)\n .map(s => s.TargetLogID)\n .filter(id => id != null);\n \n let promptRuns: MJAIPromptRunEntity[] = [];\n \n // Load prompt runs if needed\n if (promptRunIds.length > 0) {\n const promptResult = await rv.RunView<MJAIPromptRunEntity>({\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `ID IN ('${promptRunIds.join(\"','\")}')`,\n OrderBy: '__mj_CreatedAt'\n });\n \n if (promptResult.Success) {\n promptRuns = promptResult.Results || [];\n }\n }\n \n // Cache the data with timestamp\n const data = { steps, promptRuns, timestamp: Date.now() };\n \n // Enforce cache size limit\n if (this.subAgentDataCache.size >= this.MAX_CACHE_SIZE) {\n // Remove least recently used entry\n const lruKey = this.cacheAccessOrder[0];\n if (lruKey && lruKey !== subAgentRunId) {\n this.removeCacheEntry(lruKey);\n }\n }\n \n this.subAgentDataCache.set(subAgentRunId, data);\n this.updateCacheAccessOrder(subAgentRunId);\n \n return data;\n }\n \n /**\n * Clear all data\n */\n clearData() {\n this.stepsSubject$.next([]);\n this.subRunsSubject$.next([]);\n this.actionLogsSubject$.next([]);\n this.promptRunsSubject$.next([]);\n this.clearCache();\n this.currentAgentRunId = null;\n }\n \n /**\n * Clear just the cache for the current agent run\n */\n clearCurrentRunCache() {\n // Clear all cache entries related to current run\n if (this.currentAgentRunId) {\n const keysToRemove: string[] = [];\n for (const [key, value] of this.subAgentDataCache.entries()) {\n // You might want to add logic here to identify related entries\n keysToRemove.push(key);\n }\n keysToRemove.forEach(key => this.removeCacheEntry(key));\n }\n }\n \n /**\n * Clear entire cache\n */\n private clearCache() {\n this.subAgentDataCache.clear();\n this.cacheAccessOrder = [];\n }\n \n /**\n * Update cache access order for LRU eviction\n */\n private updateCacheAccessOrder(key: string) {\n const index = this.cacheAccessOrder.indexOf(key);\n if (index > -1) {\n this.cacheAccessOrder.splice(index, 1);\n }\n this.cacheAccessOrder.push(key);\n }\n \n /**\n * Remove a cache entry\n */\n private removeCacheEntry(key: string) {\n this.subAgentDataCache.delete(key);\n const index = this.cacheAccessOrder.indexOf(key);\n if (index > -1) {\n this.cacheAccessOrder.splice(index, 1);\n }\n }\n \n /**\n * Get cache statistics for monitoring\n */\n getCacheStats() {\n return {\n size: this.subAgentDataCache.size,\n maxSize: this.MAX_CACHE_SIZE,\n ttlMs: this.CACHE_TTL_MS,\n accessOrder: [...this.cacheAccessOrder]\n };\n }\n \n /**\n * Get current data snapshot\n */\n getCurrentData(): AgentRunData {\n return {\n steps: this.stepsSubject$.value,\n subRuns: this.subRunsSubject$.value,\n actionLogs: this.actionLogsSubject$.value,\n promptRuns: this.promptRunsSubject$.value\n };\n }\n}"]}
@@ -2,6 +2,7 @@ import { EventEmitter, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/cor
2
2
  import { Observable } from 'rxjs';
3
3
  import { MJAIAgentRunEntity, MJAIAgentRunStepEntity, MJActionExecutionLogEntity, MJAIPromptRunEntity } from '@memberjunction/core-entities';
4
4
  import { AIAgentRunDataHelper } from './ai-agent-run-data.service';
5
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
5
6
  import * as i0 from "@angular/core";
6
7
  export interface TimelineItem {
7
8
  id: string;
@@ -23,7 +24,7 @@ export interface TimelineItem {
23
24
  childrenLoaded?: boolean;
24
25
  hasNoChildren?: boolean;
25
26
  }
26
- export declare class AIAgentRunTimelineComponent implements OnInit, OnDestroy {
27
+ export declare class AIAgentRunTimelineComponent extends BaseAngularComponent implements OnInit, OnDestroy {
27
28
  private cdr;
28
29
  aiAgentRunId: string;
29
30
  autoRefresh: boolean;
@@ -47,7 +48,7 @@ export declare class AIAgentRunTimelineComponent implements OnInit, OnDestroy {
47
48
  private refreshTimer;
48
49
  private refreshSubscription;
49
50
  constructor(cdr: ChangeDetectorRef);
50
- ngOnInit(): void;
51
+ ngOnInit(): Promise<void>;
51
52
  ngOnDestroy(): void;
52
53
  private startAutoRefresh;
53
54
  private stopAutoRefresh;
@@ -1 +1 @@
1
- {"version":3,"file":"ai-agent-run-timeline.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-timeline.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-agent-run-timeline.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-timeline.component.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ import { RunView } from '@memberjunction/core';
5
5
  import { AIAgentRunDataHelper } from './ai-agent-run-data.service';
6
6
  import { AIEngineBase } from '@memberjunction/ai-engine-base';
7
7
  import { UUIDsEqual } from '@memberjunction/global';
8
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
8
9
  import * as i0 from "@angular/core";
9
10
  const _c0 = a0 => ({ $implicit: a0 });
10
11
  function AIAgentRunTimelineComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
@@ -147,8 +148,9 @@ function AIAgentRunTimelineComponent_ng_template_5_Template(rf, ctx) { if (rf &
147
148
  const steps_r9 = ctx.$implicit;
148
149
  i0.ɵɵrepeater(steps_r9);
149
150
  } }
150
- export class AIAgentRunTimelineComponent {
151
+ export class AIAgentRunTimelineComponent extends BaseAngularComponent {
151
152
  constructor(cdr) {
153
+ super();
152
154
  this.cdr = cdr;
153
155
  this.autoRefresh = false;
154
156
  this.refreshInterval = 30000; // Minimum 30 seconds
@@ -161,7 +163,10 @@ export class AIAgentRunTimelineComponent {
161
163
  this.selectedItem = null;
162
164
  this.refreshSubscription = null;
163
165
  }
164
- ngOnInit() {
166
+ async ngOnInit() {
167
+ // AIEngineBase is deferred at startup; ensure it's loaded before timeline
168
+ // items render — getStepIconInfo / sub-agent lookups read .Agents synchronously.
169
+ await AIEngineBase.Instance.EnsureLoaded();
165
170
  // Initialize observables from the data helper
166
171
  this.steps$ = this.dataHelper.steps$;
167
172
  this.subRuns$ = this.dataHelper.subRuns$;
@@ -214,7 +219,7 @@ export class AIAgentRunTimelineComponent {
214
219
  switchMap(() => {
215
220
  if (!this.aiAgentRunId)
216
221
  return of(null);
217
- const rv = new RunView();
222
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
218
223
  return from(rv.RunView({
219
224
  EntityName: 'MJ: AI Agent Runs',
220
225
  ExtraFilter: `ID = '${this.aiAgentRunId}'`,
@@ -453,7 +458,7 @@ export class AIAgentRunTimelineComponent {
453
458
  return new AIAgentRunDataHelper();
454
459
  }
455
460
  static { this.ɵfac = function AIAgentRunTimelineComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AIAgentRunTimelineComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; }
456
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AIAgentRunTimelineComponent, selectors: [["mj-ai-agent-run-timeline"]], inputs: { aiAgentRunId: "aiAgentRunId", autoRefresh: "autoRefresh", refreshInterval: "refreshInterval", dataHelper: "dataHelper" }, outputs: { itemSelected: "itemSelected", navigateToEntity: "navigateToEntity", agentRunCompleted: "agentRunCompleted" }, standalone: false, decls: 7, vars: 4, consts: [["recursiveSteps", ""], [1, "loading-state"], [1, "timeline-container"], [1, "error-state"], ["text", "Loading run steps...", "size", "medium"], [1, "timeline"], [1, "empty-state"], [3, "itemClick", "expandToggle", "navigateToEntity", "item", "isSelected"], [1, "loading-children"], [1, "no-children"], [3, "aiAgentRunId", "dataHelper", "autoRefresh"], [1, "fas", "fa-spinner", "fa-spin"], [1, "fas", "fa-info-circle"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [3, "itemSelected", "navigateToEntity", "aiAgentRunId", "dataHelper", "autoRefresh"], [1, "fas", "fa-stream", "fa-3x"], [1, "fas", "fa-exclamation-triangle", "fa-2x"]], template: function AIAgentRunTimelineComponent_Template(rf, ctx) { if (rf & 1) {
461
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AIAgentRunTimelineComponent, selectors: [["mj-ai-agent-run-timeline"]], inputs: { aiAgentRunId: "aiAgentRunId", autoRefresh: "autoRefresh", refreshInterval: "refreshInterval", dataHelper: "dataHelper" }, outputs: { itemSelected: "itemSelected", navigateToEntity: "navigateToEntity", agentRunCompleted: "agentRunCompleted" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 7, vars: 4, consts: [["recursiveSteps", ""], [1, "loading-state"], [1, "timeline-container"], [1, "error-state"], ["text", "Loading run steps...", "size", "medium"], [1, "timeline"], [1, "empty-state"], [3, "itemClick", "expandToggle", "navigateToEntity", "item", "isSelected"], [1, "loading-children"], [1, "no-children"], [3, "aiAgentRunId", "dataHelper", "autoRefresh"], [1, "fas", "fa-spinner", "fa-spin"], [1, "fas", "fa-info-circle"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [3, "itemSelected", "navigateToEntity", "aiAgentRunId", "dataHelper", "autoRefresh"], [1, "fas", "fa-stream", "fa-3x"], [1, "fas", "fa-exclamation-triangle", "fa-2x"]], template: function AIAgentRunTimelineComponent_Template(rf, ctx) { if (rf & 1) {
457
462
  i0.ɵɵconditionalCreate(0, AIAgentRunTimelineComponent_Conditional_0_Template, 2, 0, "div", 1);
458
463
  i0.ɵɵpipe(1, "async");
459
464
  i0.ɵɵconditionalBranchCreate(2, AIAgentRunTimelineComponent_Conditional_2_Template, 3, 2, "div", 2)(3, AIAgentRunTimelineComponent_Conditional_3_Template, 2, 0, "div", 1);
@@ -484,5 +489,5 @@ export class AIAgentRunTimelineComponent {
484
489
  }], agentRunCompleted: [{
485
490
  type: Output
486
491
  }] }); })();
487
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIAgentRunTimelineComponent, { className: "AIAgentRunTimelineComponent", filePath: "src/lib/custom/ai-agent-run/ai-agent-run-timeline.component.ts", lineNumber: 38 }); })();
492
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIAgentRunTimelineComponent, { className: "AIAgentRunTimelineComponent", filePath: "src/lib/custom/ai-agent-run/ai-agent-run-timeline.component.ts", lineNumber: 39 }); })();
488
493
  //# sourceMappingURL=ai-agent-run-timeline.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai-agent-run-timeline.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-timeline.component.ts","../../../../src/lib/custom/ai-agent-run/ai-agent-run-timeline.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';\nimport { Subject, Observable, combineLatest, interval, of, from, Subscription } from 'rxjs';\nimport { takeUntil, map, shareReplay, switchMap, filter } from 'rxjs/operators';\nimport { RunView } from '@memberjunction/core';\nimport { MJAIAgentRunEntity, MJAIAgentRunStepEntity, MJActionExecutionLogEntity, MJAIPromptRunEntity } from '@memberjunction/core-entities';\nimport { AIAgentRunDataHelper } from './ai-agent-run-data.service';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { UUIDsEqual } from '@memberjunction/global';\n\nexport interface TimelineItem {\n id: string;\n type: 'step' | 'subrun' | 'action' | 'prompt';\n title: string;\n subtitle: string;\n status: string;\n startTime: Date;\n endTime?: Date;\n duration?: string;\n icon: string;\n logoUrl?: string;\n color: string;\n data: any;\n children?: TimelineItem[];\n level: number;\n parentId?: string;\n isExpanded?: boolean;\n childrenLoaded?: boolean;\n hasNoChildren?: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-ai-agent-run-timeline',\n templateUrl: './ai-agent-run-timeline.component.html',\n styleUrls: ['./ai-agent-run-timeline.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AIAgentRunTimelineComponent implements OnInit, OnDestroy {\n @Input() aiAgentRunId!: string;\n @Input() autoRefresh = false;\n @Input() refreshInterval = 30000; // Minimum 30 seconds\n @Input() dataHelper!: AIAgentRunDataHelper; // Data helper passed from parent\n @Output() itemSelected = new EventEmitter<TimelineItem>();\n @Output() navigateToEntity = new EventEmitter<{ entityName: string; recordId: string }>();\n @Output() agentRunCompleted = new EventEmitter<string>();\n\n private destroy$ = new Subject<void>();\n \n // Public observables from data helper\n steps$!: Observable<MJAIAgentRunStepEntity[]>;\n subRuns$!: Observable<MJAIAgentRunEntity[]>;\n actionLogs$!: Observable<MJActionExecutionLogEntity[]>;\n promptRuns$!: Observable<MJAIPromptRunEntity[]>;\n \n timelineItems$!: Observable<TimelineItem[]>;\n \n loading = true;\n error: string | null = null;\n selectedItem: TimelineItem | null = null;\n \n private refreshTimer: any;\n private refreshSubscription: Subscription | null = null;\n \n constructor(\n private cdr: ChangeDetectorRef\n ) {}\n \n ngOnInit() {\n // Initialize observables from the data helper\n this.steps$ = this.dataHelper.steps$;\n this.subRuns$ = this.dataHelper.subRuns$;\n this.actionLogs$ = this.dataHelper.actionLogs$;\n this.promptRuns$ = this.dataHelper.promptRuns$;\n \n // Combine all data sources to build timeline.\n // Skip emissions where steps are empty but data is still loading —\n // the BehaviorSubjects initialise with [] so combineLatest fires\n // immediately with an empty array before the real data arrives.\n this.timelineItems$ = combineLatest([\n this.steps$,\n this.subRuns$,\n this.actionLogs$,\n this.promptRuns$,\n this.dataHelper.loading$\n ]).pipe(\n filter(([steps, _subRuns, _actionLogs, _promptRuns, isLoading]) => {\n // While loading, suppress the empty-array emission so the\n // template keeps showing the mj-loading indicator.\n return !(isLoading && steps.length === 0);\n }),\n map(([steps, subRuns, actionLogs, promptRuns]) =>\n this.buildTimelineItems(steps, subRuns, actionLogs, promptRuns)\n ),\n shareReplay(1)\n );\n \n // Data loading is now handled by the parent component through the helper\n // Subscribe to loading state from helper\n this.dataHelper.loading$.pipe(takeUntil(this.destroy$)).subscribe(loading => {\n this.loading = loading;\n this.cdr.markForCheck();\n });\n\n this.dataHelper.error$.pipe(takeUntil(this.destroy$)).subscribe(error => {\n this.error = error;\n this.cdr.markForCheck();\n });\n \n // Auto-refresh logic\n if (this.autoRefresh) {\n this.startAutoRefresh();\n }\n }\n \n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n }\n }\n \n private startAutoRefresh() {\n // Ensure minimum 30 second interval\n const refreshIntervalMs = Math.max(30000, this.refreshInterval);\n \n // Don't create multiple subscriptions - subscribe once and use interval\n this.refreshSubscription = interval(refreshIntervalMs)\n .pipe(\n takeUntil(this.destroy$),\n // Get the latest agent run status\n switchMap(() => {\n if (!this.aiAgentRunId) return of(null);\n \n const rv = new RunView();\n return from(rv.RunView({\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ID = '${this.aiAgentRunId}'`,\n ResultType: 'simple'\n }));\n }),\n filter(result => result !== null && result.Success && result.Results?.length > 0),\n map(result => result!.Results[0])\n )\n .subscribe(agentRun => {\n // Check if the agent run is still running\n if (agentRun.Status === 'Running') {\n // Reload data\n this.dataHelper.loadAgentRunData(this.aiAgentRunId);\n } else {\n // Agent run completed/failed - stop refresh\n console.log(`Agent run ${agentRun.Status} - stopping auto-refresh`);\n this.stopAutoRefresh();\n // Emit event to parent to update status\n this.agentRunCompleted.emit(agentRun.Status);\n }\n });\n }\n \n private stopAutoRefresh() {\n if (this.refreshSubscription) {\n this.refreshSubscription.unsubscribe();\n this.refreshSubscription = null;\n }\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n \n // This method is now just for compatibility - actual loading is done by parent\n async loadData() {\n if (!this.aiAgentRunId) return;\n // The parent component should handle data loading through the helper\n return this.dataHelper.loadAgentRunData(this.aiAgentRunId);\n }\n \n private buildTimelineItems(\n steps: MJAIAgentRunStepEntity[],\n subRuns: MJAIAgentRunEntity[],\n actionLogs: MJActionExecutionLogEntity[],\n promptRuns: MJAIPromptRunEntity[]\n ): TimelineItem[] {\n return this.buildHierarchicalItems(steps, 0, promptRuns);\n }\n\n private buildHierarchicalItems(\n steps: MJAIAgentRunStepEntity[],\n baseLevel: number,\n promptRuns?: MJAIPromptRunEntity[]\n ): TimelineItem[] {\n // Create a map of all timeline items by step ID\n const itemMap = new Map<string, TimelineItem>();\n\n // First pass: create all timeline items\n steps.forEach(step => {\n const item = this.createTimelineItemFromStep(step, baseLevel, promptRuns);\n itemMap.set(step.ID, item);\n });\n\n // Second pass: build parent-child relationships based on ParentID\n steps.forEach(step => {\n if (step.ParentID) {\n const parentItem = itemMap.get(step.ParentID);\n const childItem = itemMap.get(step.ID);\n\n if (parentItem && childItem) {\n // Initialize children array if needed\n if (!parentItem.children) {\n parentItem.children = [];\n }\n\n // Set child's level based on parent's level\n childItem.level = parentItem.level + 1;\n\n // Add child to parent's children array\n parentItem.children.push(childItem);\n }\n }\n });\n\n // Return only root-level items (those without a ParentID)\n const rootItems: TimelineItem[] = [];\n steps.forEach(step => {\n if (!step.ParentID) {\n const item = itemMap.get(step.ID);\n if (item) {\n rootItems.push(item);\n }\n }\n });\n\n return rootItems;\n }\n \n private createTimelineItemFromStep(step: MJAIAgentRunStepEntity, level: number, promptRuns?: MJAIPromptRunEntity[]): TimelineItem {\n let subtitle = `Type: ${step.StepType}`;\n\n // For prompt steps, try to find the associated prompt run to get model/vendor info\n if (step.StepType === 'Prompt' && step.TargetLogID && promptRuns) {\n const promptRun = promptRuns.find(pr => UUIDsEqual(pr.ID, step.TargetLogID));\n if (promptRun) {\n subtitle = `Model: ${promptRun.Model || 'Unknown'} | Vendor: ${promptRun.Vendor || 'Unknown'}`;\n }\n }\n\n // Get icon and logoUrl based on step type\n const iconInfo = this.getStepIconInfo(step);\n\n return {\n id: step.ID,\n type: 'step',\n title: step.StepName || `Step ${step.StepNumber}`,\n subtitle: subtitle,\n status: step.Status,\n startTime: step.StartedAt,\n endTime: step.CompletedAt || undefined,\n duration: this.calculateDuration(step.StartedAt, step.CompletedAt),\n icon: iconInfo.icon,\n logoUrl: iconInfo.logoUrl,\n color: this.getStatusColor(step.Status),\n data: step,\n children: [],\n level,\n isExpanded: false\n };\n }\n \n\n private getStepIconInfo(step: MJAIAgentRunStepEntity): { icon: string; logoUrl?: string } {\n // For sub-agents, try to get agent-specific icon/logo\n if (step.StepType === 'Sub-Agent' && step.TargetID) {\n const agent = AIEngineBase.Instance.Agents.find(a => UUIDsEqual(a.ID, step.TargetID));\n if (agent) {\n // Prefer LogoURL - if present, use it with robot as fallback icon (icon won't be shown when logoUrl exists)\n if (agent.LogoURL) {\n return { icon: 'fa-robot', logoUrl: agent.LogoURL };\n }\n // Next preference: IconClass from agent metadata\n else if (agent.IconClass) {\n return { icon: agent.IconClass };\n }\n // Agent exists but has no custom icon or logo - use default robot icon\n else {\n return { icon: 'fa-robot' };\n }\n }\n }\n\n // Default icons for each step type (includes fa-robot for sub-agents without agent metadata)\n const icon = this.getStepIcon(step.StepType);\n return { icon };\n }\n\n private getStepIcon(stepType: string): string {\n const iconMap: Record<string, string> = {\n 'Prompt': 'fa-brain',\n 'Tool': 'fa-tools',\n 'Sub-Agent': 'fa-robot',\n 'Decision': 'fa-code-branch',\n 'Actions': 'fa-wrench',\n 'Validation': 'fa-square-check',\n 'ForEach': 'fa-repeat',\n 'While': 'fa-rotate'\n };\n return iconMap[stepType] || 'fa-circle';\n }\n \n private getStatusColor(status: string): string {\n const colorMap: Record<string, string> = {\n 'Running': 'info',\n 'Completed': 'success',\n 'Failed': 'error',\n 'Cancelled': 'warning',\n 'Paused': 'secondary'\n };\n return colorMap[status] || 'secondary';\n }\n \n calculateDuration(start: Date, end?: Date | null): string {\n if (!end) return 'Running...';\n \n const startTime = new Date(start).getTime();\n const endTime = new Date(end).getTime();\n const duration = endTime - startTime;\n \n if (duration < 1000) return `${duration}ms`;\n if (duration < 60000) return `${(duration / 1000).toFixed(1)}s`;\n if (duration < 3600000) return `${Math.floor(duration / 60000)}m ${Math.floor((duration % 60000) / 1000)}s`;\n return `${Math.floor(duration / 3600000)}h ${Math.floor((duration % 3600000) / 60000)}m`;\n }\n \n selectItem(item: TimelineItem) {\n this.selectedItem = item;\n this.itemSelected.emit(item);\n }\n \n async toggleItemExpansion(item: TimelineItem, event: Event) {\n event.stopPropagation();\n\n // Toggle expansion state\n item.isExpanded = !item.isExpanded;\n\n // For Sub-Agent steps, load their run data on demand (requires DB query)\n if (item.isExpanded && !item.childrenLoaded && item.type === 'step' && item.data?.StepType === 'Sub-Agent') {\n await this.loadSubAgentChildren(item);\n }\n\n // For parent steps (loop containers like ForEach/While), children are already loaded via ParentID\n // Just toggle - no additional loading needed since we already have all steps from the run\n // The children were already attached in buildTimelineItems()\n }\n \n private async loadSubAgentChildren(item: TimelineItem) {\n try {\n const subAgentRunId = item.data?.TargetLogID;\n\n if (!subAgentRunId) {\n item.hasNoChildren = true;\n item.children = [];\n item.childrenLoaded = true;\n return;\n }\n\n // Load sub-agent data through service\n const data = await this.dataHelper.loadSubAgentData(subAgentRunId);\n\n if (!data.steps || data.steps.length === 0) {\n item.hasNoChildren = true;\n item.children = [];\n item.childrenLoaded = true;\n return;\n }\n\n // Build hierarchical timeline items with ParentID relationships\n // This ensures that loop steps (ForEach/While) within sub-agents also show their children\n item.children = this.buildHierarchicalItems(data.steps, item.level + 1, data.promptRuns);\n\n item.childrenLoaded = true;\n // Trigger change detection after updating the data\n this.cdr.markForCheck();\n } catch (error) {\n console.error('🔄 Timeline: Error loading sub-agent children:', error);\n item.hasNoChildren = true;\n item.childrenLoaded = true;\n // Trigger change detection for error state\n this.cdr.markForCheck();\n }\n }\n \n navigateToSubRun(runId: string, event: Event) {\n event.stopPropagation();\n this.navigateToEntity.emit({ entityName: 'MJ: AI Agent Runs', recordId: runId });\n }\n \n navigateToActionLog(logId: string, event: Event) {\n event.stopPropagation();\n this.navigateToEntity.emit({ entityName: 'MJ: Action Execution Logs', recordId: logId });\n }\n \n navigateToPromptRun(runId: string, event: Event) {\n event.stopPropagation();\n this.navigateToEntity.emit({ entityName: 'MJ: AI Prompt Runs', recordId: runId });\n }\n \n /**\n * TrackBy function for timeline items\n */\n trackByItemId(index: number, item: TimelineItem): string {\n return item.id;\n }\n \n createSubRunDataHelper(): AIAgentRunDataHelper {\n // Create a new data helper instance for sub-runs to prevent caching conflicts\n return new AIAgentRunDataHelper();\n }\n}","@if (loading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading run steps...\" size=\"medium\"></mj-loading>\n </div>\n} @else if (timelineItems$ | async; as items) {\n <div class=\"timeline-container\">\n @if (items.length > 0) {\n <div class=\"timeline\">\n @for (item of items; track trackByItemId($index, item)) {\n <!-- Main Timeline Item -->\n <mj-ai-agent-run-step-node\n [item]=\"item\"\n [isSelected]=\"selectedItem?.id === item.id\"\n (itemClick)=\"selectItem(item)\"\n (expandToggle)=\"toggleItemExpansion(item, $event)\"\n (navigateToEntity)=\"navigateToEntity.emit($event)\">\n </mj-ai-agent-run-step-node>\n <!-- Children Container (for both Sub-Agent and ParentID relationships) -->\n @if (item.isExpanded) {\n <!-- Show loading indicator while loading Sub-Agent children -->\n @if (item.type === 'step' && item.data?.StepType === 'Sub-Agent' && !item.childrenLoaded) {\n <div class=\"loading-children\">\n <i class=\"fas fa-spinner fa-spin\"></i> Loading sub-agent steps...\n </div>\n }\n <!-- Show no children message for Sub-Agents -->\n @if (item.type === 'step' && item.data?.StepType === 'Sub-Agent' && item.childrenLoaded && item.hasNoChildren) {\n <div class=\"no-children\">\n <i class=\"fas fa-info-circle\"></i> No sub-agent steps found\n </div>\n }\n <!-- Render children recursively (works for both Sub-Agent and ParentID children) -->\n @if (item.children && item.children.length > 0) {\n <ng-container *ngTemplateOutlet=\"recursiveSteps; context: { $implicit: item.children }\"></ng-container>\n }\n <!-- For actual sub-run items (from the initial load) - legacy support -->\n @if (item.type === 'subrun' && item.data?.ID) {\n <mj-ai-agent-run-timeline\n [aiAgentRunId]=\"item.data.ID\"\n [dataHelper]=\"createSubRunDataHelper()\"\n [autoRefresh]=\"false\"\n (itemSelected)=\"selectItem($event)\"\n (navigateToEntity)=\"navigateToEntity.emit($event)\">\n </mj-ai-agent-run-timeline>\n }\n }\n }\n </div>\n }\n @if (items.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fas fa-stream fa-3x\"></i>\n <p>No execution steps found</p>\n </div>\n }\n </div>\n} @else {\n <!-- timelineItems$ hasn't emitted yet -->\n <div class=\"loading-state\">\n <mj-loading text=\"Loading run steps...\" size=\"medium\"></mj-loading>\n </div>\n}\n\n@if (error) {\n <div class=\"error-state\">\n <i class=\"fas fa-exclamation-triangle fa-2x\"></i>\n <p>{{ error }}</p>\n </div>\n}\n\n<!-- Recursive template for rendering nested children (ParentID relationships) -->\n<ng-template #recursiveSteps let-steps>\n @for (step of steps; track trackByItemId($index, step)) {\n <mj-ai-agent-run-step-node\n [item]=\"step\"\n [isSelected]=\"selectedItem?.id === step.id\"\n (itemClick)=\"selectItem(step)\"\n (expandToggle)=\"toggleItemExpansion(step, $event)\"\n (navigateToEntity)=\"navigateToEntity.emit($event)\">\n </mj-ai-agent-run-step-node>\n <!-- Recursively render this step's children if expanded -->\n @if (step.isExpanded && step.children && step.children.length > 0) {\n <ng-container *ngTemplateOutlet=\"recursiveSteps; context: { $implicit: step.children }\"></ng-container>\n }\n }\n</ng-template>"]}
1
+ {"version":3,"file":"ai-agent-run-timeline.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-timeline.component.ts","../../../../src/lib/custom/ai-agent-run/ai-agent-run-timeline.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';\nimport { Subject, Observable, combineLatest, interval, of, from, Subscription } from 'rxjs';\nimport { takeUntil, map, shareReplay, switchMap, filter } from 'rxjs/operators';\nimport { RunView } from '@memberjunction/core';\nimport { MJAIAgentRunEntity, MJAIAgentRunStepEntity, MJActionExecutionLogEntity, MJAIPromptRunEntity } from '@memberjunction/core-entities';\nimport { AIAgentRunDataHelper } from './ai-agent-run-data.service';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { UUIDsEqual } from '@memberjunction/global';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nexport interface TimelineItem {\n id: string;\n type: 'step' | 'subrun' | 'action' | 'prompt';\n title: string;\n subtitle: string;\n status: string;\n startTime: Date;\n endTime?: Date;\n duration?: string;\n icon: string;\n logoUrl?: string;\n color: string;\n data: any;\n children?: TimelineItem[];\n level: number;\n parentId?: string;\n isExpanded?: boolean;\n childrenLoaded?: boolean;\n hasNoChildren?: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-ai-agent-run-timeline',\n templateUrl: './ai-agent-run-timeline.component.html',\n styleUrls: ['./ai-agent-run-timeline.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AIAgentRunTimelineComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n @Input() aiAgentRunId!: string;\n @Input() autoRefresh = false;\n @Input() refreshInterval = 30000; // Minimum 30 seconds\n @Input() dataHelper!: AIAgentRunDataHelper; // Data helper passed from parent\n @Output() itemSelected = new EventEmitter<TimelineItem>();\n @Output() navigateToEntity = new EventEmitter<{ entityName: string; recordId: string }>();\n @Output() agentRunCompleted = new EventEmitter<string>();\n\n private destroy$ = new Subject<void>();\n \n // Public observables from data helper\n steps$!: Observable<MJAIAgentRunStepEntity[]>;\n subRuns$!: Observable<MJAIAgentRunEntity[]>;\n actionLogs$!: Observable<MJActionExecutionLogEntity[]>;\n promptRuns$!: Observable<MJAIPromptRunEntity[]>;\n \n timelineItems$!: Observable<TimelineItem[]>;\n \n loading = true;\n error: string | null = null;\n selectedItem: TimelineItem | null = null;\n \n private refreshTimer: any;\n private refreshSubscription: Subscription | null = null;\n \n constructor(\n private cdr: ChangeDetectorRef\n ) {\n super();}\n \n async ngOnInit() {\n // AIEngineBase is deferred at startup; ensure it's loaded before timeline\n // items render — getStepIconInfo / sub-agent lookups read .Agents synchronously.\n await AIEngineBase.Instance.EnsureLoaded();\n\n // Initialize observables from the data helper\n this.steps$ = this.dataHelper.steps$;\n this.subRuns$ = this.dataHelper.subRuns$;\n this.actionLogs$ = this.dataHelper.actionLogs$;\n this.promptRuns$ = this.dataHelper.promptRuns$;\n \n // Combine all data sources to build timeline.\n // Skip emissions where steps are empty but data is still loading —\n // the BehaviorSubjects initialise with [] so combineLatest fires\n // immediately with an empty array before the real data arrives.\n this.timelineItems$ = combineLatest([\n this.steps$,\n this.subRuns$,\n this.actionLogs$,\n this.promptRuns$,\n this.dataHelper.loading$\n ]).pipe(\n filter(([steps, _subRuns, _actionLogs, _promptRuns, isLoading]) => {\n // While loading, suppress the empty-array emission so the\n // template keeps showing the mj-loading indicator.\n return !(isLoading && steps.length === 0);\n }),\n map(([steps, subRuns, actionLogs, promptRuns]) =>\n this.buildTimelineItems(steps, subRuns, actionLogs, promptRuns)\n ),\n shareReplay(1)\n );\n \n // Data loading is now handled by the parent component through the helper\n // Subscribe to loading state from helper\n this.dataHelper.loading$.pipe(takeUntil(this.destroy$)).subscribe(loading => {\n this.loading = loading;\n this.cdr.markForCheck();\n });\n\n this.dataHelper.error$.pipe(takeUntil(this.destroy$)).subscribe(error => {\n this.error = error;\n this.cdr.markForCheck();\n });\n \n // Auto-refresh logic\n if (this.autoRefresh) {\n this.startAutoRefresh();\n }\n }\n \n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n }\n }\n \n private startAutoRefresh() {\n // Ensure minimum 30 second interval\n const refreshIntervalMs = Math.max(30000, this.refreshInterval);\n \n // Don't create multiple subscriptions - subscribe once and use interval\n this.refreshSubscription = interval(refreshIntervalMs)\n .pipe(\n takeUntil(this.destroy$),\n // Get the latest agent run status\n switchMap(() => {\n if (!this.aiAgentRunId) return of(null);\n \n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n return from(rv.RunView({\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ID = '${this.aiAgentRunId}'`,\n ResultType: 'simple'\n }));\n }),\n filter(result => result !== null && result.Success && result.Results?.length > 0),\n map(result => result!.Results[0])\n )\n .subscribe(agentRun => {\n // Check if the agent run is still running\n if (agentRun.Status === 'Running') {\n // Reload data\n this.dataHelper.loadAgentRunData(this.aiAgentRunId);\n } else {\n // Agent run completed/failed - stop refresh\n console.log(`Agent run ${agentRun.Status} - stopping auto-refresh`);\n this.stopAutoRefresh();\n // Emit event to parent to update status\n this.agentRunCompleted.emit(agentRun.Status);\n }\n });\n }\n \n private stopAutoRefresh() {\n if (this.refreshSubscription) {\n this.refreshSubscription.unsubscribe();\n this.refreshSubscription = null;\n }\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n \n // This method is now just for compatibility - actual loading is done by parent\n async loadData() {\n if (!this.aiAgentRunId) return;\n // The parent component should handle data loading through the helper\n return this.dataHelper.loadAgentRunData(this.aiAgentRunId);\n }\n \n private buildTimelineItems(\n steps: MJAIAgentRunStepEntity[],\n subRuns: MJAIAgentRunEntity[],\n actionLogs: MJActionExecutionLogEntity[],\n promptRuns: MJAIPromptRunEntity[]\n ): TimelineItem[] {\n return this.buildHierarchicalItems(steps, 0, promptRuns);\n }\n\n private buildHierarchicalItems(\n steps: MJAIAgentRunStepEntity[],\n baseLevel: number,\n promptRuns?: MJAIPromptRunEntity[]\n ): TimelineItem[] {\n // Create a map of all timeline items by step ID\n const itemMap = new Map<string, TimelineItem>();\n\n // First pass: create all timeline items\n steps.forEach(step => {\n const item = this.createTimelineItemFromStep(step, baseLevel, promptRuns);\n itemMap.set(step.ID, item);\n });\n\n // Second pass: build parent-child relationships based on ParentID\n steps.forEach(step => {\n if (step.ParentID) {\n const parentItem = itemMap.get(step.ParentID);\n const childItem = itemMap.get(step.ID);\n\n if (parentItem && childItem) {\n // Initialize children array if needed\n if (!parentItem.children) {\n parentItem.children = [];\n }\n\n // Set child's level based on parent's level\n childItem.level = parentItem.level + 1;\n\n // Add child to parent's children array\n parentItem.children.push(childItem);\n }\n }\n });\n\n // Return only root-level items (those without a ParentID)\n const rootItems: TimelineItem[] = [];\n steps.forEach(step => {\n if (!step.ParentID) {\n const item = itemMap.get(step.ID);\n if (item) {\n rootItems.push(item);\n }\n }\n });\n\n return rootItems;\n }\n \n private createTimelineItemFromStep(step: MJAIAgentRunStepEntity, level: number, promptRuns?: MJAIPromptRunEntity[]): TimelineItem {\n let subtitle = `Type: ${step.StepType}`;\n\n // For prompt steps, try to find the associated prompt run to get model/vendor info\n if (step.StepType === 'Prompt' && step.TargetLogID && promptRuns) {\n const promptRun = promptRuns.find(pr => UUIDsEqual(pr.ID, step.TargetLogID));\n if (promptRun) {\n subtitle = `Model: ${promptRun.Model || 'Unknown'} | Vendor: ${promptRun.Vendor || 'Unknown'}`;\n }\n }\n\n // Get icon and logoUrl based on step type\n const iconInfo = this.getStepIconInfo(step);\n\n return {\n id: step.ID,\n type: 'step',\n title: step.StepName || `Step ${step.StepNumber}`,\n subtitle: subtitle,\n status: step.Status,\n startTime: step.StartedAt,\n endTime: step.CompletedAt || undefined,\n duration: this.calculateDuration(step.StartedAt, step.CompletedAt),\n icon: iconInfo.icon,\n logoUrl: iconInfo.logoUrl,\n color: this.getStatusColor(step.Status),\n data: step,\n children: [],\n level,\n isExpanded: false\n };\n }\n \n\n private getStepIconInfo(step: MJAIAgentRunStepEntity): { icon: string; logoUrl?: string } {\n // For sub-agents, try to get agent-specific icon/logo\n if (step.StepType === 'Sub-Agent' && step.TargetID) {\n const agent = AIEngineBase.Instance.Agents.find(a => UUIDsEqual(a.ID, step.TargetID));\n if (agent) {\n // Prefer LogoURL - if present, use it with robot as fallback icon (icon won't be shown when logoUrl exists)\n if (agent.LogoURL) {\n return { icon: 'fa-robot', logoUrl: agent.LogoURL };\n }\n // Next preference: IconClass from agent metadata\n else if (agent.IconClass) {\n return { icon: agent.IconClass };\n }\n // Agent exists but has no custom icon or logo - use default robot icon\n else {\n return { icon: 'fa-robot' };\n }\n }\n }\n\n // Default icons for each step type (includes fa-robot for sub-agents without agent metadata)\n const icon = this.getStepIcon(step.StepType);\n return { icon };\n }\n\n private getStepIcon(stepType: string): string {\n const iconMap: Record<string, string> = {\n 'Prompt': 'fa-brain',\n 'Tool': 'fa-tools',\n 'Sub-Agent': 'fa-robot',\n 'Decision': 'fa-code-branch',\n 'Actions': 'fa-wrench',\n 'Validation': 'fa-square-check',\n 'ForEach': 'fa-repeat',\n 'While': 'fa-rotate'\n };\n return iconMap[stepType] || 'fa-circle';\n }\n \n private getStatusColor(status: string): string {\n const colorMap: Record<string, string> = {\n 'Running': 'info',\n 'Completed': 'success',\n 'Failed': 'error',\n 'Cancelled': 'warning',\n 'Paused': 'secondary'\n };\n return colorMap[status] || 'secondary';\n }\n \n calculateDuration(start: Date, end?: Date | null): string {\n if (!end) return 'Running...';\n \n const startTime = new Date(start).getTime();\n const endTime = new Date(end).getTime();\n const duration = endTime - startTime;\n \n if (duration < 1000) return `${duration}ms`;\n if (duration < 60000) return `${(duration / 1000).toFixed(1)}s`;\n if (duration < 3600000) return `${Math.floor(duration / 60000)}m ${Math.floor((duration % 60000) / 1000)}s`;\n return `${Math.floor(duration / 3600000)}h ${Math.floor((duration % 3600000) / 60000)}m`;\n }\n \n selectItem(item: TimelineItem) {\n this.selectedItem = item;\n this.itemSelected.emit(item);\n }\n \n async toggleItemExpansion(item: TimelineItem, event: Event) {\n event.stopPropagation();\n\n // Toggle expansion state\n item.isExpanded = !item.isExpanded;\n\n // For Sub-Agent steps, load their run data on demand (requires DB query)\n if (item.isExpanded && !item.childrenLoaded && item.type === 'step' && item.data?.StepType === 'Sub-Agent') {\n await this.loadSubAgentChildren(item);\n }\n\n // For parent steps (loop containers like ForEach/While), children are already loaded via ParentID\n // Just toggle - no additional loading needed since we already have all steps from the run\n // The children were already attached in buildTimelineItems()\n }\n \n private async loadSubAgentChildren(item: TimelineItem) {\n try {\n const subAgentRunId = item.data?.TargetLogID;\n\n if (!subAgentRunId) {\n item.hasNoChildren = true;\n item.children = [];\n item.childrenLoaded = true;\n return;\n }\n\n // Load sub-agent data through service\n const data = await this.dataHelper.loadSubAgentData(subAgentRunId);\n\n if (!data.steps || data.steps.length === 0) {\n item.hasNoChildren = true;\n item.children = [];\n item.childrenLoaded = true;\n return;\n }\n\n // Build hierarchical timeline items with ParentID relationships\n // This ensures that loop steps (ForEach/While) within sub-agents also show their children\n item.children = this.buildHierarchicalItems(data.steps, item.level + 1, data.promptRuns);\n\n item.childrenLoaded = true;\n // Trigger change detection after updating the data\n this.cdr.markForCheck();\n } catch (error) {\n console.error('🔄 Timeline: Error loading sub-agent children:', error);\n item.hasNoChildren = true;\n item.childrenLoaded = true;\n // Trigger change detection for error state\n this.cdr.markForCheck();\n }\n }\n \n navigateToSubRun(runId: string, event: Event) {\n event.stopPropagation();\n this.navigateToEntity.emit({ entityName: 'MJ: AI Agent Runs', recordId: runId });\n }\n \n navigateToActionLog(logId: string, event: Event) {\n event.stopPropagation();\n this.navigateToEntity.emit({ entityName: 'MJ: Action Execution Logs', recordId: logId });\n }\n \n navigateToPromptRun(runId: string, event: Event) {\n event.stopPropagation();\n this.navigateToEntity.emit({ entityName: 'MJ: AI Prompt Runs', recordId: runId });\n }\n \n /**\n * TrackBy function for timeline items\n */\n trackByItemId(index: number, item: TimelineItem): string {\n return item.id;\n }\n \n createSubRunDataHelper(): AIAgentRunDataHelper {\n // Create a new data helper instance for sub-runs to prevent caching conflicts\n return new AIAgentRunDataHelper();\n }\n}","@if (loading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading run steps...\" size=\"medium\"></mj-loading>\n </div>\n} @else if (timelineItems$ | async; as items) {\n <div class=\"timeline-container\">\n @if (items.length > 0) {\n <div class=\"timeline\">\n @for (item of items; track trackByItemId($index, item)) {\n <!-- Main Timeline Item -->\n <mj-ai-agent-run-step-node\n [item]=\"item\"\n [isSelected]=\"selectedItem?.id === item.id\"\n (itemClick)=\"selectItem(item)\"\n (expandToggle)=\"toggleItemExpansion(item, $event)\"\n (navigateToEntity)=\"navigateToEntity.emit($event)\">\n </mj-ai-agent-run-step-node>\n <!-- Children Container (for both Sub-Agent and ParentID relationships) -->\n @if (item.isExpanded) {\n <!-- Show loading indicator while loading Sub-Agent children -->\n @if (item.type === 'step' && item.data?.StepType === 'Sub-Agent' && !item.childrenLoaded) {\n <div class=\"loading-children\">\n <i class=\"fas fa-spinner fa-spin\"></i> Loading sub-agent steps...\n </div>\n }\n <!-- Show no children message for Sub-Agents -->\n @if (item.type === 'step' && item.data?.StepType === 'Sub-Agent' && item.childrenLoaded && item.hasNoChildren) {\n <div class=\"no-children\">\n <i class=\"fas fa-info-circle\"></i> No sub-agent steps found\n </div>\n }\n <!-- Render children recursively (works for both Sub-Agent and ParentID children) -->\n @if (item.children && item.children.length > 0) {\n <ng-container *ngTemplateOutlet=\"recursiveSteps; context: { $implicit: item.children }\"></ng-container>\n }\n <!-- For actual sub-run items (from the initial load) - legacy support -->\n @if (item.type === 'subrun' && item.data?.ID) {\n <mj-ai-agent-run-timeline\n [aiAgentRunId]=\"item.data.ID\"\n [dataHelper]=\"createSubRunDataHelper()\"\n [autoRefresh]=\"false\"\n (itemSelected)=\"selectItem($event)\"\n (navigateToEntity)=\"navigateToEntity.emit($event)\">\n </mj-ai-agent-run-timeline>\n }\n }\n }\n </div>\n }\n @if (items.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fas fa-stream fa-3x\"></i>\n <p>No execution steps found</p>\n </div>\n }\n </div>\n} @else {\n <!-- timelineItems$ hasn't emitted yet -->\n <div class=\"loading-state\">\n <mj-loading text=\"Loading run steps...\" size=\"medium\"></mj-loading>\n </div>\n}\n\n@if (error) {\n <div class=\"error-state\">\n <i class=\"fas fa-exclamation-triangle fa-2x\"></i>\n <p>{{ error }}</p>\n </div>\n}\n\n<!-- Recursive template for rendering nested children (ParentID relationships) -->\n<ng-template #recursiveSteps let-steps>\n @for (step of steps; track trackByItemId($index, step)) {\n <mj-ai-agent-run-step-node\n [item]=\"step\"\n [isSelected]=\"selectedItem?.id === step.id\"\n (itemClick)=\"selectItem(step)\"\n (expandToggle)=\"toggleItemExpansion(step, $event)\"\n (navigateToEntity)=\"navigateToEntity.emit($event)\">\n </mj-ai-agent-run-step-node>\n <!-- Recursively render this step's children if expanded -->\n @if (step.isExpanded && step.children && step.children.length > 0) {\n <ng-container *ngTemplateOutlet=\"recursiveSteps; context: { $implicit: step.children }\"></ng-container>\n }\n }\n</ng-template>"]}
@@ -6,7 +6,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  };
7
7
  import { Component, ViewChild, inject } from '@angular/core';
8
8
  import { Subject } from 'rxjs';
9
- import { CompositeKey, Metadata } from '@memberjunction/core';
9
+ import { CompositeKey } from '@memberjunction/core';
10
10
  import { BaseFormComponent } from '@memberjunction/ng-base-forms';
11
11
  import { RegisterClass } from '@memberjunction/global';
12
12
  import { SharedService, NavigationService } from '@memberjunction/ng-shared';
@@ -788,7 +788,7 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
788
788
  if (!this.record?.AgentID)
789
789
  return;
790
790
  try {
791
- const md = new Metadata();
791
+ const md = this.ProviderToUse;
792
792
  const agent = await md.GetEntityObject('MJ: AI Agents');
793
793
  if (agent && await agent.Load(this.record.AgentID)) {
794
794
  this.agent = agent;