@memberjunction/ng-core-entity-forms 6.2.0-edge.4 → 6.2.0-edge.6

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 (248) hide show
  1. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.d.ts +2 -0
  2. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.d.ts.map +1 -1
  3. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js +103 -95
  4. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js.map +1 -1
  5. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +13 -0
  6. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  7. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +37 -17
  8. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  9. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +9 -1
  10. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
  11. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +193 -178
  12. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  13. package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.d.ts +48 -0
  14. package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.d.ts.map +1 -0
  15. package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.js +195 -0
  16. package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.js.map +1 -0
  17. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +2 -0
  18. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
  19. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +345 -323
  20. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  21. package/dist/lib/custom/Actions/action-form.component.d.ts +2 -0
  22. package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
  23. package/dist/lib/custom/Actions/action-form.component.js +29 -11
  24. package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
  25. package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts +2 -0
  26. package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts.map +1 -1
  27. package/dist/lib/custom/EntityActions/entityaction.form.component.js +2 -0
  28. package/dist/lib/custom/EntityActions/entityaction.form.component.js.map +1 -1
  29. package/dist/lib/custom/MLModels/ml-model-view-models.d.ts +11 -4
  30. package/dist/lib/custom/MLModels/ml-model-view-models.d.ts.map +1 -1
  31. package/dist/lib/custom/MLModels/ml-model-view-models.js +14 -0
  32. package/dist/lib/custom/MLModels/ml-model-view-models.js.map +1 -1
  33. package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts +15 -0
  34. package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts.map +1 -1
  35. package/dist/lib/custom/MLModels/ps-model-detail.component.js +186 -92
  36. package/dist/lib/custom/MLModels/ps-model-detail.component.js.map +1 -1
  37. package/dist/lib/custom/Queries/query-form.component.d.ts +2 -0
  38. package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
  39. package/dist/lib/custom/Queries/query-form.component.js +2 -0
  40. package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
  41. package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts.map +1 -1
  42. package/dist/lib/custom/RecordProcesses/record-process-form.component.js +6 -3
  43. package/dist/lib/custom/RecordProcesses/record-process-form.component.js.map +1 -1
  44. package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts +3 -3
  45. package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts.map +1 -1
  46. package/dist/lib/custom/SearchScopes/searchscope-form.component.js +5 -7
  47. package/dist/lib/custom/SearchScopes/searchscope-form.component.js.map +1 -1
  48. package/dist/lib/custom/Templates/templates-form.component.d.ts +19 -1
  49. package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
  50. package/dist/lib/custom/Templates/templates-form.component.js +20 -27
  51. package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
  52. package/dist/lib/custom/Tests/entity-link-pill.component.d.ts.map +1 -1
  53. package/dist/lib/custom/Tests/entity-link-pill.component.js +14 -6
  54. package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
  55. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
  56. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +8 -8
  57. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
  58. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts +37 -5
  59. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts.map +1 -1
  60. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +155 -79
  61. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js.map +1 -1
  62. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +8 -0
  63. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
  64. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +59 -8
  65. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  66. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +34 -9
  67. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
  68. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +281 -150
  69. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  70. package/dist/lib/custom/ai-agent-run/run-tree-timeline-projection.js +3 -1
  71. package/dist/lib/custom/ai-agent-run/run-tree-timeline-projection.js.map +1 -1
  72. package/dist/lib/custom/custom-forms.module.d.ts +82 -80
  73. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  74. package/dist/lib/custom/custom-forms.module.js +10 -0
  75. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  76. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
  77. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +65 -47
  78. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
  79. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +17 -17
  80. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
  81. package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.d.ts.map +1 -1
  82. package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js +64 -24
  83. package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js.map +1 -1
  84. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js +74 -52
  85. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js.map +1 -1
  86. package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.d.ts +10 -0
  87. package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.d.ts.map +1 -0
  88. package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.js +86 -0
  89. package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.js.map +1 -0
  90. package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.d.ts +10 -0
  91. package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.d.ts.map +1 -0
  92. package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.js +132 -0
  93. package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.js.map +1 -0
  94. package/dist/lib/generated/Entities/MJAIBridgeAgentIdentity/mjaibridgeagentidentity.form.component.js +12 -10
  95. package/dist/lib/generated/Entities/MJAIBridgeAgentIdentity/mjaibridgeagentidentity.form.component.js.map +1 -1
  96. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.d.ts.map +1 -1
  97. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js +86 -32
  98. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js.map +1 -1
  99. package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.d.ts.map +1 -1
  100. package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.js +25 -7
  101. package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.js.map +1 -1
  102. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.d.ts.map +1 -1
  103. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js +180 -160
  104. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js.map +1 -1
  105. package/dist/lib/generated/Entities/MJActionParam/mjactionparam.form.component.js +16 -14
  106. package/dist/lib/generated/Entities/MJActionParam/mjactionparam.form.component.js.map +1 -1
  107. package/dist/lib/generated/Entities/MJArchiveConfiguration/mjarchiveconfiguration.form.component.js +23 -21
  108. package/dist/lib/generated/Entities/MJArchiveConfiguration/mjarchiveconfiguration.form.component.js.map +1 -1
  109. package/dist/lib/generated/Entities/MJArchiveRun/mjarchiverun.form.component.js +21 -19
  110. package/dist/lib/generated/Entities/MJArchiveRun/mjarchiverun.form.component.js.map +1 -1
  111. package/dist/lib/generated/Entities/MJCalendarEventLink/mjcalendareventlink.form.component.d.ts +10 -0
  112. package/dist/lib/generated/Entities/MJCalendarEventLink/mjcalendareventlink.form.component.d.ts.map +1 -0
  113. package/dist/lib/generated/Entities/MJCalendarEventLink/mjcalendareventlink.form.component.js +74 -0
  114. package/dist/lib/generated/Entities/MJCalendarEventLink/mjcalendareventlink.form.component.js.map +1 -0
  115. package/dist/lib/generated/Entities/MJCalendarSyncState/mjcalendarsyncstate.form.component.d.ts +10 -0
  116. package/dist/lib/generated/Entities/MJCalendarSyncState/mjcalendarsyncstate.form.component.d.ts.map +1 -0
  117. package/dist/lib/generated/Entities/MJCalendarSyncState/mjcalendarsyncstate.form.component.js +64 -0
  118. package/dist/lib/generated/Entities/MJCalendarSyncState/mjcalendarsyncstate.form.component.js.map +1 -0
  119. package/dist/lib/generated/Entities/MJCommunicationProvider/mjcommunicationprovider.form.component.d.ts.map +1 -1
  120. package/dist/lib/generated/Entities/MJCommunicationProvider/mjcommunicationprovider.form.component.js +77 -21
  121. package/dist/lib/generated/Entities/MJCommunicationProvider/mjcommunicationprovider.form.component.js.map +1 -1
  122. package/dist/lib/generated/Entities/MJCompanyIntegration/mjcompanyintegration.form.component.d.ts.map +1 -1
  123. package/dist/lib/generated/Entities/MJCompanyIntegration/mjcompanyintegration.form.component.js +28 -10
  124. package/dist/lib/generated/Entities/MJCompanyIntegration/mjcompanyintegration.form.component.js.map +1 -1
  125. package/dist/lib/generated/Entities/MJCompanyIntegrationObject/mjcompanyintegrationobject.form.component.d.ts +10 -0
  126. package/dist/lib/generated/Entities/MJCompanyIntegrationObject/mjcompanyintegrationobject.form.component.d.ts.map +1 -0
  127. package/dist/lib/generated/Entities/MJCompanyIntegrationObject/mjcompanyintegrationobject.form.component.js +189 -0
  128. package/dist/lib/generated/Entities/MJCompanyIntegrationObject/mjcompanyintegrationobject.form.component.js.map +1 -0
  129. package/dist/lib/generated/Entities/MJCompanyIntegrationObjectField/mjcompanyintegrationobjectfield.form.component.d.ts +10 -0
  130. package/dist/lib/generated/Entities/MJCompanyIntegrationObjectField/mjcompanyintegrationobjectfield.form.component.d.ts.map +1 -0
  131. package/dist/lib/generated/Entities/MJCompanyIntegrationObjectField/mjcompanyintegrationobjectfield.form.component.js +116 -0
  132. package/dist/lib/generated/Entities/MJCompanyIntegrationObjectField/mjcompanyintegrationobjectfield.form.component.js.map +1 -0
  133. package/dist/lib/generated/Entities/MJComponent/mjcomponent.form.component.d.ts.map +1 -1
  134. package/dist/lib/generated/Entities/MJComponent/mjcomponent.form.component.js +51 -35
  135. package/dist/lib/generated/Entities/MJComponent/mjcomponent.form.component.js.map +1 -1
  136. package/dist/lib/generated/Entities/MJContentFileType/mjcontentfiletype.form.component.d.ts.map +1 -1
  137. package/dist/lib/generated/Entities/MJContentFileType/mjcontentfiletype.form.component.js +36 -18
  138. package/dist/lib/generated/Entities/MJContentFileType/mjcontentfiletype.form.component.js.map +1 -1
  139. package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.d.ts.map +1 -1
  140. package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js +74 -60
  141. package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js.map +1 -1
  142. package/dist/lib/generated/Entities/MJContentItemChunk/mjcontentitemchunk.form.component.d.ts.map +1 -1
  143. package/dist/lib/generated/Entities/MJContentItemChunk/mjcontentitemchunk.form.component.js +30 -32
  144. package/dist/lib/generated/Entities/MJContentItemChunk/mjcontentitemchunk.form.component.js.map +1 -1
  145. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js +43 -35
  146. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js.map +1 -1
  147. package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.js +21 -19
  148. package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.js.map +1 -1
  149. package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js +69 -75
  150. package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js.map +1 -1
  151. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.d.ts.map +1 -1
  152. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js +35 -17
  153. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js.map +1 -1
  154. package/dist/lib/generated/Entities/MJDashboard/mjdashboard.form.component.d.ts.map +1 -1
  155. package/dist/lib/generated/Entities/MJDashboard/mjdashboard.form.component.js +45 -29
  156. package/dist/lib/generated/Entities/MJDashboard/mjdashboard.form.component.js.map +1 -1
  157. package/dist/lib/generated/Entities/MJDuplicateRun/mjduplicaterun.form.component.js +19 -17
  158. package/dist/lib/generated/Entities/MJDuplicateRun/mjduplicaterun.form.component.js.map +1 -1
  159. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
  160. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +128 -92
  161. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
  162. package/dist/lib/generated/Entities/MJEntityAlternateBaseView/mjentityalternatebaseview.form.component.d.ts +10 -0
  163. package/dist/lib/generated/Entities/MJEntityAlternateBaseView/mjentityalternatebaseview.form.component.d.ts.map +1 -0
  164. package/dist/lib/generated/Entities/MJEntityAlternateBaseView/mjentityalternatebaseview.form.component.js +129 -0
  165. package/dist/lib/generated/Entities/MJEntityAlternateBaseView/mjentityalternatebaseview.form.component.js.map +1 -0
  166. package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.d.ts.map +1 -1
  167. package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js +27 -9
  168. package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js.map +1 -1
  169. package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.d.ts +10 -0
  170. package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.d.ts.map +1 -0
  171. package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.js +130 -0
  172. package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.js.map +1 -0
  173. package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js +26 -14
  174. package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js.map +1 -1
  175. package/dist/lib/generated/Entities/MJFeatureValueCache/mjfeaturevaluecache.form.component.js +23 -19
  176. package/dist/lib/generated/Entities/MJFeatureValueCache/mjfeaturevaluecache.form.component.js.map +1 -1
  177. package/dist/lib/generated/Entities/MJFile/mjfile.form.component.d.ts.map +1 -1
  178. package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js +30 -12
  179. package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js.map +1 -1
  180. package/dist/lib/generated/Entities/MJIntegration/mjintegration.form.component.d.ts.map +1 -1
  181. package/dist/lib/generated/Entities/MJIntegration/mjintegration.form.component.js +26 -8
  182. package/dist/lib/generated/Entities/MJIntegration/mjintegration.form.component.js.map +1 -1
  183. package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.d.ts.map +1 -1
  184. package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.js +24 -6
  185. package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.js.map +1 -1
  186. package/dist/lib/generated/Entities/MJIntegrationObjectField/mjintegrationobjectfield.form.component.d.ts.map +1 -1
  187. package/dist/lib/generated/Entities/MJIntegrationObjectField/mjintegrationobjectfield.form.component.js +25 -6
  188. package/dist/lib/generated/Entities/MJIntegrationObjectField/mjintegrationobjectfield.form.component.js.map +1 -1
  189. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js +29 -27
  190. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js.map +1 -1
  191. package/dist/lib/generated/Entities/MJProcessRunDetail/mjprocessrundetail.form.component.js +17 -15
  192. package/dist/lib/generated/Entities/MJProcessRunDetail/mjprocessrundetail.form.component.js.map +1 -1
  193. package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.d.ts.map +1 -1
  194. package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.js +73 -59
  195. package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.js.map +1 -1
  196. package/dist/lib/generated/Entities/MJQueryEntity/mjqueryentity.form.component.js +10 -8
  197. package/dist/lib/generated/Entities/MJQueryEntity/mjqueryentity.form.component.js.map +1 -1
  198. package/dist/lib/generated/Entities/MJQueryParameter/mjqueryparameter.form.component.d.ts.map +1 -1
  199. package/dist/lib/generated/Entities/MJQueryParameter/mjqueryparameter.form.component.js +12 -4
  200. package/dist/lib/generated/Entities/MJQueryParameter/mjqueryparameter.form.component.js.map +1 -1
  201. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.d.ts.map +1 -1
  202. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js +27 -9
  203. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js.map +1 -1
  204. package/dist/lib/generated/Entities/MJTest/mjtest.form.component.d.ts.map +1 -1
  205. package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js +24 -6
  206. package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js.map +1 -1
  207. package/dist/lib/generated/Entities/MJTestRun/mjtestrun.form.component.d.ts.map +1 -1
  208. package/dist/lib/generated/Entities/MJTestRun/mjtestrun.form.component.js +29 -11
  209. package/dist/lib/generated/Entities/MJTestRun/mjtestrun.form.component.js.map +1 -1
  210. package/dist/lib/generated/Entities/MJTheme/mjtheme.form.component.d.ts.map +1 -1
  211. package/dist/lib/generated/Entities/MJTheme/mjtheme.form.component.js +13 -3
  212. package/dist/lib/generated/Entities/MJTheme/mjtheme.form.component.js.map +1 -1
  213. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  214. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +256 -130
  215. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  216. package/dist/lib/generated/Entities/MJUserRoutine/mjuserroutine.form.component.js +31 -25
  217. package/dist/lib/generated/Entities/MJUserRoutine/mjuserroutine.form.component.js.map +1 -1
  218. package/dist/lib/generated/Entities/MJUserView/mjuserview.form.component.js +50 -38
  219. package/dist/lib/generated/Entities/MJUserView/mjuserview.form.component.js.map +1 -1
  220. package/dist/lib/generated/generated-forms.module.d.ts +446 -438
  221. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  222. package/dist/lib/generated/generated-forms.module.js +24 -0
  223. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  224. package/dist/lib/panels/feature-values/feature-values.logic.d.ts +55 -0
  225. package/dist/lib/panels/feature-values/feature-values.logic.d.ts.map +1 -0
  226. package/dist/lib/panels/feature-values/feature-values.logic.js +88 -0
  227. package/dist/lib/panels/feature-values/feature-values.logic.js.map +1 -0
  228. package/dist/lib/panels/feature-values/feature-values.panel.d.ts +39 -0
  229. package/dist/lib/panels/feature-values/feature-values.panel.d.ts.map +1 -0
  230. package/dist/lib/panels/feature-values/feature-values.panel.js +303 -0
  231. package/dist/lib/panels/feature-values/feature-values.panel.js.map +1 -0
  232. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts +10 -0
  233. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts.map +1 -1
  234. package/dist/lib/panels/model-predictions/model-prediction.logic.js +15 -1
  235. package/dist/lib/panels/model-predictions/model-prediction.logic.js.map +1 -1
  236. package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts +4 -0
  237. package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts.map +1 -1
  238. package/dist/lib/panels/model-predictions/model-prediction.panel.js +77 -61
  239. package/dist/lib/panels/model-predictions/model-prediction.panel.js.map +1 -1
  240. package/dist/lib/shared/components/template-editor.component.d.ts +37 -0
  241. package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
  242. package/dist/lib/shared/components/template-editor.component.js +425 -286
  243. package/dist/lib/shared/components/template-editor.component.js.map +1 -1
  244. package/dist/public-api.d.ts +1 -0
  245. package/dist/public-api.d.ts.map +1 -1
  246. package/dist/public-api.js +1 -0
  247. package/dist/public-api.js.map +1 -1
  248. package/package.json +48 -48
@@ -8,6 +8,8 @@ import { Component, ViewChild, inject } from '@angular/core';
8
8
  import { Subject } from 'rxjs';
9
9
  import { BaseEntity, CompositeKey, LogError, ResolveEntityEventRow } from '@memberjunction/core';
10
10
  import { LoadAgentRunTree, MAX_AGENT_RUN_TREE_DEPTH, WalkAgentRunTree, } from '@memberjunction/ai-core-plus';
11
+ import { WorkflowSaveOperation } from '@memberjunction/core-entities';
12
+ import { AIEngineBase } from '@memberjunction/ai-engine-base';
11
13
  import { BaseFormComponent } from '@memberjunction/ng-base-forms';
12
14
  import { MJGlobal, MJEventType, RegisterClass, UUIDsEqual } from '@memberjunction/global';
13
15
  import { SharedService, NavigationService } from '@memberjunction/ng-shared';
@@ -22,13 +24,14 @@ import * as i0 from "@angular/core";
22
24
  import * as i1 from "@angular/common";
23
25
  import * as i2 from "@angular/forms";
24
26
  import * as i3 from "@memberjunction/ng-ui-components";
25
- import * as i4 from "@memberjunction/ng-code-editor";
26
- import * as i5 from "@memberjunction/ng-deep-diff";
27
- import * as i6 from "angular-split";
28
- import * as i7 from "./ai-agent-run-timeline.component";
29
- import * as i8 from "./ai-agent-run-analytics.component";
30
- import * as i9 from "./ai-agent-run-step-detail.component";
31
- import * as i10 from "./flow/agent-run-flow.component";
27
+ import * as i4 from "@memberjunction/ng-base-forms";
28
+ import * as i5 from "@memberjunction/ng-code-editor";
29
+ import * as i6 from "@memberjunction/ng-deep-diff";
30
+ import * as i7 from "angular-split";
31
+ import * as i8 from "./ai-agent-run-timeline.component";
32
+ import * as i9 from "./ai-agent-run-analytics.component";
33
+ import * as i10 from "./ai-agent-run-step-detail.component";
34
+ import * as i11 from "./flow/agent-run-flow.component";
32
35
  function MJAIAgentRunFormComponentExtended_Conditional_6_Template(rf, ctx) { if (rf & 1) {
33
36
  i0.ɵɵelement(0, "img", 7);
34
37
  } if (rf & 2) {
@@ -52,7 +55,9 @@ function MJAIAgentRunFormComponentExtended_Conditional_13_Template(rf, ctx) { if
52
55
  i0.ɵɵelementEnd()();
53
56
  } if (rf & 2) {
54
57
  const ctx_r0 = i0.ɵɵnextContext();
55
- i0.ɵɵadvance(2);
58
+ i0.ɵɵadvance();
59
+ i0.ɵɵproperty("mjRecordLink", ctx_r0.record)("DisplayName", ctx_r0.agent.Name)("HandleClick", false);
60
+ i0.ɵɵadvance();
56
61
  i0.ɵɵtextInterpolate1(" ", ctx_r0.agent.Name, " ");
57
62
  } }
58
63
  function MJAIAgentRunFormComponentExtended_Conditional_16_Template(rf, ctx) { if (rf & 1) {
@@ -63,6 +68,10 @@ function MJAIAgentRunFormComponentExtended_Conditional_16_Template(rf, ctx) { if
63
68
  i0.ɵɵlistener("click", function MJAIAgentRunFormComponentExtended_Conditional_16_Template_a_click_2_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.navigateToParentRun()); });
64
69
  i0.ɵɵtext(3, "Parent Run");
65
70
  i0.ɵɵelementEnd()();
71
+ } if (rf & 2) {
72
+ const ctx_r0 = i0.ɵɵnextContext();
73
+ i0.ɵɵadvance(2);
74
+ i0.ɵɵproperty("mjRecordLink", ctx_r0.record)("HandleClick", false);
66
75
  } }
67
76
  function MJAIAgentRunFormComponentExtended_Conditional_17_Template(rf, ctx) { if (rf & 1) {
68
77
  const _r4 = i0.ɵɵgetCurrentView();
@@ -203,7 +212,7 @@ function MJAIAgentRunFormComponentExtended_Conditional_40_Template(rf, ctx) { if
203
212
  i0.ɵɵelementStart(3, "div", 49)(4, "div", 50);
204
213
  i0.ɵɵtext(5, "Configuration");
205
214
  i0.ɵɵelementEnd();
206
- i0.ɵɵelementStart(6, "div", 51)(7, "a", 37);
215
+ i0.ɵɵelementStart(6, "div", 51)(7, "a", 52);
207
216
  i0.ɵɵlistener("click", function MJAIAgentRunFormComponentExtended_Conditional_40_Template_a_click_7_listener() { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.openEntityRecord("MJ: AI Configurations", ctx_r0.record.ConfigurationID)); });
208
217
  i0.ɵɵtext(8);
209
218
  i0.ɵɵelementEnd()()()()();
@@ -214,21 +223,21 @@ function MJAIAgentRunFormComponentExtended_Conditional_40_Template(rf, ctx) { if
214
223
  } }
215
224
  function MJAIAgentRunFormComponentExtended_Conditional_55_Conditional_4_Template(rf, ctx) { if (rf & 1) {
216
225
  const _r7 = i0.ɵɵgetCurrentView();
217
- i0.ɵɵelementStart(0, "as-split-area", 53)(1, "mj-ai-agent-run-step-detail", 55);
218
- i0.ɵɵlistener("closePanel", function MJAIAgentRunFormComponentExtended_Conditional_55_Conditional_4_Template_mj_ai_agent_run_step_detail_closePanel_1_listener() { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.closeJsonPanel()); })("navigateToActionLog", function MJAIAgentRunFormComponentExtended_Conditional_55_Conditional_4_Template_mj_ai_agent_run_step_detail_navigateToActionLog_1_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.navigateToActionLog($event)); })("copyToClipboard", function MJAIAgentRunFormComponentExtended_Conditional_55_Conditional_4_Template_mj_ai_agent_run_step_detail_copyToClipboard_1_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.copyToClipboard($event)); });
226
+ i0.ɵɵelementStart(0, "as-split-area", 54)(1, "mj-ai-agent-run-step-detail", 56);
227
+ i0.ɵɵlistener("closePanel", function MJAIAgentRunFormComponentExtended_Conditional_55_Conditional_4_Template_mj_ai_agent_run_step_detail_closePanel_1_listener() { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.closeJsonPanel()); })("navigateToActionLog", function MJAIAgentRunFormComponentExtended_Conditional_55_Conditional_4_Template_mj_ai_agent_run_step_detail_navigateToActionLog_1_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.navigateToActionLog($event)); })("copyToClipboard", function MJAIAgentRunFormComponentExtended_Conditional_55_Conditional_4_Template_mj_ai_agent_run_step_detail_copyToClipboard_1_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.copyToClipboard($event)); })("SaveAsWorkflowRequested", function MJAIAgentRunFormComponentExtended_Conditional_55_Conditional_4_Template_mj_ai_agent_run_step_detail_SaveAsWorkflowRequested_1_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnSaveAsWorkflowRequested($event)); });
219
228
  i0.ɵɵelementEnd()();
220
229
  } if (rf & 2) {
221
230
  const ctx_r0 = i0.ɵɵnextContext(2);
222
231
  i0.ɵɵproperty("size", 45);
223
232
  i0.ɵɵadvance();
224
- i0.ɵɵproperty("selectedTimelineItem", ctx_r0.selectedTimelineItem)("Provider", ctx_r0.ProviderToUse);
233
+ i0.ɵɵproperty("selectedTimelineItem", ctx_r0.selectedTimelineItem)("Provider", ctx_r0.ProviderToUse)("SavingWorkflow", ctx_r0.SavingWorkflow);
225
234
  } }
226
235
  function MJAIAgentRunFormComponentExtended_Conditional_55_Template(rf, ctx) { if (rf & 1) {
227
236
  const _r6 = i0.ɵɵgetCurrentView();
228
- i0.ɵɵelementStart(0, "div", 35)(1, "as-split", 52)(2, "as-split-area", 53)(3, "mj-ai-agent-run-timeline", 54);
237
+ i0.ɵɵelementStart(0, "div", 35)(1, "as-split", 53)(2, "as-split-area", 54)(3, "mj-ai-agent-run-timeline", 55);
229
238
  i0.ɵɵlistener("itemSelected", function MJAIAgentRunFormComponentExtended_Conditional_55_Template_mj_ai_agent_run_timeline_itemSelected_3_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.selectTimelineItem($event)); })("navigateToEntity", function MJAIAgentRunFormComponentExtended_Conditional_55_Template_mj_ai_agent_run_timeline_navigateToEntity_3_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.navigateToEntityRecord($event)); });
230
239
  i0.ɵɵelementEnd()();
231
- i0.ɵɵconditionalCreate(4, MJAIAgentRunFormComponentExtended_Conditional_55_Conditional_4_Template, 2, 3, "as-split-area", 53);
240
+ i0.ɵɵconditionalCreate(4, MJAIAgentRunFormComponentExtended_Conditional_55_Conditional_4_Template, 2, 4, "as-split-area", 54);
232
241
  i0.ɵɵelementEnd()();
233
242
  } if (rf & 2) {
234
243
  const ctx_r0 = i0.ɵɵnextContext();
@@ -240,14 +249,14 @@ function MJAIAgentRunFormComponentExtended_Conditional_55_Template(rf, ctx) { if
240
249
  i0.ɵɵconditional(ctx_r0.selectedTimelineItem ? 4 : -1);
241
250
  } }
242
251
  function MJAIAgentRunFormComponentExtended_Conditional_56_Conditional_1_Template(rf, ctx) { if (rf & 1) {
243
- i0.ɵɵelement(0, "mj-ai-agent-run-flow", 56);
252
+ i0.ɵɵelement(0, "mj-ai-agent-run-flow", 57);
244
253
  } if (rf & 2) {
245
254
  const ctx_r0 = i0.ɵɵnextContext(2);
246
255
  i0.ɵɵproperty("aiAgentRunId", ctx_r0.record.ID)("dataHelper", ctx_r0.dataHelper)("agentName", (ctx_r0.agent == null ? null : ctx_r0.agent.Name) || null)("runStatus", ctx_r0.record.Status || "")("agentIconClass", (ctx_r0.agent == null ? null : ctx_r0.agent.IconClass) || null)("agentLogoUrl", (ctx_r0.agent == null ? null : ctx_r0.agent.LogoURL) || null)("RunTree", ctx_r0.runTree);
247
256
  } }
248
257
  function MJAIAgentRunFormComponentExtended_Conditional_56_Template(rf, ctx) { if (rf & 1) {
249
258
  i0.ɵɵelementStart(0, "div", 35);
250
- i0.ɵɵconditionalCreate(1, MJAIAgentRunFormComponentExtended_Conditional_56_Conditional_1_Template, 1, 7, "mj-ai-agent-run-flow", 56);
259
+ i0.ɵɵconditionalCreate(1, MJAIAgentRunFormComponentExtended_Conditional_56_Conditional_1_Template, 1, 7, "mj-ai-agent-run-flow", 57);
251
260
  i0.ɵɵelementEnd();
252
261
  } if (rf & 2) {
253
262
  const ctx_r0 = i0.ɵɵnextContext();
@@ -255,14 +264,14 @@ function MJAIAgentRunFormComponentExtended_Conditional_56_Template(rf, ctx) { if
255
264
  i0.ɵɵconditional(ctx_r0.visualizationLoaded ? 1 : -1);
256
265
  } }
257
266
  function MJAIAgentRunFormComponentExtended_Conditional_57_Conditional_1_Template(rf, ctx) { if (rf & 1) {
258
- i0.ɵɵelement(0, "mj-ai-agent-run-analytics", 57, 0);
267
+ i0.ɵɵelement(0, "mj-ai-agent-run-analytics", 58, 0);
259
268
  } if (rf & 2) {
260
269
  const ctx_r0 = i0.ɵɵnextContext(2);
261
270
  i0.ɵɵproperty("agentRunId", ctx_r0.record.ID)("RunTree", ctx_r0.runTree);
262
271
  } }
263
272
  function MJAIAgentRunFormComponentExtended_Conditional_57_Template(rf, ctx) { if (rf & 1) {
264
273
  i0.ɵɵelementStart(0, "div", 35);
265
- i0.ɵɵconditionalCreate(1, MJAIAgentRunFormComponentExtended_Conditional_57_Conditional_1_Template, 2, 2, "mj-ai-agent-run-analytics", 57);
274
+ i0.ɵɵconditionalCreate(1, MJAIAgentRunFormComponentExtended_Conditional_57_Conditional_1_Template, 2, 2, "mj-ai-agent-run-analytics", 58);
266
275
  i0.ɵɵelementEnd();
267
276
  } if (rf & 2) {
268
277
  const ctx_r0 = i0.ɵɵnextContext();
@@ -275,7 +284,7 @@ function MJAIAgentRunFormComponentExtended_Conditional_58_ng_template_2_Template
275
284
  } }
276
285
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_14_Template(rf, ctx) { if (rf & 1) {
277
286
  const _r9 = i0.ɵɵgetCurrentView();
278
- i0.ɵɵelementStart(0, "a", 37);
287
+ i0.ɵɵelementStart(0, "a", 52);
279
288
  i0.ɵɵlistener("click", function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_14_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.openEntityRecord("MJ: AI Agent Runs", ctx_r0.record.ParentRunID)); });
280
289
  i0.ɵɵtext(1);
281
290
  i0.ɵɵelementEnd();
@@ -291,7 +300,7 @@ function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_15_Templat
291
300
  } }
292
301
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_20_Template(rf, ctx) { if (rf & 1) {
293
302
  const _r10 = i0.ɵɵgetCurrentView();
294
- i0.ɵɵelementStart(0, "a", 37);
303
+ i0.ɵɵelementStart(0, "a", 52);
295
304
  i0.ɵɵlistener("click", function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_20_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.openEntityRecord("MJ: AI Agent Runs", ctx_r0.record.LastRunID)); });
296
305
  i0.ɵɵtext(1);
297
306
  i0.ɵɵelementEnd();
@@ -307,7 +316,7 @@ function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_21_Templat
307
316
  } }
308
317
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_26_Template(rf, ctx) { if (rf & 1) {
309
318
  const _r11 = i0.ɵɵgetCurrentView();
310
- i0.ɵɵelementStart(0, "a", 37);
319
+ i0.ɵɵelementStart(0, "a", 52);
311
320
  i0.ɵɵlistener("click", function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_26_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.openEntityRecord("MJ: Conversations", ctx_r0.record.ConversationID)); });
312
321
  i0.ɵɵtext(1);
313
322
  i0.ɵɵelementEnd();
@@ -323,7 +332,7 @@ function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_27_Templat
323
332
  } }
324
333
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_32_Template(rf, ctx) { if (rf & 1) {
325
334
  const _r12 = i0.ɵɵgetCurrentView();
326
- i0.ɵɵelementStart(0, "a", 37);
335
+ i0.ɵɵelementStart(0, "a", 52);
327
336
  i0.ɵɵlistener("click", function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_32_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r12); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.openEntityRecord("MJ: Users", ctx_r0.record.UserID)); });
328
337
  i0.ɵɵtext(1);
329
338
  i0.ɵɵelementEnd();
@@ -338,12 +347,12 @@ function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_33_Templat
338
347
  i0.ɵɵelementEnd();
339
348
  } }
340
349
  function MJAIAgentRunFormComponentExtended_Conditional_58_ng_template_35_Template(rf, ctx) { if (rf & 1) {
341
- i0.ɵɵelement(0, "i", 66);
350
+ i0.ɵɵelement(0, "i", 67);
342
351
  i0.ɵɵtext(1, " Execution Settings ");
343
352
  } }
344
353
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_41_Template(rf, ctx) { if (rf & 1) {
345
354
  const _r13 = i0.ɵɵgetCurrentView();
346
- i0.ɵɵelementStart(0, "a", 37);
355
+ i0.ɵɵelementStart(0, "a", 52);
347
356
  i0.ɵɵlistener("click", function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_41_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.openEntityRecord("MJ: AI Models", ctx_r0.record.OverrideModelID)); });
348
357
  i0.ɵɵtext(1);
349
358
  i0.ɵɵelementEnd();
@@ -359,7 +368,7 @@ function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_42_Templat
359
368
  } }
360
369
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_47_Template(rf, ctx) { if (rf & 1) {
361
370
  const _r14 = i0.ɵɵgetCurrentView();
362
- i0.ɵɵelementStart(0, "a", 37);
371
+ i0.ɵɵelementStart(0, "a", 52);
363
372
  i0.ɵɵlistener("click", function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_47_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.openEntityRecord("MJ: AI Vendors", ctx_r0.record.OverrideVendorID)); });
364
373
  i0.ɵɵtext(1);
365
374
  i0.ɵɵelementEnd();
@@ -374,7 +383,7 @@ function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_48_Templat
374
383
  i0.ɵɵelementEnd();
375
384
  } }
376
385
  function MJAIAgentRunFormComponentExtended_Conditional_58_ng_template_55_Template(rf, ctx) { if (rf & 1) {
377
- i0.ɵɵelement(0, "i", 67);
386
+ i0.ɵɵelement(0, "i", 68);
378
387
  i0.ɵɵtext(1, " Execution Status ");
379
388
  } }
380
389
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_65_Template(rf, ctx) { if (rf & 1) {
@@ -383,20 +392,20 @@ function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_65_Templat
383
392
  i0.ɵɵelementEnd();
384
393
  } }
385
394
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_66_Template(rf, ctx) { if (rf & 1) {
386
- i0.ɵɵelementStart(0, "span", 63);
395
+ i0.ɵɵelementStart(0, "span", 64);
387
396
  i0.ɵɵtext(1, "Yes");
388
397
  i0.ɵɵelementEnd();
389
398
  } }
390
399
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_67_Template(rf, ctx) { if (rf & 1) {
391
- i0.ɵɵelementStart(0, "span", 64);
400
+ i0.ɵɵelementStart(0, "span", 65);
392
401
  i0.ɵɵtext(1, "No");
393
402
  i0.ɵɵelementEnd();
394
403
  } }
395
404
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_68_Template(rf, ctx) { if (rf & 1) {
396
- i0.ɵɵelementStart(0, "div", 65)(1, "label");
405
+ i0.ɵɵelementStart(0, "div", 66)(1, "label");
397
406
  i0.ɵɵtext(2, "Message");
398
407
  i0.ɵɵelementEnd();
399
- i0.ɵɵelementStart(3, "div", 68);
408
+ i0.ɵɵelementStart(3, "div", 69);
400
409
  i0.ɵɵtext(4);
401
410
  i0.ɵɵelementEnd()();
402
411
  } if (rf & 2) {
@@ -405,10 +414,10 @@ function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_68_Templat
405
414
  i0.ɵɵtextInterpolate(ctx_r0.record.Message);
406
415
  } }
407
416
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_69_Template(rf, ctx) { if (rf & 1) {
408
- i0.ɵɵelementStart(0, "div", 65)(1, "label");
417
+ i0.ɵɵelementStart(0, "div", 66)(1, "label");
409
418
  i0.ɵɵtext(2, "Error Message");
410
419
  i0.ɵɵelementEnd();
411
- i0.ɵɵelementStart(3, "div", 64);
420
+ i0.ɵɵelementStart(3, "div", 65);
412
421
  i0.ɵɵtext(4);
413
422
  i0.ɵɵelementEnd()();
414
423
  } if (rf & 2) {
@@ -417,30 +426,30 @@ function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_69_Templat
417
426
  i0.ɵɵtextInterpolate(ctx_r0.record.ErrorMessage);
418
427
  } }
419
428
  function MJAIAgentRunFormComponentExtended_Conditional_58_ng_template_71_Template(rf, ctx) { if (rf & 1) {
420
- i0.ɵɵelement(0, "i", 69);
429
+ i0.ɵɵelement(0, "i", 70);
421
430
  i0.ɵɵtext(1, " Usage & Cost ");
422
431
  } }
423
432
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_103_ng_template_1_Template(rf, ctx) { if (rf & 1) {
424
- i0.ɵɵelement(0, "i", 73);
433
+ i0.ɵɵelement(0, "i", 74);
425
434
  i0.ɵɵtext(1, " Result ");
426
435
  } }
427
436
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_103_Conditional_3_Template(rf, ctx) { if (rf & 1) {
428
- i0.ɵɵelement(0, "mj-code-editor", 71);
437
+ i0.ɵɵelement(0, "mj-code-editor", 72);
429
438
  } if (rf & 2) {
430
439
  const ctx_r0 = i0.ɵɵnextContext(3);
431
440
  i0.ɵɵproperty("ngModel", ctx_r0.parsedResult)("language", "json")("readonly", true);
432
441
  } }
433
442
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_103_Conditional_4_Template(rf, ctx) { if (rf & 1) {
434
- i0.ɵɵelementStart(0, "div", 72);
443
+ i0.ɵɵelementStart(0, "div", 73);
435
444
  i0.ɵɵelement(1, "i", 46);
436
445
  i0.ɵɵtext(2, " Loading result data... ");
437
446
  i0.ɵɵelementEnd();
438
447
  } }
439
448
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_103_Template(rf, ctx) { if (rf & 1) {
440
- i0.ɵɵelementStart(0, "mj-accordion-panel", 58);
441
- i0.ɵɵtemplate(1, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_103_ng_template_1_Template, 2, 0, "ng-template", 59);
442
- i0.ɵɵelementStart(2, "div", 70);
443
- i0.ɵɵconditionalCreate(3, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_103_Conditional_3_Template, 1, 3, "mj-code-editor", 71)(4, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_103_Conditional_4_Template, 3, 0, "div", 72);
449
+ i0.ɵɵelementStart(0, "mj-accordion-panel", 59);
450
+ i0.ɵɵtemplate(1, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_103_ng_template_1_Template, 2, 0, "ng-template", 60);
451
+ i0.ɵɵelementStart(2, "div", 71);
452
+ i0.ɵɵconditionalCreate(3, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_103_Conditional_3_Template, 1, 3, "mj-code-editor", 72)(4, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_103_Conditional_4_Template, 3, 0, "div", 73);
444
453
  i0.ɵɵelementEnd()();
445
454
  } if (rf & 2) {
446
455
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -449,26 +458,26 @@ function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_103_Templa
449
458
  i0.ɵɵconditional(ctx_r0.isParsingComplete ? 3 : 4);
450
459
  } }
451
460
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_104_ng_template_1_Template(rf, ctx) { if (rf & 1) {
452
- i0.ɵɵelement(0, "i", 74);
461
+ i0.ɵɵelement(0, "i", 75);
453
462
  i0.ɵɵtext(1, " Starting Payload ");
454
463
  } }
455
464
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_104_Conditional_3_Template(rf, ctx) { if (rf & 1) {
456
- i0.ɵɵelement(0, "mj-code-editor", 71);
465
+ i0.ɵɵelement(0, "mj-code-editor", 72);
457
466
  } if (rf & 2) {
458
467
  const ctx_r0 = i0.ɵɵnextContext(3);
459
468
  i0.ɵɵproperty("ngModel", ctx_r0.parsedStartingPayload)("language", "json")("readonly", true);
460
469
  } }
461
470
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_104_Conditional_4_Template(rf, ctx) { if (rf & 1) {
462
- i0.ɵɵelementStart(0, "div", 72);
471
+ i0.ɵɵelementStart(0, "div", 73);
463
472
  i0.ɵɵelement(1, "i", 46);
464
473
  i0.ɵɵtext(2, " Loading payload data... ");
465
474
  i0.ɵɵelementEnd();
466
475
  } }
467
476
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_104_Template(rf, ctx) { if (rf & 1) {
468
- i0.ɵɵelementStart(0, "mj-accordion-panel", 58);
469
- i0.ɵɵtemplate(1, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_104_ng_template_1_Template, 2, 0, "ng-template", 59);
470
- i0.ɵɵelementStart(2, "div", 70);
471
- i0.ɵɵconditionalCreate(3, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_104_Conditional_3_Template, 1, 3, "mj-code-editor", 71)(4, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_104_Conditional_4_Template, 3, 0, "div", 72);
477
+ i0.ɵɵelementStart(0, "mj-accordion-panel", 59);
478
+ i0.ɵɵtemplate(1, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_104_ng_template_1_Template, 2, 0, "ng-template", 60);
479
+ i0.ɵɵelementStart(2, "div", 71);
480
+ i0.ɵɵconditionalCreate(3, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_104_Conditional_3_Template, 1, 3, "mj-code-editor", 72)(4, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_104_Conditional_4_Template, 3, 0, "div", 73);
472
481
  i0.ɵɵelementEnd()();
473
482
  } if (rf & 2) {
474
483
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -477,26 +486,26 @@ function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_104_Templa
477
486
  i0.ɵɵconditional(ctx_r0.isParsingComplete ? 3 : 4);
478
487
  } }
479
488
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_105_ng_template_1_Template(rf, ctx) { if (rf & 1) {
480
- i0.ɵɵelement(0, "i", 75);
489
+ i0.ɵɵelement(0, "i", 76);
481
490
  i0.ɵɵtext(1, " Execution Data ");
482
491
  } }
483
492
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_105_Conditional_3_Template(rf, ctx) { if (rf & 1) {
484
- i0.ɵɵelement(0, "mj-code-editor", 71);
493
+ i0.ɵɵelement(0, "mj-code-editor", 72);
485
494
  } if (rf & 2) {
486
495
  const ctx_r0 = i0.ɵɵnextContext(3);
487
496
  i0.ɵɵproperty("ngModel", ctx_r0.parsedData)("language", "json")("readonly", true);
488
497
  } }
489
498
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_105_Conditional_4_Template(rf, ctx) { if (rf & 1) {
490
- i0.ɵɵelementStart(0, "div", 72);
499
+ i0.ɵɵelementStart(0, "div", 73);
491
500
  i0.ɵɵelement(1, "i", 46);
492
501
  i0.ɵɵtext(2, " Loading execution data... ");
493
502
  i0.ɵɵelementEnd();
494
503
  } }
495
504
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_105_Template(rf, ctx) { if (rf & 1) {
496
- i0.ɵɵelementStart(0, "mj-accordion-panel", 58);
497
- i0.ɵɵtemplate(1, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_105_ng_template_1_Template, 2, 0, "ng-template", 59);
498
- i0.ɵɵelementStart(2, "div", 70);
499
- i0.ɵɵconditionalCreate(3, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_105_Conditional_3_Template, 1, 3, "mj-code-editor", 71)(4, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_105_Conditional_4_Template, 3, 0, "div", 72);
505
+ i0.ɵɵelementStart(0, "mj-accordion-panel", 59);
506
+ i0.ɵɵtemplate(1, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_105_ng_template_1_Template, 2, 0, "ng-template", 60);
507
+ i0.ɵɵelementStart(2, "div", 71);
508
+ i0.ɵɵconditionalCreate(3, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_105_Conditional_3_Template, 1, 3, "mj-code-editor", 72)(4, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_105_Conditional_4_Template, 3, 0, "div", 73);
500
509
  i0.ɵɵelementEnd()();
501
510
  } if (rf & 2) {
502
511
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -505,26 +514,26 @@ function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_105_Templa
505
514
  i0.ɵɵconditional(ctx_r0.isParsingComplete ? 3 : 4);
506
515
  } }
507
516
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_106_ng_template_1_Template(rf, ctx) { if (rf & 1) {
508
- i0.ɵɵelement(0, "i", 76);
517
+ i0.ɵɵelement(0, "i", 77);
509
518
  i0.ɵɵtext(1, " Final Payload ");
510
519
  } }
511
520
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_106_Conditional_3_Template(rf, ctx) { if (rf & 1) {
512
- i0.ɵɵelement(0, "mj-code-editor", 71);
521
+ i0.ɵɵelement(0, "mj-code-editor", 72);
513
522
  } if (rf & 2) {
514
523
  const ctx_r0 = i0.ɵɵnextContext(3);
515
524
  i0.ɵɵproperty("ngModel", ctx_r0.parsedFinalPayload)("language", "json")("readonly", true);
516
525
  } }
517
526
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_106_Conditional_4_Template(rf, ctx) { if (rf & 1) {
518
- i0.ɵɵelementStart(0, "div", 72);
527
+ i0.ɵɵelementStart(0, "div", 73);
519
528
  i0.ɵɵelement(1, "i", 46);
520
529
  i0.ɵɵtext(2, " Loading final payload data... ");
521
530
  i0.ɵɵelementEnd();
522
531
  } }
523
532
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_106_Template(rf, ctx) { if (rf & 1) {
524
- i0.ɵɵelementStart(0, "mj-accordion-panel", 58);
525
- i0.ɵɵtemplate(1, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_106_ng_template_1_Template, 2, 0, "ng-template", 59);
526
- i0.ɵɵelementStart(2, "div", 70);
527
- i0.ɵɵconditionalCreate(3, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_106_Conditional_3_Template, 1, 3, "mj-code-editor", 71)(4, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_106_Conditional_4_Template, 3, 0, "div", 72);
533
+ i0.ɵɵelementStart(0, "mj-accordion-panel", 59);
534
+ i0.ɵɵtemplate(1, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_106_ng_template_1_Template, 2, 0, "ng-template", 60);
535
+ i0.ɵɵelementStart(2, "div", 71);
536
+ i0.ɵɵconditionalCreate(3, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_106_Conditional_3_Template, 1, 3, "mj-code-editor", 72)(4, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_106_Conditional_4_Template, 3, 0, "div", 73);
528
537
  i0.ɵɵelementEnd()();
529
538
  } if (rf & 2) {
530
539
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -533,26 +542,26 @@ function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_106_Templa
533
542
  i0.ɵɵconditional(ctx_r0.isParsingComplete ? 3 : 4);
534
543
  } }
535
544
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_107_ng_template_1_Template(rf, ctx) { if (rf & 1) {
536
- i0.ɵɵelement(0, "i", 79);
545
+ i0.ɵɵelement(0, "i", 80);
537
546
  i0.ɵɵtext(1, " Payload Diff ");
538
547
  } }
539
548
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_107_Conditional_3_Template(rf, ctx) { if (rf & 1) {
540
- i0.ɵɵelement(0, "mj-deep-diff", 78);
549
+ i0.ɵɵelement(0, "mj-deep-diff", 79);
541
550
  } if (rf & 2) {
542
551
  const ctx_r0 = i0.ɵɵnextContext(3);
543
552
  i0.ɵɵproperty("oldValue", ctx_r0.startingPayloadObject)("newValue", ctx_r0.finalPayloadObject)("title", "")("showSummary", true)("showUnchanged", false)("expandAll", false)("maxDepth", 10)("maxStringLength", 200)("treatNullAsUndefined", true);
544
553
  } }
545
554
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_107_Conditional_4_Template(rf, ctx) { if (rf & 1) {
546
- i0.ɵɵelementStart(0, "div", 72);
555
+ i0.ɵɵelementStart(0, "div", 73);
547
556
  i0.ɵɵelement(1, "i", 46);
548
557
  i0.ɵɵtext(2, " Loading payload diff... ");
549
558
  i0.ɵɵelementEnd();
550
559
  } }
551
560
  function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_107_Template(rf, ctx) { if (rf & 1) {
552
- i0.ɵɵelementStart(0, "mj-accordion-panel", 58);
553
- i0.ɵɵtemplate(1, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_107_ng_template_1_Template, 2, 0, "ng-template", 59);
554
- i0.ɵɵelementStart(2, "div", 77);
555
- i0.ɵɵconditionalCreate(3, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_107_Conditional_3_Template, 1, 9, "mj-deep-diff", 78)(4, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_107_Conditional_4_Template, 3, 0, "div", 72);
561
+ i0.ɵɵelementStart(0, "mj-accordion-panel", 59);
562
+ i0.ɵɵtemplate(1, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_107_ng_template_1_Template, 2, 0, "ng-template", 60);
563
+ i0.ɵɵelementStart(2, "div", 78);
564
+ i0.ɵɵconditionalCreate(3, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_107_Conditional_3_Template, 1, 9, "mj-deep-diff", 79)(4, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_107_Conditional_4_Template, 3, 0, "div", 73);
556
565
  i0.ɵɵelementEnd()();
557
566
  } if (rf & 2) {
558
567
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -562,123 +571,123 @@ function MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_107_Templa
562
571
  } }
563
572
  function MJAIAgentRunFormComponentExtended_Conditional_58_Template(rf, ctx) { if (rf & 1) {
564
573
  const _r8 = i0.ɵɵgetCurrentView();
565
- i0.ɵɵelementStart(0, "div", 36)(1, "mj-accordion-panel", 58);
566
- i0.ɵɵtemplate(2, MJAIAgentRunFormComponentExtended_Conditional_58_ng_template_2_Template, 2, 0, "ng-template", 59);
567
- i0.ɵɵelementStart(3, "div", 60)(4, "div", 61)(5, "label");
574
+ i0.ɵɵelementStart(0, "div", 36)(1, "mj-accordion-panel", 59);
575
+ i0.ɵɵtemplate(2, MJAIAgentRunFormComponentExtended_Conditional_58_ng_template_2_Template, 2, 0, "ng-template", 60);
576
+ i0.ɵɵelementStart(3, "div", 61)(4, "div", 62)(5, "label");
568
577
  i0.ɵɵtext(6, "Agent");
569
578
  i0.ɵɵelementEnd();
570
- i0.ɵɵelementStart(7, "span")(8, "a", 37);
579
+ i0.ɵɵelementStart(7, "span")(8, "a", 52);
571
580
  i0.ɵɵlistener("click", function MJAIAgentRunFormComponentExtended_Conditional_58_Template_a_click_8_listener() { i0.ɵɵrestoreView(_r8); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.openEntityRecord("MJ: AI Agents", ctx_r0.record.AgentID)); });
572
581
  i0.ɵɵtext(9);
573
582
  i0.ɵɵelementEnd()()();
574
- i0.ɵɵelementStart(10, "div", 61)(11, "label");
583
+ i0.ɵɵelementStart(10, "div", 62)(11, "label");
575
584
  i0.ɵɵtext(12, "Parent Run ID");
576
585
  i0.ɵɵelementEnd();
577
586
  i0.ɵɵelementStart(13, "span");
578
- i0.ɵɵconditionalCreate(14, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_14_Template, 2, 1, "a", 62);
587
+ i0.ɵɵconditionalCreate(14, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_14_Template, 2, 1, "a", 63);
579
588
  i0.ɵɵconditionalCreate(15, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_15_Template, 2, 0, "span");
580
589
  i0.ɵɵelementEnd()();
581
- i0.ɵɵelementStart(16, "div", 61)(17, "label");
590
+ i0.ɵɵelementStart(16, "div", 62)(17, "label");
582
591
  i0.ɵɵtext(18, "Last Run ID");
583
592
  i0.ɵɵelementEnd();
584
593
  i0.ɵɵelementStart(19, "span");
585
- i0.ɵɵconditionalCreate(20, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_20_Template, 2, 1, "a", 62);
594
+ i0.ɵɵconditionalCreate(20, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_20_Template, 2, 1, "a", 63);
586
595
  i0.ɵɵconditionalCreate(21, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_21_Template, 2, 0, "span");
587
596
  i0.ɵɵelementEnd()();
588
- i0.ɵɵelementStart(22, "div", 61)(23, "label");
597
+ i0.ɵɵelementStart(22, "div", 62)(23, "label");
589
598
  i0.ɵɵtext(24, "Conversation ID");
590
599
  i0.ɵɵelementEnd();
591
600
  i0.ɵɵelementStart(25, "span");
592
- i0.ɵɵconditionalCreate(26, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_26_Template, 2, 1, "a", 62);
601
+ i0.ɵɵconditionalCreate(26, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_26_Template, 2, 1, "a", 63);
593
602
  i0.ɵɵconditionalCreate(27, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_27_Template, 2, 0, "span");
594
603
  i0.ɵɵelementEnd()();
595
- i0.ɵɵelementStart(28, "div", 61)(29, "label");
604
+ i0.ɵɵelementStart(28, "div", 62)(29, "label");
596
605
  i0.ɵɵtext(30, "User");
597
606
  i0.ɵɵelementEnd();
598
607
  i0.ɵɵelementStart(31, "span");
599
- i0.ɵɵconditionalCreate(32, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_32_Template, 2, 1, "a", 62);
608
+ i0.ɵɵconditionalCreate(32, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_32_Template, 2, 1, "a", 63);
600
609
  i0.ɵɵconditionalCreate(33, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_33_Template, 2, 0, "span");
601
610
  i0.ɵɵelementEnd()()()();
602
- i0.ɵɵelementStart(34, "mj-accordion-panel", 58);
603
- i0.ɵɵtemplate(35, MJAIAgentRunFormComponentExtended_Conditional_58_ng_template_35_Template, 2, 0, "ng-template", 59);
604
- i0.ɵɵelementStart(36, "div", 60)(37, "div", 61)(38, "label");
611
+ i0.ɵɵelementStart(34, "mj-accordion-panel", 59);
612
+ i0.ɵɵtemplate(35, MJAIAgentRunFormComponentExtended_Conditional_58_ng_template_35_Template, 2, 0, "ng-template", 60);
613
+ i0.ɵɵelementStart(36, "div", 61)(37, "div", 62)(38, "label");
605
614
  i0.ɵɵtext(39, "Override Model");
606
615
  i0.ɵɵelementEnd();
607
616
  i0.ɵɵelementStart(40, "span");
608
- i0.ɵɵconditionalCreate(41, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_41_Template, 2, 1, "a", 62);
617
+ i0.ɵɵconditionalCreate(41, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_41_Template, 2, 1, "a", 63);
609
618
  i0.ɵɵconditionalCreate(42, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_42_Template, 2, 0, "span");
610
619
  i0.ɵɵelementEnd()();
611
- i0.ɵɵelementStart(43, "div", 61)(44, "label");
620
+ i0.ɵɵelementStart(43, "div", 62)(44, "label");
612
621
  i0.ɵɵtext(45, "Override Vendor");
613
622
  i0.ɵɵelementEnd();
614
623
  i0.ɵɵelementStart(46, "span");
615
- i0.ɵɵconditionalCreate(47, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_47_Template, 2, 1, "a", 62);
624
+ i0.ɵɵconditionalCreate(47, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_47_Template, 2, 1, "a", 63);
616
625
  i0.ɵɵconditionalCreate(48, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_48_Template, 2, 0, "span");
617
626
  i0.ɵɵelementEnd()();
618
- i0.ɵɵelementStart(49, "div", 61)(50, "label");
627
+ i0.ɵɵelementStart(49, "div", 62)(50, "label");
619
628
  i0.ɵɵtext(51, "Verbose Logging");
620
629
  i0.ɵɵelementEnd();
621
630
  i0.ɵɵelementStart(52, "span");
622
631
  i0.ɵɵtext(53);
623
632
  i0.ɵɵelementEnd()()()();
624
- i0.ɵɵelementStart(54, "mj-accordion-panel", 58);
625
- i0.ɵɵtemplate(55, MJAIAgentRunFormComponentExtended_Conditional_58_ng_template_55_Template, 2, 0, "ng-template", 59);
626
- i0.ɵɵelementStart(56, "div", 60)(57, "div", 61)(58, "label");
633
+ i0.ɵɵelementStart(54, "mj-accordion-panel", 59);
634
+ i0.ɵɵtemplate(55, MJAIAgentRunFormComponentExtended_Conditional_58_ng_template_55_Template, 2, 0, "ng-template", 60);
635
+ i0.ɵɵelementStart(56, "div", 61)(57, "div", 62)(58, "label");
627
636
  i0.ɵɵtext(59, "Status");
628
637
  i0.ɵɵelementEnd();
629
638
  i0.ɵɵelementStart(60, "span", 18);
630
639
  i0.ɵɵtext(61);
631
640
  i0.ɵɵelementEnd()();
632
- i0.ɵɵelementStart(62, "div", 61)(63, "label");
641
+ i0.ɵɵelementStart(62, "div", 62)(63, "label");
633
642
  i0.ɵɵtext(64, "Success");
634
643
  i0.ɵɵelementEnd();
635
- i0.ɵɵconditionalCreate(65, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_65_Template, 2, 0, "span")(66, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_66_Template, 2, 0, "span", 63)(67, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_67_Template, 2, 0, "span", 64);
644
+ i0.ɵɵconditionalCreate(65, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_65_Template, 2, 0, "span")(66, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_66_Template, 2, 0, "span", 64)(67, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_67_Template, 2, 0, "span", 65);
636
645
  i0.ɵɵelementEnd();
637
- i0.ɵɵconditionalCreate(68, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_68_Template, 5, 1, "div", 65);
638
- i0.ɵɵconditionalCreate(69, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_69_Template, 5, 1, "div", 65);
646
+ i0.ɵɵconditionalCreate(68, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_68_Template, 5, 1, "div", 66);
647
+ i0.ɵɵconditionalCreate(69, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_69_Template, 5, 1, "div", 66);
639
648
  i0.ɵɵelementEnd()();
640
- i0.ɵɵelementStart(70, "mj-accordion-panel", 58);
641
- i0.ɵɵtemplate(71, MJAIAgentRunFormComponentExtended_Conditional_58_ng_template_71_Template, 2, 0, "ng-template", 59);
642
- i0.ɵɵelementStart(72, "div", 60)(73, "div", 61)(74, "label");
649
+ i0.ɵɵelementStart(70, "mj-accordion-panel", 59);
650
+ i0.ɵɵtemplate(71, MJAIAgentRunFormComponentExtended_Conditional_58_ng_template_71_Template, 2, 0, "ng-template", 60);
651
+ i0.ɵɵelementStart(72, "div", 61)(73, "div", 62)(74, "label");
643
652
  i0.ɵɵtext(75, "Total Tokens Used");
644
653
  i0.ɵɵelementEnd();
645
654
  i0.ɵɵelementStart(76, "span");
646
655
  i0.ɵɵtext(77);
647
656
  i0.ɵɵpipe(78, "number");
648
657
  i0.ɵɵelementEnd()();
649
- i0.ɵɵelementStart(79, "div", 61)(80, "label");
658
+ i0.ɵɵelementStart(79, "div", 62)(80, "label");
650
659
  i0.ɵɵtext(81, "Prompt Tokens");
651
660
  i0.ɵɵelementEnd();
652
661
  i0.ɵɵelementStart(82, "span");
653
662
  i0.ɵɵtext(83);
654
663
  i0.ɵɵpipe(84, "number");
655
664
  i0.ɵɵelementEnd()();
656
- i0.ɵɵelementStart(85, "div", 61)(86, "label");
665
+ i0.ɵɵelementStart(85, "div", 62)(86, "label");
657
666
  i0.ɵɵtext(87, "Completion Tokens");
658
667
  i0.ɵɵelementEnd();
659
668
  i0.ɵɵelementStart(88, "span");
660
669
  i0.ɵɵtext(89);
661
670
  i0.ɵɵpipe(90, "number");
662
671
  i0.ɵɵelementEnd()();
663
- i0.ɵɵelementStart(91, "div", 61)(92, "label");
672
+ i0.ɵɵelementStart(91, "div", 62)(92, "label");
664
673
  i0.ɵɵtext(93, "Total Cost");
665
674
  i0.ɵɵelementEnd();
666
675
  i0.ɵɵelementStart(94, "span");
667
676
  i0.ɵɵtext(95);
668
677
  i0.ɵɵpipe(96, "number");
669
678
  i0.ɵɵelementEnd()();
670
- i0.ɵɵelementStart(97, "div", 61)(98, "label");
679
+ i0.ɵɵelementStart(97, "div", 62)(98, "label");
671
680
  i0.ɵɵtext(99, "Total Prompt Iterations");
672
681
  i0.ɵɵelementEnd();
673
682
  i0.ɵɵelementStart(100, "span");
674
683
  i0.ɵɵtext(101);
675
684
  i0.ɵɵpipe(102, "number");
676
685
  i0.ɵɵelementEnd()()()();
677
- i0.ɵɵconditionalCreate(103, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_103_Template, 5, 2, "mj-accordion-panel", 58);
678
- i0.ɵɵconditionalCreate(104, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_104_Template, 5, 2, "mj-accordion-panel", 58);
679
- i0.ɵɵconditionalCreate(105, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_105_Template, 5, 2, "mj-accordion-panel", 58);
680
- i0.ɵɵconditionalCreate(106, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_106_Template, 5, 2, "mj-accordion-panel", 58);
681
- i0.ɵɵconditionalCreate(107, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_107_Template, 5, 2, "mj-accordion-panel", 58);
686
+ i0.ɵɵconditionalCreate(103, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_103_Template, 5, 2, "mj-accordion-panel", 59);
687
+ i0.ɵɵconditionalCreate(104, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_104_Template, 5, 2, "mj-accordion-panel", 59);
688
+ i0.ɵɵconditionalCreate(105, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_105_Template, 5, 2, "mj-accordion-panel", 59);
689
+ i0.ɵɵconditionalCreate(106, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_106_Template, 5, 2, "mj-accordion-panel", 59);
690
+ i0.ɵɵconditionalCreate(107, MJAIAgentRunFormComponentExtended_Conditional_58_Conditional_107_Template, 5, 2, "mj-accordion-panel", 59);
682
691
  i0.ɵɵelementEnd();
683
692
  } if (rf & 2) {
684
693
  const ctx_r0 = i0.ɵɵnextContext();
@@ -739,7 +748,7 @@ function MJAIAgentRunFormComponentExtended_Conditional_58_Template(rf, ctx) { if
739
748
  i0.ɵɵadvance(6);
740
749
  i0.ɵɵtextInterpolate(ctx_r0.record.TotalPromptIterations != null ? i0.ɵɵpipeBind2(102, 45, ctx_r0.record.TotalPromptIterations, "1.0-0") : "N/A");
741
750
  i0.ɵɵadvance(2);
742
- i0.ɵɵconditional(ctx_r0.record.Result ? 103 : -1);
751
+ i0.ɵɵconditional(ctx_r0.ShowResultPanel ? 103 : -1);
743
752
  i0.ɵɵadvance();
744
753
  i0.ɵɵconditional(ctx_r0.record.StartingPayload ? 104 : -1);
745
754
  i0.ɵɵadvance();
@@ -790,6 +799,18 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
790
799
  this._cachedParsedStartingPayload = null;
791
800
  this._cachedParsedFinalPayload = null;
792
801
  this._cachedParsedData = null;
802
+ this._cachedStartingPayloadRaw = undefined;
803
+ this._cachedStartingPayloadObject = null;
804
+ this._cachedFinalPayloadRaw = undefined;
805
+ this._cachedFinalPayloadObject = null;
806
+ this._cachedStepStartRaw = undefined;
807
+ this._cachedStepStartItem = null;
808
+ this._cachedStepPayloadAtStartObject = null;
809
+ this._cachedStepEndRaw = undefined;
810
+ this._cachedStepEndItem = null;
811
+ this._cachedStepPayloadAtEndObject = null;
812
+ this._lastRunTreeForWorkflowRunning = null;
813
+ this._cachedWorkflowStillRunning = false;
793
814
  // Simple parsing state - true when all parsing is complete
794
815
  this._allParsingComplete = false;
795
816
  // Field injections
@@ -812,6 +833,8 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
812
833
  this.RunTreeLoading = false;
813
834
  /** Why the tree could not be loaded, or null. Surfaced rather than swallowed. */
814
835
  this.RunTreeError = null;
836
+ /** True while a workflow is being saved via `WorkflowSaveOperation`. */
837
+ this.SavingWorkflow = false;
815
838
  }
816
839
  /** @deprecated Use {@link ActiveTab}. */
817
840
  get activeTab() {
@@ -952,6 +975,7 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
952
975
  finally {
953
976
  this.RunTreeLoading = false;
954
977
  this.scheduleWorkflowPoll();
978
+ this.cdr.markForCheck();
955
979
  }
956
980
  }
957
981
  /**
@@ -969,13 +993,20 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
969
993
  get WorkflowStillRunning() {
970
994
  if (!this.RunTree)
971
995
  return false;
972
- for (const node of WalkAgentRunTree(this.RunTree)) {
973
- if (node.NodeType !== 'Task' && node.NodeType !== 'TaskGraph')
974
- continue;
975
- if (!TERMINAL_TASK_STATUSES.has(node.Status))
976
- return true;
996
+ if (this._lastRunTreeForWorkflowRunning !== this.RunTree) {
997
+ this._lastRunTreeForWorkflowRunning = this.RunTree;
998
+ let stillRunning = false;
999
+ for (const node of WalkAgentRunTree(this.RunTree)) {
1000
+ if (node.NodeType !== 'Task' && node.NodeType !== 'TaskGraph')
1001
+ continue;
1002
+ if (!TERMINAL_TASK_STATUSES.has(node.Status)) {
1003
+ stillRunning = true;
1004
+ break;
1005
+ }
1006
+ }
1007
+ this._cachedWorkflowStillRunning = stillRunning;
977
1008
  }
978
- return false;
1009
+ return this._cachedWorkflowStillRunning;
979
1010
  }
980
1011
  /**
981
1012
  * Re-reads the tree while a detached workflow is still moving, and stops when it settles.
@@ -1005,12 +1036,15 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1005
1036
  async ngOnInit() {
1006
1037
  await super.ngOnInit();
1007
1038
  if (this.record && this.record.ID) {
1008
- await this.DataHelper.loadAgentRunData(this.record.ID);
1009
- await this.loadRunTree();
1010
- await this.loadAgent();
1011
- await this.loadCostMetrics();
1039
+ await Promise.all([
1040
+ this.DataHelper.loadAgentRunData(this.record.ID),
1041
+ this.loadRunTree(),
1042
+ this.loadAgent(),
1043
+ this.loadCostMetrics()
1044
+ ]);
1012
1045
  // Parse all JSON fields on form load for instant access later
1013
1046
  this.parseAllFields();
1047
+ this.cdr.markForCheck();
1014
1048
  // If the run is in progress, subscribe to BaseEntity events so we
1015
1049
  // pick up new steps / status changes the moment AgentRunner saves
1016
1050
  // them — no 30s polling timer. Same pattern used by the Form
@@ -1190,11 +1224,17 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1190
1224
  if (!this.record?.AgentID)
1191
1225
  return;
1192
1226
  try {
1227
+ const cachedAgent = AIEngineBase.Instance?.Agents?.find(a => UUIDsEqual(a.ID, this.record.AgentID));
1228
+ if (cachedAgent) {
1229
+ this.Agent = cachedAgent;
1230
+ this.cdr.markForCheck();
1231
+ return;
1232
+ }
1193
1233
  const md = this.ProviderToUse;
1194
1234
  const agent = await md.GetEntityObject('MJ: AI Agents');
1195
1235
  if (agent && await agent.Load(this.record.AgentID)) {
1196
1236
  this.Agent = agent;
1197
- this.cdr.detectChanges();
1237
+ this.cdr.markForCheck();
1198
1238
  }
1199
1239
  }
1200
1240
  catch (error) {
@@ -1218,6 +1258,7 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1218
1258
  isLoading: false,
1219
1259
  error: 'Failed to load cost data'
1220
1260
  };
1261
+ this.cdr.markForCheck();
1221
1262
  }
1222
1263
  }
1223
1264
  ChangeTab(tab) {
@@ -1379,6 +1420,44 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1379
1420
  async copyToClipboard(text) {
1380
1421
  return this.CopyToClipboard(text);
1381
1422
  }
1423
+ /**
1424
+ * Persists the selected `TaskGraph` step's `TaskGraphSpec` as a Draft Flow Agent workflow
1425
+ * via `WorkflowSaveOperation` and opens the resulting `MJ: AI Agents` record.
1426
+ */
1427
+ async OnSaveAsWorkflowRequested(spec) {
1428
+ if (!spec || this.SavingWorkflow) {
1429
+ return;
1430
+ }
1431
+ this.SavingWorkflow = true;
1432
+ try {
1433
+ const name = spec.workflowName?.trim() ||
1434
+ this.SelectedTimelineItem?.title?.trim() ||
1435
+ (this.Agent?.Name ? `${this.Agent.Name} Workflow` : 'Saved Workflow');
1436
+ const workflowSpec = {
1437
+ name,
1438
+ description: `Saved from AI Agent Run ${this.record?.ID ?? ''}`.trim(),
1439
+ status: 'Draft',
1440
+ graph: { ...spec, workflowName: name },
1441
+ triggers: [],
1442
+ };
1443
+ const op = new WorkflowSaveOperation();
1444
+ const result = await op.Execute({ spec: workflowSpec }, { provider: this.ProviderToUse, user: this.ProviderToUse.CurrentUser });
1445
+ const output = result.Output;
1446
+ if (!result.Success || !output?.success || !output.agentID) {
1447
+ SharedService.Instance.CreateSimpleNotification(output?.errorMessage ?? result.ErrorMessage ?? 'Could not save workflow.', 'error', 5000);
1448
+ return;
1449
+ }
1450
+ SharedService.Instance.CreateSimpleNotification(`Saved workflow "${name}". Opening Flow Agent record…`, 'success', 3500);
1451
+ this.navigationService.OpenEntityRecord('MJ: AI Agents', CompositeKey.FromID(output.agentID));
1452
+ }
1453
+ catch (err) {
1454
+ const msg = err instanceof Error ? err.message : String(err);
1455
+ SharedService.Instance.CreateSimpleNotification(`Failed to save workflow: ${msg}`, 'error', 5000);
1456
+ }
1457
+ finally {
1458
+ this.SavingWorkflow = false;
1459
+ }
1460
+ }
1382
1461
  /**
1383
1462
  * Get the Result field with recursive JSON parsing applied
1384
1463
  */
@@ -1557,18 +1636,23 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1557
1636
  * Get parsed Starting Payload as an object for deep diff
1558
1637
  */
1559
1638
  get StartingPayloadObject() {
1560
- if (!this.record?.StartingPayload)
1639
+ const raw = this.record?.StartingPayload;
1640
+ if (!raw)
1561
1641
  return null;
1642
+ if (this._cachedStartingPayloadRaw === raw && this._cachedStartingPayloadObject !== null) {
1643
+ return this._cachedStartingPayloadObject;
1644
+ }
1645
+ this._cachedStartingPayloadRaw = raw;
1562
1646
  try {
1563
1647
  // First, check if StartingPayload is a JSON string that needs to be parsed
1564
- let payloadData = this.record.StartingPayload;
1648
+ let payloadData = raw;
1565
1649
  try {
1566
1650
  // If StartingPayload is a JSON string, parse it first
1567
- payloadData = JSON.parse(this.record.StartingPayload);
1651
+ payloadData = JSON.parse(raw);
1568
1652
  }
1569
1653
  catch {
1570
1654
  // If it's not valid JSON, use it as-is
1571
- payloadData = this.record.StartingPayload;
1655
+ payloadData = raw;
1572
1656
  }
1573
1657
  const parseOptions = {
1574
1658
  extractInlineJson: true,
@@ -1576,9 +1660,11 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1576
1660
  debug: false
1577
1661
  };
1578
1662
  // Re-enabled ParseJSONRecursive with performance optimizations
1579
- return ParseJSONRecursive(payloadData, parseOptions);
1663
+ this._cachedStartingPayloadObject = ParseJSONRecursive(payloadData, parseOptions);
1664
+ return this._cachedStartingPayloadObject;
1580
1665
  }
1581
- catch (e) {
1666
+ catch {
1667
+ this._cachedStartingPayloadObject = null;
1582
1668
  return null;
1583
1669
  }
1584
1670
  }
@@ -1590,18 +1676,23 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1590
1676
  * Get parsed Final Payload as an object for deep diff
1591
1677
  */
1592
1678
  get FinalPayloadObject() {
1593
- if (!this.record?.FinalPayload)
1679
+ const raw = this.record?.FinalPayload;
1680
+ if (!raw)
1594
1681
  return null;
1682
+ if (this._cachedFinalPayloadRaw === raw && this._cachedFinalPayloadObject !== null) {
1683
+ return this._cachedFinalPayloadObject;
1684
+ }
1685
+ this._cachedFinalPayloadRaw = raw;
1595
1686
  try {
1596
1687
  // First, check if FinalPayload is a JSON string that needs to be parsed
1597
- let payloadData = this.record.FinalPayload;
1688
+ let payloadData = raw;
1598
1689
  try {
1599
1690
  // If FinalPayload is a JSON string, parse it first
1600
- payloadData = JSON.parse(this.record.FinalPayload);
1691
+ payloadData = JSON.parse(raw);
1601
1692
  }
1602
1693
  catch {
1603
1694
  // If it's not valid JSON, use it as-is
1604
- payloadData = this.record.FinalPayload;
1695
+ payloadData = raw;
1605
1696
  }
1606
1697
  const parseOptions = {
1607
1698
  extractInlineJson: true,
@@ -1609,9 +1700,11 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1609
1700
  debug: false
1610
1701
  };
1611
1702
  // Re-enabled ParseJSONRecursive with performance optimizations
1612
- return ParseJSONRecursive(payloadData, parseOptions);
1703
+ this._cachedFinalPayloadObject = ParseJSONRecursive(payloadData, parseOptions);
1704
+ return this._cachedFinalPayloadObject;
1613
1705
  }
1614
- catch (e) {
1706
+ catch {
1707
+ this._cachedFinalPayloadObject = null;
1615
1708
  return null;
1616
1709
  }
1617
1710
  }
@@ -1627,6 +1720,17 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1627
1720
  this._cachedParsedStartingPayload = null;
1628
1721
  this._cachedParsedFinalPayload = null;
1629
1722
  this._cachedParsedData = null;
1723
+ this._cachedStartingPayloadRaw = undefined;
1724
+ this._cachedStartingPayloadObject = null;
1725
+ this._cachedFinalPayloadRaw = undefined;
1726
+ this._cachedFinalPayloadObject = null;
1727
+ this._cachedStepStartRaw = undefined;
1728
+ this._cachedStepStartItem = null;
1729
+ this._cachedStepPayloadAtStartObject = null;
1730
+ this._cachedStepEndRaw = undefined;
1731
+ this._cachedStepEndItem = null;
1732
+ this._cachedStepPayloadAtEndObject = null;
1733
+ this._lastRunTreeForWorkflowRunning = null;
1630
1734
  this._allParsingComplete = false;
1631
1735
  }
1632
1736
  /**
@@ -1635,8 +1739,8 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1635
1739
  parseAllFields() {
1636
1740
  try {
1637
1741
  let parsedCount = 0;
1638
- // Parse all fields that exist
1639
- if (this.record?.Result) {
1742
+ // Parse each field whose panel is shown
1743
+ if (this.ShowResultPanel) {
1640
1744
  this.ParsedResult; // Triggers parsing and caching
1641
1745
  parsedCount++;
1642
1746
  }
@@ -1678,6 +1782,13 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1678
1782
  get showPayloadDiff() {
1679
1783
  return this.ShowPayloadDiff;
1680
1784
  }
1785
+ /**
1786
+ * True for an older run that has `Result` but no `FinalPayload`. When `FinalPayload` is set it
1787
+ * holds the same JSON and has its own panel.
1788
+ */
1789
+ get ShowResultPanel() {
1790
+ return !!this.record?.Result && !this.record?.FinalPayload;
1791
+ }
1681
1792
  /**
1682
1793
  * Check if selected timeline item is a step with payload changes
1683
1794
  */
@@ -1706,16 +1817,24 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1706
1817
  return null;
1707
1818
  }
1708
1819
  const stepData = this.SelectedTimelineItem.data;
1709
- if (!stepData || !stepData.PayloadAtStart) {
1820
+ const raw = stepData?.PayloadAtStart;
1821
+ if (!raw) {
1710
1822
  return null;
1711
1823
  }
1824
+ if (this._cachedStepStartItem === this.SelectedTimelineItem &&
1825
+ this._cachedStepStartRaw === raw &&
1826
+ this._cachedStepPayloadAtStartObject !== null) {
1827
+ return this._cachedStepPayloadAtStartObject;
1828
+ }
1829
+ this._cachedStepStartItem = this.SelectedTimelineItem;
1830
+ this._cachedStepStartRaw = raw;
1712
1831
  try {
1713
- let payloadData = stepData.PayloadAtStart;
1832
+ let payloadData = raw;
1714
1833
  try {
1715
- payloadData = JSON.parse(stepData.PayloadAtStart);
1834
+ payloadData = JSON.parse(raw);
1716
1835
  }
1717
1836
  catch {
1718
- payloadData = stepData.PayloadAtStart;
1837
+ payloadData = raw;
1719
1838
  }
1720
1839
  const parseOptions = {
1721
1840
  extractInlineJson: true,
@@ -1723,9 +1842,11 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1723
1842
  debug: false
1724
1843
  };
1725
1844
  // Re-enabled ParseJSONRecursive with performance optimizations
1726
- return ParseJSONRecursive(payloadData, parseOptions);
1845
+ this._cachedStepPayloadAtStartObject = ParseJSONRecursive(payloadData, parseOptions);
1846
+ return this._cachedStepPayloadAtStartObject;
1727
1847
  }
1728
- catch (e) {
1848
+ catch {
1849
+ this._cachedStepPayloadAtStartObject = null;
1729
1850
  return null;
1730
1851
  }
1731
1852
  }
@@ -1741,16 +1862,24 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1741
1862
  return null;
1742
1863
  }
1743
1864
  const stepData = this.SelectedTimelineItem.data;
1744
- if (!stepData || !stepData.PayloadAtEnd) {
1865
+ const raw = stepData?.PayloadAtEnd;
1866
+ if (!raw) {
1745
1867
  return null;
1746
1868
  }
1869
+ if (this._cachedStepEndItem === this.SelectedTimelineItem &&
1870
+ this._cachedStepEndRaw === raw &&
1871
+ this._cachedStepPayloadAtEndObject !== null) {
1872
+ return this._cachedStepPayloadAtEndObject;
1873
+ }
1874
+ this._cachedStepEndItem = this.SelectedTimelineItem;
1875
+ this._cachedStepEndRaw = raw;
1747
1876
  try {
1748
- let payloadData = stepData.PayloadAtEnd;
1877
+ let payloadData = raw;
1749
1878
  try {
1750
- payloadData = JSON.parse(stepData.PayloadAtEnd);
1879
+ payloadData = JSON.parse(raw);
1751
1880
  }
1752
1881
  catch {
1753
- payloadData = stepData.PayloadAtEnd;
1882
+ payloadData = raw;
1754
1883
  }
1755
1884
  const parseOptions = {
1756
1885
  extractInlineJson: true,
@@ -1758,9 +1887,11 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1758
1887
  debug: false
1759
1888
  };
1760
1889
  // Re-enabled ParseJSONRecursive with performance optimizations
1761
- return ParseJSONRecursive(payloadData, parseOptions);
1890
+ this._cachedStepPayloadAtEndObject = ParseJSONRecursive(payloadData, parseOptions);
1891
+ return this._cachedStepPayloadAtEndObject;
1762
1892
  }
1763
- catch (e) {
1893
+ catch {
1894
+ this._cachedStepPayloadAtEndObject = null;
1764
1895
  return null;
1765
1896
  }
1766
1897
  }
@@ -1775,7 +1906,7 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1775
1906
  let _t;
1776
1907
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.TimelineComponent = _t.first);
1777
1908
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.AnalyticsComponent = _t.first);
1778
- } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 59, vars: 35, consts: [["analyticsComponent", ""], [1, "record-form-container", "ai-agent-run-form"], [1, "record-form"], [1, "header"], [1, "header-content"], [1, "header-left"], [1, "icon-wrapper"], [1, "agent-logo", 3, "src", "alt"], [1, "fas", 3, "ngClass"], [1, "fas", "fa-robot"], [1, "header-info"], [1, "meta-info"], [1, "agent-name"], [1, "run-id"], [1, "parent-run"], ["title", "Open conversation in Chat app", 1, "conversation-pill"], [1, "header-right"], ["title", "This run executed in Plan Mode \u2014 the agent presented a plan for human approval before executing actions or sub-agents", 1, "plan-mode-badge"], [1, "status-badge"], ["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.", 1, "workflow-running-badge"], [1, "header-actions"], ["title", "Refresh", 1, "btn-icon", 3, "click"], [1, "fas", "fa-sync-alt"], [1, "header-stats"], [1, "stat"], [1, "label"], [1, "value"], [1, "configuration-bar"], [1, "tabs"], [1, "tab", 3, "click"], [1, "fas", "fa-stream"], [1, "fas", "fa-diagram-project"], [1, "fas", "fa-chart-line"], [1, "fas", "fa-info-circle"], [1, "content-area"], [1, "tab-content", 2, "height", "100%"], [1, "tab-content"], ["href", "javascript:void(0)", 1, "entity-link", 3, "click"], [1, "fas", "fa-level-up-alt"], [1, "parent-link", 3, "click"], ["title", "Open conversation in Chat app", 1, "conversation-pill", 3, "click"], [1, "fas", "fa-comments"], [1, "fas", "fa-external-link-alt", "pill-action"], [1, "fas", "fa-clipboard-check"], [1, "fas", "fa-circle-notch", "fa-spin"], [1, "value", "loading"], [1, "fas", "fa-spinner", "fa-spin"], [1, "config-item"], [1, "fas", "fa-cog"], [1, "config-content"], [1, "config-label"], [1, "config-value"], ["direction", "horizontal", 2, "height", "100%"], [3, "size"], [3, "itemSelected", "navigateToEntity", "aiAgentRunId", "dataHelper", "RunTree"], [3, "closePanel", "navigateToActionLog", "copyToClipboard", "selectedTimelineItem", "Provider"], [3, "aiAgentRunId", "dataHelper", "agentName", "runStatus", "agentIconClass", "agentLogoUrl", "RunTree"], [3, "agentRunId", "RunTree"], [3, "Expanded"], ["mjAccordionTitle", ""], [1, "details-grid"], [1, "detail-item"], ["href", "javascript:void(0)", 1, "entity-link"], [1, "success"], [1, "error-message"], [1, "detail-item", "full-width"], [1, "fas", "fa-cogs"], [1, "fas", "fa-tasks"], [1, "message"], [1, "fas", "fa-dollar-sign"], [1, "result-viewer"], [2, "height", "300px", "width", "100%", 3, "ngModel", "language", "readonly"], [2, "padding", "20px", "text-align", "center", "color", "var(--mj-text-muted)"], [1, "fas", "fa-code"], [1, "fas", "fa-upload"], [1, "fas", "fa-database"], [1, "fas", "fa-download"], [2, "padding", "20px", "background", "var(--mj-bg-surface-card)"], [3, "oldValue", "newValue", "title", "showSummary", "showUnchanged", "expandAll", "maxDepth", "maxStringLength", "treatNullAsUndefined"], [1, "fas", "fa-code-compare"]], template: function MJAIAgentRunFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
1909
+ } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 59, vars: 35, consts: [["analyticsComponent", ""], [1, "record-form-container", "ai-agent-run-form"], [1, "record-form"], [1, "header"], [1, "header-content"], [1, "header-left"], [1, "icon-wrapper"], [1, "agent-logo", 3, "src", "alt"], [1, "fas", 3, "ngClass"], [1, "fas", "fa-robot"], [1, "header-info"], [1, "meta-info"], [1, "agent-name"], [1, "run-id"], [1, "parent-run"], ["title", "Open conversation in Chat app", 1, "conversation-pill"], [1, "header-right"], ["title", "This run executed in Plan Mode \u2014 the agent presented a plan for human approval before executing actions or sub-agents", 1, "plan-mode-badge"], [1, "status-badge"], ["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.", 1, "workflow-running-badge"], [1, "header-actions"], ["title", "Refresh", 1, "btn-icon", 3, "click"], [1, "fas", "fa-sync-alt"], [1, "header-stats"], [1, "stat"], [1, "label"], [1, "value"], [1, "configuration-bar"], [1, "tabs"], [1, "tab", 3, "click"], [1, "fas", "fa-stream"], [1, "fas", "fa-diagram-project"], [1, "fas", "fa-chart-line"], [1, "fas", "fa-info-circle"], [1, "content-area"], [1, "tab-content", 2, "height", "100%"], [1, "tab-content"], ["href", "javascript:void(0)", "FieldName", "AgentID", 1, "entity-link", 3, "click", "mjRecordLink", "DisplayName", "HandleClick"], [1, "fas", "fa-level-up-alt"], ["FieldName", "ParentRunID", 1, "parent-link", 3, "click", "mjRecordLink", "HandleClick"], ["title", "Open conversation in Chat app", 1, "conversation-pill", 3, "click"], [1, "fas", "fa-comments"], [1, "fas", "fa-external-link-alt", "pill-action"], [1, "fas", "fa-clipboard-check"], [1, "fas", "fa-circle-notch", "fa-spin"], [1, "value", "loading"], [1, "fas", "fa-spinner", "fa-spin"], [1, "config-item"], [1, "fas", "fa-cog"], [1, "config-content"], [1, "config-label"], [1, "config-value"], ["href", "javascript:void(0)", 1, "entity-link", 3, "click"], ["direction", "horizontal", 2, "height", "100%"], [3, "size"], [3, "itemSelected", "navigateToEntity", "aiAgentRunId", "dataHelper", "RunTree"], [3, "closePanel", "navigateToActionLog", "copyToClipboard", "SaveAsWorkflowRequested", "selectedTimelineItem", "Provider", "SavingWorkflow"], [3, "aiAgentRunId", "dataHelper", "agentName", "runStatus", "agentIconClass", "agentLogoUrl", "RunTree"], [3, "agentRunId", "RunTree"], [3, "Expanded"], ["mjAccordionTitle", ""], [1, "details-grid"], [1, "detail-item"], ["href", "javascript:void(0)", 1, "entity-link"], [1, "success"], [1, "error-message"], [1, "detail-item", "full-width"], [1, "fas", "fa-cogs"], [1, "fas", "fa-tasks"], [1, "message"], [1, "fas", "fa-dollar-sign"], [1, "result-viewer"], [2, "height", "300px", "width", "100%", 3, "ngModel", "language", "readonly"], [2, "padding", "20px", "text-align", "center", "color", "var(--mj-text-muted)"], [1, "fas", "fa-code"], [1, "fas", "fa-upload"], [1, "fas", "fa-database"], [1, "fas", "fa-download"], [2, "padding", "20px", "background", "var(--mj-bg-surface-card)"], [3, "oldValue", "newValue", "title", "showSummary", "showUnchanged", "expandAll", "maxDepth", "maxStringLength", "treatNullAsUndefined"], [1, "fas", "fa-code-compare"]], template: function MJAIAgentRunFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
1779
1910
  i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "div", 3)(3, "div", 4)(4, "div", 5)(5, "div", 6);
1780
1911
  i0.ɵɵconditionalCreate(6, MJAIAgentRunFormComponentExtended_Conditional_6_Template, 1, 2, "img", 7);
1781
1912
  i0.ɵɵconditionalCreate(7, MJAIAgentRunFormComponentExtended_Conditional_7_Template, 1, 1, "i", 8);
@@ -1785,11 +1916,11 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1785
1916
  i0.ɵɵtext(11, "AI Agent Run");
1786
1917
  i0.ɵɵelementEnd();
1787
1918
  i0.ɵɵelementStart(12, "div", 11);
1788
- i0.ɵɵconditionalCreate(13, MJAIAgentRunFormComponentExtended_Conditional_13_Template, 3, 1, "span", 12);
1919
+ i0.ɵɵconditionalCreate(13, MJAIAgentRunFormComponentExtended_Conditional_13_Template, 3, 4, "span", 12);
1789
1920
  i0.ɵɵelementStart(14, "span", 13);
1790
1921
  i0.ɵɵtext(15);
1791
1922
  i0.ɵɵelementEnd();
1792
- i0.ɵɵconditionalCreate(16, MJAIAgentRunFormComponentExtended_Conditional_16_Template, 4, 0, "span", 14);
1923
+ i0.ɵɵconditionalCreate(16, MJAIAgentRunFormComponentExtended_Conditional_16_Template, 4, 2, "span", 14);
1793
1924
  i0.ɵɵconditionalCreate(17, MJAIAgentRunFormComponentExtended_Conditional_17_Template, 5, 0, "span", 15);
1794
1925
  i0.ɵɵelementEnd()()();
1795
1926
  i0.ɵɵelementStart(18, "div", 16);
@@ -1902,7 +2033,7 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1902
2033
  i0.ɵɵconditional(ctx.activeTab === "analytics" ? 57 : -1);
1903
2034
  i0.ɵɵadvance();
1904
2035
  i0.ɵɵconditional(ctx.activeTab === "details" ? 58 : -1);
1905
- } }, dependencies: [i1.NgClass, i2.NgControlStatus, i2.NgModel, i3.MJAccordionPanelComponent, i3.MJAccordionTitleDirective, i4.CodeEditorComponent, i5.DeepDiffComponent, i6.SplitComponent, i6.SplitAreaComponent, i7.AIAgentRunTimelineComponent, i8.AIAgentRunAnalyticsComponent, i9.AIAgentRunStepDetailComponent, i10.AIAgentRunFlowComponent, i1.DecimalPipe, i1.DatePipe], styles: [".ai-agent-run-form[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.record-form-container.ai-agent-run-form[_ngcontent-%COMP%] > .record-form[_ngcontent-%COMP%], \n.ai-agent-run-form[_ngcontent-%COMP%] > .record-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n}\n\n\n.header[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n padding: 20px;\n box-shadow: var(--mj-shadow-sm);\n flex-shrink: 0;\n}\n\n.header-content[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 16px;\n}\n\n.header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.icon-wrapper[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n background: var(--mj-brand-primary);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 20px;\n overflow: hidden;\n}\n\n.agent-logo[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.header-info[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.meta-info[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n margin-top: 4px;\n font-size: 14px;\n color: var(--mj-text-muted);\n}\n\n.parent-run[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.parent-link[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n text-decoration: none;\n cursor: pointer;\n transition: color 0.2s;\n}\n\n.parent-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-status-error);\n text-decoration: underline;\n}\n\n.agent-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.run-id[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n opacity: 0.7;\n}\n\n\n.conversation-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 16px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-brand-primary);\n cursor: pointer;\n transition: all 0.2s ease;\n white-space: nowrap;\n}\n\n.conversation-pill[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n transform: translateY(-1px);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.conversation-pill[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child {\n font-size: 11px;\n opacity: 0.9;\n}\n\n.conversation-pill[_ngcontent-%COMP%] .pill-action[_ngcontent-%COMP%] {\n font-size: 9px;\n opacity: 0.6;\n transition: opacity 0.2s ease;\n}\n\n.conversation-pill[_ngcontent-%COMP%]:hover .pill-action[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n padding: 6px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.status-badge[data-status=\"Running\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.status-badge[data-status=\"Completed\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-badge[data-status=\"Failed\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-badge[data-status=\"Cancelled\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.status-badge[data-status=\"Paused\"][_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.status-badge.small[_ngcontent-%COMP%] {\n padding: 4px 12px;\n font-size: 11px;\n}\n\n\n.plan-mode-badge[_ngcontent-%COMP%] {\n padding: 6px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.btn-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: var(--mj-text-muted);\n}\n\n.btn-icon[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-secondary);\n}\n\n.header-stats[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n padding-top: 12px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n\n.configuration-bar[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n padding-top: 16px;\n border-top: 1px solid var(--mj-border-default);\n margin-top: 16px;\n}\n\n.config-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.config-item[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n font-size: 1.2em;\n color: var(--mj-text-muted);\n width: 24px;\n text-align: center;\n}\n\n.config-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.config-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.config-value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.config-value[_ngcontent-%COMP%] .entity-link[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n text-decoration: none;\n cursor: pointer;\n transition: color 0.2s;\n}\n\n.config-value[_ngcontent-%COMP%] .entity-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary-hover);\n text-decoration: underline;\n}\n\n.stat[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.stat[_ngcontent-%COMP%] .label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat[_ngcontent-%COMP%] .value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.stat[_ngcontent-%COMP%] .value.success[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.stat[_ngcontent-%COMP%] .value.error[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n.tabs[_ngcontent-%COMP%] {\n display: flex;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n flex-shrink: 0;\n}\n\n.tab[_ngcontent-%COMP%] {\n padding: 12px 24px;\n border: none;\n background: transparent;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 8px;\n transition: all 0.2s ease;\n border-bottom: 3px solid transparent;\n}\n\n.tab[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-text-primary) 2%, var(--mj-bg-surface));\n}\n\n.tab.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n}\n\n\n.content-area[_ngcontent-%COMP%] {\n position: relative;\n flex: 1;\n min-height: 0;\n overflow: auto;\n background: var(--mj-bg-surface);\n}\n\n.tab-content[_ngcontent-%COMP%] {\n height: 100%;\n min-height: 0;\n overflow: auto;\n}\n\n\n.tab-content[_ngcontent-%COMP%] mj-accordion-panel[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 8px;\n}\n\n\n.json-detail-pane[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface-sunken);\n border-left: 1px solid var(--mj-border-default);\n}\n\n.json-pane-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.json-pane-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.json-pane-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 14px;\n}\n\n.json-pane-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: auto;\n padding: 16px;\n}\n\n.json-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 20px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.json-meta[_ngcontent-%COMP%] .meta-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta[_ngcontent-%COMP%] .meta-item[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n font-weight: 600;\n letter-spacing: 0.5px;\n}\n\n.json-meta[_ngcontent-%COMP%] .meta-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.action-link[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n.action-link[_ngcontent-%COMP%] .btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n font-size: 14px;\n cursor: pointer;\n padding: 6px 12px;\n border-radius: 4px;\n transition: all 0.2s;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.action-link[_ngcontent-%COMP%] .btn-link[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary-hover);\n}\n\n.json-viewer[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n overflow: auto;\n padding: 20px;\n gap: 10px;\n min-height: 0;\n margin-bottom: 45px;\n}\n\n\n.json-toolbar[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n padding: 8px 12px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n\n.timeline-container[_ngcontent-%COMP%] {\n height: 100%;\n overflow-y: auto;\n padding: 20px;\n}\n\n.timeline-container[_ngcontent-%COMP%] > .timeline[_ngcontent-%COMP%] {\n max-width: 900px;\n margin: 0 auto;\n}\n\n.timeline[_ngcontent-%COMP%] {\n position: relative;\n padding-left: 40px;\n}\n\n.timeline[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: 20px;\n top: 0;\n bottom: 0;\n width: 2px;\n background: var(--mj-border-default);\n}\n\n.timeline-item[_ngcontent-%COMP%] {\n position: relative;\n margin-bottom: 24px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.timeline-item[_ngcontent-%COMP%]:hover {\n transform: translateX(4px);\n}\n\n.timeline-item.selected[_ngcontent-%COMP%] {\n transform: translateX(8px);\n}\n\n.timeline-item.selected[_ngcontent-%COMP%] .timeline-content[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n}\n\n.timeline-marker[_ngcontent-%COMP%] {\n position: absolute;\n left: -30px;\n top: 0;\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface);\n border: 3px solid var(--mj-border-default);\n z-index: 1;\n transition: all 0.2s ease;\n}\n\n.timeline-marker[data-color=\"success\"][_ngcontent-%COMP%] {\n border-color: var(--mj-status-success);\n color: var(--mj-status-success);\n}\n\n.timeline-marker[data-color=\"error\"][_ngcontent-%COMP%] {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n.timeline-marker[data-color=\"info\"][_ngcontent-%COMP%] {\n border-color: var(--mj-status-info);\n color: var(--mj-status-info);\n}\n\n.timeline-marker[data-color=\"warning\"][_ngcontent-%COMP%] {\n border-color: var(--mj-status-warning);\n color: var(--mj-status-warning);\n}\n\n.timeline-marker[data-color=\"secondary\"][_ngcontent-%COMP%] {\n border-color: var(--mj-text-muted);\n color: var(--mj-text-muted);\n}\n\n.timeline-marker.small[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n font-size: 12px;\n}\n\n.timeline-content[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n margin-left: 20px;\n box-shadow: var(--mj-shadow-sm);\n transition: all 0.2s ease;\n}\n\n.timeline-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.timeline-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.timeline-header[_ngcontent-%COMP%] h5[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.timeline-time[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n font-family: monospace;\n}\n\n.timeline-subtitle[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n}\n\n.timeline-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.timeline-meta[_ngcontent-%COMP%] .status[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.timeline-meta[_ngcontent-%COMP%] .status[data-status=\"Completed\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.timeline-meta[_ngcontent-%COMP%] .status[data-status=\"Failed\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.timeline-meta[_ngcontent-%COMP%] .status[data-status=\"Running\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.timeline-meta[_ngcontent-%COMP%] .status[data-status=\"Paused\"][_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.duration[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.timeline-actions[_ngcontent-%COMP%] {\n position: absolute;\n right: 20px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s ease;\n}\n\n.btn-link[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.btn-expand[_ngcontent-%COMP%] {\n width: 24px;\n height: 24px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n.btn-expand[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-secondary);\n}\n\n\n.timeline-children[_ngcontent-%COMP%] {\n position: relative;\n margin-top: 12px;\n margin-bottom: 12px;\n}\n\n.timeline-children[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: -10px;\n top: -12px;\n bottom: 0;\n width: 2px;\n background: var(--mj-border-default);\n}\n\n.child-item[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n.child-item[_ngcontent-%COMP%] .timeline-content[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-default);\n}\n\n\n.sub-run-timeline[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 2%, var(--mj-bg-surface));\n border-left: 2px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n margin-left: 20px;\n padding-left: 20px;\n margin-top: 8px;\n margin-bottom: 8px;\n}\n\n.sub-run-item[_ngcontent-%COMP%] .timeline-marker[_ngcontent-%COMP%] {\n border-width: 2px;\n}\n\n.sub-run-item[_ngcontent-%COMP%] .timeline-content[_ngcontent-%COMP%] {\n transition: all 0.2s ease;\n}\n\n\n.json-detail-pane[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n}\n\n.json-pane-header[_ngcontent-%COMP%] {\n padding: 16px 20px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-shrink: 0;\n}\n\n.json-pane-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 10px;\n font-weight: 600;\n}\n\n.json-pane-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.json-meta[_ngcontent-%COMP%] {\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n flex-shrink: 0;\n}\n\n.json-meta[_ngcontent-%COMP%] .meta-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.json-meta[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.action-link[_ngcontent-%COMP%] {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.action-link[_ngcontent-%COMP%] .btn-link[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-brand-primary);\n text-decoration: none;\n font-size: 14px;\n padding: 8px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 4px;\n transition: all 0.2s;\n cursor: pointer;\n}\n\n.action-link[_ngcontent-%COMP%] .btn-link[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 35%, transparent);\n text-decoration: none;\n}\n\n\n.json-toolbar[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n\n.details-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n padding: 20px;\n}\n\n.detail-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-item.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.detail-item[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.error-message[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n padding: 12px;\n border-radius: 8px;\n font-size: 13px;\n}\n\n.result-viewer[_ngcontent-%COMP%], \n.state-viewer[_ngcontent-%COMP%] {\n padding: 20px;\n max-height: 450px;\n overflow: auto;\n display: flex;\n flex-direction: column;\n}\n\n.result-viewer[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%], \n.state-viewer[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n}\n\n\n.empty-state[_ngcontent-%COMP%], \n.loading-state[_ngcontent-%COMP%], \n.error-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 60px 20px;\n color: var(--mj-text-muted);\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.loading-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.error-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n opacity: 0.3;\n margin-bottom: 16px;\n}\n\n\n@media (max-width: 768px) {\n .header-content[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n }\n \n .header-stats[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n \n .json-detail-pane[_ngcontent-%COMP%] {\n width: 100%;\n }\n \n .timeline[_ngcontent-%COMP%] {\n padding-left: 30px;\n }\n \n .timeline-marker[_ngcontent-%COMP%] {\n left: -25px;\n width: 32px;\n height: 32px;\n }\n \n .timeline-content[_ngcontent-%COMP%] {\n margin-left: 10px;\n }\n}\n\n\n.entity-link[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n text-decoration: none;\n transition: all 0.2s ease;\n border-bottom: 1px solid transparent;\n display: inline-block;\n}\n\n.entity-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary-hover);\n border-bottom-color: var(--mj-brand-primary-hover);\n}\n\n.entity-link[_ngcontent-%COMP%]:active {\n color: var(--mj-brand-primary-hover);\n}\n\n\n.detail-pane-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n margin: 8px 0 0 0;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 0 16px;\n}\n\n.detail-tab[_ngcontent-%COMP%] {\n padding: 10px 16px;\n background: none;\n border: none;\n border-bottom: 3px solid transparent;\n color: var(--mj-text-muted);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.detail-tab[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-text-primary) 2%, var(--mj-bg-surface));\n}\n\n.detail-tab.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.detail-tab[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n\n.detail-pane-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n min-height: 0;\n margin-bottom: 35px;\n}\n\n.detail-pane-content.with-tabs[_ngcontent-%COMP%] {\n \n margin-top: 0;\n}\n\n\n.step-payload-diff[_ngcontent-%COMP%] {\n height: 100%;\n overflow-y: auto;\n padding: 16px;\n}\n\n.step-payload-diff[_ngcontent-%COMP%] mj-deep-diff[_ngcontent-%COMP%] {\n display: block;\n height: 100%;\n}\n\n\n.detail-pane-content[_ngcontent-%COMP%]:not(.with-tabs) .json-viewer[_ngcontent-%COMP%] {\n margin-top: 16px;\n}\n\n\n.workflow-running-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: var(--mj-radius-full, 999px);\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n white-space: nowrap;\n}"] }); }
2036
+ } }, dependencies: [i1.NgClass, i2.NgControlStatus, i2.NgModel, i3.MJAccordionPanelComponent, i3.MJAccordionTitleDirective, i4.MjRecordLinkDirective, i5.CodeEditorComponent, i6.DeepDiffComponent, i7.SplitComponent, i7.SplitAreaComponent, i8.AIAgentRunTimelineComponent, i9.AIAgentRunAnalyticsComponent, i10.AIAgentRunStepDetailComponent, i11.AIAgentRunFlowComponent, i1.DecimalPipe, i1.DatePipe], styles: [".ai-agent-run-form[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.record-form-container.ai-agent-run-form[_ngcontent-%COMP%] > .record-form[_ngcontent-%COMP%], \n.ai-agent-run-form[_ngcontent-%COMP%] > .record-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n}\n\n\n.header[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n padding: 20px;\n box-shadow: var(--mj-shadow-sm);\n flex-shrink: 0;\n}\n\n.header-content[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 16px;\n}\n\n.header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.icon-wrapper[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n background: var(--mj-brand-primary);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 20px;\n overflow: hidden;\n}\n\n.agent-logo[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.header-info[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.meta-info[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n margin-top: 4px;\n font-size: 14px;\n color: var(--mj-text-muted);\n}\n\n.parent-run[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.parent-link[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n text-decoration: none;\n cursor: pointer;\n transition: color 0.2s;\n}\n\n.parent-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-status-error);\n text-decoration: underline;\n}\n\n.agent-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.run-id[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n opacity: 0.7;\n}\n\n\n.conversation-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 16px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-brand-primary);\n cursor: pointer;\n transition: all 0.2s ease;\n white-space: nowrap;\n}\n\n.conversation-pill[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n transform: translateY(-1px);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.conversation-pill[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child {\n font-size: 11px;\n opacity: 0.9;\n}\n\n.conversation-pill[_ngcontent-%COMP%] .pill-action[_ngcontent-%COMP%] {\n font-size: 9px;\n opacity: 0.6;\n transition: opacity 0.2s ease;\n}\n\n.conversation-pill[_ngcontent-%COMP%]:hover .pill-action[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n padding: 6px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.status-badge[data-status=\"Running\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.status-badge[data-status=\"Completed\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-badge[data-status=\"Failed\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-badge[data-status=\"Cancelled\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.status-badge[data-status=\"Paused\"][_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.status-badge.small[_ngcontent-%COMP%] {\n padding: 4px 12px;\n font-size: 11px;\n}\n\n\n.plan-mode-badge[_ngcontent-%COMP%] {\n padding: 6px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.btn-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: var(--mj-text-muted);\n}\n\n.btn-icon[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-secondary);\n}\n\n.header-stats[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n padding-top: 12px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n\n.configuration-bar[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n padding-top: 16px;\n border-top: 1px solid var(--mj-border-default);\n margin-top: 16px;\n}\n\n.config-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.config-item[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n font-size: 1.2em;\n color: var(--mj-text-muted);\n width: 24px;\n text-align: center;\n}\n\n.config-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.config-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.config-value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.config-value[_ngcontent-%COMP%] .entity-link[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n text-decoration: none;\n cursor: pointer;\n transition: color 0.2s;\n}\n\n.config-value[_ngcontent-%COMP%] .entity-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary-hover);\n text-decoration: underline;\n}\n\n.stat[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.stat[_ngcontent-%COMP%] .label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat[_ngcontent-%COMP%] .value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.stat[_ngcontent-%COMP%] .value.success[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.stat[_ngcontent-%COMP%] .value.error[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n.tabs[_ngcontent-%COMP%] {\n display: flex;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n flex-shrink: 0;\n}\n\n.tab[_ngcontent-%COMP%] {\n padding: 12px 24px;\n border: none;\n background: transparent;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 8px;\n transition: all 0.2s ease;\n border-bottom: 3px solid transparent;\n}\n\n.tab[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-text-primary) 2%, var(--mj-bg-surface));\n}\n\n.tab.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n}\n\n\n.content-area[_ngcontent-%COMP%] {\n position: relative;\n flex: 1;\n min-height: 0;\n overflow: auto;\n background: var(--mj-bg-surface);\n}\n\n.tab-content[_ngcontent-%COMP%] {\n height: 100%;\n min-height: 0;\n overflow: auto;\n}\n\n\n.tab-content[_ngcontent-%COMP%] mj-accordion-panel[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 8px;\n}\n\n\n.json-detail-pane[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface-sunken);\n border-left: 1px solid var(--mj-border-default);\n}\n\n.json-pane-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.json-pane-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.json-pane-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 14px;\n}\n\n.json-pane-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: auto;\n padding: 16px;\n}\n\n.json-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 20px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.json-meta[_ngcontent-%COMP%] .meta-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta[_ngcontent-%COMP%] .meta-item[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n font-weight: 600;\n letter-spacing: 0.5px;\n}\n\n.json-meta[_ngcontent-%COMP%] .meta-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.action-link[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n.action-link[_ngcontent-%COMP%] .btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n font-size: 14px;\n cursor: pointer;\n padding: 6px 12px;\n border-radius: 4px;\n transition: all 0.2s;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.action-link[_ngcontent-%COMP%] .btn-link[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary-hover);\n}\n\n.json-viewer[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n overflow: auto;\n padding: 20px;\n gap: 10px;\n min-height: 0;\n margin-bottom: 45px;\n}\n\n\n.json-toolbar[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n padding: 8px 12px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n\n.timeline-container[_ngcontent-%COMP%] {\n height: 100%;\n overflow-y: auto;\n padding: 20px;\n}\n\n.timeline-container[_ngcontent-%COMP%] > .timeline[_ngcontent-%COMP%] {\n max-width: 900px;\n margin: 0 auto;\n}\n\n.timeline[_ngcontent-%COMP%] {\n position: relative;\n padding-left: 40px;\n}\n\n.timeline[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: 20px;\n top: 0;\n bottom: 0;\n width: 2px;\n background: var(--mj-border-default);\n}\n\n.timeline-item[_ngcontent-%COMP%] {\n position: relative;\n margin-bottom: 24px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.timeline-item[_ngcontent-%COMP%]:hover {\n transform: translateX(4px);\n}\n\n.timeline-item.selected[_ngcontent-%COMP%] {\n transform: translateX(8px);\n}\n\n.timeline-item.selected[_ngcontent-%COMP%] .timeline-content[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n}\n\n.timeline-marker[_ngcontent-%COMP%] {\n position: absolute;\n left: -30px;\n top: 0;\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface);\n border: 3px solid var(--mj-border-default);\n z-index: 1;\n transition: all 0.2s ease;\n}\n\n.timeline-marker[data-color=\"success\"][_ngcontent-%COMP%] {\n border-color: var(--mj-status-success);\n color: var(--mj-status-success);\n}\n\n.timeline-marker[data-color=\"error\"][_ngcontent-%COMP%] {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n.timeline-marker[data-color=\"info\"][_ngcontent-%COMP%] {\n border-color: var(--mj-status-info);\n color: var(--mj-status-info);\n}\n\n.timeline-marker[data-color=\"warning\"][_ngcontent-%COMP%] {\n border-color: var(--mj-status-warning);\n color: var(--mj-status-warning);\n}\n\n.timeline-marker[data-color=\"secondary\"][_ngcontent-%COMP%] {\n border-color: var(--mj-text-muted);\n color: var(--mj-text-muted);\n}\n\n.timeline-marker.small[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n font-size: 12px;\n}\n\n.timeline-content[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n margin-left: 20px;\n box-shadow: var(--mj-shadow-sm);\n transition: all 0.2s ease;\n}\n\n.timeline-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.timeline-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.timeline-header[_ngcontent-%COMP%] h5[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.timeline-time[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n font-family: monospace;\n}\n\n.timeline-subtitle[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n}\n\n.timeline-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.timeline-meta[_ngcontent-%COMP%] .status[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.timeline-meta[_ngcontent-%COMP%] .status[data-status=\"Completed\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.timeline-meta[_ngcontent-%COMP%] .status[data-status=\"Failed\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.timeline-meta[_ngcontent-%COMP%] .status[data-status=\"Running\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.timeline-meta[_ngcontent-%COMP%] .status[data-status=\"Paused\"][_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.duration[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.timeline-actions[_ngcontent-%COMP%] {\n position: absolute;\n right: 20px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s ease;\n}\n\n.btn-link[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.btn-expand[_ngcontent-%COMP%] {\n width: 24px;\n height: 24px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n.btn-expand[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-secondary);\n}\n\n\n.timeline-children[_ngcontent-%COMP%] {\n position: relative;\n margin-top: 12px;\n margin-bottom: 12px;\n}\n\n.timeline-children[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: -10px;\n top: -12px;\n bottom: 0;\n width: 2px;\n background: var(--mj-border-default);\n}\n\n.child-item[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n.child-item[_ngcontent-%COMP%] .timeline-content[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-default);\n}\n\n\n.sub-run-timeline[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 2%, var(--mj-bg-surface));\n border-left: 2px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n margin-left: 20px;\n padding-left: 20px;\n margin-top: 8px;\n margin-bottom: 8px;\n}\n\n.sub-run-item[_ngcontent-%COMP%] .timeline-marker[_ngcontent-%COMP%] {\n border-width: 2px;\n}\n\n.sub-run-item[_ngcontent-%COMP%] .timeline-content[_ngcontent-%COMP%] {\n transition: all 0.2s ease;\n}\n\n\n.json-detail-pane[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n}\n\n.json-pane-header[_ngcontent-%COMP%] {\n padding: 16px 20px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-shrink: 0;\n}\n\n.json-pane-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 10px;\n font-weight: 600;\n}\n\n.json-pane-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.json-meta[_ngcontent-%COMP%] {\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n flex-shrink: 0;\n}\n\n.json-meta[_ngcontent-%COMP%] .meta-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.json-meta[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.action-link[_ngcontent-%COMP%] {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.action-link[_ngcontent-%COMP%] .btn-link[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-brand-primary);\n text-decoration: none;\n font-size: 14px;\n padding: 8px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 4px;\n transition: all 0.2s;\n cursor: pointer;\n}\n\n.action-link[_ngcontent-%COMP%] .btn-link[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 35%, transparent);\n text-decoration: none;\n}\n\n\n.json-toolbar[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n\n.details-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n padding: 20px;\n}\n\n.detail-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-item.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.detail-item[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.error-message[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n padding: 12px;\n border-radius: 8px;\n font-size: 13px;\n}\n\n.result-viewer[_ngcontent-%COMP%], \n.state-viewer[_ngcontent-%COMP%] {\n padding: 20px;\n max-height: 450px;\n overflow: auto;\n display: flex;\n flex-direction: column;\n}\n\n.result-viewer[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%], \n.state-viewer[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n}\n\n\n.empty-state[_ngcontent-%COMP%], \n.loading-state[_ngcontent-%COMP%], \n.error-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 60px 20px;\n color: var(--mj-text-muted);\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.loading-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.error-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n opacity: 0.3;\n margin-bottom: 16px;\n}\n\n\n@media (max-width: 768px) {\n .header-content[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n }\n \n .header-stats[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n \n .json-detail-pane[_ngcontent-%COMP%] {\n width: 100%;\n }\n \n .timeline[_ngcontent-%COMP%] {\n padding-left: 30px;\n }\n \n .timeline-marker[_ngcontent-%COMP%] {\n left: -25px;\n width: 32px;\n height: 32px;\n }\n \n .timeline-content[_ngcontent-%COMP%] {\n margin-left: 10px;\n }\n}\n\n\n.entity-link[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n text-decoration: none;\n transition: all 0.2s ease;\n border-bottom: 1px solid transparent;\n display: inline-block;\n}\n\n.entity-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary-hover);\n border-bottom-color: var(--mj-brand-primary-hover);\n}\n\n.entity-link[_ngcontent-%COMP%]:active {\n color: var(--mj-brand-primary-hover);\n}\n\n\n.detail-pane-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n margin: 8px 0 0 0;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 0 16px;\n}\n\n.detail-tab[_ngcontent-%COMP%] {\n padding: 10px 16px;\n background: none;\n border: none;\n border-bottom: 3px solid transparent;\n color: var(--mj-text-muted);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.detail-tab[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-text-primary) 2%, var(--mj-bg-surface));\n}\n\n.detail-tab.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.detail-tab[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n\n.detail-pane-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n min-height: 0;\n margin-bottom: 35px;\n}\n\n.detail-pane-content.with-tabs[_ngcontent-%COMP%] {\n \n margin-top: 0;\n}\n\n\n.step-payload-diff[_ngcontent-%COMP%] {\n height: 100%;\n overflow-y: auto;\n padding: 16px;\n}\n\n.step-payload-diff[_ngcontent-%COMP%] mj-deep-diff[_ngcontent-%COMP%] {\n display: block;\n height: 100%;\n}\n\n\n.detail-pane-content[_ngcontent-%COMP%]:not(.with-tabs) .json-viewer[_ngcontent-%COMP%] {\n margin-top: 16px;\n}\n\n\n.workflow-running-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: var(--mj-radius-full, 999px);\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n white-space: nowrap;\n}"] }); }
1906
2037
  };
1907
2038
  MJAIAgentRunFormComponentExtended = __decorate([
1908
2039
  RegisterClass(BaseFormComponent, 'MJ: AI Agent Runs')
@@ -1910,7 +2041,7 @@ MJAIAgentRunFormComponentExtended = __decorate([
1910
2041
  export { MJAIAgentRunFormComponentExtended };
1911
2042
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJAIAgentRunFormComponentExtended, [{
1912
2043
  type: Component,
1913
- args: [{ standalone: false, selector: 'mj-ai-agent-run-form', template: "<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 \u2014 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 \u2014 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>", styles: [".ai-agent-run-form {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.record-form-container.ai-agent-run-form > .record-form,\n.ai-agent-run-form > .record-form {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n}\n\n/* Header Styles */\n.header {\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n padding: 20px;\n box-shadow: var(--mj-shadow-sm);\n flex-shrink: 0;\n}\n\n.header-content {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 16px;\n}\n\n.header-left {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.icon-wrapper {\n width: 48px;\n height: 48px;\n background: var(--mj-brand-primary);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 20px;\n overflow: hidden;\n}\n\n.agent-logo {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.header-info h2 {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.meta-info {\n display: flex;\n gap: 12px;\n margin-top: 4px;\n font-size: 14px;\n color: var(--mj-text-muted);\n}\n\n.parent-run {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.parent-link {\n color: var(--mj-status-error);\n text-decoration: none;\n cursor: pointer;\n transition: color 0.2s;\n}\n\n.parent-link:hover {\n color: var(--mj-status-error);\n text-decoration: underline;\n}\n\n.agent-name {\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.run-id {\n font-family: monospace;\n font-size: 12px;\n opacity: 0.7;\n}\n\n/* Conversation Link Pill */\n.conversation-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 16px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-brand-primary);\n cursor: pointer;\n transition: all 0.2s ease;\n white-space: nowrap;\n}\n\n.conversation-pill:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n transform: translateY(-1px);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.conversation-pill i:first-child {\n font-size: 11px;\n opacity: 0.9;\n}\n\n.conversation-pill .pill-action {\n font-size: 9px;\n opacity: 0.6;\n transition: opacity 0.2s ease;\n}\n\n.conversation-pill:hover .pill-action {\n opacity: 1;\n}\n\n.header-right {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.status-badge {\n padding: 6px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.status-badge[data-status=\"Running\"] {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.status-badge[data-status=\"Completed\"] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-badge[data-status=\"Failed\"] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-badge[data-status=\"Cancelled\"] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.status-badge[data-status=\"Paused\"] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.status-badge.small {\n padding: 4px 12px;\n font-size: 11px;\n}\n\n/* Plan Mode chip \u2014 shown next to the status badge when AIAgentRun.PlanMode = 1 */\n.plan-mode-badge {\n padding: 6px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.header-actions {\n display: flex;\n gap: 8px;\n}\n\n.btn-icon {\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: var(--mj-text-muted);\n}\n\n.btn-icon:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-secondary);\n}\n\n.header-stats {\n display: flex;\n gap: 24px;\n padding-top: 12px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n/* Configuration Bar */\n.configuration-bar {\n display: flex;\n gap: 24px;\n padding-top: 16px;\n border-top: 1px solid var(--mj-border-default);\n margin-top: 16px;\n}\n\n.config-item {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.config-item > i {\n font-size: 1.2em;\n color: var(--mj-text-muted);\n width: 24px;\n text-align: center;\n}\n\n.config-content {\n display: flex;\n flex-direction: column;\n}\n\n.config-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.config-value {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.config-value .entity-link {\n color: var(--mj-brand-primary);\n text-decoration: none;\n cursor: pointer;\n transition: color 0.2s;\n}\n\n.config-value .entity-link:hover {\n color: var(--mj-brand-primary-hover);\n text-decoration: underline;\n}\n\n.stat {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.stat .label {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat .value {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.stat .value.success {\n color: var(--mj-status-success);\n}\n\n.stat .value.error {\n color: var(--mj-status-error);\n}\n\n/* Tabs */\n.tabs {\n display: flex;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n flex-shrink: 0;\n}\n\n.tab {\n padding: 12px 24px;\n border: none;\n background: transparent;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 8px;\n transition: all 0.2s ease;\n border-bottom: 3px solid transparent;\n}\n\n.tab:hover {\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-text-primary) 2%, var(--mj-bg-surface));\n}\n\n.tab.active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n}\n\n/* Content Area */\n.content-area {\n position: relative;\n flex: 1;\n min-height: 0;\n overflow: auto;\n background: var(--mj-bg-surface);\n}\n\n.tab-content {\n height: 100%;\n min-height: 0;\n overflow: auto;\n}\n\n/* Details tab accordion panels */\n.tab-content mj-accordion-panel {\n display: block;\n margin-bottom: 8px;\n}\n\n/* JSON Detail Pane */\n.json-detail-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface-sunken);\n border-left: 1px solid var(--mj-border-default);\n}\n\n.json-pane-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.json-pane-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.json-pane-header h3 i {\n color: var(--mj-text-muted);\n font-size: 14px;\n}\n\n.json-pane-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: auto;\n padding: 16px;\n}\n\n.json-meta {\n display: flex;\n gap: 20px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.json-meta .meta-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta .meta-item label {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n font-weight: 600;\n letter-spacing: 0.5px;\n}\n\n.json-meta .meta-item span {\n font-size: 14px;\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.action-link {\n margin-bottom: 12px;\n}\n\n.action-link .btn-link {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n font-size: 14px;\n cursor: pointer;\n padding: 6px 12px;\n border-radius: 4px;\n transition: all 0.2s;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.action-link .btn-link:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary-hover);\n}\n\n.json-viewer {\n flex: 1;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n overflow: auto;\n padding: 20px;\n gap: 10px;\n min-height: 0;\n margin-bottom: 45px;\n}\n\n\n.json-toolbar {\n display: flex;\n justify-content: flex-end;\n padding: 8px 12px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n/* Timeline Styles */\n.timeline-container {\n height: 100%;\n overflow-y: auto;\n padding: 20px;\n}\n\n.timeline-container > .timeline {\n max-width: 900px;\n margin: 0 auto;\n}\n\n.timeline {\n position: relative;\n padding-left: 40px;\n}\n\n.timeline::before {\n content: '';\n position: absolute;\n left: 20px;\n top: 0;\n bottom: 0;\n width: 2px;\n background: var(--mj-border-default);\n}\n\n.timeline-item {\n position: relative;\n margin-bottom: 24px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.timeline-item:hover {\n transform: translateX(4px);\n}\n\n.timeline-item.selected {\n transform: translateX(8px);\n}\n\n.timeline-item.selected .timeline-content {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n}\n\n.timeline-marker {\n position: absolute;\n left: -30px;\n top: 0;\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface);\n border: 3px solid var(--mj-border-default);\n z-index: 1;\n transition: all 0.2s ease;\n}\n\n.timeline-marker[data-color=\"success\"] {\n border-color: var(--mj-status-success);\n color: var(--mj-status-success);\n}\n\n.timeline-marker[data-color=\"error\"] {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n.timeline-marker[data-color=\"info\"] {\n border-color: var(--mj-status-info);\n color: var(--mj-status-info);\n}\n\n.timeline-marker[data-color=\"warning\"] {\n border-color: var(--mj-status-warning);\n color: var(--mj-status-warning);\n}\n\n.timeline-marker[data-color=\"secondary\"] {\n border-color: var(--mj-text-muted);\n color: var(--mj-text-muted);\n}\n\n.timeline-marker.small {\n width: 28px;\n height: 28px;\n font-size: 12px;\n}\n\n.timeline-content {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n margin-left: 20px;\n box-shadow: var(--mj-shadow-sm);\n transition: all 0.2s ease;\n}\n\n.timeline-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.timeline-header h4 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.timeline-header h5 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.timeline-time {\n font-size: 12px;\n color: var(--mj-text-muted);\n font-family: monospace;\n}\n\n.timeline-subtitle {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n}\n\n.timeline-meta {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.timeline-meta .status {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.timeline-meta .status[data-status=\"Completed\"] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.timeline-meta .status[data-status=\"Failed\"] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.timeline-meta .status[data-status=\"Running\"] {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.timeline-meta .status[data-status=\"Paused\"] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.duration {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.timeline-actions {\n position: absolute;\n right: 20px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn-link {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s ease;\n}\n\n.btn-link:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.btn-expand {\n width: 24px;\n height: 24px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n.btn-expand:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-secondary);\n}\n\n/* Timeline Children */\n.timeline-children {\n position: relative;\n margin-top: 12px;\n margin-bottom: 12px;\n}\n\n.timeline-children::before {\n content: '';\n position: absolute;\n left: -10px;\n top: -12px;\n bottom: 0;\n width: 2px;\n background: var(--mj-border-default);\n}\n\n.child-item {\n margin-bottom: 12px;\n}\n\n.child-item .timeline-content {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-default);\n}\n\n/* Sub-run timeline styles */\n.sub-run-timeline {\n background: color-mix(in srgb, var(--mj-brand-primary) 2%, var(--mj-bg-surface));\n border-left: 2px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n margin-left: 20px;\n padding-left: 20px;\n margin-top: 8px;\n margin-bottom: 8px;\n}\n\n.sub-run-item .timeline-marker {\n border-width: 2px;\n}\n\n.sub-run-item .timeline-content {\n transition: all 0.2s ease;\n}\n\n/* JSON Detail Pane (in splitter) */\n.json-detail-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n}\n\n.json-pane-header {\n padding: 16px 20px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-shrink: 0;\n}\n\n.json-pane-header h3 {\n margin: 0;\n font-size: 16px;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 10px;\n font-weight: 600;\n}\n\n.json-pane-content {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.json-meta {\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n flex-shrink: 0;\n}\n\n.json-meta .meta-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta label {\n font-size: 11px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.json-meta span {\n font-size: 14px;\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.action-link {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.action-link .btn-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-brand-primary);\n text-decoration: none;\n font-size: 14px;\n padding: 8px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 4px;\n transition: all 0.2s;\n cursor: pointer;\n}\n\n.action-link .btn-link:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 35%, transparent);\n text-decoration: none;\n}\n\n\n.json-toolbar {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n/* Details Tab */\n.details-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n padding: 20px;\n}\n\n.detail-item {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-item.full-width {\n grid-column: 1 / -1;\n}\n\n.detail-item label {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-item span {\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.error-message {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n padding: 12px;\n border-radius: 8px;\n font-size: 13px;\n}\n\n.result-viewer,\n.state-viewer {\n padding: 20px;\n max-height: 450px;\n overflow: auto;\n display: flex;\n flex-direction: column;\n}\n\n.result-viewer mj-code-editor,\n.state-viewer mj-code-editor {\n flex: 1;\n min-height: 0;\n}\n\n/* Empty States */\n.empty-state,\n.loading-state,\n.error-state {\n text-align: center;\n padding: 60px 20px;\n color: var(--mj-text-muted);\n}\n\n.empty-state i,\n.loading-state i,\n.error-state i {\n opacity: 0.3;\n margin-bottom: 16px;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .header-content {\n flex-direction: column;\n gap: 16px;\n }\n \n .header-stats {\n flex-wrap: wrap;\n }\n \n .json-detail-pane {\n width: 100%;\n }\n \n .timeline {\n padding-left: 30px;\n }\n \n .timeline-marker {\n left: -25px;\n width: 32px;\n height: 32px;\n }\n \n .timeline-content {\n margin-left: 10px;\n }\n}\n\n/* Entity Link Styles */\n.entity-link {\n color: var(--mj-brand-primary);\n text-decoration: none;\n transition: all 0.2s ease;\n border-bottom: 1px solid transparent;\n display: inline-block;\n}\n\n.entity-link:hover {\n color: var(--mj-brand-primary-hover);\n border-bottom-color: var(--mj-brand-primary-hover);\n}\n\n.entity-link:active {\n color: var(--mj-brand-primary-hover);\n}\n\n/* Detail Pane Tabs */\n.detail-pane-tabs {\n display: flex;\n gap: 8px;\n margin: 8px 0 0 0;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 0 16px;\n}\n\n.detail-tab {\n padding: 10px 16px;\n background: none;\n border: none;\n border-bottom: 3px solid transparent;\n color: var(--mj-text-muted);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.detail-tab:hover {\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-text-primary) 2%, var(--mj-bg-surface));\n}\n\n.detail-tab.active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.detail-tab i {\n font-size: 14px;\n}\n\n/* Detail Pane Content */\n.detail-pane-content {\n flex: 1;\n overflow-y: auto;\n min-height: 0;\n margin-bottom: 35px;\n}\n\n.detail-pane-content.with-tabs {\n /* When tabs are shown, content starts right after tabs */\n margin-top: 0;\n}\n\n/* Step Payload Diff */\n.step-payload-diff {\n height: 100%;\n overflow-y: auto;\n padding: 16px;\n}\n\n.step-payload-diff mj-deep-diff {\n display: block;\n height: 100%;\n}\n\n/* JSON Viewer adjustments when no tabs */\n.detail-pane-content:not(.with-tabs) .json-viewer {\n margin-top: 16px;\n}\n/* A detached workflow still executing after its run completed. Blue rather than green or amber: it\n is neither finished nor wrong, it is the same \"workflow\" provenance the timeline uses. */\n.workflow-running-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: var(--mj-radius-full, 999px);\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n white-space: nowrap;\n}\n"] }]
2044
+ args: [{ standalone: false, selector: 'mj-ai-agent-run-form', template: "<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)\"\n class=\"entity-link\"\n [mjRecordLink]=\"record\"\n FieldName=\"AgentID\"\n [DisplayName]=\"agent.Name\"\n [HandleClick]=\"false\"\n (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 [mjRecordLink]=\"record\"\n FieldName=\"ParentRunID\"\n [HandleClick]=\"false\"\n (click)=\"navigateToParentRun()\"\n 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 \u2014 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 \u2014 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 [SavingWorkflow]=\"SavingWorkflow\"\n (closePanel)=\"closeJsonPanel()\"\n (navigateToActionLog)=\"navigateToActionLog($event)\"\n (copyToClipboard)=\"copyToClipboard($event)\"\n (SaveAsWorkflowRequested)=\"OnSaveAsWorkflowRequested($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 (ShowResultPanel) {\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>", styles: [".ai-agent-run-form {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.record-form-container.ai-agent-run-form > .record-form,\n.ai-agent-run-form > .record-form {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n}\n\n/* Header Styles */\n.header {\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n padding: 20px;\n box-shadow: var(--mj-shadow-sm);\n flex-shrink: 0;\n}\n\n.header-content {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 16px;\n}\n\n.header-left {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.icon-wrapper {\n width: 48px;\n height: 48px;\n background: var(--mj-brand-primary);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 20px;\n overflow: hidden;\n}\n\n.agent-logo {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.header-info h2 {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.meta-info {\n display: flex;\n gap: 12px;\n margin-top: 4px;\n font-size: 14px;\n color: var(--mj-text-muted);\n}\n\n.parent-run {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.parent-link {\n color: var(--mj-status-error);\n text-decoration: none;\n cursor: pointer;\n transition: color 0.2s;\n}\n\n.parent-link:hover {\n color: var(--mj-status-error);\n text-decoration: underline;\n}\n\n.agent-name {\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.run-id {\n font-family: monospace;\n font-size: 12px;\n opacity: 0.7;\n}\n\n/* Conversation Link Pill */\n.conversation-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 16px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-brand-primary);\n cursor: pointer;\n transition: all 0.2s ease;\n white-space: nowrap;\n}\n\n.conversation-pill:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n transform: translateY(-1px);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.conversation-pill i:first-child {\n font-size: 11px;\n opacity: 0.9;\n}\n\n.conversation-pill .pill-action {\n font-size: 9px;\n opacity: 0.6;\n transition: opacity 0.2s ease;\n}\n\n.conversation-pill:hover .pill-action {\n opacity: 1;\n}\n\n.header-right {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.status-badge {\n padding: 6px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.status-badge[data-status=\"Running\"] {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.status-badge[data-status=\"Completed\"] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-badge[data-status=\"Failed\"] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-badge[data-status=\"Cancelled\"] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.status-badge[data-status=\"Paused\"] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.status-badge.small {\n padding: 4px 12px;\n font-size: 11px;\n}\n\n/* Plan Mode chip \u2014 shown next to the status badge when AIAgentRun.PlanMode = 1 */\n.plan-mode-badge {\n padding: 6px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.header-actions {\n display: flex;\n gap: 8px;\n}\n\n.btn-icon {\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: var(--mj-text-muted);\n}\n\n.btn-icon:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-secondary);\n}\n\n.header-stats {\n display: flex;\n gap: 24px;\n padding-top: 12px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n/* Configuration Bar */\n.configuration-bar {\n display: flex;\n gap: 24px;\n padding-top: 16px;\n border-top: 1px solid var(--mj-border-default);\n margin-top: 16px;\n}\n\n.config-item {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.config-item > i {\n font-size: 1.2em;\n color: var(--mj-text-muted);\n width: 24px;\n text-align: center;\n}\n\n.config-content {\n display: flex;\n flex-direction: column;\n}\n\n.config-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.config-value {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.config-value .entity-link {\n color: var(--mj-brand-primary);\n text-decoration: none;\n cursor: pointer;\n transition: color 0.2s;\n}\n\n.config-value .entity-link:hover {\n color: var(--mj-brand-primary-hover);\n text-decoration: underline;\n}\n\n.stat {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.stat .label {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat .value {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.stat .value.success {\n color: var(--mj-status-success);\n}\n\n.stat .value.error {\n color: var(--mj-status-error);\n}\n\n/* Tabs */\n.tabs {\n display: flex;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n flex-shrink: 0;\n}\n\n.tab {\n padding: 12px 24px;\n border: none;\n background: transparent;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 8px;\n transition: all 0.2s ease;\n border-bottom: 3px solid transparent;\n}\n\n.tab:hover {\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-text-primary) 2%, var(--mj-bg-surface));\n}\n\n.tab.active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n}\n\n/* Content Area */\n.content-area {\n position: relative;\n flex: 1;\n min-height: 0;\n overflow: auto;\n background: var(--mj-bg-surface);\n}\n\n.tab-content {\n height: 100%;\n min-height: 0;\n overflow: auto;\n}\n\n/* Details tab accordion panels */\n.tab-content mj-accordion-panel {\n display: block;\n margin-bottom: 8px;\n}\n\n/* JSON Detail Pane */\n.json-detail-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface-sunken);\n border-left: 1px solid var(--mj-border-default);\n}\n\n.json-pane-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.json-pane-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.json-pane-header h3 i {\n color: var(--mj-text-muted);\n font-size: 14px;\n}\n\n.json-pane-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: auto;\n padding: 16px;\n}\n\n.json-meta {\n display: flex;\n gap: 20px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.json-meta .meta-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta .meta-item label {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n font-weight: 600;\n letter-spacing: 0.5px;\n}\n\n.json-meta .meta-item span {\n font-size: 14px;\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.action-link {\n margin-bottom: 12px;\n}\n\n.action-link .btn-link {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n font-size: 14px;\n cursor: pointer;\n padding: 6px 12px;\n border-radius: 4px;\n transition: all 0.2s;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.action-link .btn-link:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary-hover);\n}\n\n.json-viewer {\n flex: 1;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n overflow: auto;\n padding: 20px;\n gap: 10px;\n min-height: 0;\n margin-bottom: 45px;\n}\n\n\n.json-toolbar {\n display: flex;\n justify-content: flex-end;\n padding: 8px 12px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n/* Timeline Styles */\n.timeline-container {\n height: 100%;\n overflow-y: auto;\n padding: 20px;\n}\n\n.timeline-container > .timeline {\n max-width: 900px;\n margin: 0 auto;\n}\n\n.timeline {\n position: relative;\n padding-left: 40px;\n}\n\n.timeline::before {\n content: '';\n position: absolute;\n left: 20px;\n top: 0;\n bottom: 0;\n width: 2px;\n background: var(--mj-border-default);\n}\n\n.timeline-item {\n position: relative;\n margin-bottom: 24px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.timeline-item:hover {\n transform: translateX(4px);\n}\n\n.timeline-item.selected {\n transform: translateX(8px);\n}\n\n.timeline-item.selected .timeline-content {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n}\n\n.timeline-marker {\n position: absolute;\n left: -30px;\n top: 0;\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface);\n border: 3px solid var(--mj-border-default);\n z-index: 1;\n transition: all 0.2s ease;\n}\n\n.timeline-marker[data-color=\"success\"] {\n border-color: var(--mj-status-success);\n color: var(--mj-status-success);\n}\n\n.timeline-marker[data-color=\"error\"] {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n.timeline-marker[data-color=\"info\"] {\n border-color: var(--mj-status-info);\n color: var(--mj-status-info);\n}\n\n.timeline-marker[data-color=\"warning\"] {\n border-color: var(--mj-status-warning);\n color: var(--mj-status-warning);\n}\n\n.timeline-marker[data-color=\"secondary\"] {\n border-color: var(--mj-text-muted);\n color: var(--mj-text-muted);\n}\n\n.timeline-marker.small {\n width: 28px;\n height: 28px;\n font-size: 12px;\n}\n\n.timeline-content {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n margin-left: 20px;\n box-shadow: var(--mj-shadow-sm);\n transition: all 0.2s ease;\n}\n\n.timeline-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.timeline-header h4 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.timeline-header h5 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.timeline-time {\n font-size: 12px;\n color: var(--mj-text-muted);\n font-family: monospace;\n}\n\n.timeline-subtitle {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n}\n\n.timeline-meta {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.timeline-meta .status {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.timeline-meta .status[data-status=\"Completed\"] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.timeline-meta .status[data-status=\"Failed\"] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.timeline-meta .status[data-status=\"Running\"] {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.timeline-meta .status[data-status=\"Paused\"] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.duration {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.timeline-actions {\n position: absolute;\n right: 20px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn-link {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s ease;\n}\n\n.btn-link:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.btn-expand {\n width: 24px;\n height: 24px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n.btn-expand:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-secondary);\n}\n\n/* Timeline Children */\n.timeline-children {\n position: relative;\n margin-top: 12px;\n margin-bottom: 12px;\n}\n\n.timeline-children::before {\n content: '';\n position: absolute;\n left: -10px;\n top: -12px;\n bottom: 0;\n width: 2px;\n background: var(--mj-border-default);\n}\n\n.child-item {\n margin-bottom: 12px;\n}\n\n.child-item .timeline-content {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-default);\n}\n\n/* Sub-run timeline styles */\n.sub-run-timeline {\n background: color-mix(in srgb, var(--mj-brand-primary) 2%, var(--mj-bg-surface));\n border-left: 2px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n margin-left: 20px;\n padding-left: 20px;\n margin-top: 8px;\n margin-bottom: 8px;\n}\n\n.sub-run-item .timeline-marker {\n border-width: 2px;\n}\n\n.sub-run-item .timeline-content {\n transition: all 0.2s ease;\n}\n\n/* JSON Detail Pane (in splitter) */\n.json-detail-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n}\n\n.json-pane-header {\n padding: 16px 20px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-shrink: 0;\n}\n\n.json-pane-header h3 {\n margin: 0;\n font-size: 16px;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 10px;\n font-weight: 600;\n}\n\n.json-pane-content {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.json-meta {\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n flex-shrink: 0;\n}\n\n.json-meta .meta-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta label {\n font-size: 11px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.json-meta span {\n font-size: 14px;\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.action-link {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.action-link .btn-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-brand-primary);\n text-decoration: none;\n font-size: 14px;\n padding: 8px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 4px;\n transition: all 0.2s;\n cursor: pointer;\n}\n\n.action-link .btn-link:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 35%, transparent);\n text-decoration: none;\n}\n\n\n.json-toolbar {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n/* Details Tab */\n.details-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n padding: 20px;\n}\n\n.detail-item {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-item.full-width {\n grid-column: 1 / -1;\n}\n\n.detail-item label {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-item span {\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.error-message {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n padding: 12px;\n border-radius: 8px;\n font-size: 13px;\n}\n\n.result-viewer,\n.state-viewer {\n padding: 20px;\n max-height: 450px;\n overflow: auto;\n display: flex;\n flex-direction: column;\n}\n\n.result-viewer mj-code-editor,\n.state-viewer mj-code-editor {\n flex: 1;\n min-height: 0;\n}\n\n/* Empty States */\n.empty-state,\n.loading-state,\n.error-state {\n text-align: center;\n padding: 60px 20px;\n color: var(--mj-text-muted);\n}\n\n.empty-state i,\n.loading-state i,\n.error-state i {\n opacity: 0.3;\n margin-bottom: 16px;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .header-content {\n flex-direction: column;\n gap: 16px;\n }\n \n .header-stats {\n flex-wrap: wrap;\n }\n \n .json-detail-pane {\n width: 100%;\n }\n \n .timeline {\n padding-left: 30px;\n }\n \n .timeline-marker {\n left: -25px;\n width: 32px;\n height: 32px;\n }\n \n .timeline-content {\n margin-left: 10px;\n }\n}\n\n/* Entity Link Styles */\n.entity-link {\n color: var(--mj-brand-primary);\n text-decoration: none;\n transition: all 0.2s ease;\n border-bottom: 1px solid transparent;\n display: inline-block;\n}\n\n.entity-link:hover {\n color: var(--mj-brand-primary-hover);\n border-bottom-color: var(--mj-brand-primary-hover);\n}\n\n.entity-link:active {\n color: var(--mj-brand-primary-hover);\n}\n\n/* Detail Pane Tabs */\n.detail-pane-tabs {\n display: flex;\n gap: 8px;\n margin: 8px 0 0 0;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 0 16px;\n}\n\n.detail-tab {\n padding: 10px 16px;\n background: none;\n border: none;\n border-bottom: 3px solid transparent;\n color: var(--mj-text-muted);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.detail-tab:hover {\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-text-primary) 2%, var(--mj-bg-surface));\n}\n\n.detail-tab.active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.detail-tab i {\n font-size: 14px;\n}\n\n/* Detail Pane Content */\n.detail-pane-content {\n flex: 1;\n overflow-y: auto;\n min-height: 0;\n margin-bottom: 35px;\n}\n\n.detail-pane-content.with-tabs {\n /* When tabs are shown, content starts right after tabs */\n margin-top: 0;\n}\n\n/* Step Payload Diff */\n.step-payload-diff {\n height: 100%;\n overflow-y: auto;\n padding: 16px;\n}\n\n.step-payload-diff mj-deep-diff {\n display: block;\n height: 100%;\n}\n\n/* JSON Viewer adjustments when no tabs */\n.detail-pane-content:not(.with-tabs) .json-viewer {\n margin-top: 16px;\n}\n/* A detached workflow still executing after its run completed. Blue rather than green or amber: it\n is neither finished nor wrong, it is the same \"workflow\" provenance the timeline uses. */\n.workflow-running-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: var(--mj-radius-full, 999px);\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n white-space: nowrap;\n}\n"] }]
1914
2045
  }], null, { TimelineComponent: [{
1915
2046
  type: ViewChild,
1916
2047
  args: [AIAgentRunTimelineComponent]
@@ -1918,5 +2049,5 @@ export { MJAIAgentRunFormComponentExtended };
1918
2049
  type: ViewChild,
1919
2050
  args: [AIAgentRunAnalyticsComponent]
1920
2051
  }] }); })();
1921
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJAIAgentRunFormComponentExtended, { className: "MJAIAgentRunFormComponentExtended", filePath: "src/lib/custom/ai-agent-run/ai-agent-run.component.ts", lineNumber: 45 }); })();
2052
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJAIAgentRunFormComponentExtended, { className: "MJAIAgentRunFormComponentExtended", filePath: "src/lib/custom/ai-agent-run/ai-agent-run.component.ts", lineNumber: 49 }); })();
1922
2053
  //# sourceMappingURL=ai-agent-run.component.js.map