@memberjunction/ng-core-entity-forms 6.1.0-edge.5 → 6.1.0-edge.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js +2 -2
  2. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js.map +1 -1
  3. package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.js +1 -1
  4. package/dist/lib/custom/AIAgents/add-action-dialog.component.js +1 -1
  5. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +1 -1
  6. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +3 -3
  7. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  8. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +1 -1
  9. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +1 -1
  10. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +1 -1
  11. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +1 -1
  12. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +1 -1
  13. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +3 -3
  14. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  15. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +2 -2
  16. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js.map +1 -1
  17. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +1 -1
  18. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +1 -1
  19. package/dist/lib/custom/Actions/action-execution-log-form.component.js +2 -2
  20. package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
  21. package/dist/lib/custom/Actions/action-form.component.js +2 -2
  22. package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
  23. package/dist/lib/custom/BridgeAgentIdentities/bridge-agent-identity-form.component.js +1 -1
  24. package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js +1 -1
  25. package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
  26. package/dist/lib/custom/Entities/entity-form.component.js +7 -10
  27. package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
  28. package/dist/lib/custom/EntityActions/entityaction.form.component.js +1 -1
  29. package/dist/lib/custom/Files/file-form.component.js +1 -1
  30. package/dist/lib/custom/Lists/list-form.component.d.ts +7 -0
  31. package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
  32. package/dist/lib/custom/Lists/list-form.component.js +32 -18
  33. package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
  34. package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
  35. package/dist/lib/custom/Queries/query-form.component.js +5 -7
  36. package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
  37. package/dist/lib/custom/Queries/query-run-dialog.component.js +1 -1
  38. package/dist/lib/custom/SessionBridges/session-bridge-form.component.js +1 -1
  39. package/dist/lib/custom/Templates/template-param-dialog.component.js +1 -1
  40. package/dist/lib/custom/Templates/template-params-grid.component.js +1 -1
  41. package/dist/lib/custom/Templates/templates-form.component.js +1 -1
  42. package/dist/lib/custom/Tests/entity-link-pill.component.d.ts.map +1 -1
  43. package/dist/lib/custom/Tests/entity-link-pill.component.js +3 -1
  44. package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
  45. package/dist/lib/custom/Tests/test-form.component.js +1 -1
  46. package/dist/lib/custom/Tests/test-run-form.component.js +1 -1
  47. package/dist/lib/custom/Tests/test-suite-form.component.js +3 -3
  48. package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
  49. package/dist/lib/custom/Tests/test-suite-run-form.component.js +6 -6
  50. package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
  51. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +1 -1
  52. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +1 -1
  53. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js +1 -1
  54. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +1 -1
  55. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +3 -3
  56. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  57. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js +1 -1
  58. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +86 -72
  59. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
  60. package/dist/lib/generated/Entities/MJAIAgentAction/mjaiagentaction.form.component.js +10 -8
  61. package/dist/lib/generated/Entities/MJAIAgentAction/mjaiagentaction.form.component.js.map +1 -1
  62. package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.d.ts.map +1 -1
  63. package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.js +31 -25
  64. package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.js.map +1 -1
  65. package/dist/lib/generated/Entities/MJAIAgentPersona/mjaiagentpersona.form.component.d.ts +10 -0
  66. package/dist/lib/generated/Entities/MJAIAgentPersona/mjaiagentpersona.form.component.d.ts.map +1 -0
  67. package/dist/lib/generated/Entities/MJAIAgentPersona/mjaiagentpersona.form.component.js +78 -0
  68. package/dist/lib/generated/Entities/MJAIAgentPersona/mjaiagentpersona.form.component.js.map +1 -0
  69. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.d.ts.map +1 -1
  70. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +136 -112
  71. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
  72. package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js +29 -21
  73. package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js.map +1 -1
  74. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js +3 -3
  75. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js.map +1 -1
  76. package/dist/lib/generated/Entities/MJAIArchitecture/mjaiarchitecture.form.component.d.ts.map +1 -1
  77. package/dist/lib/generated/Entities/MJAIArchitecture/mjaiarchitecture.form.component.js +27 -21
  78. package/dist/lib/generated/Entities/MJAIArchitecture/mjaiarchitecture.form.component.js.map +1 -1
  79. package/dist/lib/generated/Entities/MJAIConfiguration/mjaiconfiguration.form.component.d.ts.map +1 -1
  80. package/dist/lib/generated/Entities/MJAIConfiguration/mjaiconfiguration.form.component.js +67 -61
  81. package/dist/lib/generated/Entities/MJAIConfiguration/mjaiconfiguration.form.component.js.map +1 -1
  82. package/dist/lib/generated/Entities/MJAIModality/mjaimodality.form.component.d.ts.map +1 -1
  83. package/dist/lib/generated/Entities/MJAIModality/mjaimodality.form.component.js +29 -11
  84. package/dist/lib/generated/Entities/MJAIModality/mjaimodality.form.component.js.map +1 -1
  85. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.d.ts.map +1 -1
  86. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js +49 -31
  87. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js.map +1 -1
  88. package/dist/lib/generated/Entities/MJAIModelPersona/mjaimodelpersona.form.component.d.ts +10 -0
  89. package/dist/lib/generated/Entities/MJAIModelPersona/mjaimodelpersona.form.component.d.ts.map +1 -0
  90. package/dist/lib/generated/Entities/MJAIModelPersona/mjaimodelpersona.form.component.js +74 -0
  91. package/dist/lib/generated/Entities/MJAIModelPersona/mjaimodelpersona.form.component.js.map +1 -0
  92. package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.d.ts +10 -0
  93. package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.d.ts.map +1 -0
  94. package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.js +161 -0
  95. package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.js.map +1 -0
  96. package/dist/lib/generated/Entities/MJAIPersonaVendor/mjaipersonavendor.form.component.d.ts +10 -0
  97. package/dist/lib/generated/Entities/MJAIPersonaVendor/mjaipersonavendor.form.component.d.ts.map +1 -0
  98. package/dist/lib/generated/Entities/MJAIPersonaVendor/mjaipersonavendor.form.component.js +80 -0
  99. package/dist/lib/generated/Entities/MJAIPersonaVendor/mjaipersonavendor.form.component.js.map +1 -0
  100. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js +149 -147
  101. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js.map +1 -1
  102. package/dist/lib/generated/Entities/MJAIPromptModel/mjaipromptmodel.form.component.d.ts.map +1 -1
  103. package/dist/lib/generated/Entities/MJAIPromptModel/mjaipromptmodel.form.component.js +8 -12
  104. package/dist/lib/generated/Entities/MJAIPromptModel/mjaipromptmodel.form.component.js.map +1 -1
  105. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.d.ts.map +1 -1
  106. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js +20 -24
  107. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
  108. package/dist/lib/generated/Entities/MJAISkill/mjaiskill.form.component.js +34 -20
  109. package/dist/lib/generated/Entities/MJAISkill/mjaiskill.form.component.js.map +1 -1
  110. package/dist/lib/generated/Entities/MJAISkillAction/mjaiskillaction.form.component.js +8 -6
  111. package/dist/lib/generated/Entities/MJAISkillAction/mjaiskillaction.form.component.js.map +1 -1
  112. package/dist/lib/generated/Entities/MJAIUsageType/mjaiusagetype.form.component.js +10 -10
  113. package/dist/lib/generated/Entities/MJAIUsageType/mjaiusagetype.form.component.js.map +1 -1
  114. package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.d.ts.map +1 -1
  115. package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js +32 -14
  116. package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js.map +1 -1
  117. package/dist/lib/generated/Entities/MJAPIScope/mjapiscope.form.component.d.ts.map +1 -1
  118. package/dist/lib/generated/Entities/MJAPIScope/mjapiscope.form.component.js +31 -25
  119. package/dist/lib/generated/Entities/MJAPIScope/mjapiscope.form.component.js.map +1 -1
  120. package/dist/lib/generated/Entities/MJAction/mjaction.form.component.d.ts.map +1 -1
  121. package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js +114 -108
  122. package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js.map +1 -1
  123. package/dist/lib/generated/Entities/MJActionCategory/mjactioncategory.form.component.d.ts.map +1 -1
  124. package/dist/lib/generated/Entities/MJActionCategory/mjactioncategory.form.component.js +31 -25
  125. package/dist/lib/generated/Entities/MJActionCategory/mjactioncategory.form.component.js.map +1 -1
  126. package/dist/lib/generated/Entities/MJArtifactType/mjartifacttype.form.component.d.ts.map +1 -1
  127. package/dist/lib/generated/Entities/MJArtifactType/mjartifacttype.form.component.js +43 -37
  128. package/dist/lib/generated/Entities/MJArtifactType/mjartifacttype.form.component.js.map +1 -1
  129. package/dist/lib/generated/Entities/MJAuditLogType/mjauditlogtype.form.component.d.ts.map +1 -1
  130. package/dist/lib/generated/Entities/MJAuditLogType/mjauditlogtype.form.component.js +25 -19
  131. package/dist/lib/generated/Entities/MJAuditLogType/mjauditlogtype.form.component.js.map +1 -1
  132. package/dist/lib/generated/Entities/MJAuthorization/mjauthorization.form.component.d.ts.map +1 -1
  133. package/dist/lib/generated/Entities/MJAuthorization/mjauthorization.form.component.js +45 -39
  134. package/dist/lib/generated/Entities/MJAuthorization/mjauthorization.form.component.js.map +1 -1
  135. package/dist/lib/generated/Entities/MJCollection/mjcollection.form.component.d.ts.map +1 -1
  136. package/dist/lib/generated/Entities/MJCollection/mjcollection.form.component.js +43 -37
  137. package/dist/lib/generated/Entities/MJCollection/mjcollection.form.component.js.map +1 -1
  138. package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.d.ts.map +1 -1
  139. package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js +55 -49
  140. package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js.map +1 -1
  141. package/dist/lib/generated/Entities/MJContentItemChunk/mjcontentitemchunk.form.component.d.ts.map +1 -1
  142. package/dist/lib/generated/Entities/MJContentItemChunk/mjcontentitemchunk.form.component.js +31 -25
  143. package/dist/lib/generated/Entities/MJContentItemChunk/mjcontentitemchunk.form.component.js.map +1 -1
  144. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.d.ts.map +1 -1
  145. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js +45 -27
  146. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js.map +1 -1
  147. package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.d.ts.map +1 -1
  148. package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js +71 -65
  149. package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js.map +1 -1
  150. package/dist/lib/generated/Entities/MJConversationSkill/mjconversationskill.form.component.d.ts +10 -0
  151. package/dist/lib/generated/Entities/MJConversationSkill/mjconversationskill.form.component.d.ts.map +1 -0
  152. package/dist/lib/generated/Entities/MJConversationSkill/mjconversationskill.form.component.js +76 -0
  153. package/dist/lib/generated/Entities/MJConversationSkill/mjconversationskill.form.component.js.map +1 -0
  154. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +419 -415
  155. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
  156. package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.d.ts.map +1 -1
  157. package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js +23 -5
  158. package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js.map +1 -1
  159. package/dist/lib/generated/Entities/MJEntityFieldPermission/mjentityfieldpermission.form.component.d.ts +10 -0
  160. package/dist/lib/generated/Entities/MJEntityFieldPermission/mjentityfieldpermission.form.component.d.ts.map +1 -0
  161. package/dist/lib/generated/Entities/MJEntityFieldPermission/mjentityfieldpermission.form.component.js +76 -0
  162. package/dist/lib/generated/Entities/MJEntityFieldPermission/mjentityfieldpermission.form.component.js.map +1 -0
  163. package/dist/lib/generated/Entities/MJIdentityClaim/mjidentityclaim.form.component.d.ts.map +1 -1
  164. package/dist/lib/generated/Entities/MJIdentityClaim/mjidentityclaim.form.component.js +5 -29
  165. package/dist/lib/generated/Entities/MJIdentityClaim/mjidentityclaim.form.component.js.map +1 -1
  166. package/dist/lib/generated/Entities/MJIdentityClaimType/mjidentityclaimtype.form.component.d.ts.map +1 -1
  167. package/dist/lib/generated/Entities/MJIdentityClaimType/mjidentityclaimtype.form.component.js +12 -24
  168. package/dist/lib/generated/Entities/MJIdentityClaimType/mjidentityclaimtype.form.component.js.map +1 -1
  169. package/dist/lib/generated/Entities/MJMagicLinkInvite/mjmagiclinkinvite.form.component.js +2 -2
  170. package/dist/lib/generated/Entities/MJMagicLinkInvite/mjmagiclinkinvite.form.component.js.map +1 -1
  171. package/dist/lib/generated/Entities/MJProject/mjproject.form.component.d.ts.map +1 -1
  172. package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js +33 -27
  173. package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js.map +1 -1
  174. package/dist/lib/generated/Entities/MJRole/mjrole.form.component.d.ts.map +1 -1
  175. package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js +38 -20
  176. package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js.map +1 -1
  177. package/dist/lib/generated/Entities/MJSkill/mjskill.form.component.d.ts.map +1 -1
  178. package/dist/lib/generated/Entities/MJSkill/mjskill.form.component.js +25 -19
  179. package/dist/lib/generated/Entities/MJSkill/mjskill.form.component.js.map +1 -1
  180. package/dist/lib/generated/Entities/MJTag/mjtag.form.component.js +2 -2
  181. package/dist/lib/generated/Entities/MJTag/mjtag.form.component.js.map +1 -1
  182. package/dist/lib/generated/Entities/MJTask/mjtask.form.component.js +2 -2
  183. package/dist/lib/generated/Entities/MJTask/mjtask.form.component.js.map +1 -1
  184. package/dist/lib/generated/Entities/MJTestSuite/mjtestsuite.form.component.d.ts.map +1 -1
  185. package/dist/lib/generated/Entities/MJTestSuite/mjtestsuite.form.component.js +35 -29
  186. package/dist/lib/generated/Entities/MJTestSuite/mjtestsuite.form.component.js.map +1 -1
  187. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +32 -32
  188. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  189. package/dist/lib/generated/Entities/MJVersionLabel/mjversionlabel.form.component.d.ts.map +1 -1
  190. package/dist/lib/generated/Entities/MJVersionLabel/mjversionlabel.form.component.js +39 -33
  191. package/dist/lib/generated/Entities/MJVersionLabel/mjversionlabel.form.component.js.map +1 -1
  192. package/dist/lib/generated/generated-forms.module.d.ts +474 -408
  193. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  194. package/dist/lib/generated/generated-forms.module.js +1276 -898
  195. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  196. package/dist/lib/panels/ai-agents/agent-realtime.panel.js +1 -1
  197. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js +1 -1
  198. package/dist/lib/panels/content-sources/website-crawler-settings.panel.js +1 -1
  199. package/dist/lib/panels/model-predictions/model-prediction.panel.js +1 -1
  200. package/dist/lib/shared/components/template-editor.component.js +1 -1
  201. package/package.json +48 -48
@@ -1 +1 @@
1
- {"version":3,"file":"ai-agent-run.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run.component.ts","../../../../src/lib/custom/ai-agent-run/ai-agent-run.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ViewChild, inject } from '@angular/core';\nimport { Subject, Subscription } from 'rxjs';\nimport { BaseEntity, BaseEntityEvent, CompositeKey, Metadata } from '@memberjunction/core';\nimport {\n LoadAgentRunTree,\n MAX_AGENT_RUN_TREE_DEPTH,\n MJAIAgentRunEntityExtended,\n MJAIAgentEntityExtended,\n WalkAgentRunTree,\n type AgentRunTreeNode,\n} from '@memberjunction/ai-core-plus';\nimport { BaseFormComponent } from '@memberjunction/ng-base-forms';\nimport { MJGlobal, MJEvent, MJEventType, RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { SharedService, NavigationService } from '@memberjunction/ng-shared';\nimport { TimelineItem, AIAgentRunTimelineComponent } from './ai-agent-run-timeline.component';\nimport { MJAIAgentRunFormComponent } from '../../generated/Entities/MJAIAgentRun/mjaiagentrun.form.component';\nimport { ParseJSONRecursive, ParseJSONOptions } from '@memberjunction/global';\nimport { AIAgentRunAnalyticsComponent } from './ai-agent-run-analytics.component';\nimport { AIAgentRunCostService, AgentRunCostMetrics } from './ai-agent-run-cost.service';\nimport { AIAgentRunDataHelper } from './ai-agent-run-data.service';\nimport { ApplicationManager } from '@memberjunction/ng-base-application';\n\n/**\n * Task statuses that mean the step is finished with. Anything else means the workflow is still\n * moving — see `WorkflowStillRunning`.\n */\nconst TERMINAL_TASK_STATUSES = new Set(['Complete', 'Failed', 'Cancelled', 'Skipped', 'Blocked']);\n\n/**\n * How often to re-read the tree while a detached workflow runs.\n *\n * Human-scale rather than aggressive: a workflow step takes seconds at least, and the query walks\n * the whole tree. Fast enough that a watcher sees progress, slow enough that leaving the tab open on\n * a long workflow is not a load problem.\n */\nconst WORKFLOW_POLL_INTERVAL_MS = 4000;\n\n@RegisterClass(BaseFormComponent, 'MJ: AI Agent Runs')\n@Component({\n standalone: false,\n selector: 'mj-ai-agent-run-form',\n templateUrl: './ai-agent-run.component.html',\n styleUrls: ['./ai-agent-run.component.css']\n})\nexport class MJAIAgentRunFormComponentExtended extends MJAIAgentRunFormComponent implements OnInit, OnDestroy {\n public record!: MJAIAgentRunEntityExtended;\n \n private destroy$ = new Subject<void>();\n\n // MJGlobal BaseEntity event subscription — fires on both local Save()\n // and server-side remote-invalidate events. While the run is Running,\n // this is how we hear about new steps and status changes without\n // polling the DB on a timer. Only attached when Status === 'Running'.\n private entityEventSubscription: Subscription | null = null;\n private refreshInFlight = false;\n\n /** Pending re-read of the run tree while a detached workflow is still running. */\n private workflowPollTimer: ReturnType<typeof setTimeout> | null = null;\n\n // UI state\n activeTab = 'timeline';\n selectedTimelineItem: TimelineItem | null = null;\n jsonPanelExpanded = false;\n loading = false;\n error: string | null = null;\n analyticsLoaded = false;\n visualizationLoaded = false;\n \n agent: MJAIAgentEntityExtended | null = null;\n \n // Cost metrics using shared service\n costMetrics: AgentRunCostMetrics | null = null;\n \n // Cached parsed results to prevent redundant JSON parsing\n private _cachedParsedResult: string | null = null;\n private _cachedParsedStartingPayload: string | null = null;\n private _cachedParsedFinalPayload: string | null = null;\n private _cachedParsedData: string | null = null;\n \n // Simple parsing state - true when all parsing is complete\n private _allParsingComplete = false;\n \n @ViewChild(AIAgentRunTimelineComponent) timelineComponent?: AIAgentRunTimelineComponent;\n @ViewChild(AIAgentRunAnalyticsComponent) analyticsComponent?: AIAgentRunAnalyticsComponent;\n\n // Field injections\n private navigationService = inject(NavigationService);\n private costService = inject(AIAgentRunCostService);\n private appManager = inject(ApplicationManager);\n\n // Instance of data helper per component\n public dataHelper = new AIAgentRunDataHelper();\n\n /**\n * The run's complete execution tree — loaded ONCE here and shared with every tab.\n *\n * **One load, one shape, one refresh.** The timeline, the three flow renderers and analytics all\n * need the same structure; letting each fetch its own would issue the same recursive query three\n * times, and — worse — let the tabs disagree, because a tab that loaded a second earlier shows a\n * different run than the one beside it. Sharing it also means a refresh updates all three at once\n * rather than whichever one the user happens to open next.\n */\n public runTree: AgentRunTreeNode | null = null;\n\n /** True while the tree is loading, so a tab can say so rather than render an empty run. */\n public runTreeLoading = false;\n\n /** Why the tree could not be loaded, or null. Surfaced rather than swallowed. */\n public runTreeError: string | null = null;\n\n /**\n * Loads (or reloads) the shared run tree.\n *\n * Errors are held rather than thrown: a run whose tree cannot be read still has fields worth\n * looking at, and taking the whole form down over one query would hide them.\n */\n private async loadRunTree(): Promise<void> {\n if (!this.record?.ID) return;\n this.runTreeLoading = true;\n this.runTreeError = null;\n try {\n const result = await LoadAgentRunTree(this.record.ID, this.RunQueryToUse);\n this.runTree = result.Root;\n this.runTreeError = result.ErrorMessage;\n if (result.Truncated) {\n this.runTreeError =\n `This run nests deeper than ${MAX_AGENT_RUN_TREE_DEPTH} levels; what is shown is truncated.`;\n }\n } catch (e) {\n this.runTreeError = e instanceof Error ? e.message : String(e);\n this.runTree = null;\n } finally {\n this.runTreeLoading = false;\n this.scheduleWorkflowPoll();\n }\n }\n\n /**\n * True when this run submitted a workflow that has not finished.\n *\n * **The run being \"Completed\" says nothing about this.** A task graph is submit-and-detach: the\n * step that submits it completes as soon as the graph is persisted, and the run completes with it\n * — while the dispatcher goes on executing for seconds or minutes afterwards. One observed run\n * finished in 225ms and its workflow ran for a further eighteen seconds.\n *\n * Without this the form showed a green COMPLETED header above steps sitting at Pending, and the\n * only available reading was that something had failed. Nothing had; the page was simply a\n * snapshot of a moving thing, with nothing saying so.\n */\n public get WorkflowStillRunning(): boolean {\n if (!this.runTree) return false;\n for (const node of WalkAgentRunTree(this.runTree)) {\n if (node.NodeType !== 'Task' && node.NodeType !== 'TaskGraph') continue;\n if (!TERMINAL_TASK_STATUSES.has(node.Status)) return true;\n }\n return false;\n }\n\n /**\n * Re-reads the tree while a detached workflow is still moving, and stops when it settles.\n *\n * Polling rather than the BaseEntity event subscription this form already has, because that\n * subscription cannot see this work for two independent reasons: it is only attached while the RUN\n * is `Running` (a detached graph outlives that), and the dispatcher advances tasks through the\n * claim protocol's direct SQL, which fires no entity events at all.\n *\n * Self-cancelling: each load reschedules only if work remains, so a settled run costs nothing.\n */\n private scheduleWorkflowPoll(): void {\n this.clearWorkflowPoll();\n if (!this.WorkflowStillRunning) return;\n this.workflowPollTimer = setTimeout(() => {\n this.workflowPollTimer = null;\n void this.loadRunTree();\n }, WORKFLOW_POLL_INTERVAL_MS);\n }\n\n private clearWorkflowPoll(): void {\n if (this.workflowPollTimer !== null) {\n clearTimeout(this.workflowPollTimer);\n this.workflowPollTimer = null;\n }\n }\n \n async ngOnInit() {\n await super.ngOnInit();\n \n if (this.record && this.record.ID) {\n await this.dataHelper.loadAgentRunData(this.record.ID);\n await this.loadRunTree();\n await this.loadAgent();\n await this.loadCostMetrics();\n\n // Parse all JSON fields on form load for instant access later\n this.parseAllFields();\n\n // If the run is in progress, subscribe to BaseEntity events so we\n // pick up new steps / status changes the moment AgentRunner saves\n // them — no 30s polling timer. Same pattern used by the Form\n // Builder cockpit. See `handleEntityEvent` below for filtering.\n if (this.record.Status === 'Running') {\n this.subscribeToRunEvents();\n }\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n this.clearWorkflowPoll();\n this.entityEventSubscription?.unsubscribe();\n this.entityEventSubscription = null;\n this.clearParsedCache();\n this.dataHelper.clearData();\n this.costMetrics = null;\n this.agent = null;\n }\n\n private subscribeToRunEvents(): void {\n if (this.entityEventSubscription) return;\n this.entityEventSubscription = MJGlobal.Instance.GetEventListener(false)\n .subscribe(mjEvent => this.handleEntityEvent(mjEvent));\n }\n\n private unsubscribeFromRunEvents(): void {\n this.entityEventSubscription?.unsubscribe();\n this.entityEventSubscription = null;\n }\n\n /**\n * Filter the global BaseEntity event firehose down to saves on the\n * current Agent Run row, its Steps, or its Prompt Runs — and only when\n * AgentRunID matches `this.record.ID`. Local `save` events come from\n * the in-process AgentRunner (dev/same-tab case, which is the primary\n * use case here); `remote-invalidate` covers writes from a separate\n * server process if GraphQL cache-invalidation is wired up.\n */\n private handleEntityEvent(mjEvent: MJEvent): void {\n if (mjEvent.event !== MJEventType.ComponentEvent) return;\n if (mjEvent.eventCode !== BaseEntity.BaseEventCode) return;\n const evt = mjEvent.args as BaseEntityEvent | undefined;\n if (!evt) return;\n if (evt.type !== 'save' && evt.type !== 'remote-invalidate') return;\n\n const entityName = evt.entityName ?? evt.baseEntity?.EntityInfo?.Name;\n if (!entityName) return;\n\n const runId = this.record?.ID;\n if (!runId) return;\n\n if (entityName === 'MJ: AI Agent Runs') {\n // Status change on THIS run row.\n const savedID = this.resolveEventID(evt);\n if (savedID && UUIDsEqual(savedID, runId)) {\n this.refreshData();\n // If the run completed, drop the subscription — no further\n // writes are expected and we don't want to hold the listener.\n const newStatus = this.resolveEventField<string>(evt, 'Status');\n if (newStatus && newStatus !== 'Running') {\n this.unsubscribeFromRunEvents();\n }\n }\n return;\n }\n\n // Steps still carry AgentRunID, so a step write can be correlated exactly to this run.\n if (entityName === 'MJ: AI Agent Run Steps') {\n const childAgentRunId = this.resolveEventField<string>(evt, 'AgentRunID');\n if (childAgentRunId && UUIDsEqual(childAgentRunId, runId)) {\n this.refreshRunDataDebounced();\n }\n return;\n }\n\n // Prompt runs and action logs expose no AgentRunID to correlate on: AIPromptRun.AgentRunID was\n // dropped in v5.50 (Break_CodeGen_Cycle_Remove_PromptRun_AgentRunID) and ActionExecutionLog never\n // had one. Correlating on it made this branch dead for action logs from the start, and for prompt\n // runs from v5.50 — the form simply stopped live-refreshing. Refresh unconditionally instead,\n // which is what the original comment described: the reload is debounced and re-reads only THIS\n // run, and the subscription is dropped once the run leaves 'Running', so a foreign write costs at\n // most one collapsed reload while a run is open on screen.\n if (entityName === 'MJ: AI Prompt Runs' || entityName === 'MJ: Action Execution Logs') {\n this.refreshRunDataDebounced();\n }\n }\n\n private resolveEventID(evt: BaseEntityEvent): string | null {\n if (evt.baseEntity) {\n return evt.baseEntity.PrimaryKey?.ToConcatenatedString() ?? null;\n }\n const payload = evt.payload as { primaryKeyValues?: string | null; recordData?: string | null } | undefined;\n if (!payload) return null;\n try {\n if (payload.primaryKeyValues) {\n const pk = JSON.parse(payload.primaryKeyValues) as Record<string, unknown> | unknown[];\n if (Array.isArray(pk)) {\n const idPair = pk.find(p => (p as { FieldName?: string }).FieldName === 'ID') as { Value?: unknown } | undefined;\n if (idPair?.Value != null) return String(idPair.Value);\n } else if (pk && typeof pk === 'object' && 'ID' in pk) {\n const v = (pk as { ID?: unknown }).ID;\n if (v != null) return String(v);\n }\n }\n } catch {\n // bad JSON — fall through to recordData\n }\n try {\n if (payload.recordData) {\n const row = JSON.parse(payload.recordData) as Record<string, unknown>;\n if (typeof row?.ID === 'string') return row.ID;\n }\n } catch {\n // ignore\n }\n return null;\n }\n\n private resolveEventField<T>(evt: BaseEntityEvent, fieldName: string): T | null {\n if (evt.baseEntity) {\n const val = evt.baseEntity.Get?.(fieldName) as T | undefined;\n return val ?? null;\n }\n const payload = evt.payload as { recordData?: string | null } | undefined;\n if (!payload?.recordData) return null;\n try {\n const row = JSON.parse(payload.recordData) as Record<string, unknown>;\n const v = row?.[fieldName];\n return (v ?? null) as T | null;\n } catch {\n return null;\n }\n }\n\n /**\n * Collapse rapid bursts of step/prompt/action events into a single\n * reload — AgentRunner often saves several rows in quick succession.\n */\n private refreshRunDataDebounced(): void {\n if (this.refreshInFlight) return;\n this.refreshInFlight = true;\n queueMicrotask(() => {\n this.refreshInFlight = false;\n if (!this.record?.ID) return;\n this.dataHelper.loadAgentRunData(this.record.ID, true);\n });\n }\n \n private async loadAgent() {\n if (!this.record?.AgentID) return;\n \n try {\n const md = this.ProviderToUse;\n const agent = await md.GetEntityObject<MJAIAgentEntityExtended>('MJ: AI Agents');\n if (agent && await agent.Load(this.record.AgentID)) {\n this.agent = agent;\n this.cdr.detectChanges();\n }\n } catch (error) {\n console.error('Error loading agent:', error);\n }\n }\n\n private async loadCostMetrics() {\n if (!this.record?.ID) return;\n \n try {\n this.costMetrics = await this.costService.getAgentRunCostMetrics(this.record.ID);\n this.cdr.markForCheck();\n } catch (error) {\n console.error('Error loading cost metrics:', error);\n this.costMetrics = {\n totalCost: 0,\n totalPrompts: 0,\n totalTokensInput: 0,\n totalTokensOutput: 0,\n isLoading: false,\n error: 'Failed to load cost data'\n };\n }\n }\n \n changeTab(tab: string) {\n this.activeTab = tab;\n \n // Lazy load the Visualization (playable + static flow) view on first access\n if (tab === 'visualization' && !this.visualizationLoaded) {\n this.visualizationLoaded = true;\n this.cdr.markForCheck();\n }\n \n // Lazy load analytics when the tab is first accessed\n if (tab === 'analytics' && !this.analyticsLoaded) {\n this.analyticsLoaded = true;\n this.cdr.markForCheck();\n }\n }\n \n \n calculateDuration(start: Date, end?: Date | null): string {\n if (!end) return 'Running...';\n \n const ms = end.getTime() - start.getTime();\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3600000) return `${Math.floor(ms / 60000)}m ${Math.floor((ms % 60000) / 1000)}s`;\n return `${Math.floor(ms / 3600000)}h ${Math.floor((ms % 3600000) / 60000)}m`;\n }\n \n selectTimelineItem(item: TimelineItem) {\n this.selectedTimelineItem = item;\n this.jsonPanelExpanded = true;\n this.cdr.markForCheck();\n }\n \n closeJsonPanel() {\n this.selectedTimelineItem = null;\n this.cdr.markForCheck();\n }\n \n navigateToSubRun(runId: string) {\n SharedService.Instance.OpenEntityRecord(\"MJ: AI Agent Runs\", CompositeKey.FromID(runId));\n }\n\n navigateToParentRun() {\n if (this.record.ParentRunID) {\n SharedService.Instance.OpenEntityRecord(\"MJ: AI Agent Runs\", CompositeKey.FromID(this.record.ParentRunID));\n }\n }\n \n navigateToActionLog(logId: string) {\n SharedService.Instance.OpenEntityRecord(\"MJ: Action Execution Logs\", CompositeKey.FromID(logId));\n }\n \n openEntityRecord(entityName: string, recordId: string | null) {\n if (recordId) {\n SharedService.Instance.OpenEntityRecord(entityName, CompositeKey.FromID(recordId));\n }\n }\n \n navigateToEntityRecord(event: { entityName: string; recordId: string }) {\n SharedService.Instance.OpenEntityRecord(event.entityName, CompositeKey.FromID(event.recordId));\n }\n\n /**\n * Navigate to the conversation in the Chat application\n */\n navigateToConversation() {\n if (!this.record?.ConversationID) return;\n\n // Find the Chat app\n const chatApp = this.appManager.GetAllApps().find(app => app.Name === 'Chat');\n if (!chatApp) {\n console.warn('Chat application not found');\n return;\n }\n\n // Navigate to the Conversations nav item with the conversationId parameter\n this.navigationService.OpenNavItemByName(\n 'Conversations',\n { conversationId: this.record.ConversationID },\n chatApp.ID\n );\n }\n \n refreshData() {\n // Reload the agent run record to get latest status\n if (this.record?.ID) {\n // Clear parsed cache when refreshing data\n this.clearParsedCache();\n \n // No panel states to reset in simplified approach\n \n this.record.Load(this.record.ID).then(() => {\n // Clear cost cache and reload\n this.costService.clearCache(this.record.ID);\n this.loadCostMetrics();\n \n // Reload data through helper - this will update all components (force reload for refresh)\n this.dataHelper.loadAgentRunData(this.record.ID, true);\n void this.loadRunTree();\n \n // Trigger analytics refresh\n if (this.analyticsComponent) {\n this.analyticsComponent.loadData();\n }\n });\n }\n }\n \n \n getStatusIcon(status: string): string {\n const iconMap: Record<string, string> = {\n 'Running': 'fa-circle-notch fa-spin',\n 'Completed': 'fa-check-circle',\n 'Failed': 'fa-times-circle',\n 'Cancelled': 'fa-ban',\n 'Paused': 'fa-pause-circle'\n };\n return iconMap[status] || 'fa-question-circle';\n }\n \n async copyToClipboard(text: string) {\n try {\n await navigator.clipboard.writeText(text);\n // Could show a toast notification here\n } catch (err) {\n console.error('Failed to copy to clipboard:', err);\n }\n }\n \n /**\n * Get the Result field with recursive JSON parsing applied\n */\n get parsedResult(): string {\n if (!this.record?.Result) {\n return '';\n }\n \n // Return cached result if available\n if (this._cachedParsedResult !== null) {\n return this._cachedParsedResult;\n }\n \n \n try {\n // First, check if Result is a JSON string that needs to be parsed\n let resultData = this.record.Result;\n try {\n // If Result is a JSON string, parse it first\n resultData = JSON.parse(this.record.Result);\n } catch {\n // If it's not valid JSON, use it as-is\n resultData = this.record.Result;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false // Disable debug logging - regex issue fixed\n };\n // Re-enabled ParseJSONRecursive with performance optimizations\n const parsed = ParseJSONRecursive(resultData, parseOptions);\n const result = JSON.stringify(parsed, null, 2);\n \n // Cache the result\n this._cachedParsedResult = result;\n \n return result;\n } catch (e) {\n const fallbackResult = this.record.Result;\n this._cachedParsedResult = fallbackResult;\n return fallbackResult;\n }\n }\n \n /**\n * Get the Starting Payload field with recursive JSON parsing applied\n */\n get parsedStartingPayload(): string {\n if (!this.record?.StartingPayload) {\n return '';\n }\n \n // Return cached result if available\n if (this._cachedParsedStartingPayload !== null) {\n return this._cachedParsedStartingPayload;\n }\n \n \n try {\n // First, check if StartingPayload is a JSON string that needs to be parsed\n let payloadData = this.record.StartingPayload;\n try {\n // If StartingPayload is a JSON string, parse it first\n payloadData = JSON.parse(this.record.StartingPayload);\n } catch {\n // If it's not valid JSON, use it as-is\n payloadData = this.record.StartingPayload;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n // Re-enabled ParseJSONRecursive with performance optimizations\n const parsed = ParseJSONRecursive(payloadData, parseOptions);\n const result = JSON.stringify(parsed, null, 2);\n \n // Cache the result\n this._cachedParsedStartingPayload = result;\n \n return result;\n } catch (e) {\n const fallbackResult = this.record.StartingPayload;\n this._cachedParsedStartingPayload = fallbackResult;\n return fallbackResult;\n }\n }\n\n /**\n * Get the Final Payload (state) field with recursive JSON parsing applied\n */\n get parsedFinalPayload(): string {\n if (!this.record?.FinalPayload) return '';\n \n // Return cached result if available\n if (this._cachedParsedFinalPayload !== null) {\n return this._cachedParsedFinalPayload;\n }\n \n try {\n // First, check if FinalPayload is a JSON string that needs to be parsed\n let payloadData = this.record.FinalPayload;\n try {\n // If FinalPayload is a JSON string, parse it first\n payloadData = JSON.parse(this.record.FinalPayload);\n } catch {\n // If it's not valid JSON, use it as-is\n payloadData = this.record.FinalPayload;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false // Disable debug logging - regex issue fixed\n };\n // Re-enabled ParseJSONRecursive with performance optimizations\n const parsed = ParseJSONRecursive(payloadData, parseOptions);\n const result = JSON.stringify(parsed, null, 2);\n \n // Cache the result\n this._cachedParsedFinalPayload = result;\n \n return result;\n } catch (e) {\n const fallbackResult = this.record.FinalPayload;\n this._cachedParsedFinalPayload = fallbackResult;\n return fallbackResult;\n }\n }\n\n /**\n * Get the Data field with recursive JSON parsing applied\n */\n get parsedData(): string {\n if (!this.record?.Data) return '';\n \n // Return cached result if available\n if (this._cachedParsedData !== null) {\n return this._cachedParsedData;\n }\n \n try {\n // First, check if Data is a JSON string that needs to be parsed\n let data = this.record.Data;\n try {\n // If Data is a JSON string, parse it first\n data = JSON.parse(this.record.Data);\n } catch {\n // If it's not valid JSON, use it as-is\n data = this.record.Data;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n // Re-enabled ParseJSONRecursive with performance optimizations\n const parsed = ParseJSONRecursive(data, parseOptions);\n const result = JSON.stringify(parsed, null, 2);\n \n // Cache the result\n this._cachedParsedData = result;\n \n return result;\n } catch (e) {\n const fallbackResult = this.record.Data;\n this._cachedParsedData = fallbackResult;\n return fallbackResult;\n }\n }\n \n /**\n * Get parsed Starting Payload as an object for deep diff\n */\n get startingPayloadObject(): any {\n if (!this.record?.StartingPayload) return null;\n \n try {\n // First, check if StartingPayload is a JSON string that needs to be parsed\n let payloadData = this.record.StartingPayload;\n try {\n // If StartingPayload is a JSON string, parse it first\n payloadData = JSON.parse(this.record.StartingPayload);\n } catch {\n // If it's not valid JSON, use it as-is\n payloadData = this.record.StartingPayload;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n // Re-enabled ParseJSONRecursive with performance optimizations\n return ParseJSONRecursive(payloadData, parseOptions);\n } catch (e) {\n return null;\n }\n }\n\n /**\n * Get parsed Final Payload as an object for deep diff\n */\n get finalPayloadObject(): any {\n if (!this.record?.FinalPayload) return null;\n \n try {\n // First, check if FinalPayload is a JSON string that needs to be parsed\n let payloadData = this.record.FinalPayload;\n try {\n // If FinalPayload is a JSON string, parse it first\n payloadData = JSON.parse(this.record.FinalPayload);\n } catch {\n // If it's not valid JSON, use it as-is\n payloadData = this.record.FinalPayload;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n // Re-enabled ParseJSONRecursive with performance optimizations\n return ParseJSONRecursive(payloadData, parseOptions);\n } catch (e) {\n return null;\n }\n }\n\n /**\n * Clear all cached parsed results\n */\n private clearParsedCache(): void {\n this._cachedParsedResult = null;\n this._cachedParsedStartingPayload = null;\n this._cachedParsedFinalPayload = null;\n this._cachedParsedData = null;\n this._allParsingComplete = false;\n }\n \n /**\n * Parse all JSON fields at once and cache results\n */\n private parseAllFields(): void {\n try {\n let parsedCount = 0;\n \n // Parse all fields that exist\n if (this.record?.Result) {\n this.parsedResult; // Triggers parsing and caching\n parsedCount++;\n }\n \n if (this.record?.StartingPayload) {\n this.parsedStartingPayload; // Triggers parsing and caching\n parsedCount++;\n }\n \n if (this.record?.FinalPayload) {\n this.parsedFinalPayload; // Triggers parsing and caching\n parsedCount++;\n }\n \n if (this.record?.Data) {\n this.parsedData; // Triggers parsing and caching\n parsedCount++;\n }\n \n this._allParsingComplete = true;\n \n } catch (error) {\n console.error('Error during JSON parsing:', error);\n }\n }\n \n /**\n * Check if all parsing is complete - used by template\n */\n get isParsingComplete(): boolean {\n return this._allParsingComplete;\n }\n\n /**\n * Check if we have both payloads to show diff\n */\n get showPayloadDiff(): boolean {\n return !!(this.record?.StartingPayload && this.record?.FinalPayload);\n }\n\n /**\n * Check if selected timeline item is a step with payload changes\n */\n get showStepPayloadDiff(): boolean {\n if (!this.selectedTimelineItem || this.selectedTimelineItem.type !== 'step') {\n return false;\n }\n \n const stepData = this.selectedTimelineItem.data;\n if (stepData && (stepData.PayloadAtStart?.trim().length > 0 \n || stepData.PayloadAtEnd?.trim().length > 0)) {\n return stepData.PayloadAtStart !== stepData.PayloadAtEnd;\n }\n else {\n return false;\n }\n }\n\n /**\n * Get parsed PayloadAtStart for the selected step\n */\n get stepPayloadAtStartObject(): any {\n if (!this.selectedTimelineItem || this.selectedTimelineItem.type !== 'step') {\n return null;\n }\n \n const stepData = this.selectedTimelineItem.data;\n if (!stepData || !stepData.PayloadAtStart) {\n return null;\n }\n \n try {\n let payloadData = stepData.PayloadAtStart;\n try {\n payloadData = JSON.parse(stepData.PayloadAtStart);\n } catch {\n payloadData = stepData.PayloadAtStart;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n // Re-enabled ParseJSONRecursive with performance optimizations\n return ParseJSONRecursive(payloadData, parseOptions);\n } catch (e) {\n return null;\n }\n }\n\n /**\n * Get parsed PayloadAtEnd for the selected step\n */\n get stepPayloadAtEndObject(): any {\n if (!this.selectedTimelineItem || this.selectedTimelineItem.type !== 'step') {\n return null;\n }\n \n const stepData = this.selectedTimelineItem.data;\n if (!stepData || !stepData.PayloadAtEnd) {\n return null;\n }\n \n try {\n let payloadData = stepData.PayloadAtEnd;\n try {\n payloadData = JSON.parse(stepData.PayloadAtEnd);\n } catch {\n payloadData = stepData.PayloadAtEnd;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n // Re-enabled ParseJSONRecursive with performance optimizations\n return ParseJSONRecursive(payloadData, parseOptions);\n } catch (e) {\n return null;\n }\n }\n}\n","<div class=\"record-form-container ai-agent-run-form\">\n <div class=\"record-form\">\n <!-- Header -->\n <div class=\"header\">\n <div class=\"header-content\">\n <div class=\"header-left\">\n <div class=\"icon-wrapper\">\n @if (agent && agent.LogoURL) {\n <img [src]=\"agent.LogoURL\" [alt]=\"agent.Name || 'Agent'\" class=\"agent-logo\" />\n }\n @if (agent && !agent.LogoURL && agent.IconClass) {\n <i class=\"fas\" [ngClass]=\"agent.IconClass\"></i>\n }\n @if (!agent || (!agent.LogoURL && !agent.IconClass)) {\n <i class=\"fas fa-robot\"></i>\n }\n </div>\n <div class=\"header-info\">\n <h2>AI Agent Run</h2>\n <div class=\"meta-info\">\n @if (agent) {\n <span class=\"agent-name\">\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Agents', record.AgentID)\">\n {{ agent.Name }}\n </a>\n </span>\n }\n <span class=\"run-id\">{{ record.ID }}</span>\n @if (record.ParentRunID) {\n <span class=\"parent-run\">\n <i class=\"fas fa-level-up-alt\"></i>\n <a (click)=\"navigateToParentRun()\" class=\"parent-link\">Parent Run</a>\n </span>\n }\n <!-- Conversation Link Pill -->\n @if (record.ConversationID) {\n <span class=\"conversation-pill\" (click)=\"navigateToConversation()\" title=\"Open conversation in Chat app\">\n <i class=\"fas fa-comments\"></i>\n <span>Conversation</span>\n <i class=\"fas fa-external-link-alt pill-action\"></i>\n </span>\n }\n </div>\n </div>\n </div>\n <div class=\"header-right\">\n @if (record.PlanMode) {\n <div class=\"plan-mode-badge\" title=\"This run executed in Plan Mode — the agent presented a plan for human approval before executing actions or sub-agents\">\n <i class=\"fas fa-clipboard-check\"></i>\n Plan Mode\n </div>\n }\n <div class=\"status-badge\" [attr.data-status]=\"record.Status\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon(record.Status || '')\"></i>\n {{ record.Status }}\n </div>\n <!-- A workflow outlives the run that submitted it, so a Completed run can still have work\n in flight. Said beside the status rather than instead of it — both are true. -->\n @if (WorkflowStillRunning) {\n <div class=\"workflow-running-badge\"\n title=\"This run submitted a workflow that runs on the dispatcher. The run finished when the workflow was submitted; the workflow itself is still going. This view refreshes on its own.\">\n <i class=\"fas fa-circle-notch fa-spin\"></i>\n Workflow still running\n </div>\n }\n <div class=\"header-actions\">\n <button class=\"btn-icon\" (click)=\"refreshData()\" title=\"Refresh\">\n <i class=\"fas fa-sync-alt\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"header-stats\">\n <div class=\"stat\">\n <span class=\"label\">Started</span>\n <span class=\"value\">{{ record.StartedAt | date:'medium' }}</span>\n </div>\n @if (record.CompletedAt) {\n <div class=\"stat\">\n <span class=\"label\">Completed</span>\n <span class=\"value\">{{ record.CompletedAt | date:'medium' }}</span>\n </div>\n }\n @if (record.CompletedAt) {\n <div class=\"stat\">\n <span class=\"label\">Duration</span>\n <span class=\"value\">{{ calculateDuration(record.StartedAt, record.CompletedAt) }}</span>\n </div>\n }\n @if (record.Success !== null && record.CompletedAt !== null) {\n <div class=\"stat\">\n <span class=\"label\">Result</span>\n <span class=\"value\" [class.success]=\"record.Success\" [class.error]=\"!record.Success\">\n {{ record.Success ? 'Success' : 'Failed' }}\n </span>\n </div>\n }\n @if (costMetrics && (costMetrics.totalTokensInput + costMetrics.totalTokensOutput) > 0) {\n <div class=\"stat\">\n <span class=\"label\">Tokens</span>\n @if (!costMetrics.isLoading) {\n <span class=\"value\">{{ (costMetrics.totalTokensInput + costMetrics.totalTokensOutput) | number:'1.0-0' }}</span>\n }\n @if (costMetrics.isLoading) {\n <span class=\"value loading\"><i class=\"fas fa-spinner fa-spin\"></i></span>\n }\n </div>\n }\n @if (costMetrics && costMetrics.totalCost > 0) {\n <div class=\"stat\">\n <span class=\"label\">Cost</span>\n @if (!costMetrics.isLoading) {\n <span class=\"value\">${{ costMetrics.totalCost | number:'1.2-4' }}</span>\n }\n @if (costMetrics.isLoading) {\n <span class=\"value loading\"><i class=\"fas fa-spinner fa-spin\"></i></span>\n }\n </div>\n }\n @if (record.EffortLevel) {\n <div class=\"stat\">\n <span class=\"label\">Effort Level</span>\n <span class=\"value\">{{ record.EffortLevel }}</span>\n </div>\n }\n </div>\n\n <!-- Configuration Bar (shown below header stats when ConfigurationID exists) -->\n @if (record.ConfigurationID) {\n <div class=\"configuration-bar\">\n <div class=\"config-item\">\n <i class=\"fas fa-cog\"></i>\n <div class=\"config-content\">\n <div class=\"config-label\">Configuration</div>\n <div class=\"config-value\">\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Configurations', record.ConfigurationID)\">\n {{ record.Configuration || 'Unknown' }}\n </a>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs\">\n <button class=\"tab\" [class.active]=\"activeTab === 'timeline'\" (click)=\"changeTab('timeline')\">\n <i class=\"fas fa-stream\"></i> Timeline\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'visualization'\" (click)=\"changeTab('visualization')\">\n <i class=\"fas fa-diagram-project\"></i> Visualization\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'analytics'\" (click)=\"changeTab('analytics')\">\n <i class=\"fas fa-chart-line\"></i> Analytics\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'details'\" (click)=\"changeTab('details')\">\n <i class=\"fas fa-info-circle\"></i> Details\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"content-area\">\n <!-- Timeline Tab -->\n @if (activeTab === 'timeline') {\n <div class=\"tab-content\" style=\"height: 100%;\">\n <as-split direction=\"horizontal\" style=\"height: 100%;\">\n <!-- Timeline Pane -->\n <as-split-area [size]=\"selectedTimelineItem ? 55 : 100\">\n <mj-ai-agent-run-timeline\n [aiAgentRunId]=\"record.ID\"\n [dataHelper]=\"dataHelper\"\n [RunTree]=\"runTree\"\n (itemSelected)=\"selectTimelineItem($event)\"\n (navigateToEntity)=\"navigateToEntityRecord($event)\">\n </mj-ai-agent-run-timeline>\n </as-split-area>\n <!-- JSON Detail Pane -->\n @if (selectedTimelineItem) {\n <as-split-area [size]=\"45\">\n <mj-ai-agent-run-step-detail\n [selectedTimelineItem]=\"selectedTimelineItem\"\n [Provider]=\"ProviderToUse\"\n (closePanel)=\"closeJsonPanel()\"\n (navigateToActionLog)=\"navigateToActionLog($event)\"\n (copyToClipboard)=\"copyToClipboard($event)\">\n </mj-ai-agent-run-step-detail>\n </as-split-area>\n }\n </as-split>\n </div>\n }\n\n <!-- Visualization Tab (animated flow views + static flowchart) -->\n @if (activeTab === 'visualization') {\n <div class=\"tab-content\" style=\"height: 100%;\">\n @if (visualizationLoaded) {\n <mj-ai-agent-run-flow\n [aiAgentRunId]=\"record.ID\"\n [dataHelper]=\"dataHelper\"\n [agentName]=\"agent?.Name || null\"\n [runStatus]=\"record.Status || ''\"\n [agentIconClass]=\"agent?.IconClass || null\"\n [agentLogoUrl]=\"agent?.LogoURL || null\"\n [RunTree]=\"runTree\">\n </mj-ai-agent-run-flow>\n }\n </div>\n }\n\n <!-- Analytics Tab -->\n @if (activeTab === 'analytics') {\n <div class=\"tab-content\" style=\"height: 100%;\">\n @if (analyticsLoaded) {\n <mj-ai-agent-run-analytics\n #analyticsComponent\n [agentRunId]=\"record.ID\"\n [RunTree]=\"runTree\"\n >\n </mj-ai-agent-run-analytics>\n }\n </div>\n }\n\n <!-- Details Tab -->\n @if (activeTab === 'details') {\n <div class=\"tab-content\">\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-info-circle\"></i> General Information\n </ng-template>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Agent</label>\n <span>\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Agents', record.AgentID)\">\n {{ agent?.Name || 'N/A' }}\n </a>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Parent Run ID</label>\n <span>\n @if (record.ParentRunID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Agent Runs', record.ParentRunID)\">\n {{ record.ParentRunID }}\n </a>\n }\n @if (!record.ParentRunID) {\n <span>None (Root)</span>\n }\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Last Run ID</label>\n <span>\n @if (record.LastRunID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Agent Runs', record.LastRunID)\">\n {{ record.LastRunID }}\n </a>\n }\n @if (!record.LastRunID) {\n <span>None</span>\n }\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Conversation ID</label>\n <span>\n @if (record.ConversationID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: Conversations', record.ConversationID)\">\n {{ record.ConversationID }}\n </a>\n }\n @if (!record.ConversationID) {\n <span>N/A</span>\n }\n </span>\n </div>\n <div class=\"detail-item\">\n <label>User</label>\n <span>\n @if (record.UserID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: Users', record.UserID)\">\n {{ record.User || 'N/A' }}\n </a>\n }\n @if (!record.UserID) {\n <span>N/A</span>\n }\n </span>\n </div>\n </div>\n </mj-accordion-panel>\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-cogs\"></i> Execution Settings\n </ng-template>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Override Model</label>\n <span>\n @if (record.OverrideModelID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Models', record.OverrideModelID)\">\n {{ record.OverrideModel || 'N/A' }}\n </a>\n }\n @if (!record.OverrideModelID) {\n <span>N/A</span>\n }\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Override Vendor</label>\n <span>\n @if (record.OverrideVendorID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Vendors', record.OverrideVendorID)\">\n {{ record.OverrideVendor || 'N/A' }}\n </a>\n }\n @if (!record.OverrideVendorID) {\n <span>N/A</span>\n }\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Verbose Logging</label>\n <span>{{ record.Verbose ? 'Yes' : 'No' }}</span>\n </div>\n </div>\n </mj-accordion-panel>\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-tasks\"></i> Execution Status\n </ng-template>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Status</label>\n <span class=\"status-badge\" [attr.data-status]=\"record.Status\">\n {{ record.Status }}\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Success</label>\n @if (record.Success === null) {\n <span>In Progress</span>\n }\n @else if (record.Success) {\n <span class=\"success\">Yes</span>\n }\n @else {\n <span class=\"error-message\">No</span>\n }\n </div>\n @if (record.Message) {\n <div class=\"detail-item full-width\">\n <label>Message</label>\n <div class=\"message\">{{ record.Message }}</div>\n </div>\n }\n @if (record.ErrorMessage) {\n <div class=\"detail-item full-width\">\n <label>Error Message</label>\n <div class=\"error-message\">{{ record.ErrorMessage }}</div>\n </div>\n }\n </div>\n </mj-accordion-panel>\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-dollar-sign\"></i> Usage &amp; Cost\n </ng-template>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Total Tokens Used</label>\n <span>{{ record.TotalTokensUsed ? (record.TotalTokensUsed | number:'1.0-0') : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Prompt Tokens</label>\n <span>{{ record.TotalPromptTokensUsed ? (record.TotalPromptTokensUsed | number:'1.0-0') : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Completion Tokens</label>\n <span>{{ record.TotalCompletionTokensUsed ? (record.TotalCompletionTokensUsed | number:'1.0-0') : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Total Cost</label>\n <span>{{ record.TotalCost != null ? ('$' + (record.TotalCost | number:'1.2-4')) : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Total Prompt Iterations</label>\n <span>{{ record.TotalPromptIterations != null ? (record.TotalPromptIterations | number:'1.0-0') : 'N/A' }}</span>\n </div>\n </div>\n </mj-accordion-panel>\n @if (record.Result) {\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-code\"></i> Result\n </ng-template>\n <div class=\"result-viewer\">\n @if (isParsingComplete) {\n <mj-code-editor\n [ngModel]=\"parsedResult\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n } @else {\n <div style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fas fa-spinner fa-spin\"></i> Loading result data...\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n @if (record.StartingPayload) {\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-upload\"></i> Starting Payload\n </ng-template>\n <div class=\"result-viewer\">\n @if (isParsingComplete) {\n <mj-code-editor\n [ngModel]=\"parsedStartingPayload\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n } @else {\n <div style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fas fa-spinner fa-spin\"></i> Loading payload data...\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n @if (record.Data) {\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-database\"></i> Execution Data\n </ng-template>\n <div class=\"result-viewer\">\n @if (isParsingComplete) {\n <mj-code-editor\n [ngModel]=\"parsedData\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n } @else {\n <div style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fas fa-spinner fa-spin\"></i> Loading execution data...\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n @if (record.FinalPayload) {\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-download\"></i> Final Payload\n </ng-template>\n <div class=\"result-viewer\">\n @if (isParsingComplete) {\n <mj-code-editor\n [ngModel]=\"parsedFinalPayload\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n } @else {\n <div style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fas fa-spinner fa-spin\"></i> Loading final payload data...\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n @if (showPayloadDiff) {\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-code-compare\"></i> Payload Diff\n </ng-template>\n <div style=\"padding: 20px; background: var(--mj-bg-surface-card);\">\n @if (isParsingComplete) {\n <mj-deep-diff\n [oldValue]=\"startingPayloadObject\"\n [newValue]=\"finalPayloadObject\"\n [title]=\"''\"\n [showSummary]=\"true\"\n [showUnchanged]=\"false\"\n [expandAll]=\"false\"\n [maxDepth]=\"10\"\n [maxStringLength]=\"200\"\n [treatNullAsUndefined]=\"true\">\n </mj-deep-diff>\n } @else {\n <div style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fas fa-spinner fa-spin\"></i> Loading payload diff...\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n </div>\n }\n</div>\n</div>\n</div>"]}
1
+ {"version":3,"file":"ai-agent-run.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run.component.ts","../../../../src/lib/custom/ai-agent-run/ai-agent-run.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ViewChild, inject } from '@angular/core';\nimport { Subject, Subscription } from 'rxjs';\nimport { BaseEntity, BaseEntityEvent, CompositeKey, Metadata } from '@memberjunction/core';\nimport {\n LoadAgentRunTree,\n MAX_AGENT_RUN_TREE_DEPTH,\n MJAIAgentRunEntityExtended,\n MJAIAgentEntityExtended,\n WalkAgentRunTree,\n type AgentRunTreeNode,\n} from '@memberjunction/ai-core-plus';\nimport { BaseFormComponent } from '@memberjunction/ng-base-forms';\nimport { MJGlobal, MJEvent, MJEventType, RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { SharedService, NavigationService } from '@memberjunction/ng-shared';\nimport { TimelineItem, AIAgentRunTimelineComponent } from './ai-agent-run-timeline.component';\nimport { MJAIAgentRunFormComponent } from '../../generated/Entities/MJAIAgentRun/mjaiagentrun.form.component';\nimport { ParseJSONRecursive, ParseJSONOptions } from '@memberjunction/global';\nimport { AIAgentRunAnalyticsComponent } from './ai-agent-run-analytics.component';\nimport { AIAgentRunCostService, AgentRunCostMetrics } from './ai-agent-run-cost.service';\nimport { AIAgentRunDataHelper } from './ai-agent-run-data.service';\nimport { ApplicationManager } from '@memberjunction/ng-base-application';\n\n/**\n * Task statuses that mean the step is finished with. Anything else means the workflow is still\n * moving — see `WorkflowStillRunning`.\n */\nconst TERMINAL_TASK_STATUSES = new Set(['Complete', 'Failed', 'Cancelled', 'Skipped', 'Blocked']);\n\n/**\n * How often to re-read the tree while a detached workflow runs.\n *\n * Human-scale rather than aggressive: a workflow step takes seconds at least, and the query walks\n * the whole tree. Fast enough that a watcher sees progress, slow enough that leaving the tab open on\n * a long workflow is not a load problem.\n */\nconst WORKFLOW_POLL_INTERVAL_MS = 4000;\n\n@RegisterClass(BaseFormComponent, 'MJ: AI Agent Runs')\n@Component({\n standalone: false,\n selector: 'mj-ai-agent-run-form',\n templateUrl: './ai-agent-run.component.html',\n styleUrls: ['./ai-agent-run.component.css']\n})\nexport class MJAIAgentRunFormComponentExtended extends MJAIAgentRunFormComponent implements OnInit, OnDestroy {\n public record!: MJAIAgentRunEntityExtended;\n \n private destroy$ = new Subject<void>();\n\n // MJGlobal BaseEntity event subscription — fires on both local Save()\n // and server-side remote-invalidate events. While the run is Running,\n // this is how we hear about new steps and status changes without\n // polling the DB on a timer. Only attached when Status === 'Running'.\n private entityEventSubscription: Subscription | null = null;\n private refreshInFlight = false;\n\n /** Pending re-read of the run tree while a detached workflow is still running. */\n private workflowPollTimer: ReturnType<typeof setTimeout> | null = null;\n\n // UI state\n activeTab = 'timeline';\n selectedTimelineItem: TimelineItem | null = null;\n jsonPanelExpanded = false;\n loading = false;\n error: string | null = null;\n analyticsLoaded = false;\n visualizationLoaded = false;\n \n agent: MJAIAgentEntityExtended | null = null;\n \n // Cost metrics using shared service\n costMetrics: AgentRunCostMetrics | null = null;\n \n // Cached parsed results to prevent redundant JSON parsing\n private _cachedParsedResult: string | null = null;\n private _cachedParsedStartingPayload: string | null = null;\n private _cachedParsedFinalPayload: string | null = null;\n private _cachedParsedData: string | null = null;\n \n // Simple parsing state - true when all parsing is complete\n private _allParsingComplete = false;\n \n @ViewChild(AIAgentRunTimelineComponent) timelineComponent?: AIAgentRunTimelineComponent;\n @ViewChild(AIAgentRunAnalyticsComponent) analyticsComponent?: AIAgentRunAnalyticsComponent;\n\n // Field injections\n private navigationService = inject(NavigationService);\n private costService = inject(AIAgentRunCostService);\n private appManager = inject(ApplicationManager);\n\n // Instance of data helper per component\n public dataHelper = new AIAgentRunDataHelper();\n\n /**\n * The run's complete execution tree — loaded ONCE here and shared with every tab.\n *\n * **One load, one shape, one refresh.** The timeline, the three flow renderers and analytics all\n * need the same structure; letting each fetch its own would issue the same recursive query three\n * times, and — worse — let the tabs disagree, because a tab that loaded a second earlier shows a\n * different run than the one beside it. Sharing it also means a refresh updates all three at once\n * rather than whichever one the user happens to open next.\n */\n public runTree: AgentRunTreeNode | null = null;\n\n /** True while the tree is loading, so a tab can say so rather than render an empty run. */\n public runTreeLoading = false;\n\n /** Why the tree could not be loaded, or null. Surfaced rather than swallowed. */\n public runTreeError: string | null = null;\n\n /**\n * Loads (or reloads) the shared run tree.\n *\n * Errors are held rather than thrown: a run whose tree cannot be read still has fields worth\n * looking at, and taking the whole form down over one query would hide them.\n */\n private async loadRunTree(): Promise<void> {\n if (!this.record?.ID) return;\n this.runTreeLoading = true;\n this.runTreeError = null;\n try {\n const result = await LoadAgentRunTree(this.record.ID, this.RunQueryToUse);\n this.runTree = result.Root;\n this.runTreeError = result.ErrorMessage;\n if (result.Truncated) {\n this.runTreeError =\n `This run nests deeper than ${MAX_AGENT_RUN_TREE_DEPTH} levels; what is shown is truncated.`;\n }\n } catch (e) {\n this.runTreeError = e instanceof Error ? e.message : String(e);\n this.runTree = null;\n } finally {\n this.runTreeLoading = false;\n this.scheduleWorkflowPoll();\n }\n }\n\n /**\n * True when this run submitted a workflow that has not finished.\n *\n * **The run being \"Completed\" says nothing about this.** A task graph is submit-and-detach: the\n * step that submits it completes as soon as the graph is persisted, and the run completes with it\n * — while the dispatcher goes on executing for seconds or minutes afterwards. One observed run\n * finished in 225ms and its workflow ran for a further eighteen seconds.\n *\n * Without this the form showed a green COMPLETED header above steps sitting at Pending, and the\n * only available reading was that something had failed. Nothing had; the page was simply a\n * snapshot of a moving thing, with nothing saying so.\n */\n public get WorkflowStillRunning(): boolean {\n if (!this.runTree) return false;\n for (const node of WalkAgentRunTree(this.runTree)) {\n if (node.NodeType !== 'Task' && node.NodeType !== 'TaskGraph') continue;\n if (!TERMINAL_TASK_STATUSES.has(node.Status)) return true;\n }\n return false;\n }\n\n /**\n * Re-reads the tree while a detached workflow is still moving, and stops when it settles.\n *\n * Polling rather than the BaseEntity event subscription this form already has, because that\n * subscription cannot see this work for two independent reasons: it is only attached while the RUN\n * is `Running` (a detached graph outlives that), and the dispatcher advances tasks through the\n * claim protocol's direct SQL, which fires no entity events at all.\n *\n * Self-cancelling: each load reschedules only if work remains, so a settled run costs nothing.\n */\n private scheduleWorkflowPoll(): void {\n this.clearWorkflowPoll();\n if (!this.WorkflowStillRunning) return;\n this.workflowPollTimer = setTimeout(() => {\n this.workflowPollTimer = null;\n void this.loadRunTree();\n }, WORKFLOW_POLL_INTERVAL_MS);\n }\n\n private clearWorkflowPoll(): void {\n if (this.workflowPollTimer !== null) {\n clearTimeout(this.workflowPollTimer);\n this.workflowPollTimer = null;\n }\n }\n \n async ngOnInit() {\n await super.ngOnInit();\n \n if (this.record && this.record.ID) {\n await this.dataHelper.loadAgentRunData(this.record.ID);\n await this.loadRunTree();\n await this.loadAgent();\n await this.loadCostMetrics();\n\n // Parse all JSON fields on form load for instant access later\n this.parseAllFields();\n\n // If the run is in progress, subscribe to BaseEntity events so we\n // pick up new steps / status changes the moment AgentRunner saves\n // them — no 30s polling timer. Same pattern used by the Form\n // Builder cockpit. See `handleEntityEvent` below for filtering.\n if (this.record.Status === 'Running') {\n this.subscribeToRunEvents();\n }\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n this.clearWorkflowPoll();\n this.entityEventSubscription?.unsubscribe();\n this.entityEventSubscription = null;\n this.clearParsedCache();\n this.dataHelper.clearData();\n this.costMetrics = null;\n this.agent = null;\n }\n\n private subscribeToRunEvents(): void {\n if (this.entityEventSubscription) return;\n this.entityEventSubscription = MJGlobal.Instance.GetEventListener(false)\n .subscribe(mjEvent => this.handleEntityEvent(mjEvent));\n }\n\n private unsubscribeFromRunEvents(): void {\n this.entityEventSubscription?.unsubscribe();\n this.entityEventSubscription = null;\n }\n\n /**\n * Filter the global BaseEntity event firehose down to saves on the\n * current Agent Run row, its Steps, or its Prompt Runs — and only when\n * AgentRunID matches `this.record.ID`. Local `save` events come from\n * the in-process AgentRunner (dev/same-tab case, which is the primary\n * use case here); `remote-invalidate` covers writes from a separate\n * server process if GraphQL cache-invalidation is wired up.\n */\n private handleEntityEvent(mjEvent: MJEvent): void {\n if (mjEvent.event !== MJEventType.ComponentEvent) return;\n if (mjEvent.eventCode !== BaseEntity.BaseEventCode) return;\n const evt = mjEvent.args as BaseEntityEvent | undefined;\n if (!evt) return;\n if (evt.type !== 'save' && evt.type !== 'remote-invalidate') return;\n\n const entityName = evt.entityName ?? evt.baseEntity?.EntityInfo?.Name;\n if (!entityName) return;\n\n const runId = this.record?.ID;\n if (!runId) return;\n\n if (entityName === 'MJ: AI Agent Runs') {\n // Status change on THIS run row.\n const savedID = this.resolveEventID(evt);\n if (savedID && UUIDsEqual(savedID, runId)) {\n this.refreshData();\n // If the run completed, drop the subscription — no further\n // writes are expected and we don't want to hold the listener.\n const newStatus = this.resolveEventField<string>(evt, 'Status');\n if (newStatus && newStatus !== 'Running') {\n this.unsubscribeFromRunEvents();\n }\n }\n return;\n }\n\n // Steps still carry AgentRunID, so a step write can be correlated exactly to this run.\n if (entityName === 'MJ: AI Agent Run Steps') {\n const childAgentRunId = this.resolveEventField<string>(evt, 'AgentRunID');\n if (childAgentRunId && UUIDsEqual(childAgentRunId, runId)) {\n this.refreshRunDataDebounced();\n }\n return;\n }\n\n // Prompt runs and action logs expose no AgentRunID to correlate on: AIPromptRun.AgentRunID was\n // dropped in v5.50 (Break_CodeGen_Cycle_Remove_PromptRun_AgentRunID) and ActionExecutionLog never\n // had one. Correlating on it made this branch dead for action logs from the start, and for prompt\n // runs from v5.50 — the form simply stopped live-refreshing. Refresh unconditionally instead,\n // which is what the original comment described: the reload is debounced and re-reads only THIS\n // run, and the subscription is dropped once the run leaves 'Running', so a foreign write costs at\n // most one collapsed reload while a run is open on screen.\n if (entityName === 'MJ: AI Prompt Runs' || entityName === 'MJ: Action Execution Logs') {\n this.refreshRunDataDebounced();\n }\n }\n\n private resolveEventID(evt: BaseEntityEvent): string | null {\n if (evt.baseEntity) {\n return evt.baseEntity.PrimaryKey?.ToConcatenatedString() ?? null;\n }\n const payload = evt.payload as { primaryKeyValues?: string | null; recordData?: string | null } | undefined;\n if (!payload) return null;\n try {\n if (payload.primaryKeyValues) {\n const pk = JSON.parse(payload.primaryKeyValues) as Record<string, unknown> | unknown[];\n if (Array.isArray(pk)) {\n const idPair = pk.find(p => (p as { FieldName?: string }).FieldName === 'ID') as { Value?: unknown } | undefined;\n if (idPair?.Value != null) return String(idPair.Value);\n } else if (pk && typeof pk === 'object' && 'ID' in pk) {\n const v = (pk as { ID?: unknown }).ID;\n if (v != null) return String(v);\n }\n }\n } catch {\n // bad JSON — fall through to recordData\n }\n try {\n if (payload.recordData) {\n const row = JSON.parse(payload.recordData) as Record<string, unknown>;\n if (typeof row?.ID === 'string') return row.ID;\n }\n } catch {\n // ignore\n }\n return null;\n }\n\n private resolveEventField<T>(evt: BaseEntityEvent, fieldName: string): T | null {\n if (evt.baseEntity) {\n const val = evt.baseEntity.Get?.(fieldName) as T | undefined;\n return val ?? null;\n }\n const payload = evt.payload as { recordData?: string | null } | undefined;\n if (!payload?.recordData) return null;\n try {\n const row = JSON.parse(payload.recordData) as Record<string, unknown>;\n const v = row?.[fieldName];\n return (v ?? null) as T | null;\n } catch {\n return null;\n }\n }\n\n /**\n * Collapse rapid bursts of step/prompt/action events into a single\n * reload — AgentRunner often saves several rows in quick succession.\n */\n private refreshRunDataDebounced(): void {\n if (this.refreshInFlight) return;\n this.refreshInFlight = true;\n queueMicrotask(() => {\n this.refreshInFlight = false;\n if (!this.record?.ID) return;\n this.dataHelper.loadAgentRunData(this.record.ID, true);\n });\n }\n \n private async loadAgent() {\n if (!this.record?.AgentID) return;\n \n try {\n const md = this.ProviderToUse;\n const agent = await md.GetEntityObject<MJAIAgentEntityExtended>('MJ: AI Agents');\n if (agent && await agent.Load(this.record.AgentID)) {\n this.agent = agent;\n this.cdr.detectChanges();\n }\n } catch (error) {\n console.error('Error loading agent:', error);\n }\n }\n\n private async loadCostMetrics() {\n if (!this.record?.ID) return;\n \n try {\n this.costMetrics = await this.costService.getAgentRunCostMetrics(this.record.ID);\n this.cdr.markForCheck();\n } catch (error) {\n console.error('Error loading cost metrics:', error);\n this.costMetrics = {\n totalCost: 0,\n totalPrompts: 0,\n totalTokensInput: 0,\n totalTokensOutput: 0,\n isLoading: false,\n error: 'Failed to load cost data'\n };\n }\n }\n \n changeTab(tab: string) {\n this.activeTab = tab;\n \n // Lazy load the Visualization (playable + static flow) view on first access\n if (tab === 'visualization' && !this.visualizationLoaded) {\n this.visualizationLoaded = true;\n this.cdr.markForCheck();\n }\n \n // Lazy load analytics when the tab is first accessed\n if (tab === 'analytics' && !this.analyticsLoaded) {\n this.analyticsLoaded = true;\n this.cdr.markForCheck();\n }\n }\n \n \n calculateDuration(start: Date, end?: Date | null): string {\n if (!end) return 'Running...';\n \n const ms = end.getTime() - start.getTime();\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3600000) return `${Math.floor(ms / 60000)}m ${Math.floor((ms % 60000) / 1000)}s`;\n return `${Math.floor(ms / 3600000)}h ${Math.floor((ms % 3600000) / 60000)}m`;\n }\n \n selectTimelineItem(item: TimelineItem) {\n this.selectedTimelineItem = item;\n this.jsonPanelExpanded = true;\n this.cdr.markForCheck();\n }\n \n closeJsonPanel() {\n this.selectedTimelineItem = null;\n this.cdr.markForCheck();\n }\n \n navigateToSubRun(runId: string) {\n SharedService.Instance.OpenEntityRecord(\"MJ: AI Agent Runs\", CompositeKey.FromID(runId));\n }\n\n navigateToParentRun() {\n if (this.record.ParentRunID) {\n SharedService.Instance.OpenEntityRecord(\"MJ: AI Agent Runs\", CompositeKey.FromID(this.record.ParentRunID));\n }\n }\n \n navigateToActionLog(logId: string) {\n SharedService.Instance.OpenEntityRecord(\"MJ: Action Execution Logs\", CompositeKey.FromID(logId));\n }\n \n openEntityRecord(entityName: string, recordId: string | null) {\n if (recordId) {\n SharedService.Instance.OpenEntityRecord(entityName, CompositeKey.FromURLSegment(this.ProviderToUse.EntityByName(entityName), recordId));\n }\n }\n \n navigateToEntityRecord(event: { entityName: string; recordId: string }) {\n SharedService.Instance.OpenEntityRecord(event.entityName, CompositeKey.FromURLSegment(this.ProviderToUse.EntityByName(event.entityName), event.recordId));\n }\n\n /**\n * Navigate to the conversation in the Chat application\n */\n navigateToConversation() {\n if (!this.record?.ConversationID) return;\n\n // Find the Chat app\n const chatApp = this.appManager.GetAllApps().find(app => app.Name === 'Chat');\n if (!chatApp) {\n console.warn('Chat application not found');\n return;\n }\n\n // Navigate to the Conversations nav item with the conversationId parameter\n this.navigationService.OpenNavItemByName(\n 'Conversations',\n { conversationId: this.record.ConversationID },\n chatApp.ID\n );\n }\n \n refreshData() {\n // Reload the agent run record to get latest status\n if (this.record?.ID) {\n // Clear parsed cache when refreshing data\n this.clearParsedCache();\n \n // No panel states to reset in simplified approach\n \n this.record.Load(this.record.ID).then(() => {\n // Clear cost cache and reload\n this.costService.clearCache(this.record.ID);\n this.loadCostMetrics();\n \n // Reload data through helper - this will update all components (force reload for refresh)\n this.dataHelper.loadAgentRunData(this.record.ID, true);\n void this.loadRunTree();\n \n // Trigger analytics refresh\n if (this.analyticsComponent) {\n this.analyticsComponent.loadData();\n }\n });\n }\n }\n \n \n getStatusIcon(status: string): string {\n const iconMap: Record<string, string> = {\n 'Running': 'fa-circle-notch fa-spin',\n 'Completed': 'fa-check-circle',\n 'Failed': 'fa-times-circle',\n 'Cancelled': 'fa-ban',\n 'Paused': 'fa-pause-circle'\n };\n return iconMap[status] || 'fa-question-circle';\n }\n \n async copyToClipboard(text: string) {\n try {\n await navigator.clipboard.writeText(text);\n // Could show a toast notification here\n } catch (err) {\n console.error('Failed to copy to clipboard:', err);\n }\n }\n \n /**\n * Get the Result field with recursive JSON parsing applied\n */\n get parsedResult(): string {\n if (!this.record?.Result) {\n return '';\n }\n \n // Return cached result if available\n if (this._cachedParsedResult !== null) {\n return this._cachedParsedResult;\n }\n \n \n try {\n // First, check if Result is a JSON string that needs to be parsed\n let resultData = this.record.Result;\n try {\n // If Result is a JSON string, parse it first\n resultData = JSON.parse(this.record.Result);\n } catch {\n // If it's not valid JSON, use it as-is\n resultData = this.record.Result;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false // Disable debug logging - regex issue fixed\n };\n // Re-enabled ParseJSONRecursive with performance optimizations\n const parsed = ParseJSONRecursive(resultData, parseOptions);\n const result = JSON.stringify(parsed, null, 2);\n \n // Cache the result\n this._cachedParsedResult = result;\n \n return result;\n } catch (e) {\n const fallbackResult = this.record.Result;\n this._cachedParsedResult = fallbackResult;\n return fallbackResult;\n }\n }\n \n /**\n * Get the Starting Payload field with recursive JSON parsing applied\n */\n get parsedStartingPayload(): string {\n if (!this.record?.StartingPayload) {\n return '';\n }\n \n // Return cached result if available\n if (this._cachedParsedStartingPayload !== null) {\n return this._cachedParsedStartingPayload;\n }\n \n \n try {\n // First, check if StartingPayload is a JSON string that needs to be parsed\n let payloadData = this.record.StartingPayload;\n try {\n // If StartingPayload is a JSON string, parse it first\n payloadData = JSON.parse(this.record.StartingPayload);\n } catch {\n // If it's not valid JSON, use it as-is\n payloadData = this.record.StartingPayload;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n // Re-enabled ParseJSONRecursive with performance optimizations\n const parsed = ParseJSONRecursive(payloadData, parseOptions);\n const result = JSON.stringify(parsed, null, 2);\n \n // Cache the result\n this._cachedParsedStartingPayload = result;\n \n return result;\n } catch (e) {\n const fallbackResult = this.record.StartingPayload;\n this._cachedParsedStartingPayload = fallbackResult;\n return fallbackResult;\n }\n }\n\n /**\n * Get the Final Payload (state) field with recursive JSON parsing applied\n */\n get parsedFinalPayload(): string {\n if (!this.record?.FinalPayload) return '';\n \n // Return cached result if available\n if (this._cachedParsedFinalPayload !== null) {\n return this._cachedParsedFinalPayload;\n }\n \n try {\n // First, check if FinalPayload is a JSON string that needs to be parsed\n let payloadData = this.record.FinalPayload;\n try {\n // If FinalPayload is a JSON string, parse it first\n payloadData = JSON.parse(this.record.FinalPayload);\n } catch {\n // If it's not valid JSON, use it as-is\n payloadData = this.record.FinalPayload;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false // Disable debug logging - regex issue fixed\n };\n // Re-enabled ParseJSONRecursive with performance optimizations\n const parsed = ParseJSONRecursive(payloadData, parseOptions);\n const result = JSON.stringify(parsed, null, 2);\n \n // Cache the result\n this._cachedParsedFinalPayload = result;\n \n return result;\n } catch (e) {\n const fallbackResult = this.record.FinalPayload;\n this._cachedParsedFinalPayload = fallbackResult;\n return fallbackResult;\n }\n }\n\n /**\n * Get the Data field with recursive JSON parsing applied\n */\n get parsedData(): string {\n if (!this.record?.Data) return '';\n \n // Return cached result if available\n if (this._cachedParsedData !== null) {\n return this._cachedParsedData;\n }\n \n try {\n // First, check if Data is a JSON string that needs to be parsed\n let data = this.record.Data;\n try {\n // If Data is a JSON string, parse it first\n data = JSON.parse(this.record.Data);\n } catch {\n // If it's not valid JSON, use it as-is\n data = this.record.Data;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n // Re-enabled ParseJSONRecursive with performance optimizations\n const parsed = ParseJSONRecursive(data, parseOptions);\n const result = JSON.stringify(parsed, null, 2);\n \n // Cache the result\n this._cachedParsedData = result;\n \n return result;\n } catch (e) {\n const fallbackResult = this.record.Data;\n this._cachedParsedData = fallbackResult;\n return fallbackResult;\n }\n }\n \n /**\n * Get parsed Starting Payload as an object for deep diff\n */\n get startingPayloadObject(): any {\n if (!this.record?.StartingPayload) return null;\n \n try {\n // First, check if StartingPayload is a JSON string that needs to be parsed\n let payloadData = this.record.StartingPayload;\n try {\n // If StartingPayload is a JSON string, parse it first\n payloadData = JSON.parse(this.record.StartingPayload);\n } catch {\n // If it's not valid JSON, use it as-is\n payloadData = this.record.StartingPayload;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n // Re-enabled ParseJSONRecursive with performance optimizations\n return ParseJSONRecursive(payloadData, parseOptions);\n } catch (e) {\n return null;\n }\n }\n\n /**\n * Get parsed Final Payload as an object for deep diff\n */\n get finalPayloadObject(): any {\n if (!this.record?.FinalPayload) return null;\n \n try {\n // First, check if FinalPayload is a JSON string that needs to be parsed\n let payloadData = this.record.FinalPayload;\n try {\n // If FinalPayload is a JSON string, parse it first\n payloadData = JSON.parse(this.record.FinalPayload);\n } catch {\n // If it's not valid JSON, use it as-is\n payloadData = this.record.FinalPayload;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n // Re-enabled ParseJSONRecursive with performance optimizations\n return ParseJSONRecursive(payloadData, parseOptions);\n } catch (e) {\n return null;\n }\n }\n\n /**\n * Clear all cached parsed results\n */\n private clearParsedCache(): void {\n this._cachedParsedResult = null;\n this._cachedParsedStartingPayload = null;\n this._cachedParsedFinalPayload = null;\n this._cachedParsedData = null;\n this._allParsingComplete = false;\n }\n \n /**\n * Parse all JSON fields at once and cache results\n */\n private parseAllFields(): void {\n try {\n let parsedCount = 0;\n \n // Parse all fields that exist\n if (this.record?.Result) {\n this.parsedResult; // Triggers parsing and caching\n parsedCount++;\n }\n \n if (this.record?.StartingPayload) {\n this.parsedStartingPayload; // Triggers parsing and caching\n parsedCount++;\n }\n \n if (this.record?.FinalPayload) {\n this.parsedFinalPayload; // Triggers parsing and caching\n parsedCount++;\n }\n \n if (this.record?.Data) {\n this.parsedData; // Triggers parsing and caching\n parsedCount++;\n }\n \n this._allParsingComplete = true;\n \n } catch (error) {\n console.error('Error during JSON parsing:', error);\n }\n }\n \n /**\n * Check if all parsing is complete - used by template\n */\n get isParsingComplete(): boolean {\n return this._allParsingComplete;\n }\n\n /**\n * Check if we have both payloads to show diff\n */\n get showPayloadDiff(): boolean {\n return !!(this.record?.StartingPayload && this.record?.FinalPayload);\n }\n\n /**\n * Check if selected timeline item is a step with payload changes\n */\n get showStepPayloadDiff(): boolean {\n if (!this.selectedTimelineItem || this.selectedTimelineItem.type !== 'step') {\n return false;\n }\n \n const stepData = this.selectedTimelineItem.data;\n if (stepData && (stepData.PayloadAtStart?.trim().length > 0 \n || stepData.PayloadAtEnd?.trim().length > 0)) {\n return stepData.PayloadAtStart !== stepData.PayloadAtEnd;\n }\n else {\n return false;\n }\n }\n\n /**\n * Get parsed PayloadAtStart for the selected step\n */\n get stepPayloadAtStartObject(): any {\n if (!this.selectedTimelineItem || this.selectedTimelineItem.type !== 'step') {\n return null;\n }\n \n const stepData = this.selectedTimelineItem.data;\n if (!stepData || !stepData.PayloadAtStart) {\n return null;\n }\n \n try {\n let payloadData = stepData.PayloadAtStart;\n try {\n payloadData = JSON.parse(stepData.PayloadAtStart);\n } catch {\n payloadData = stepData.PayloadAtStart;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n // Re-enabled ParseJSONRecursive with performance optimizations\n return ParseJSONRecursive(payloadData, parseOptions);\n } catch (e) {\n return null;\n }\n }\n\n /**\n * Get parsed PayloadAtEnd for the selected step\n */\n get stepPayloadAtEndObject(): any {\n if (!this.selectedTimelineItem || this.selectedTimelineItem.type !== 'step') {\n return null;\n }\n \n const stepData = this.selectedTimelineItem.data;\n if (!stepData || !stepData.PayloadAtEnd) {\n return null;\n }\n \n try {\n let payloadData = stepData.PayloadAtEnd;\n try {\n payloadData = JSON.parse(stepData.PayloadAtEnd);\n } catch {\n payloadData = stepData.PayloadAtEnd;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n // Re-enabled ParseJSONRecursive with performance optimizations\n return ParseJSONRecursive(payloadData, parseOptions);\n } catch (e) {\n return null;\n }\n }\n}\n","<div class=\"record-form-container ai-agent-run-form\">\n <div class=\"record-form\">\n <!-- Header -->\n <div class=\"header\">\n <div class=\"header-content\">\n <div class=\"header-left\">\n <div class=\"icon-wrapper\">\n @if (agent && agent.LogoURL) {\n <img [src]=\"agent.LogoURL\" [alt]=\"agent.Name || 'Agent'\" class=\"agent-logo\" />\n }\n @if (agent && !agent.LogoURL && agent.IconClass) {\n <i class=\"fas\" [ngClass]=\"agent.IconClass\"></i>\n }\n @if (!agent || (!agent.LogoURL && !agent.IconClass)) {\n <i class=\"fas fa-robot\"></i>\n }\n </div>\n <div class=\"header-info\">\n <h2>AI Agent Run</h2>\n <div class=\"meta-info\">\n @if (agent) {\n <span class=\"agent-name\">\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Agents', record.AgentID)\">\n {{ agent.Name }}\n </a>\n </span>\n }\n <span class=\"run-id\">{{ record.ID }}</span>\n @if (record.ParentRunID) {\n <span class=\"parent-run\">\n <i class=\"fas fa-level-up-alt\"></i>\n <a (click)=\"navigateToParentRun()\" class=\"parent-link\">Parent Run</a>\n </span>\n }\n <!-- Conversation Link Pill -->\n @if (record.ConversationID) {\n <span class=\"conversation-pill\" (click)=\"navigateToConversation()\" title=\"Open conversation in Chat app\">\n <i class=\"fas fa-comments\"></i>\n <span>Conversation</span>\n <i class=\"fas fa-external-link-alt pill-action\"></i>\n </span>\n }\n </div>\n </div>\n </div>\n <div class=\"header-right\">\n @if (record.PlanMode) {\n <div class=\"plan-mode-badge\" title=\"This run executed in Plan Mode — the agent presented a plan for human approval before executing actions or sub-agents\">\n <i class=\"fas fa-clipboard-check\"></i>\n Plan Mode\n </div>\n }\n <div class=\"status-badge\" [attr.data-status]=\"record.Status\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon(record.Status || '')\"></i>\n {{ record.Status }}\n </div>\n <!-- A workflow outlives the run that submitted it, so a Completed run can still have work\n in flight. Said beside the status rather than instead of it — both are true. -->\n @if (WorkflowStillRunning) {\n <div class=\"workflow-running-badge\"\n title=\"This run submitted a workflow that runs on the dispatcher. The run finished when the workflow was submitted; the workflow itself is still going. This view refreshes on its own.\">\n <i class=\"fas fa-circle-notch fa-spin\"></i>\n Workflow still running\n </div>\n }\n <div class=\"header-actions\">\n <button class=\"btn-icon\" (click)=\"refreshData()\" title=\"Refresh\">\n <i class=\"fas fa-sync-alt\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"header-stats\">\n <div class=\"stat\">\n <span class=\"label\">Started</span>\n <span class=\"value\">{{ record.StartedAt | date:'medium' }}</span>\n </div>\n @if (record.CompletedAt) {\n <div class=\"stat\">\n <span class=\"label\">Completed</span>\n <span class=\"value\">{{ record.CompletedAt | date:'medium' }}</span>\n </div>\n }\n @if (record.CompletedAt) {\n <div class=\"stat\">\n <span class=\"label\">Duration</span>\n <span class=\"value\">{{ calculateDuration(record.StartedAt, record.CompletedAt) }}</span>\n </div>\n }\n @if (record.Success !== null && record.CompletedAt !== null) {\n <div class=\"stat\">\n <span class=\"label\">Result</span>\n <span class=\"value\" [class.success]=\"record.Success\" [class.error]=\"!record.Success\">\n {{ record.Success ? 'Success' : 'Failed' }}\n </span>\n </div>\n }\n @if (costMetrics && (costMetrics.totalTokensInput + costMetrics.totalTokensOutput) > 0) {\n <div class=\"stat\">\n <span class=\"label\">Tokens</span>\n @if (!costMetrics.isLoading) {\n <span class=\"value\">{{ (costMetrics.totalTokensInput + costMetrics.totalTokensOutput) | number:'1.0-0' }}</span>\n }\n @if (costMetrics.isLoading) {\n <span class=\"value loading\"><i class=\"fas fa-spinner fa-spin\"></i></span>\n }\n </div>\n }\n @if (costMetrics && costMetrics.totalCost > 0) {\n <div class=\"stat\">\n <span class=\"label\">Cost</span>\n @if (!costMetrics.isLoading) {\n <span class=\"value\">${{ costMetrics.totalCost | number:'1.2-4' }}</span>\n }\n @if (costMetrics.isLoading) {\n <span class=\"value loading\"><i class=\"fas fa-spinner fa-spin\"></i></span>\n }\n </div>\n }\n @if (record.EffortLevel) {\n <div class=\"stat\">\n <span class=\"label\">Effort Level</span>\n <span class=\"value\">{{ record.EffortLevel }}</span>\n </div>\n }\n </div>\n\n <!-- Configuration Bar (shown below header stats when ConfigurationID exists) -->\n @if (record.ConfigurationID) {\n <div class=\"configuration-bar\">\n <div class=\"config-item\">\n <i class=\"fas fa-cog\"></i>\n <div class=\"config-content\">\n <div class=\"config-label\">Configuration</div>\n <div class=\"config-value\">\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Configurations', record.ConfigurationID)\">\n {{ record.Configuration || 'Unknown' }}\n </a>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs\">\n <button class=\"tab\" [class.active]=\"activeTab === 'timeline'\" (click)=\"changeTab('timeline')\">\n <i class=\"fas fa-stream\"></i> Timeline\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'visualization'\" (click)=\"changeTab('visualization')\">\n <i class=\"fas fa-diagram-project\"></i> Visualization\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'analytics'\" (click)=\"changeTab('analytics')\">\n <i class=\"fas fa-chart-line\"></i> Analytics\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'details'\" (click)=\"changeTab('details')\">\n <i class=\"fas fa-info-circle\"></i> Details\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"content-area\">\n <!-- Timeline Tab -->\n @if (activeTab === 'timeline') {\n <div class=\"tab-content\" style=\"height: 100%;\">\n <as-split direction=\"horizontal\" style=\"height: 100%;\">\n <!-- Timeline Pane -->\n <as-split-area [size]=\"selectedTimelineItem ? 55 : 100\">\n <mj-ai-agent-run-timeline\n [aiAgentRunId]=\"record.ID\"\n [dataHelper]=\"dataHelper\"\n [RunTree]=\"runTree\"\n (itemSelected)=\"selectTimelineItem($event)\"\n (navigateToEntity)=\"navigateToEntityRecord($event)\">\n </mj-ai-agent-run-timeline>\n </as-split-area>\n <!-- JSON Detail Pane -->\n @if (selectedTimelineItem) {\n <as-split-area [size]=\"45\">\n <mj-ai-agent-run-step-detail\n [selectedTimelineItem]=\"selectedTimelineItem\"\n [Provider]=\"ProviderToUse\"\n (closePanel)=\"closeJsonPanel()\"\n (navigateToActionLog)=\"navigateToActionLog($event)\"\n (copyToClipboard)=\"copyToClipboard($event)\">\n </mj-ai-agent-run-step-detail>\n </as-split-area>\n }\n </as-split>\n </div>\n }\n\n <!-- Visualization Tab (animated flow views + static flowchart) -->\n @if (activeTab === 'visualization') {\n <div class=\"tab-content\" style=\"height: 100%;\">\n @if (visualizationLoaded) {\n <mj-ai-agent-run-flow\n [aiAgentRunId]=\"record.ID\"\n [dataHelper]=\"dataHelper\"\n [agentName]=\"agent?.Name || null\"\n [runStatus]=\"record.Status || ''\"\n [agentIconClass]=\"agent?.IconClass || null\"\n [agentLogoUrl]=\"agent?.LogoURL || null\"\n [RunTree]=\"runTree\">\n </mj-ai-agent-run-flow>\n }\n </div>\n }\n\n <!-- Analytics Tab -->\n @if (activeTab === 'analytics') {\n <div class=\"tab-content\" style=\"height: 100%;\">\n @if (analyticsLoaded) {\n <mj-ai-agent-run-analytics\n #analyticsComponent\n [agentRunId]=\"record.ID\"\n [RunTree]=\"runTree\"\n >\n </mj-ai-agent-run-analytics>\n }\n </div>\n }\n\n <!-- Details Tab -->\n @if (activeTab === 'details') {\n <div class=\"tab-content\">\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-info-circle\"></i> General Information\n </ng-template>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Agent</label>\n <span>\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Agents', record.AgentID)\">\n {{ agent?.Name || 'N/A' }}\n </a>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Parent Run ID</label>\n <span>\n @if (record.ParentRunID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Agent Runs', record.ParentRunID)\">\n {{ record.ParentRunID }}\n </a>\n }\n @if (!record.ParentRunID) {\n <span>None (Root)</span>\n }\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Last Run ID</label>\n <span>\n @if (record.LastRunID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Agent Runs', record.LastRunID)\">\n {{ record.LastRunID }}\n </a>\n }\n @if (!record.LastRunID) {\n <span>None</span>\n }\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Conversation ID</label>\n <span>\n @if (record.ConversationID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: Conversations', record.ConversationID)\">\n {{ record.ConversationID }}\n </a>\n }\n @if (!record.ConversationID) {\n <span>N/A</span>\n }\n </span>\n </div>\n <div class=\"detail-item\">\n <label>User</label>\n <span>\n @if (record.UserID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: Users', record.UserID)\">\n {{ record.User || 'N/A' }}\n </a>\n }\n @if (!record.UserID) {\n <span>N/A</span>\n }\n </span>\n </div>\n </div>\n </mj-accordion-panel>\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-cogs\"></i> Execution Settings\n </ng-template>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Override Model</label>\n <span>\n @if (record.OverrideModelID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Models', record.OverrideModelID)\">\n {{ record.OverrideModel || 'N/A' }}\n </a>\n }\n @if (!record.OverrideModelID) {\n <span>N/A</span>\n }\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Override Vendor</label>\n <span>\n @if (record.OverrideVendorID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Vendors', record.OverrideVendorID)\">\n {{ record.OverrideVendor || 'N/A' }}\n </a>\n }\n @if (!record.OverrideVendorID) {\n <span>N/A</span>\n }\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Verbose Logging</label>\n <span>{{ record.Verbose ? 'Yes' : 'No' }}</span>\n </div>\n </div>\n </mj-accordion-panel>\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-tasks\"></i> Execution Status\n </ng-template>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Status</label>\n <span class=\"status-badge\" [attr.data-status]=\"record.Status\">\n {{ record.Status }}\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Success</label>\n @if (record.Success === null) {\n <span>In Progress</span>\n }\n @else if (record.Success) {\n <span class=\"success\">Yes</span>\n }\n @else {\n <span class=\"error-message\">No</span>\n }\n </div>\n @if (record.Message) {\n <div class=\"detail-item full-width\">\n <label>Message</label>\n <div class=\"message\">{{ record.Message }}</div>\n </div>\n }\n @if (record.ErrorMessage) {\n <div class=\"detail-item full-width\">\n <label>Error Message</label>\n <div class=\"error-message\">{{ record.ErrorMessage }}</div>\n </div>\n }\n </div>\n </mj-accordion-panel>\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-dollar-sign\"></i> Usage &amp; Cost\n </ng-template>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Total Tokens Used</label>\n <span>{{ record.TotalTokensUsed ? (record.TotalTokensUsed | number:'1.0-0') : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Prompt Tokens</label>\n <span>{{ record.TotalPromptTokensUsed ? (record.TotalPromptTokensUsed | number:'1.0-0') : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Completion Tokens</label>\n <span>{{ record.TotalCompletionTokensUsed ? (record.TotalCompletionTokensUsed | number:'1.0-0') : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Total Cost</label>\n <span>{{ record.TotalCost != null ? ('$' + (record.TotalCost | number:'1.2-4')) : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Total Prompt Iterations</label>\n <span>{{ record.TotalPromptIterations != null ? (record.TotalPromptIterations | number:'1.0-0') : 'N/A' }}</span>\n </div>\n </div>\n </mj-accordion-panel>\n @if (record.Result) {\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-code\"></i> Result\n </ng-template>\n <div class=\"result-viewer\">\n @if (isParsingComplete) {\n <mj-code-editor\n [ngModel]=\"parsedResult\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n } @else {\n <div style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fas fa-spinner fa-spin\"></i> Loading result data...\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n @if (record.StartingPayload) {\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-upload\"></i> Starting Payload\n </ng-template>\n <div class=\"result-viewer\">\n @if (isParsingComplete) {\n <mj-code-editor\n [ngModel]=\"parsedStartingPayload\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n } @else {\n <div style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fas fa-spinner fa-spin\"></i> Loading payload data...\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n @if (record.Data) {\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-database\"></i> Execution Data\n </ng-template>\n <div class=\"result-viewer\">\n @if (isParsingComplete) {\n <mj-code-editor\n [ngModel]=\"parsedData\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n } @else {\n <div style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fas fa-spinner fa-spin\"></i> Loading execution data...\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n @if (record.FinalPayload) {\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-download\"></i> Final Payload\n </ng-template>\n <div class=\"result-viewer\">\n @if (isParsingComplete) {\n <mj-code-editor\n [ngModel]=\"parsedFinalPayload\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n } @else {\n <div style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fas fa-spinner fa-spin\"></i> Loading final payload data...\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n @if (showPayloadDiff) {\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-code-compare\"></i> Payload Diff\n </ng-template>\n <div style=\"padding: 20px; background: var(--mj-bg-surface-card);\">\n @if (isParsingComplete) {\n <mj-deep-diff\n [oldValue]=\"startingPayloadObject\"\n [newValue]=\"finalPayloadObject\"\n [title]=\"''\"\n [showSummary]=\"true\"\n [showUnchanged]=\"false\"\n [expandAll]=\"false\"\n [maxDepth]=\"10\"\n [maxStringLength]=\"200\"\n [treatNullAsUndefined]=\"true\">\n </mj-deep-diff>\n } @else {\n <div style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fas fa-spinner fa-spin\"></i> Loading payload diff...\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n </div>\n }\n</div>\n</div>\n</div>"]}
@@ -618,7 +618,7 @@ export class AIAgentRunFlowComponent {
618
618
  i0.ɵɵconditional(ctx.isAnimated ? 15 : -1);
619
619
  i0.ɵɵadvance(2);
620
620
  i0.ɵɵconditional(ctx.isAnimated ? 17 : 18);
621
- } }, dependencies: [i1.NgClass, i2.LoadingComponent, i3.AIAgentRunStepDetailComponent, i4.FlameCascadeComponent, i5.SubwayLinesComponent, i6.ConstellationComponent, i7.FlowchartComponent], styles: ["[_nghost-%COMP%] { display: block; height: 100%; }\n\n.flow-cockpit[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\n\n\n.flow-modes[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n padding: 10px 14px;\n flex-wrap: wrap;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.flow-mode[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 7px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 999px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n font-weight: 600;\n font-size: 12.5px;\n cursor: pointer;\n transition: 0.15s;\n}\n.flow-mode[_ngcontent-%COMP%]:hover:not(:disabled) { color: var(--mj-text-primary); border-color: var(--mj-brand-primary); }\n.flow-mode.on[_ngcontent-%COMP%] {\n color: var(--mj-text-inverse);\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 14px color-mix(in srgb, var(--mj-brand-primary) 35%, transparent);\n}\n.flow-mode.soon[_ngcontent-%COMP%] { cursor: not-allowed; opacity: 0.6; }\n.soon-tag[_ngcontent-%COMP%] {\n font-size: 9px;\n font-weight: 700;\n letter-spacing: 0.5px;\n text-transform: uppercase;\n padding: 2px 6px;\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-text-muted) 20%, transparent);\n color: var(--mj-text-muted);\n}\n\n\n\n.flow-main[_ngcontent-%COMP%] { flex: 1; display: flex; min-height: 0; }\n\n.flow-stage[_ngcontent-%COMP%] {\n flex: 1;\n position: relative;\n overflow: hidden;\n background:\n radial-gradient(900px 520px at 72% -8%,\n color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface-sunken)) 0%,\n var(--mj-bg-surface-sunken) 60%);\n}\n.flow-stage[_ngcontent-%COMP%] mj-agent-flow-flame[_ngcontent-%COMP%], \n.flow-stage[_ngcontent-%COMP%] mj-agent-flow-subway[_ngcontent-%COMP%], \n.flow-stage[_ngcontent-%COMP%] mj-agent-flow-constellation[_ngcontent-%COMP%] {\n display: block;\n position: absolute;\n inset: 0;\n padding: 10px 14px;\n}\n.flow-stage[_ngcontent-%COMP%] mj-agent-flow-flowchart[_ngcontent-%COMP%] {\n display: block;\n position: absolute;\n inset: 0;\n}\n.flow-hidden[_ngcontent-%COMP%] { display: none !important; }\n\n\n\n.flow-zoom[_ngcontent-%COMP%] {\n position: absolute;\n top: 12px;\n right: 14px;\n z-index: 5;\n display: flex;\n gap: 6px;\n}\n.fz-btn[_ngcontent-%COMP%] {\n width: 34px;\n height: 34px;\n border-radius: 9px;\n border: 1px solid var(--mj-border-default);\n background: color-mix(in srgb, var(--mj-bg-surface-card) 88%, transparent);\n color: var(--mj-text-secondary);\n cursor: pointer;\n display: grid;\n place-items: center;\n font-size: 13px;\n backdrop-filter: blur(4px);\n}\n.fz-btn[_ngcontent-%COMP%]:hover { color: var(--mj-text-primary); border-color: var(--mj-brand-primary); }\n\n\n\n.flow-resizer[_ngcontent-%COMP%] {\n position: absolute;\n left: -3px;\n top: 0;\n width: 7px;\n height: 100%;\n cursor: col-resize;\n z-index: 6;\n}\n.flow-resizer[_ngcontent-%COMP%]:hover { background: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent); }\n\n\n\n.flow-detail[_ngcontent-%COMP%] {\n position: relative;\n flex-shrink: 0;\n border-left: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n overflow: hidden;\n display: flex;\n}\n\n\n\n.flow-detail[_ngcontent-%COMP%] > mj-ai-agent-run-step-detail[_ngcontent-%COMP%] { flex: 1 1 auto; min-width: 0; }\n\n.flow-overlay[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n z-index: 4;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n background: color-mix(in srgb, var(--mj-bg-surface-sunken) 70%, transparent);\n}\n.flow-empty[_ngcontent-%COMP%] { color: var(--mj-text-muted); }\n.flow-empty[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 34px; opacity: 0.5; }\n\n\n\n.flow-rail[_ngcontent-%COMP%] {\n position: relative;\n flex-shrink: 0;\n border-left: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n.now[_ngcontent-%COMP%] { padding: 16px; }\n.rail-lbl[_ngcontent-%COMP%] {\n font-size: 10px;\n letter-spacing: 1.4px;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n.breadcrumb[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n margin: 8px 0 12px;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.breadcrumb[_ngcontent-%COMP%] .sep[_ngcontent-%COMP%] { opacity: 0.5; }\n.nowcard[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 14px;\n padding: 16px;\n background: var(--mj-bg-surface-card);\n}\n.nowcard[_ngcontent-%COMP%] .ico[_ngcontent-%COMP%] { font-size: 26px; line-height: 1; }\n.nowcard[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] { margin: 8px 0 2px; font-size: 17px; color: var(--mj-text-primary); }\n.nowcard[_ngcontent-%COMP%] .type[_ngcontent-%COMP%] { font-size: 12px; font-weight: 600; color: var(--mj-text-secondary); }\n.nowcard[_ngcontent-%COMP%] .meta[_ngcontent-%COMP%] { display: flex; gap: 14px; margin-top: 12px; font-size: 12px; color: var(--mj-text-secondary); }\n.nowcard[_ngcontent-%COMP%] .meta[_ngcontent-%COMP%] b[_ngcontent-%COMP%] { display: block; color: var(--mj-text-primary); font-size: 15px; font-variant-numeric: tabular-nums; }\n.barbg[_ngcontent-%COMP%] { height: 6px; border-radius: 6px; background: var(--mj-border-default); margin-top: 14px; overflow: hidden; }\n.barfg[_ngcontent-%COMP%] {\n height: 100%;\n width: 0;\n background: linear-gradient(90deg, var(--mj-brand-primary), color-mix(in srgb, var(--mj-brand-primary) 40%, var(--mj-bg-surface)));\n}\n.log[_ngcontent-%COMP%] { flex: 1; overflow: auto; padding: 0 14px 16px; }\n.rail-lbl.sticky[_ngcontent-%COMP%] { position: sticky; top: 0; background: var(--mj-bg-surface); padding: 10px 0 8px; z-index: 1; }\n\n\n\n\n[_nghost-%COMP%] .flogitem {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 9px;\n border-radius: 8px;\n margin-bottom: 3px;\n font-size: 11.5px;\n line-height: 1.25;\n border: 1px solid transparent;\n}\n[_nghost-%COMP%] .flogitem .flog-ico { flex: 0 0 auto; font-size: 11px; }\n[_nghost-%COMP%] .flogitem .flog-name {\n flex: 1 1 auto;\n min-width: 0;\n color: var(--mj-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n[_nghost-%COMP%] .flogitem .flog-dur {\n flex: 0 0 auto;\n color: var(--mj-text-muted);\n font-variant-numeric: tabular-nums;\n font-size: 10.5px;\n}\n[_nghost-%COMP%] .flogitem.heat {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, transparent);\n border-color: color-mix(in srgb, var(--mj-status-warning) 35%, transparent);\n}\n[_nghost-%COMP%] .breadcrumb .sep { opacity: 0.5; margin: 0 1px; }\n\n\n\n[_nghost-%COMP%] .ftree-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 5px 8px;\n border-radius: 7px;\n margin-bottom: 1px;\n font-size: 11.5px;\n line-height: 1.25;\n cursor: pointer;\n border-left: 2px solid transparent;\n}\n[_nghost-%COMP%] .ftree-row:hover { background: var(--mj-bg-surface-hover); }\n[_nghost-%COMP%] .ftree-ico { flex: 0 0 14px; width: 14px; text-align: center; font-size: 11px; }\n[_nghost-%COMP%] .ftree-logo { flex: 0 0 14px; width: 14px; height: 14px; border-radius: 50%; object-fit: cover; }\n[_nghost-%COMP%] .ftree-name {\n flex: 1 1 auto; min-width: 0;\n overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n color: var(--mj-text-secondary);\n}\n[_nghost-%COMP%] .ftree-dur { flex: 0 0 auto; color: var(--mj-text-muted); font-size: 10.5px; font-variant-numeric: tabular-nums; }\n[_nghost-%COMP%] .ftree-row.ftree-pending { opacity: 0.5; }\n[_nghost-%COMP%] .ftree-row.ftree-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n border-left-color: var(--mj-brand-primary);\n}\n[_nghost-%COMP%] .ftree-row.ftree-active .ftree-name { color: var(--mj-text-primary); font-weight: 600; }\n[_nghost-%COMP%] .ftree-row.ftree-selected {\n background: var(--mj-bg-surface-hover);\n border-left-color: var(--mj-brand-primary);\n}\n[_nghost-%COMP%] .ftree-row.ftree-selected .ftree-name { color: var(--mj-text-primary); }\n\n\n\n.flow-transport[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 12px 18px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n.pbtn[_ngcontent-%COMP%] {\n width: 42px;\n height: 42px;\n border-radius: 50%;\n border: none;\n cursor: pointer;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 15px;\n box-shadow: 0 6px 16px color-mix(in srgb, var(--mj-brand-primary) 35%, transparent);\n transition: 0.15s;\n}\n.pbtn[_ngcontent-%COMP%]:hover:not(:disabled) { transform: translateY(-1px); }\n.pbtn[_ngcontent-%COMP%]:disabled, .ibtn[_ngcontent-%COMP%]:disabled { opacity: 0.45; cursor: not-allowed; }\n.ibtn[_ngcontent-%COMP%] {\n width: 38px;\n height: 38px;\n border-radius: 10px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n.ibtn[_ngcontent-%COMP%]:hover:not(:disabled) { color: var(--mj-text-primary); border-color: var(--mj-brand-primary); }\n\ninput[type=range].scrub[_ngcontent-%COMP%], input[type=range].speed[_ngcontent-%COMP%] {\n -webkit-appearance: none;\n appearance: none;\n height: 6px;\n border-radius: 6px;\n background: var(--mj-border-default);\n outline: none;\n cursor: pointer;\n}\ninput[type=range].scrub[_ngcontent-%COMP%] { flex: 1; }\ninput[type=range].speed[_ngcontent-%COMP%] { width: 90px; }\ninput[type=range][_ngcontent-%COMP%]::-webkit-slider-thumb {\n -webkit-appearance: none;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--mj-bg-surface);\n border: 3px solid var(--mj-brand-primary);\n cursor: pointer;\n box-shadow: 0 0 8px color-mix(in srgb, var(--mj-brand-primary) 60%, transparent);\n}\ninput[type=range][_ngcontent-%COMP%]::-moz-range-thumb {\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--mj-bg-surface);\n border: 3px solid var(--mj-brand-primary);\n cursor: pointer;\n}\n.clock[_ngcontent-%COMP%] {\n font-variant-numeric: tabular-nums;\n font-weight: 700;\n font-size: 14px;\n min-width: 116px;\n text-align: center;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 9px;\n padding: 7px 10px;\n}\n.speedbox[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 8px; color: var(--mj-text-muted); font-size: 12px; }\n.spdval[_ngcontent-%COMP%] { min-width: 34px; font-variant-numeric: tabular-nums; }\n\n\n\n.flow-legend[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 18px;\n border-top: 1px solid var(--mj-border-subtle);\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.flow-legend[_ngcontent-%COMP%] .lg[_ngcontent-%COMP%] { width: 10px; height: 10px; border-radius: 3px; display: inline-block; }\n.legend-note[_ngcontent-%COMP%] { color: var(--mj-text-muted); }"], changeDetection: 0 }); }
621
+ } }, dependencies: [i1.NgClass, i2.LoadingComponent, i3.AIAgentRunStepDetailComponent, i4.FlameCascadeComponent, i5.SubwayLinesComponent, i6.ConstellationComponent, i7.FlowchartComponent], styles: ["[_nghost-%COMP%] { display: block; height: 100%; }\n\n.flow-cockpit[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\n\n.flow-modes[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n padding: 10px 14px;\n flex-wrap: wrap;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.flow-mode[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 7px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 999px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n font-weight: 600;\n font-size: 12.5px;\n cursor: pointer;\n transition: 0.15s;\n}\n.flow-mode[_ngcontent-%COMP%]:hover:not(:disabled) { color: var(--mj-text-primary); border-color: var(--mj-brand-primary); }\n.flow-mode.on[_ngcontent-%COMP%] {\n color: var(--mj-text-inverse);\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 14px color-mix(in srgb, var(--mj-brand-primary) 35%, transparent);\n}\n.flow-mode.soon[_ngcontent-%COMP%] { cursor: not-allowed; opacity: 0.6; }\n.soon-tag[_ngcontent-%COMP%] {\n font-size: 9px;\n font-weight: 700;\n letter-spacing: 0.5px;\n text-transform: uppercase;\n padding: 2px 6px;\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-text-muted) 20%, transparent);\n color: var(--mj-text-muted);\n}\n\n\n.flow-main[_ngcontent-%COMP%] { flex: 1; display: flex; min-height: 0; }\n\n.flow-stage[_ngcontent-%COMP%] {\n flex: 1;\n position: relative;\n overflow: hidden;\n background:\n radial-gradient(900px 520px at 72% -8%,\n color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface-sunken)) 0%,\n var(--mj-bg-surface-sunken) 60%);\n}\n.flow-stage[_ngcontent-%COMP%] mj-agent-flow-flame[_ngcontent-%COMP%], \n.flow-stage[_ngcontent-%COMP%] mj-agent-flow-subway[_ngcontent-%COMP%], \n.flow-stage[_ngcontent-%COMP%] mj-agent-flow-constellation[_ngcontent-%COMP%] {\n display: block;\n position: absolute;\n inset: 0;\n padding: 10px 14px;\n}\n.flow-stage[_ngcontent-%COMP%] mj-agent-flow-flowchart[_ngcontent-%COMP%] {\n display: block;\n position: absolute;\n inset: 0;\n}\n.flow-hidden[_ngcontent-%COMP%] { display: none !important; }\n\n\n.flow-zoom[_ngcontent-%COMP%] {\n position: absolute;\n top: 12px;\n right: 14px;\n z-index: 5;\n display: flex;\n gap: 6px;\n}\n.fz-btn[_ngcontent-%COMP%] {\n width: 34px;\n height: 34px;\n border-radius: 9px;\n border: 1px solid var(--mj-border-default);\n background: color-mix(in srgb, var(--mj-bg-surface-card) 88%, transparent);\n color: var(--mj-text-secondary);\n cursor: pointer;\n display: grid;\n place-items: center;\n font-size: 13px;\n backdrop-filter: blur(4px);\n}\n.fz-btn[_ngcontent-%COMP%]:hover { color: var(--mj-text-primary); border-color: var(--mj-brand-primary); }\n\n\n.flow-resizer[_ngcontent-%COMP%] {\n position: absolute;\n left: -3px;\n top: 0;\n width: 7px;\n height: 100%;\n cursor: col-resize;\n z-index: 6;\n}\n.flow-resizer[_ngcontent-%COMP%]:hover { background: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent); }\n\n\n.flow-detail[_ngcontent-%COMP%] {\n position: relative;\n flex-shrink: 0;\n border-left: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n overflow: hidden;\n display: flex;\n}\n\n\n.flow-detail[_ngcontent-%COMP%] > mj-ai-agent-run-step-detail[_ngcontent-%COMP%] { flex: 1 1 auto; min-width: 0; }\n\n.flow-overlay[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n z-index: 4;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n background: color-mix(in srgb, var(--mj-bg-surface-sunken) 70%, transparent);\n}\n.flow-empty[_ngcontent-%COMP%] { color: var(--mj-text-muted); }\n.flow-empty[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 34px; opacity: 0.5; }\n\n\n.flow-rail[_ngcontent-%COMP%] {\n position: relative;\n flex-shrink: 0;\n border-left: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n.now[_ngcontent-%COMP%] { padding: 16px; }\n.rail-lbl[_ngcontent-%COMP%] {\n font-size: 10px;\n letter-spacing: 1.4px;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n.breadcrumb[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n margin: 8px 0 12px;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.breadcrumb[_ngcontent-%COMP%] .sep[_ngcontent-%COMP%] { opacity: 0.5; }\n.nowcard[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 14px;\n padding: 16px;\n background: var(--mj-bg-surface-card);\n}\n.nowcard[_ngcontent-%COMP%] .ico[_ngcontent-%COMP%] { font-size: 26px; line-height: 1; }\n.nowcard[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] { margin: 8px 0 2px; font-size: 17px; color: var(--mj-text-primary); }\n.nowcard[_ngcontent-%COMP%] .type[_ngcontent-%COMP%] { font-size: 12px; font-weight: 600; color: var(--mj-text-secondary); }\n.nowcard[_ngcontent-%COMP%] .meta[_ngcontent-%COMP%] { display: flex; gap: 14px; margin-top: 12px; font-size: 12px; color: var(--mj-text-secondary); }\n.nowcard[_ngcontent-%COMP%] .meta[_ngcontent-%COMP%] b[_ngcontent-%COMP%] { display: block; color: var(--mj-text-primary); font-size: 15px; font-variant-numeric: tabular-nums; }\n.barbg[_ngcontent-%COMP%] { height: 6px; border-radius: 6px; background: var(--mj-border-default); margin-top: 14px; overflow: hidden; }\n.barfg[_ngcontent-%COMP%] {\n height: 100%;\n width: 0;\n background: linear-gradient(90deg, var(--mj-brand-primary), color-mix(in srgb, var(--mj-brand-primary) 40%, var(--mj-bg-surface)));\n}\n.log[_ngcontent-%COMP%] { flex: 1; overflow: auto; padding: 0 14px 16px; }\n.rail-lbl.sticky[_ngcontent-%COMP%] { position: sticky; top: 0; background: var(--mj-bg-surface); padding: 10px 0 8px; z-index: 1; }\n\n\n\n[_nghost-%COMP%] .flogitem {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 9px;\n border-radius: 8px;\n margin-bottom: 3px;\n font-size: 11.5px;\n line-height: 1.25;\n border: 1px solid transparent;\n}\n[_nghost-%COMP%] .flogitem .flog-ico { flex: 0 0 auto; font-size: 11px; }\n[_nghost-%COMP%] .flogitem .flog-name {\n flex: 1 1 auto;\n min-width: 0;\n color: var(--mj-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n[_nghost-%COMP%] .flogitem .flog-dur {\n flex: 0 0 auto;\n color: var(--mj-text-muted);\n font-variant-numeric: tabular-nums;\n font-size: 10.5px;\n}\n[_nghost-%COMP%] .flogitem.heat {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, transparent);\n border-color: color-mix(in srgb, var(--mj-status-warning) 35%, transparent);\n}\n[_nghost-%COMP%] .breadcrumb .sep { opacity: 0.5; margin: 0 1px; }\n\n\n[_nghost-%COMP%] .ftree-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 5px 8px;\n border-radius: 7px;\n margin-bottom: 1px;\n font-size: 11.5px;\n line-height: 1.25;\n cursor: pointer;\n border-left: 2px solid transparent;\n}\n[_nghost-%COMP%] .ftree-row:hover { background: var(--mj-bg-surface-hover); }\n[_nghost-%COMP%] .ftree-ico { flex: 0 0 14px; width: 14px; text-align: center; font-size: 11px; }\n[_nghost-%COMP%] .ftree-logo { flex: 0 0 14px; width: 14px; height: 14px; border-radius: 50%; object-fit: cover; }\n[_nghost-%COMP%] .ftree-name {\n flex: 1 1 auto; min-width: 0;\n overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n color: var(--mj-text-secondary);\n}\n[_nghost-%COMP%] .ftree-dur { flex: 0 0 auto; color: var(--mj-text-muted); font-size: 10.5px; font-variant-numeric: tabular-nums; }\n[_nghost-%COMP%] .ftree-row.ftree-pending { opacity: 0.5; }\n[_nghost-%COMP%] .ftree-row.ftree-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n border-left-color: var(--mj-brand-primary);\n}\n[_nghost-%COMP%] .ftree-row.ftree-active .ftree-name { color: var(--mj-text-primary); font-weight: 600; }\n[_nghost-%COMP%] .ftree-row.ftree-selected {\n background: var(--mj-bg-surface-hover);\n border-left-color: var(--mj-brand-primary);\n}\n[_nghost-%COMP%] .ftree-row.ftree-selected .ftree-name { color: var(--mj-text-primary); }\n\n\n.flow-transport[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 12px 18px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n.pbtn[_ngcontent-%COMP%] {\n width: 42px;\n height: 42px;\n border-radius: 50%;\n border: none;\n cursor: pointer;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 15px;\n box-shadow: 0 6px 16px color-mix(in srgb, var(--mj-brand-primary) 35%, transparent);\n transition: 0.15s;\n}\n.pbtn[_ngcontent-%COMP%]:hover:not(:disabled) { transform: translateY(-1px); }\n.pbtn[_ngcontent-%COMP%]:disabled, .ibtn[_ngcontent-%COMP%]:disabled { opacity: 0.45; cursor: not-allowed; }\n.ibtn[_ngcontent-%COMP%] {\n width: 38px;\n height: 38px;\n border-radius: 10px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n.ibtn[_ngcontent-%COMP%]:hover:not(:disabled) { color: var(--mj-text-primary); border-color: var(--mj-brand-primary); }\n\ninput[type=range].scrub[_ngcontent-%COMP%], input[type=range].speed[_ngcontent-%COMP%] {\n -webkit-appearance: none;\n appearance: none;\n height: 6px;\n border-radius: 6px;\n background: var(--mj-border-default);\n outline: none;\n cursor: pointer;\n}\ninput[type=range].scrub[_ngcontent-%COMP%] { flex: 1; }\ninput[type=range].speed[_ngcontent-%COMP%] { width: 90px; }\ninput[type=range][_ngcontent-%COMP%]::-webkit-slider-thumb {\n -webkit-appearance: none;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--mj-bg-surface);\n border: 3px solid var(--mj-brand-primary);\n cursor: pointer;\n box-shadow: 0 0 8px color-mix(in srgb, var(--mj-brand-primary) 60%, transparent);\n}\ninput[type=range][_ngcontent-%COMP%]::-moz-range-thumb {\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--mj-bg-surface);\n border: 3px solid var(--mj-brand-primary);\n cursor: pointer;\n}\n.clock[_ngcontent-%COMP%] {\n font-variant-numeric: tabular-nums;\n font-weight: 700;\n font-size: 14px;\n min-width: 116px;\n text-align: center;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 9px;\n padding: 7px 10px;\n}\n.speedbox[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 8px; color: var(--mj-text-muted); font-size: 12px; }\n.spdval[_ngcontent-%COMP%] { min-width: 34px; font-variant-numeric: tabular-nums; }\n\n\n.flow-legend[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 18px;\n border-top: 1px solid var(--mj-border-subtle);\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.flow-legend[_ngcontent-%COMP%] .lg[_ngcontent-%COMP%] { width: 10px; height: 10px; border-radius: 3px; display: inline-block; }\n.legend-note[_ngcontent-%COMP%] { color: var(--mj-text-muted); }"], changeDetection: 0 }); }
622
622
  }
623
623
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AIAgentRunFlowComponent, [{
624
624
  type: Component,