@memberjunction/ng-core-entity-forms 5.42.0 → 5.44.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 (270) hide show
  1. package/dist/__tests__/model-prediction.logic.test.d.ts +2 -0
  2. package/dist/__tests__/model-prediction.logic.test.d.ts.map +1 -0
  3. package/dist/__tests__/model-prediction.logic.test.js +140 -0
  4. package/dist/__tests__/model-prediction.logic.test.js.map +1 -0
  5. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js +79 -105
  6. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js.map +1 -1
  7. package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.js +7 -10
  8. package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.js.map +1 -1
  9. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts.map +1 -1
  10. package/dist/lib/custom/AIAgents/add-action-dialog.component.js +46 -51
  11. package/dist/lib/custom/AIAgents/add-action-dialog.component.js.map +1 -1
  12. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +2 -0
  13. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  14. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +300 -378
  15. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  16. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +22 -29
  17. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -1
  18. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +15 -17
  19. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js.map +1 -1
  20. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +27 -34
  21. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
  22. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +11 -0
  23. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -1
  24. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +48 -47
  25. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
  26. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +438 -454
  27. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  28. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +48 -51
  29. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js.map +1 -1
  30. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +253 -282
  31. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  32. package/dist/lib/custom/Actions/action-execution-log-form.component.js +24 -33
  33. package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
  34. package/dist/lib/custom/Actions/action-form.component.js +263 -311
  35. package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
  36. package/dist/lib/custom/Entities/entity-form.component.d.ts +6 -0
  37. package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
  38. package/dist/lib/custom/Entities/entity-form.component.js +475 -493
  39. package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
  40. package/dist/lib/custom/Lists/list-form.component.js +122 -173
  41. package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
  42. package/dist/lib/custom/Queries/query-form.component.js +190 -248
  43. package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
  44. package/dist/lib/custom/Queries/query-run-dialog.component.js +19 -23
  45. package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
  46. package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts +16 -0
  47. package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts.map +1 -0
  48. package/dist/lib/custom/RecordProcesses/record-process-form.component.js +54 -0
  49. package/dist/lib/custom/RecordProcesses/record-process-form.component.js.map +1 -0
  50. package/dist/lib/custom/SearchScopes/searchscopeprovider-form.component.js +23 -24
  51. package/dist/lib/custom/SearchScopes/searchscopeprovider-form.component.js.map +1 -1
  52. package/dist/lib/custom/Templates/template-param-dialog.component.d.ts.map +1 -1
  53. package/dist/lib/custom/Templates/template-param-dialog.component.js +25 -46
  54. package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
  55. package/dist/lib/custom/Tests/test-form.component.js +100 -130
  56. package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
  57. package/dist/lib/custom/Tests/test-run-form.component.js +187 -205
  58. package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
  59. package/dist/lib/custom/Tests/test-suite-form.component.d.ts +8 -0
  60. package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
  61. package/dist/lib/custom/Tests/test-suite-form.component.js +412 -489
  62. package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
  63. package/dist/lib/custom/Tests/test-suite-run-form.component.js +100 -126
  64. package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
  65. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +166 -184
  66. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
  67. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +42 -61
  68. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js.map +1 -1
  69. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +8 -17
  70. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  71. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +0 -2
  72. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
  73. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +183 -188
  74. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  75. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts +108 -0
  76. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts.map +1 -0
  77. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js +665 -0
  78. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js.map +1 -0
  79. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts +94 -0
  80. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts.map +1 -0
  81. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js +257 -0
  82. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js.map +1 -0
  83. package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts +38 -0
  84. package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts.map +1 -0
  85. package/dist/lib/custom/ai-agent-run/flow/constellation.component.js +200 -0
  86. package/dist/lib/custom/ai-agent-run/flow/constellation.component.js.map +1 -0
  87. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts +44 -0
  88. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts.map +1 -0
  89. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js +180 -0
  90. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js.map +1 -0
  91. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts +12 -0
  92. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts.map +1 -0
  93. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js +46 -0
  94. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js.map +1 -0
  95. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts +64 -0
  96. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts.map +1 -0
  97. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js +267 -0
  98. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js.map +1 -0
  99. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts +53 -0
  100. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts.map +1 -0
  101. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js +111 -0
  102. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js.map +1 -0
  103. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts +42 -0
  104. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts.map +1 -0
  105. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js +193 -0
  106. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js.map +1 -0
  107. package/dist/lib/custom/custom-forms.module.d.ts +58 -49
  108. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  109. package/dist/lib/custom/custom-forms.module.js +64 -16
  110. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  111. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts +2 -0
  112. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts.map +1 -1
  113. package/dist/lib/custom/shared/entity-selector-dialog.component.js +25 -25
  114. package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
  115. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
  116. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +280 -216
  117. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
  118. package/dist/lib/generated/Entities/MJAIAgentChannel/mjaiagentchannel.form.component.js +25 -21
  119. package/dist/lib/generated/Entities/MJAIAgentChannel/mjaiagentchannel.form.component.js.map +1 -1
  120. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.d.ts.map +1 -1
  121. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +68 -14
  122. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
  123. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.d.ts.map +1 -1
  124. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js +44 -32
  125. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js.map +1 -1
  126. package/dist/lib/generated/Entities/MJAIAgentSkill/mjaiagentskill.form.component.d.ts +10 -0
  127. package/dist/lib/generated/Entities/MJAIAgentSkill/mjaiagentskill.form.component.d.ts.map +1 -0
  128. package/dist/lib/generated/Entities/MJAIAgentSkill/mjaiagentskill.form.component.js +66 -0
  129. package/dist/lib/generated/Entities/MJAIAgentSkill/mjaiagentskill.form.component.js.map +1 -0
  130. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.d.ts.map +1 -1
  131. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js +55 -19
  132. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js.map +1 -1
  133. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.d.ts.map +1 -1
  134. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js +28 -10
  135. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
  136. package/dist/lib/generated/Entities/MJAISkill/mjaiskill.form.component.d.ts +10 -0
  137. package/dist/lib/generated/Entities/MJAISkill/mjaiskill.form.component.d.ts.map +1 -0
  138. package/dist/lib/generated/Entities/MJAISkill/mjaiskill.form.component.js +167 -0
  139. package/dist/lib/generated/Entities/MJAISkill/mjaiskill.form.component.js.map +1 -0
  140. package/dist/lib/generated/Entities/MJAISkillAction/mjaiskillaction.form.component.d.ts +10 -0
  141. package/dist/lib/generated/Entities/MJAISkillAction/mjaiskillaction.form.component.d.ts.map +1 -0
  142. package/dist/lib/generated/Entities/MJAISkillAction/mjaiskillaction.form.component.js +64 -0
  143. package/dist/lib/generated/Entities/MJAISkillAction/mjaiskillaction.form.component.js.map +1 -0
  144. package/dist/lib/generated/Entities/MJAISkillPermission/mjaiskillpermission.form.component.d.ts +10 -0
  145. package/dist/lib/generated/Entities/MJAISkillPermission/mjaiskillpermission.form.component.d.ts.map +1 -0
  146. package/dist/lib/generated/Entities/MJAISkillPermission/mjaiskillpermission.form.component.js +82 -0
  147. package/dist/lib/generated/Entities/MJAISkillPermission/mjaiskillpermission.form.component.js.map +1 -0
  148. package/dist/lib/generated/Entities/MJAISkillSubAgent/mjaiskillsubagent.form.component.d.ts +10 -0
  149. package/dist/lib/generated/Entities/MJAISkillSubAgent/mjaiskillsubagent.form.component.d.ts.map +1 -0
  150. package/dist/lib/generated/Entities/MJAISkillSubAgent/mjaiskillsubagent.form.component.js +64 -0
  151. package/dist/lib/generated/Entities/MJAISkillSubAgent/mjaiskillsubagent.form.component.js.map +1 -0
  152. package/dist/lib/generated/Entities/MJAction/mjaction.form.component.d.ts.map +1 -1
  153. package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js +35 -17
  154. package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js.map +1 -1
  155. package/dist/lib/generated/Entities/MJApplication/mjapplication.form.component.d.ts.map +1 -1
  156. package/dist/lib/generated/Entities/MJApplication/mjapplication.form.component.js +59 -51
  157. package/dist/lib/generated/Entities/MJApplication/mjapplication.form.component.js.map +1 -1
  158. package/dist/lib/generated/Entities/MJCollection/mjcollection.form.component.d.ts.map +1 -1
  159. package/dist/lib/generated/Entities/MJCollection/mjcollection.form.component.js +25 -7
  160. package/dist/lib/generated/Entities/MJCollection/mjcollection.form.component.js.map +1 -1
  161. package/dist/lib/generated/Entities/MJCollectionArtifact/mjcollectionartifact.form.component.js +11 -7
  162. package/dist/lib/generated/Entities/MJCollectionArtifact/mjcollectionartifact.form.component.js.map +1 -1
  163. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.d.ts.map +1 -1
  164. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js +56 -46
  165. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js.map +1 -1
  166. package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.d.ts.map +1 -1
  167. package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js +73 -59
  168. package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js.map +1 -1
  169. package/dist/lib/generated/Entities/MJDuplicateRunDetailMatch/mjduplicaterundetailmatch.form.component.d.ts.map +1 -1
  170. package/dist/lib/generated/Entities/MJDuplicateRunDetailMatch/mjduplicaterundetailmatch.form.component.js +24 -4
  171. package/dist/lib/generated/Entities/MJDuplicateRunDetailMatch/mjduplicaterundetailmatch.form.component.js.map +1 -1
  172. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
  173. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +137 -87
  174. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
  175. package/dist/lib/generated/Entities/MJEntityActionInvocation/mjentityactioninvocation.form.component.js +10 -8
  176. package/dist/lib/generated/Entities/MJEntityActionInvocation/mjentityactioninvocation.form.component.js.map +1 -1
  177. package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.d.ts.map +1 -1
  178. package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js +47 -29
  179. package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js.map +1 -1
  180. package/dist/lib/generated/Entities/MJExperiment/mjexperiment.form.component.d.ts +10 -0
  181. package/dist/lib/generated/Entities/MJExperiment/mjexperiment.form.component.d.ts.map +1 -0
  182. package/dist/lib/generated/Entities/MJExperiment/mjexperiment.form.component.js +99 -0
  183. package/dist/lib/generated/Entities/MJExperiment/mjexperiment.form.component.js.map +1 -0
  184. package/dist/lib/generated/Entities/MJExperimentSession/mjexperimentsession.form.component.d.ts +10 -0
  185. package/dist/lib/generated/Entities/MJExperimentSession/mjexperimentsession.form.component.d.ts.map +1 -0
  186. package/dist/lib/generated/Entities/MJExperimentSession/mjexperimentsession.form.component.js +101 -0
  187. package/dist/lib/generated/Entities/MJExperimentSession/mjexperimentsession.form.component.js.map +1 -0
  188. package/dist/lib/generated/Entities/MJExperimentSessionIteration/mjexperimentsessioniteration.form.component.d.ts +10 -0
  189. package/dist/lib/generated/Entities/MJExperimentSessionIteration/mjexperimentsessioniteration.form.component.d.ts.map +1 -0
  190. package/dist/lib/generated/Entities/MJExperimentSessionIteration/mjexperimentsessioniteration.form.component.js +115 -0
  191. package/dist/lib/generated/Entities/MJExperimentSessionIteration/mjexperimentsessioniteration.form.component.js.map +1 -0
  192. package/dist/lib/generated/Entities/MJFile/mjfile.form.component.d.ts.map +1 -1
  193. package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js +63 -9
  194. package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js.map +1 -1
  195. package/dist/lib/generated/Entities/MJFileStorageProvider/mjfilestorageprovider.form.component.d.ts.map +1 -1
  196. package/dist/lib/generated/Entities/MJFileStorageProvider/mjfilestorageprovider.form.component.js +32 -14
  197. package/dist/lib/generated/Entities/MJFileStorageProvider/mjfilestorageprovider.form.component.js.map +1 -1
  198. package/dist/lib/generated/Entities/MJMLAlgorithm/mjmlalgorithm.form.component.d.ts +10 -0
  199. package/dist/lib/generated/Entities/MJMLAlgorithm/mjmlalgorithm.form.component.d.ts.map +1 -0
  200. package/dist/lib/generated/Entities/MJMLAlgorithm/mjmlalgorithm.form.component.js +161 -0
  201. package/dist/lib/generated/Entities/MJMLAlgorithm/mjmlalgorithm.form.component.js.map +1 -0
  202. package/dist/lib/generated/Entities/MJMLAlgorithmUseCase/mjmlalgorithmusecase.form.component.d.ts +10 -0
  203. package/dist/lib/generated/Entities/MJMLAlgorithmUseCase/mjmlalgorithmusecase.form.component.d.ts.map +1 -0
  204. package/dist/lib/generated/Entities/MJMLAlgorithmUseCase/mjmlalgorithmusecase.form.component.js +89 -0
  205. package/dist/lib/generated/Entities/MJMLAlgorithmUseCase/mjmlalgorithmusecase.form.component.js.map +1 -0
  206. package/dist/lib/generated/Entities/MJMLAlgorithmUseCaseRanking/mjmlalgorithmusecaseranking.form.component.d.ts +10 -0
  207. package/dist/lib/generated/Entities/MJMLAlgorithmUseCaseRanking/mjmlalgorithmusecaseranking.form.component.d.ts.map +1 -0
  208. package/dist/lib/generated/Entities/MJMLAlgorithmUseCaseRanking/mjmlalgorithmusecaseranking.form.component.js +76 -0
  209. package/dist/lib/generated/Entities/MJMLAlgorithmUseCaseRanking/mjmlalgorithmusecaseranking.form.component.js.map +1 -0
  210. package/dist/lib/generated/Entities/MJMLModel/mjmlmodel.form.component.d.ts +10 -0
  211. package/dist/lib/generated/Entities/MJMLModel/mjmlmodel.form.component.d.ts.map +1 -0
  212. package/dist/lib/generated/Entities/MJMLModel/mjmlmodel.form.component.js +141 -0
  213. package/dist/lib/generated/Entities/MJMLModel/mjmlmodel.form.component.js.map +1 -0
  214. package/dist/lib/generated/Entities/MJMLModelScoringBinding/mjmlmodelscoringbinding.form.component.d.ts +10 -0
  215. package/dist/lib/generated/Entities/MJMLModelScoringBinding/mjmlmodelscoringbinding.form.component.d.ts.map +1 -0
  216. package/dist/lib/generated/Entities/MJMLModelScoringBinding/mjmlmodelscoringbinding.form.component.js +88 -0
  217. package/dist/lib/generated/Entities/MJMLModelScoringBinding/mjmlmodelscoringbinding.form.component.js.map +1 -0
  218. package/dist/lib/generated/Entities/MJMLTrainingPipeline/mjmltrainingpipeline.form.component.d.ts +10 -0
  219. package/dist/lib/generated/Entities/MJMLTrainingPipeline/mjmltrainingpipeline.form.component.d.ts.map +1 -0
  220. package/dist/lib/generated/Entities/MJMLTrainingPipeline/mjmltrainingpipeline.form.component.js +143 -0
  221. package/dist/lib/generated/Entities/MJMLTrainingPipeline/mjmltrainingpipeline.form.component.js.map +1 -0
  222. package/dist/lib/generated/Entities/MJMLTrainingRun/mjmltrainingrun.form.component.d.ts +10 -0
  223. package/dist/lib/generated/Entities/MJMLTrainingRun/mjmltrainingrun.form.component.d.ts.map +1 -0
  224. package/dist/lib/generated/Entities/MJMLTrainingRun/mjmltrainingrun.form.component.js +110 -0
  225. package/dist/lib/generated/Entities/MJMLTrainingRun/mjmltrainingrun.form.component.js.map +1 -0
  226. package/dist/lib/generated/Entities/MJOpenApp/mjopenapp.form.component.d.ts.map +1 -1
  227. package/dist/lib/generated/Entities/MJOpenApp/mjopenapp.form.component.js +56 -24
  228. package/dist/lib/generated/Entities/MJOpenApp/mjopenapp.form.component.js.map +1 -1
  229. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js +19 -17
  230. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js.map +1 -1
  231. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.d.ts.map +1 -1
  232. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js +46 -26
  233. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js.map +1 -1
  234. package/dist/lib/generated/Entities/MJRemoteOperation/mjremoteoperation.form.component.js +12 -6
  235. package/dist/lib/generated/Entities/MJRemoteOperation/mjremoteoperation.form.component.js.map +1 -1
  236. package/dist/lib/generated/Entities/MJRole/mjrole.form.component.d.ts.map +1 -1
  237. package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js +36 -18
  238. package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js.map +1 -1
  239. package/dist/lib/generated/Entities/MJSchemaInfo/mjschemainfo.form.component.js +8 -6
  240. package/dist/lib/generated/Entities/MJSchemaInfo/mjschemainfo.form.component.js.map +1 -1
  241. package/dist/lib/generated/Entities/MJScopedPromptPart/mjscopedpromptpart.form.component.d.ts +10 -0
  242. package/dist/lib/generated/Entities/MJScopedPromptPart/mjscopedpromptpart.form.component.d.ts.map +1 -0
  243. package/dist/lib/generated/Entities/MJScopedPromptPart/mjscopedpromptpart.form.component.js +78 -0
  244. package/dist/lib/generated/Entities/MJScopedPromptPart/mjscopedpromptpart.form.component.js.map +1 -0
  245. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  246. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +145 -109
  247. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  248. package/dist/lib/generated/generated-forms.module.d.ts +356 -335
  249. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  250. package/dist/lib/generated/generated-forms.module.js +304 -226
  251. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  252. package/dist/lib/panels/ai-agents/agent-realtime.panel.js +44 -44
  253. package/dist/lib/panels/ai-agents/agent-realtime.panel.js.map +1 -1
  254. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts +43 -0
  255. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts.map +1 -0
  256. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js +240 -0
  257. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js.map +1 -0
  258. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts +69 -0
  259. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts.map +1 -0
  260. package/dist/lib/panels/model-predictions/model-prediction.logic.js +130 -0
  261. package/dist/lib/panels/model-predictions/model-prediction.logic.js.map +1 -0
  262. package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts +83 -0
  263. package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts.map +1 -0
  264. package/dist/lib/panels/model-predictions/model-prediction.panel.js +293 -0
  265. package/dist/lib/panels/model-predictions/model-prediction.panel.js.map +1 -0
  266. package/package.json +38 -36
  267. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts +0 -82
  268. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts.map +0 -1
  269. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js +0 -1033
  270. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-run-flow.component.js","sourceRoot":"","sources":["../../../../../src/lib/custom/ai-agent-run/flow/agent-run-flow.component.ts","../../../../../src/lib/custom/ai-agent-run/flow/agent-run-flow.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, Input, ElementRef, ViewChild, NgZone, ChangeDetectorRef,\n OnDestroy, AfterViewInit, ChangeDetectionStrategy, inject\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { combineLatest } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { CompositeKey } from '@memberjunction/core';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport { AIAgentRunDataHelper } from '../ai-agent-run-data.service';\nimport { TimelineItem } from '../ai-agent-run-timeline.component';\nimport {\n FlowModel, FlowNode, buildFlowModel, activeLeaf, ancestors,\n formatDuration, shortLabel, FLOW_COLORS, FLOW_EMOJI, FLOW_LABEL\n} from './agent-run-flow.model';\nimport { FlameCascadeComponent } from './flame-cascade.component';\nimport { SubwayLinesComponent } from './subway-lines.component';\nimport { ConstellationComponent } from './constellation.component';\nimport { FlowchartComponent } from './flowchart.component';\n\ninterface FlowMode { key: string; label: string; icon: string; enabled: boolean; }\n\n/**\n * Flow — the playable, zoomed-out execution view for an Agent Run.\n *\n * Owns the single master clock (scrub / play / speed) and the narration rail,\n * and hosts three interchangeable renderers (Flame, Subway, Constellation).\n * The per-frame loop runs *outside* Angular's zone and pushes updates straight\n * to the DOM / active renderer, so 60fps playback never triggers change detection.\n */\n@Component({\n standalone: false,\n selector: 'mj-ai-agent-run-flow',\n templateUrl: './agent-run-flow.component.html',\n styleUrls: ['./agent-run-flow.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AIAgentRunFlowComponent implements AfterViewInit, OnDestroy {\n @Input() aiAgentRunId!: string;\n @Input() dataHelper!: AIAgentRunDataHelper;\n @Input() agentName: string | null = null;\n @Input() runStatus = '';\n @Input() agentIconClass: string | null = null;\n @Input() agentLogoUrl: string | null = null;\n\n public modes: FlowMode[] = [\n { key: 'subway', label: 'Subway Lines', icon: 'fa-train-subway', enabled: true },\n { key: 'constellation', label: 'Constellation', icon: 'fa-star', enabled: true },\n { key: 'flow', label: 'Flow', icon: 'fa-diagram-project', enabled: true },\n { key: 'flame', label: 'Flame Cascade', icon: 'fa-fire', enabled: true }\n ];\n public mode = 'subway';\n public model: FlowModel | null = null;\n public playing = false;\n public speed = 1;\n public loading = true;\n public hasData = false;\n /** Selected node detail (any mode). */\n public selectedStepItem: TimelineItem | null = null;\n private selectedNodeId = -1;\n private logRows = new Map<number, HTMLElement>();\n private lastActiveRowId = -1;\n\n /** The animated modes share the master clock + narration rail; Flow is static. */\n public get isAnimated(): boolean { return this.mode !== 'flow'; }\n /** Rail (now-executing + log tree) shows only for animated modes with nothing selected. */\n public get showRail(): boolean { return this.isAnimated && !this.selectedStepItem; }\n\n /** Right-panel width (rail / inspector), resizable + persisted per user. Default is 50px wider than the old fixed panel. */\n public panelWidth = 410;\n private readonly PANEL_KEY = 'mj.agentRunFlow.panelWidth.v1';\n private resizing = false;\n private resizeStartX = 0;\n private resizeStartW = 0;\n\n @ViewChild(FlameCascadeComponent) private flame?: FlameCascadeComponent;\n @ViewChild(SubwayLinesComponent) private subway?: SubwayLinesComponent;\n @ViewChild(ConstellationComponent) private constellation?: ConstellationComponent;\n @ViewChild(FlowchartComponent) private flowchart?: FlowchartComponent;\n\n @ViewChild('scrub') private scrubRef?: ElementRef<HTMLInputElement>;\n @ViewChild('clock') private clockRef?: ElementRef<HTMLElement>;\n @ViewChild('crumb') private crumbRef?: ElementRef<HTMLElement>;\n @ViewChild('nowIco') private nowIcoRef?: ElementRef<HTMLElement>;\n @ViewChild('nowName') private nowNameRef?: ElementRef<HTMLElement>;\n @ViewChild('nowType') private nowTypeRef?: ElementRef<HTMLElement>;\n @ViewChild('nowDur') private nowDurRef?: ElementRef<HTMLElement>;\n @ViewChild('nowModel') private nowModelRef?: ElementRef<HTMLElement>;\n @ViewChild('nowStat') private nowStatRef?: ElementRef<HTMLElement>;\n @ViewChild('nowBar') private nowBarRef?: ElementRef<HTMLElement>;\n @ViewChild('loglist') private loglistRef?: ElementRef<HTMLElement>;\n\n private destroy$ = new Subject<void>();\n private rafId: number | null = null;\n private p = 0;\n private lastTs = 0;\n private readonly PLAY_MS = 11000;\n private logModelRef: FlowModel | null = null;\n private lastLeafId = -1;\n private viewReady = false;\n\n private zone = inject(NgZone);\n private cdr = inject(ChangeDetectorRef);\n\n ngAfterViewInit(): void {\n this.viewReady = true;\n const savedW = UserInfoEngine.Instance.GetSetting(this.PANEL_KEY);\n if (savedW) { const n = +savedW; if (n >= 280) this.panelWidth = Math.min(n, this.maxPanelWidth()); }\n combineLatest([this.dataHelper.steps$, this.dataHelper.loading$])\n .pipe(takeUntil(this.destroy$))\n .subscribe(([steps, loading]) => {\n this.loading = loading && steps.length === 0;\n if (!loading || steps.length > 0) this.rebuildModel();\n this.cdr.markForCheck();\n });\n this.zone.runOutsideAngular(() => {\n this.rafId = requestAnimationFrame(ts => this.tick(ts));\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next(); this.destroy$.complete();\n if (this.rafId != null) cancelAnimationFrame(this.rafId);\n }\n\n private async rebuildModel(): Promise<void> {\n const wasEmpty = !this.model;\n await AIEngineBase.Instance.EnsureLoaded(); // agent icons/logos read synchronously during build\n const rootIcon = { iconClass: this.agentIconClass || 'fa-robot', logoUrl: this.agentLogoUrl };\n const model = await buildFlowModel(this.agentName ?? '', this.runStatus, rootIcon, this.dataHelper);\n this.model = model;\n this.hasData = model.leaves.length > 0;\n if (wasEmpty) this.p = 0;\n this.lastLeafId = -1;\n this.cdr.markForCheck();\n }\n\n /* -------------------------------- transport ------------------------------- */\n\n public togglePlay(): void {\n if (!this.hasData) return;\n if (this.p >= 1) this.p = 0;\n this.playing = !this.playing;\n this.lastTs = 0;\n }\n\n public restart(): void {\n if (!this.hasData) return;\n this.p = 0; this.playing = true; this.lastTs = 0;\n this.lastLeafId = -1;\n }\n\n public onScrub(value: string): void {\n this.p = (+value) / 1000;\n this.playing = false;\n }\n\n public onSpeed(value: string): void { this.speed = (+value) / 100; }\n\n public selectMode(m: FlowMode): void {\n if (!m.enabled) return;\n this.mode = m.key;\n this.applyRendererSelection(this.selectedNodeId === -1 ? null : this.selectedNodeId);\n this.currentRenderer?.ReapplyView?.(); // ensure the now-visible renderer shows its OWN (per-type) zoom\n }\n\n private get currentRenderer(): { Render(p: number, ts: number): void; ZoomIn?(): void; ZoomOut?(): void; FitReset?(): void; ReapplyView?(): void } | undefined {\n switch (this.mode) {\n case 'flame': return this.flame;\n case 'subway': return this.subway;\n case 'constellation': return this.constellation;\n case 'flow': return this.flowchart;\n default: return undefined;\n }\n }\n\n /* --------------------------- zoom (shared toolbar) ------------------------ */\n\n public zoomIn(): void { this.currentRenderer?.ZoomIn?.(); }\n public zoomOut(): void { this.currentRenderer?.ZoomOut?.(); }\n public fitReset(): void { this.currentRenderer?.FitReset?.(); }\n\n /* ---------------------------- panel resize ------------------------------- */\n\n /** Cap the right panel at 75% of the viewport width. */\n private maxPanelWidth(): number { return Math.max(360, window.innerWidth * 0.75); }\n\n public startResize(e: MouseEvent): void {\n e.preventDefault();\n this.resizing = true;\n this.resizeStartX = e.clientX;\n this.resizeStartW = this.panelWidth;\n const move = (ev: MouseEvent) => {\n if (!this.resizing) return;\n const w = this.resizeStartW + (this.resizeStartX - ev.clientX); // drag left → wider\n this.panelWidth = Math.max(280, Math.min(this.maxPanelWidth(), w));\n this.cdr.markForCheck();\n };\n const up = () => {\n this.resizing = false;\n window.removeEventListener('mousemove', move);\n window.removeEventListener('mouseup', up);\n UserInfoEngine.Instance.SetSettingDebounced(this.PANEL_KEY, String(Math.round(this.panelWidth)));\n };\n window.addEventListener('mousemove', move);\n window.addEventListener('mouseup', up);\n }\n\n /* -------------------------------- selection ------------------------------ */\n\n /** A node was clicked in any renderer (or a log row) — highlight it everywhere and show its detail. */\n public selectStep(n: FlowNode): void {\n this.zone.run(() => {\n this.selectedNodeId = n.id;\n this.selectedStepItem = this.toTimelineItem(n);\n this.cdr.markForCheck();\n });\n this.applyRendererSelection(n.id);\n }\n\n public closeDetail(): void {\n this.zone.run(() => { this.selectedStepItem = null; this.selectedNodeId = -1; this.cdr.markForCheck(); });\n this.applyRendererSelection(null);\n this.flowchart?.Deselect();\n }\n\n private applyRendererSelection(id: number | null): void {\n this.flame?.SetSelected(id);\n this.subway?.SetSelected(id);\n this.constellation?.SetSelected(id);\n }\n\n public onDetailNavigateActionLog(logId: string): void {\n SharedService.Instance.OpenEntityRecord('MJ: Action Execution Logs', CompositeKey.FromID(logId));\n }\n\n public async onDetailCopy(text: string): Promise<void> {\n try { await navigator.clipboard.writeText(text); } catch { /* clipboard unavailable */ }\n }\n\n private toTimelineItem(n: FlowNode): TimelineItem | null {\n if (!n.raw) return null;\n return {\n id: n.raw.ID, type: 'step', title: n.name, subtitle: `Type: ${n.raw.StepType}`,\n status: n.status, startTime: n.raw.StartedAt, endTime: n.raw.CompletedAt || undefined,\n duration: formatDuration(n.realDur), icon: 'fa-circle', color: '', data: n.raw, level: n.depth\n };\n }\n\n /* ------------------------------- master loop ------------------------------ */\n\n private tick(ts: number): void {\n const animated = this.isAnimated;\n if (animated && this.playing && this.hasData) {\n if (!this.lastTs) this.lastTs = ts;\n const dt = ts - this.lastTs; this.lastTs = ts;\n this.p += dt / (this.PLAY_MS / this.speed);\n if (this.p >= 1) { this.p = 1; this.playing = false; this.zone.run(() => this.cdr.markForCheck()); }\n } else {\n this.lastTs = 0;\n }\n if (this.viewReady && this.model && this.hasData) {\n if (animated) {\n this.currentRenderer?.Render(this.p, ts);\n this.updateRail(ts);\n } else {\n // Flow (static): just ensure the flowchart is built; no clock.\n this.flowchart?.Render(0, ts);\n }\n }\n this.rafId = requestAnimationFrame(t => this.tick(t));\n }\n\n /* ------------------------------ narration rail ---------------------------- */\n\n private updateRail(_ts: number): void {\n const m = this.model!;\n\n // (Re)populate the imperative rail content whenever the rail DOM is fresh\n // (the @if remounted it with template defaults) or the model changed. Without\n // this, a remount at run-completion leaves an empty log + a blank now-card.\n if (this.loglistRef &&\n (this.logModelRef !== m || (this.loglistRef.nativeElement.childElementCount === 0 && m.nodes.length > 1))) {\n this.buildLogTree();\n this.logModelRef = m;\n this.lastLeafId = -1; // force the now-card to repopulate the fresh DOM\n }\n\n const leaf = activeLeaf(m, this.p);\n const prog = this.p >= leaf.t1 ? 1 : Math.max(0, (this.p - leaf.t0) / (leaf.t1 - leaf.t0));\n\n if (this.scrubRef) this.scrubRef.nativeElement.value = String(Math.round(this.p * 1000));\n if (this.clockRef) {\n const realT = this.p >= 1 ? m.total : leaf.r0 + prog * leaf.realDur;\n this.clockRef.nativeElement.textContent = `${formatDuration(realT)} / ${formatDuration(m.total)}`;\n }\n if (this.nowBarRef) this.nowBarRef.nativeElement.style.width = `${prog * 100}%`;\n\n if (leaf.id !== this.lastLeafId) {\n this.lastLeafId = leaf.id;\n this.refreshNowCard(leaf);\n }\n if (this.nowStatRef) {\n this.nowStatRef.nativeElement.textContent = this.p >= 1 ? 'done' : (this.p > leaf.t0 ? 'running' : 'starting');\n }\n if (this.loglistRef) this.updateLogTree();\n }\n\n private refreshNowCard(leaf: FlowNode): void {\n const col = FLOW_COLORS[leaf.type];\n if (this.nowIcoRef) this.nowIcoRef.nativeElement.textContent = FLOW_EMOJI[leaf.type];\n if (this.nowNameRef) this.nowNameRef.nativeElement.textContent = leaf.name;\n if (this.nowTypeRef) {\n this.nowTypeRef.nativeElement.textContent = FLOW_LABEL[leaf.type];\n this.nowTypeRef.nativeElement.style.color = col;\n }\n if (this.nowDurRef) this.nowDurRef.nativeElement.textContent = formatDuration(leaf.realDur);\n if (this.nowModelRef) this.nowModelRef.nativeElement.textContent = leaf.model ?? '—';\n if (this.crumbRef) {\n const chain = ancestors(leaf);\n this.crumbRef.nativeElement.innerHTML = chain.map((n, i) =>\n `${i ? '<span class=\"sep\">›</span>' : ''}<span style=\"color:${FLOW_COLORS[n.type]}\">${FLOW_EMOJI[n.type]} ${this.escape(n.name)}</span>`\n ).join('');\n }\n }\n\n /* ------------------------------ log tree (rail) --------------------------- */\n\n /** Build a clickable indented tree of every step, mirroring the run hierarchy. */\n private buildLogTree(): void {\n const list = this.loglistRef!.nativeElement;\n list.innerHTML = '';\n this.logRows.clear();\n this.lastActiveRowId = -1;\n const m = this.model!;\n for (const n of m.nodes) {\n if (n.depth === 0) continue; // skip the synthetic root (it's the header)\n const col = FLOW_COLORS[n.type];\n const row = document.createElement('div');\n row.className = 'ftree-row';\n row.style.paddingLeft = `${6 + (n.depth - 1) * 15}px`;\n const ico = n.logoUrl\n ? `<img class=\"ftree-logo\" src=\"${this.escape(n.logoUrl)}\" alt=\"\"/>`\n : `<i class=\"ftree-ico fa-solid ${this.escape(n.iconClass)}\" style=\"color:${col}\"></i>`;\n row.innerHTML = ico +\n `<span class=\"ftree-name\">${this.escape(shortLabel(n))}</span>` +\n `<span class=\"ftree-dur\">${formatDuration(n.realDur)}</span>`;\n row.addEventListener('click', () => this.selectStep(n));\n list.appendChild(row);\n this.logRows.set(n.id, row);\n }\n }\n\n /** Sync each log row's state (pending / running / done / selected) with the clock. */\n private updateLogTree(): void {\n const m = this.model!;\n for (const n of m.nodes) {\n if (n.depth === 0) continue;\n const row = this.logRows.get(n.id);\n if (!row) continue;\n const started = this.p >= n.t0;\n const active = started && this.p < n.t1;\n row.classList.toggle('ftree-pending', !started);\n row.classList.toggle('ftree-active', active);\n row.classList.toggle('ftree-done', this.p >= n.t1);\n row.classList.toggle('ftree-selected', n.id === this.selectedNodeId);\n if (active && n.id !== this.lastActiveRowId && !n.children.length) {\n this.lastActiveRowId = n.id;\n row.scrollIntoView({ block: 'nearest' });\n }\n }\n }\n\n private escape(s: string): string {\n return s.replace(/[&<>\"]/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;' }[c] ?? c));\n }\n}\n","<div class=\"flow-cockpit\">\n <!-- mode segmented control -->\n <div class=\"flow-modes\">\n @for (m of modes; track m.key) {\n <button class=\"flow-mode\" [class.on]=\"mode === m.key\" [class.soon]=\"!m.enabled\"\n [disabled]=\"!m.enabled\" (click)=\"selectMode(m)\"\n [title]=\"m.enabled ? m.label : m.label + ' — coming soon'\">\n <i class=\"fas\" [ngClass]=\"m.icon\"></i>\n <span>{{ m.label }}</span>\n @if (!m.enabled) { <span class=\"soon-tag\">Soon</span> }\n </button>\n }\n </div>\n\n <div class=\"flow-main\">\n <!-- stage -->\n <div class=\"flow-stage\">\n @if (loading) {\n <div class=\"flow-overlay\"><mj-loading text=\"Building flow…\"></mj-loading></div>\n } @else if (!hasData) {\n <div class=\"flow-overlay flow-empty\">\n <i class=\"fas fa-wind\"></i>\n <p>No steps recorded for this run yet.</p>\n </div>\n }\n\n <mj-agent-flow-flame [class.flow-hidden]=\"mode !== 'flame'\" [Model]=\"model\" (nodeSelected)=\"selectStep($event)\"></mj-agent-flow-flame>\n <mj-agent-flow-subway [class.flow-hidden]=\"mode !== 'subway'\" [Model]=\"model\" (nodeSelected)=\"selectStep($event)\"></mj-agent-flow-subway>\n <mj-agent-flow-constellation [class.flow-hidden]=\"mode !== 'constellation'\" [Model]=\"model\" (nodeSelected)=\"selectStep($event)\"></mj-agent-flow-constellation>\n <mj-agent-flow-flowchart [class.flow-hidden]=\"mode !== 'flow'\" [Model]=\"model\"\n (nodeSelected)=\"selectStep($event)\"\n (selectionCleared)=\"closeDetail()\"></mj-agent-flow-flowchart>\n\n @if (hasData) {\n <div class=\"flow-zoom\">\n <button class=\"fz-btn\" (click)=\"zoomIn()\" title=\"Zoom in\"><i class=\"fas fa-magnifying-glass-plus\"></i></button>\n <button class=\"fz-btn\" (click)=\"zoomOut()\" title=\"Zoom out\"><i class=\"fas fa-magnifying-glass-minus\"></i></button>\n <button class=\"fz-btn\" (click)=\"fitReset()\" title=\"Fit to view\"><i class=\"fas fa-expand\"></i></button>\n </div>\n }\n </div>\n\n <!-- narration rail (animated modes, nothing selected) -->\n @if (showRail) {\n <aside class=\"flow-rail\" [style.width.px]=\"panelWidth\">\n <div class=\"flow-resizer\" (mousedown)=\"startResize($event)\" title=\"Drag to resize\"></div>\n <div class=\"now\">\n <div class=\"rail-lbl\">Now executing</div>\n <div class=\"breadcrumb\" #crumb></div>\n <div class=\"nowcard\">\n <div class=\"ico\" #nowIco>🤖</div>\n <h3 #nowName>—</h3>\n <div class=\"type\" #nowType>Agent run</div>\n <div class=\"meta\">\n <div>Duration<b #nowDur>—</b></div>\n <div>Status<b #nowStat>—</b></div>\n <div>Model<b #nowModel>—</b></div>\n </div>\n <div class=\"barbg\"><div class=\"barfg\" #nowBar></div></div>\n </div>\n </div>\n <div class=\"log\">\n <div class=\"rail-lbl sticky\">Execution log</div>\n <div #loglist class=\"loglist\"></div>\n </div>\n </aside>\n }\n\n <!-- step inspector (any mode) -->\n @if (selectedStepItem) {\n <aside class=\"flow-detail\" [style.width.px]=\"panelWidth\">\n <div class=\"flow-resizer\" (mousedown)=\"startResize($event)\" title=\"Drag to resize\"></div>\n <mj-ai-agent-run-step-detail\n [selectedTimelineItem]=\"selectedStepItem\"\n (closePanel)=\"closeDetail()\"\n (navigateToActionLog)=\"onDetailNavigateActionLog($event)\"\n (copyToClipboard)=\"onDetailCopy($event)\">\n </mj-ai-agent-run-step-detail>\n </aside>\n }\n </div>\n\n <!-- transport (animated modes only) -->\n @if (isAnimated) {\n <div class=\"flow-transport\">\n <button class=\"pbtn\" (click)=\"togglePlay()\" [disabled]=\"!hasData\" [title]=\"playing ? 'Pause' : 'Play'\">\n <i class=\"fas\" [ngClass]=\"playing ? 'fa-pause' : 'fa-play'\"></i>\n </button>\n <button class=\"ibtn\" (click)=\"restart()\" [disabled]=\"!hasData\" title=\"Restart\">\n <i class=\"fas fa-rotate-left\"></i>\n </button>\n <input #scrub class=\"scrub\" type=\"range\" min=\"0\" max=\"1000\" value=\"0\"\n [disabled]=\"!hasData\" (input)=\"onScrub(scrub.value)\"/>\n <div class=\"clock\" #clock>0s / 0s</div>\n <div class=\"speedbox\">\n <i class=\"fas fa-gauge-high\"></i>\n <input class=\"speed\" type=\"range\" min=\"25\" max=\"300\" value=\"100\" (input)=\"onSpeed($any($event.target).value)\"/>\n <span class=\"spdval\">{{ speed.toFixed(1) }}×</span>\n </div>\n </div>\n }\n\n <!-- legend / hint -->\n <div class=\"flow-legend\">\n @if (isAnimated) {\n <span><i class=\"lg\" style=\"background: var(--mj-text-muted)\"></i>Hint:</span>\n <span class=\"legend-note\">Playback is compressed so every step is visible — real duration shows through heat, size &amp; speed, not literal width.</span>\n } @else {\n <span><i class=\"lg\" style=\"background: var(--mj-text-muted)\"></i>Tip:</span>\n <span class=\"legend-note\">Drag to pan, scroll to zoom, click any node to inspect it. Layout is the full execution tree, top to bottom.</span>\n }\n </div>\n</div>\n"]}
@@ -0,0 +1,94 @@
1
+ import { MJAIAgentRunStepEntity } from '@memberjunction/core-entities';
2
+ import { AIAgentRunDataHelper } from '../ai-agent-run-data.service';
3
+ /** Root-agent icon, resolved by the caller from the run's agent metadata. */
4
+ export interface RootIcon {
5
+ iconClass: string;
6
+ logoUrl: string | null;
7
+ }
8
+ /**
9
+ * Shared, framework-agnostic flow model for the Agent Run "Flow" visualizations.
10
+ *
11
+ * One adapter (`buildFlowModel`) turns the raw step / sub-run / prompt-run data
12
+ * from {@link AIAgentRunDataHelper} into a normalized {@link FlowNode} tree that
13
+ * every renderer (Flame Cascade, Subway Lines, Constellation, …) consumes.
14
+ *
15
+ * Two clocks are baked into each node:
16
+ * - **playback time** (`t0`/`t1`, range 0..1): compressed so every step gets
17
+ * visible airtime regardless of real duration. This is what the scrubber drives.
18
+ * - **real time** (`r0`/`r1`, seconds): the true cumulative wall-clock, used for
19
+ * the digital clock readout and the narration rail.
20
+ *
21
+ * True duration is therefore never encoded as literal playback width — renderers
22
+ * surface it through a *visual* channel (heat glow, node size, sweep speed).
23
+ */
24
+ export type FlowNodeType = 'agent' | 'subagent' | 'prompt' | 'action' | 'decision' | 'loop' | 'validation' | 'other';
25
+ export interface FlowNode {
26
+ /** Stable index within the flattened model (renderer scratch keys off this). */
27
+ id: number;
28
+ name: string;
29
+ type: FlowNodeType;
30
+ status: string;
31
+ model: string | null;
32
+ /** Real duration in seconds (container nodes = sum of children). */
33
+ realDur: number;
34
+ /** Normalized playback window [0..1]. */
35
+ t0: number;
36
+ t1: number;
37
+ tmid: number;
38
+ /** Real cumulative wall-clock window in seconds. */
39
+ r0: number;
40
+ r1: number;
41
+ depth: number;
42
+ /** Relative heat tier 0..3 (3 = among the longest steps in this run). */
43
+ heat: 0 | 1 | 2 | 3;
44
+ parent: FlowNode | null;
45
+ children: FlowNode[];
46
+ /** Underlying step entity (null for the synthetic root). Enables click-through. */
47
+ raw: MJAIAgentRunStepEntity | null;
48
+ /** Font Awesome class (e.g. 'fa-brain'); sub-agents resolve their agent's icon. */
49
+ iconClass: string;
50
+ /** Agent logo image URL when available (sub-agents / root), else null. */
51
+ logoUrl: string | null;
52
+ }
53
+ export interface FlowModel {
54
+ root: FlowNode;
55
+ nodes: FlowNode[];
56
+ leaves: FlowNode[];
57
+ total: number;
58
+ maxDepth: number;
59
+ maxLeafDur: number;
60
+ }
61
+ /** Categorical data-visualization palette (per CLAUDE.md, chart colors may be literal). */
62
+ export declare const FLOW_COLORS: Record<FlowNodeType, string>;
63
+ export declare const FLOW_EMOJI: Record<FlowNodeType, string>;
64
+ /** Font Awesome icon per type — mirrors the Timeline's step icons. */
65
+ export declare const FLOW_ICON: Record<FlowNodeType, string>;
66
+ export declare const FLOW_LABEL: Record<FlowNodeType, string>;
67
+ /**
68
+ * Build the full normalized flow model for an agent run. Eagerly walks the whole
69
+ * sub-agent tree (via the helper's cached `loadSubAgentData`) so the zoomed-out
70
+ * view shows the entire run at once.
71
+ */
72
+ export declare function buildFlowModel(rootName: string, rootStatus: string, rootIcon: RootIcon, helper: AIAgentRunDataHelper): Promise<FlowModel>;
73
+ export declare function activeLeaf(model: FlowModel, p: number): FlowNode;
74
+ export declare function ancestors(n: FlowNode): FlowNode[];
75
+ export declare function agentOf(n: FlowNode): FlowNode;
76
+ /** "Execute Sub-Agent: Query Strategist" → "Query Strategist". */
77
+ export declare function agentShortName(a: FlowNode): string;
78
+ /**
79
+ * Label with the owning agent's prefix stripped — child step names tend to be
80
+ * "Query Strategist: Execute Agent Prompt"; on a view that already shows which
81
+ * agent/line a node belongs to, the prefix is pure noise that causes overlap.
82
+ */
83
+ export declare function displayName(n: FlowNode): string;
84
+ /**
85
+ * Aggressively abbreviated label for tight surfaces (subway stations, flame bars,
86
+ * stars). Strips the agent prefix, then collapses the verbose MJ step phrasing:
87
+ * "Execute Sub-Agent: Query Strategist" → "Query Strategist Sub-Agent"
88
+ * "Execute Agent Prompt" → "Prompt"
89
+ * "Execute Action: Search Query Catalog"→ "Search Query Catalog"
90
+ * "Agent Validation" → "Validation"
91
+ */
92
+ export declare function shortLabel(n: FlowNode): string;
93
+ export declare function formatDuration(seconds: number): string;
94
+ //# sourceMappingURL=agent-run-flow.model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-run-flow.model.d.ts","sourceRoot":"","sources":["../../../../../src/lib/custom/ai-agent-run/flow/agent-run-flow.model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,257 @@
1
+ import { UUIDsEqual } from '@memberjunction/global';
2
+ import { AIEngineBase } from '@memberjunction/ai-engine-base';
3
+ /** Categorical data-visualization palette (per CLAUDE.md, chart colors may be literal). */
4
+ export const FLOW_COLORS = {
5
+ agent: '#11a8e6', subagent: '#f59e0b', prompt: '#3b82f6', action: '#22c55e',
6
+ decision: '#ef4444', loop: '#a855f7', validation: '#14b8a6', other: '#94a3b8'
7
+ };
8
+ export const FLOW_EMOJI = {
9
+ agent: '🤖', subagent: '🤖', prompt: '💬', action: '⚙️',
10
+ decision: '🔀', loop: '🔁', validation: '✓', other: '•'
11
+ };
12
+ /** Font Awesome icon per type — mirrors the Timeline's step icons. */
13
+ export const FLOW_ICON = {
14
+ agent: 'fa-robot', subagent: 'fa-robot', prompt: 'fa-brain', action: 'fa-wrench',
15
+ decision: 'fa-code-branch', loop: 'fa-repeat', validation: 'fa-square-check', other: 'fa-circle'
16
+ };
17
+ export const FLOW_LABEL = {
18
+ agent: 'Agent run', subagent: 'Sub-agent', prompt: 'Prompt', action: 'Action',
19
+ decision: 'Decision', loop: 'Loop', validation: 'Validation', other: 'Step'
20
+ };
21
+ function flowType(stepType) {
22
+ switch (stepType) {
23
+ case 'Prompt': return 'prompt';
24
+ case 'Actions':
25
+ case 'Tool': return 'action';
26
+ case 'Sub-Agent': return 'subagent';
27
+ case 'Decision': return 'decision';
28
+ case 'ForEach':
29
+ case 'While': return 'loop';
30
+ case 'Validation': return 'validation';
31
+ default: return 'other';
32
+ }
33
+ }
34
+ /** Compression curve: longer steps still get more airtime, but sub-linearly. */
35
+ function comp(d) { return Math.pow(Math.max(d, 0.001), 0.55); }
36
+ function durationSeconds(start, end) {
37
+ if (!start)
38
+ return 0.1;
39
+ const s = new Date(start).getTime();
40
+ const e = end ? new Date(end).getTime() : Date.now();
41
+ return Math.max(0.05, (e - s) / 1000);
42
+ }
43
+ /** Resolve a step's icon: sub-agents use their agent's logo/icon, else the type icon. */
44
+ function stepIcon(step, type) {
45
+ if (step.StepType === 'Sub-Agent' && step.TargetID) {
46
+ const agent = AIEngineBase.Instance.Agents.find(a => UUIDsEqual(a.ID, step.TargetID));
47
+ if (agent?.LogoURL)
48
+ return { iconClass: 'fa-robot', logoUrl: agent.LogoURL };
49
+ if (agent?.IconClass)
50
+ return { iconClass: agent.IconClass, logoUrl: null };
51
+ }
52
+ return { iconClass: FLOW_ICON[type], logoUrl: null };
53
+ }
54
+ function makeStepNode(step, promptRuns) {
55
+ const type = flowType(step.StepType);
56
+ let model = null;
57
+ if (type === 'prompt' && step.TargetLogID) {
58
+ const pr = promptRuns.find(p => UUIDsEqual(p.ID, step.TargetLogID));
59
+ model = pr?.Model ?? null;
60
+ }
61
+ const icon = stepIcon(step, type);
62
+ return {
63
+ id: -1, name: step.StepName || `Step ${step.StepNumber}`, type, status: step.Status,
64
+ model, realDur: durationSeconds(step.StartedAt, step.CompletedAt),
65
+ t0: 0, t1: 0, tmid: 0, r0: 0, r1: 0, depth: 0, heat: 0,
66
+ parent: null, children: [], raw: step, iconClass: icon.iconClass, logoUrl: icon.logoUrl
67
+ };
68
+ }
69
+ /**
70
+ * Recursively attach a level of steps to `parent`, nesting both loop bodies
71
+ * (`ParentID`) and sub-agent runs (`Sub-Agent` step → its own run's steps).
72
+ */
73
+ async function attachStepTree(parent, steps, promptRuns, helper) {
74
+ const byId = new Map();
75
+ steps.forEach(s => byId.set(s.ID, makeStepNode(s, promptRuns)));
76
+ // Nest loop bodies via ParentID; everything else hangs off `parent`.
77
+ for (const s of steps) {
78
+ const node = byId.get(s.ID);
79
+ if (s.ParentID && byId.has(s.ParentID)) {
80
+ const par = byId.get(s.ParentID);
81
+ node.parent = par;
82
+ par.children.push(node);
83
+ }
84
+ else {
85
+ node.parent = parent;
86
+ parent.children.push(node);
87
+ }
88
+ }
89
+ // Recurse into sub-agent steps (their child steps need a separate load).
90
+ for (const s of steps) {
91
+ if (s.StepType === 'Sub-Agent' && s.TargetLogID) {
92
+ const node = byId.get(s.ID);
93
+ try {
94
+ const sub = await helper.loadSubAgentData(s.TargetLogID);
95
+ if (sub.steps?.length) {
96
+ await attachStepTree(node, sub.steps, sub.promptRuns, helper);
97
+ }
98
+ }
99
+ catch {
100
+ // Sub-agent load failed — leave it as a leaf with its own timing.
101
+ }
102
+ }
103
+ }
104
+ }
105
+ function calcDur(n) {
106
+ if (n.children.length)
107
+ n.realDur = n.children.reduce((s, c) => s + calcDur(c), 0);
108
+ return n.realDur;
109
+ }
110
+ function assignT(n, t0, t1) {
111
+ n.t0 = t0;
112
+ n.t1 = t1;
113
+ n.tmid = (t0 + t1) / 2;
114
+ if (n.children.length) {
115
+ const tot = n.children.reduce((s, c) => s + comp(c.realDur), 0) || 1;
116
+ let cur = t0;
117
+ for (const c of n.children) {
118
+ const w = (t1 - t0) * comp(c.realDur) / tot;
119
+ assignT(c, cur, cur + w);
120
+ cur += w;
121
+ }
122
+ }
123
+ }
124
+ function assignReal(n, r0) {
125
+ n.r0 = r0;
126
+ if (n.children.length) {
127
+ let cur = r0;
128
+ for (const c of n.children) {
129
+ assignReal(c, cur);
130
+ cur = c.r1;
131
+ }
132
+ n.r1 = cur;
133
+ }
134
+ else {
135
+ n.r1 = r0 + n.realDur;
136
+ }
137
+ return n.r1;
138
+ }
139
+ function flatten(n, depth, out) {
140
+ n.depth = depth;
141
+ n.id = out.length;
142
+ out.push(n);
143
+ n.children.forEach(c => flatten(c, depth + 1, out));
144
+ }
145
+ function heatTier(d, maxLeaf) {
146
+ const r = d / (maxLeaf || 1);
147
+ return r >= 0.66 ? 3 : r >= 0.33 ? 2 : r >= 0.12 ? 1 : 0;
148
+ }
149
+ /**
150
+ * Build the full normalized flow model for an agent run. Eagerly walks the whole
151
+ * sub-agent tree (via the helper's cached `loadSubAgentData`) so the zoomed-out
152
+ * view shows the entire run at once.
153
+ */
154
+ export async function buildFlowModel(rootName, rootStatus, rootIcon, helper) {
155
+ const { steps, promptRuns } = helper.getCurrentData();
156
+ const root = {
157
+ id: -1, name: rootName || 'Agent run', type: 'agent', status: rootStatus,
158
+ model: null, realDur: 0, t0: 0, t1: 1, tmid: 0.5, r0: 0, r1: 0, depth: 0, heat: 0,
159
+ parent: null, children: [], raw: null,
160
+ iconClass: rootIcon.iconClass || 'fa-robot', logoUrl: rootIcon.logoUrl
161
+ };
162
+ if (steps.length) {
163
+ await attachStepTree(root, steps, promptRuns, helper);
164
+ }
165
+ calcDur(root);
166
+ assignT(root, 0, 1);
167
+ assignReal(root, 0);
168
+ const nodes = [];
169
+ flatten(root, 0, nodes);
170
+ nodes.forEach(n => { n.tmid = (n.t0 + n.t1) / 2; });
171
+ const leaves = nodes.filter(n => n.children.length === 0).sort((a, b) => a.t0 - b.t0);
172
+ const maxLeafDur = Math.max(0.001, ...leaves.map(n => n.realDur));
173
+ nodes.forEach(n => { n.heat = heatTier(n.realDur, maxLeafDur); });
174
+ return {
175
+ root, nodes, leaves, total: root.realDur,
176
+ maxDepth: Math.max(0, ...nodes.map(n => n.depth)), maxLeafDur
177
+ };
178
+ }
179
+ /* ----------------------------- shared lookups ----------------------------- */
180
+ export function activeLeaf(model, p) {
181
+ const L = model.leaves;
182
+ if (!L.length)
183
+ return model.root;
184
+ if (p <= 0)
185
+ return L[0];
186
+ if (p >= 1)
187
+ return L[L.length - 1];
188
+ return L.find(l => p >= l.t0 && p < l.t1) ?? L[L.length - 1];
189
+ }
190
+ export function ancestors(n) {
191
+ const out = [];
192
+ let c = n;
193
+ while (c) {
194
+ out.unshift(c);
195
+ c = c.parent;
196
+ }
197
+ return out;
198
+ }
199
+ export function agentOf(n) {
200
+ let c = n.parent;
201
+ while (c) {
202
+ if (c.type === 'agent' || c.type === 'subagent')
203
+ return c;
204
+ c = c.parent;
205
+ }
206
+ return n;
207
+ }
208
+ /** "Execute Sub-Agent: Query Strategist" → "Query Strategist". */
209
+ export function agentShortName(a) {
210
+ const i = a.name.indexOf(': ');
211
+ return i >= 0 ? a.name.slice(i + 2) : a.name;
212
+ }
213
+ /**
214
+ * Label with the owning agent's prefix stripped — child step names tend to be
215
+ * "Query Strategist: Execute Agent Prompt"; on a view that already shows which
216
+ * agent/line a node belongs to, the prefix is pure noise that causes overlap.
217
+ */
218
+ export function displayName(n) {
219
+ const a = agentOf(n);
220
+ if (a && a !== n) {
221
+ const short = agentShortName(a);
222
+ if (short && n.name.startsWith(short + ':'))
223
+ return n.name.slice(short.length + 1).trim();
224
+ }
225
+ return n.name;
226
+ }
227
+ /**
228
+ * Aggressively abbreviated label for tight surfaces (subway stations, flame bars,
229
+ * stars). Strips the agent prefix, then collapses the verbose MJ step phrasing:
230
+ * "Execute Sub-Agent: Query Strategist" → "Query Strategist Sub-Agent"
231
+ * "Execute Agent Prompt" → "Prompt"
232
+ * "Execute Action: Search Query Catalog"→ "Search Query Catalog"
233
+ * "Agent Validation" → "Validation"
234
+ */
235
+ export function shortLabel(n) {
236
+ if (n.type === 'subagent')
237
+ return `${agentShortName(n)} Sub-Agent`;
238
+ let s = displayName(n);
239
+ s = s.replace(/^Execute Action:\s*/i, '').replace(/^Execute Sub-Agent:\s*/i, '');
240
+ if (/^Execute Agent Prompt$/i.test(s))
241
+ s = 'Prompt';
242
+ else if (/^Agent Validation$/i.test(s))
243
+ s = 'Validation';
244
+ else if (/^Data Source Preloading$/i.test(s))
245
+ s = 'Data Preload';
246
+ return s;
247
+ }
248
+ export function formatDuration(seconds) {
249
+ if (seconds < 1)
250
+ return `${Math.round(seconds * 1000)}ms`;
251
+ if (seconds < 60)
252
+ return `${seconds < 10 ? seconds.toFixed(1) : Math.round(seconds)}s`;
253
+ if (seconds < 3600)
254
+ return `${Math.floor(seconds / 60)}m ${Math.round(seconds % 60)}s`;
255
+ return `${Math.floor(seconds / 3600)}h ${Math.floor((seconds % 3600) / 60)}m`;
256
+ }
257
+ //# sourceMappingURL=agent-run-flow.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-run-flow.model.js","sourceRoot":"","sources":["../../../../../src/lib/custom/ai-agent-run/flow/agent-run-flow.model.ts"],"names":[],"mappings":"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","sourcesContent":["import { MJAIAgentRunStepEntity, MJAIPromptRunEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { AIAgentRunDataHelper } from '../ai-agent-run-data.service';\n\n/** Root-agent icon, resolved by the caller from the run's agent metadata. */\nexport interface RootIcon { iconClass: string; logoUrl: string | null; }\n\n/**\n * Shared, framework-agnostic flow model for the Agent Run \"Flow\" visualizations.\n *\n * One adapter (`buildFlowModel`) turns the raw step / sub-run / prompt-run data\n * from {@link AIAgentRunDataHelper} into a normalized {@link FlowNode} tree that\n * every renderer (Flame Cascade, Subway Lines, Constellation, …) consumes.\n *\n * Two clocks are baked into each node:\n * - **playback time** (`t0`/`t1`, range 0..1): compressed so every step gets\n * visible airtime regardless of real duration. This is what the scrubber drives.\n * - **real time** (`r0`/`r1`, seconds): the true cumulative wall-clock, used for\n * the digital clock readout and the narration rail.\n *\n * True duration is therefore never encoded as literal playback width — renderers\n * surface it through a *visual* channel (heat glow, node size, sweep speed).\n */\nexport type FlowNodeType =\n | 'agent' | 'subagent' | 'prompt' | 'action' | 'decision' | 'loop' | 'validation' | 'other';\n\nexport interface FlowNode {\n /** Stable index within the flattened model (renderer scratch keys off this). */\n id: number;\n name: string;\n type: FlowNodeType;\n status: string;\n model: string | null;\n /** Real duration in seconds (container nodes = sum of children). */\n realDur: number;\n /** Normalized playback window [0..1]. */\n t0: number;\n t1: number;\n tmid: number;\n /** Real cumulative wall-clock window in seconds. */\n r0: number;\n r1: number;\n depth: number;\n /** Relative heat tier 0..3 (3 = among the longest steps in this run). */\n heat: 0 | 1 | 2 | 3;\n parent: FlowNode | null;\n children: FlowNode[];\n /** Underlying step entity (null for the synthetic root). Enables click-through. */\n raw: MJAIAgentRunStepEntity | null;\n /** Font Awesome class (e.g. 'fa-brain'); sub-agents resolve their agent's icon. */\n iconClass: string;\n /** Agent logo image URL when available (sub-agents / root), else null. */\n logoUrl: string | null;\n}\n\nexport interface FlowModel {\n root: FlowNode;\n nodes: FlowNode[];\n leaves: FlowNode[];\n total: number;\n maxDepth: number;\n maxLeafDur: number;\n}\n\n/** Categorical data-visualization palette (per CLAUDE.md, chart colors may be literal). */\nexport const FLOW_COLORS: Record<FlowNodeType, string> = {\n agent: '#11a8e6', subagent: '#f59e0b', prompt: '#3b82f6', action: '#22c55e',\n decision: '#ef4444', loop: '#a855f7', validation: '#14b8a6', other: '#94a3b8'\n};\n\nexport const FLOW_EMOJI: Record<FlowNodeType, string> = {\n agent: '🤖', subagent: '🤖', prompt: '💬', action: '⚙️',\n decision: '🔀', loop: '🔁', validation: '✓', other: '•'\n};\n\n/** Font Awesome icon per type — mirrors the Timeline's step icons. */\nexport const FLOW_ICON: Record<FlowNodeType, string> = {\n agent: 'fa-robot', subagent: 'fa-robot', prompt: 'fa-brain', action: 'fa-wrench',\n decision: 'fa-code-branch', loop: 'fa-repeat', validation: 'fa-square-check', other: 'fa-circle'\n};\n\nexport const FLOW_LABEL: Record<FlowNodeType, string> = {\n agent: 'Agent run', subagent: 'Sub-agent', prompt: 'Prompt', action: 'Action',\n decision: 'Decision', loop: 'Loop', validation: 'Validation', other: 'Step'\n};\n\nfunction flowType(stepType: string | null | undefined): FlowNodeType {\n switch (stepType) {\n case 'Prompt': return 'prompt';\n case 'Actions':\n case 'Tool': return 'action';\n case 'Sub-Agent': return 'subagent';\n case 'Decision': return 'decision';\n case 'ForEach':\n case 'While': return 'loop';\n case 'Validation': return 'validation';\n default: return 'other';\n }\n}\n\n/** Compression curve: longer steps still get more airtime, but sub-linearly. */\nfunction comp(d: number): number { return Math.pow(Math.max(d, 0.001), 0.55); }\n\nfunction durationSeconds(start: Date | null | undefined, end: Date | null | undefined): number {\n if (!start) return 0.1;\n const s = new Date(start).getTime();\n const e = end ? new Date(end).getTime() : Date.now();\n return Math.max(0.05, (e - s) / 1000);\n}\n\n/** Resolve a step's icon: sub-agents use their agent's logo/icon, else the type icon. */\nfunction stepIcon(step: MJAIAgentRunStepEntity, type: FlowNodeType): { iconClass: string; logoUrl: string | null } {\n if (step.StepType === 'Sub-Agent' && step.TargetID) {\n const agent = AIEngineBase.Instance.Agents.find(a => UUIDsEqual(a.ID, step.TargetID!));\n if (agent?.LogoURL) return { iconClass: 'fa-robot', logoUrl: agent.LogoURL };\n if (agent?.IconClass) return { iconClass: agent.IconClass, logoUrl: null };\n }\n return { iconClass: FLOW_ICON[type], logoUrl: null };\n}\n\nfunction makeStepNode(step: MJAIAgentRunStepEntity, promptRuns: MJAIPromptRunEntity[]): FlowNode {\n const type = flowType(step.StepType);\n let model: string | null = null;\n if (type === 'prompt' && step.TargetLogID) {\n const pr = promptRuns.find(p => UUIDsEqual(p.ID, step.TargetLogID!));\n model = pr?.Model ?? null;\n }\n const icon = stepIcon(step, type);\n return {\n id: -1, name: step.StepName || `Step ${step.StepNumber}`, type, status: step.Status,\n model, realDur: durationSeconds(step.StartedAt, step.CompletedAt),\n t0: 0, t1: 0, tmid: 0, r0: 0, r1: 0, depth: 0, heat: 0,\n parent: null, children: [], raw: step, iconClass: icon.iconClass, logoUrl: icon.logoUrl\n };\n}\n\n/**\n * Recursively attach a level of steps to `parent`, nesting both loop bodies\n * (`ParentID`) and sub-agent runs (`Sub-Agent` step → its own run's steps).\n */\nasync function attachStepTree(\n parent: FlowNode,\n steps: MJAIAgentRunStepEntity[],\n promptRuns: MJAIPromptRunEntity[],\n helper: AIAgentRunDataHelper\n): Promise<void> {\n const byId = new Map<string, FlowNode>();\n steps.forEach(s => byId.set(s.ID, makeStepNode(s, promptRuns)));\n\n // Nest loop bodies via ParentID; everything else hangs off `parent`.\n for (const s of steps) {\n const node = byId.get(s.ID)!;\n if (s.ParentID && byId.has(s.ParentID)) {\n const par = byId.get(s.ParentID)!;\n node.parent = par; par.children.push(node);\n } else {\n node.parent = parent; parent.children.push(node);\n }\n }\n\n // Recurse into sub-agent steps (their child steps need a separate load).\n for (const s of steps) {\n if (s.StepType === 'Sub-Agent' && s.TargetLogID) {\n const node = byId.get(s.ID)!;\n try {\n const sub = await helper.loadSubAgentData(s.TargetLogID);\n if (sub.steps?.length) {\n await attachStepTree(node, sub.steps, sub.promptRuns, helper);\n }\n } catch {\n // Sub-agent load failed — leave it as a leaf with its own timing.\n }\n }\n }\n}\n\nfunction calcDur(n: FlowNode): number {\n if (n.children.length) n.realDur = n.children.reduce((s, c) => s + calcDur(c), 0);\n return n.realDur;\n}\n\nfunction assignT(n: FlowNode, t0: number, t1: number): void {\n n.t0 = t0; n.t1 = t1; n.tmid = (t0 + t1) / 2;\n if (n.children.length) {\n const tot = n.children.reduce((s, c) => s + comp(c.realDur), 0) || 1;\n let cur = t0;\n for (const c of n.children) {\n const w = (t1 - t0) * comp(c.realDur) / tot;\n assignT(c, cur, cur + w); cur += w;\n }\n }\n}\n\nfunction assignReal(n: FlowNode, r0: number): number {\n n.r0 = r0;\n if (n.children.length) {\n let cur = r0;\n for (const c of n.children) { assignReal(c, cur); cur = c.r1; }\n n.r1 = cur;\n } else {\n n.r1 = r0 + n.realDur;\n }\n return n.r1;\n}\n\nfunction flatten(n: FlowNode, depth: number, out: FlowNode[]): void {\n n.depth = depth; n.id = out.length; out.push(n);\n n.children.forEach(c => flatten(c, depth + 1, out));\n}\n\nfunction heatTier(d: number, maxLeaf: number): 0 | 1 | 2 | 3 {\n const r = d / (maxLeaf || 1);\n return r >= 0.66 ? 3 : r >= 0.33 ? 2 : r >= 0.12 ? 1 : 0;\n}\n\n/**\n * Build the full normalized flow model for an agent run. Eagerly walks the whole\n * sub-agent tree (via the helper's cached `loadSubAgentData`) so the zoomed-out\n * view shows the entire run at once.\n */\nexport async function buildFlowModel(\n rootName: string,\n rootStatus: string,\n rootIcon: RootIcon,\n helper: AIAgentRunDataHelper\n): Promise<FlowModel> {\n const { steps, promptRuns } = helper.getCurrentData();\n\n const root: FlowNode = {\n id: -1, name: rootName || 'Agent run', type: 'agent', status: rootStatus,\n model: null, realDur: 0, t0: 0, t1: 1, tmid: 0.5, r0: 0, r1: 0, depth: 0, heat: 0,\n parent: null, children: [], raw: null,\n iconClass: rootIcon.iconClass || 'fa-robot', logoUrl: rootIcon.logoUrl\n };\n\n if (steps.length) {\n await attachStepTree(root, steps, promptRuns, helper);\n }\n\n calcDur(root);\n assignT(root, 0, 1);\n assignReal(root, 0);\n\n const nodes: FlowNode[] = [];\n flatten(root, 0, nodes);\n nodes.forEach(n => { n.tmid = (n.t0 + n.t1) / 2; });\n\n const leaves = nodes.filter(n => n.children.length === 0).sort((a, b) => a.t0 - b.t0);\n const maxLeafDur = Math.max(0.001, ...leaves.map(n => n.realDur));\n nodes.forEach(n => { n.heat = heatTier(n.realDur, maxLeafDur); });\n\n return {\n root, nodes, leaves, total: root.realDur,\n maxDepth: Math.max(0, ...nodes.map(n => n.depth)), maxLeafDur\n };\n}\n\n/* ----------------------------- shared lookups ----------------------------- */\n\nexport function activeLeaf(model: FlowModel, p: number): FlowNode {\n const L = model.leaves;\n if (!L.length) return model.root;\n if (p <= 0) return L[0];\n if (p >= 1) return L[L.length - 1];\n return L.find(l => p >= l.t0 && p < l.t1) ?? L[L.length - 1];\n}\n\nexport function ancestors(n: FlowNode): FlowNode[] {\n const out: FlowNode[] = []; let c: FlowNode | null = n;\n while (c) { out.unshift(c); c = c.parent; }\n return out;\n}\n\nexport function agentOf(n: FlowNode): FlowNode {\n let c = n.parent;\n while (c) { if (c.type === 'agent' || c.type === 'subagent') return c; c = c.parent; }\n return n;\n}\n\n/** \"Execute Sub-Agent: Query Strategist\" → \"Query Strategist\". */\nexport function agentShortName(a: FlowNode): string {\n const i = a.name.indexOf(': ');\n return i >= 0 ? a.name.slice(i + 2) : a.name;\n}\n\n/**\n * Label with the owning agent's prefix stripped — child step names tend to be\n * \"Query Strategist: Execute Agent Prompt\"; on a view that already shows which\n * agent/line a node belongs to, the prefix is pure noise that causes overlap.\n */\nexport function displayName(n: FlowNode): string {\n const a = agentOf(n);\n if (a && a !== n) {\n const short = agentShortName(a);\n if (short && n.name.startsWith(short + ':')) return n.name.slice(short.length + 1).trim();\n }\n return n.name;\n}\n\n/**\n * Aggressively abbreviated label for tight surfaces (subway stations, flame bars,\n * stars). Strips the agent prefix, then collapses the verbose MJ step phrasing:\n * \"Execute Sub-Agent: Query Strategist\" → \"Query Strategist Sub-Agent\"\n * \"Execute Agent Prompt\" → \"Prompt\"\n * \"Execute Action: Search Query Catalog\"→ \"Search Query Catalog\"\n * \"Agent Validation\" → \"Validation\"\n */\nexport function shortLabel(n: FlowNode): string {\n if (n.type === 'subagent') return `${agentShortName(n)} Sub-Agent`;\n let s = displayName(n);\n s = s.replace(/^Execute Action:\\s*/i, '').replace(/^Execute Sub-Agent:\\s*/i, '');\n if (/^Execute Agent Prompt$/i.test(s)) s = 'Prompt';\n else if (/^Agent Validation$/i.test(s)) s = 'Validation';\n else if (/^Data Source Preloading$/i.test(s)) s = 'Data Preload';\n return s;\n}\n\nexport function formatDuration(seconds: number): string {\n if (seconds < 1) return `${Math.round(seconds * 1000)}ms`;\n if (seconds < 60) return `${seconds < 10 ? seconds.toFixed(1) : Math.round(seconds)}s`;\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ${Math.round(seconds % 60)}s`;\n return `${Math.floor(seconds / 3600)}h ${Math.floor((seconds % 3600) / 60)}m`;\n}\n"]}
@@ -0,0 +1,38 @@
1
+ import { ElementRef, EventEmitter } from '@angular/core';
2
+ import { FlowModel, FlowNode } from './agent-run-flow.model';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Constellation — the agent tree as a star map. Leaves spread evenly around the
6
+ * circle (radial dendrogram) so dense sub-agents don't clump; stars carry the real
7
+ * step/agent icon, ignite in execution order, and pulse energy down curved edges.
8
+ * Labels stay clutter-free (root + top level + active by default, hover to reveal).
9
+ */
10
+ export declare class ConstellationComponent {
11
+ svgRef: ElementRef<SVGSVGElement>;
12
+ nodeSelected: EventEmitter<FlowNode>;
13
+ private _model;
14
+ private built;
15
+ private stars;
16
+ private edges;
17
+ private hoveredId;
18
+ private selectedId;
19
+ private pz?;
20
+ private readonly VW;
21
+ private readonly VH;
22
+ private readonly CX;
23
+ private readonly CY;
24
+ SetSelected(id: number | null): void;
25
+ ZoomIn(): void;
26
+ ZoomOut(): void;
27
+ FitReset(): void;
28
+ ReapplyView(): void;
29
+ ngOnDestroy(): void;
30
+ set Model(m: FlowModel | null);
31
+ Render(p: number, ts: number): void;
32
+ private clear;
33
+ private build;
34
+ private update;
35
+ static ɵfac: i0.ɵɵFactoryDeclaration<ConstellationComponent, never>;
36
+ static ɵcmp: i0.ɵɵComponentDeclaration<ConstellationComponent, "mj-agent-flow-constellation", never, { "Model": { "alias": "Model"; "required": false; }; }, { "nodeSelected": "nodeSelected"; }, never, never, false, never>;
37
+ }
38
+ //# sourceMappingURL=constellation.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constellation.component.d.ts","sourceRoot":"","sources":["../../../../../src/lib/custom/ai-agent-run/flow/constellation.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAiB,YAAY,EAAoE,MAAM,eAAe,CAAC;AACrJ,OAAO,EAAE,SAAS,EAAE,QAAQ,EAA2B,MAAM,wBAAwB,CAAC;;AAQtF;;;;;GAKG;AACH,qBAQa,sBAAsB;IACG,MAAM,EAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAC7D,YAAY,yBAAgC;IAEtD,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,EAAE,CAAC,CAAoB;IAE/B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAQ;IAC3B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAO;IAC1B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAO;IAC1B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAO;IAEnB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IACpC,MAAM,IAAI,IAAI;IACd,OAAO,IAAI,IAAI;IACf,QAAQ,IAAI,IAAI;IAChB,WAAW,IAAI,IAAI;IAC1B,WAAW,IAAI,IAAI;IAEnB,IAAa,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI,EAAwD;IAEvF,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IAM1C,OAAO,CAAC,KAAK;IAOb,OAAO,CAAC,KAAK;IA0Eb,OAAO,CAAC,MAAM;yCAjHH,sBAAsB;2CAAtB,sBAAsB;CAwJlC"}