@memberjunction/ng-core-entity-forms 6.2.0-edge.0 → 6.2.0-edge.1

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 (275) hide show
  1. package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.d.ts +1 -1
  2. package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.js +2 -2
  3. package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.js.map +1 -1
  4. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js.map +1 -1
  5. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts +90 -16
  6. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts.map +1 -1
  7. package/dist/lib/custom/AIAgents/add-action-dialog.component.js +218 -70
  8. package/dist/lib/custom/AIAgents/add-action-dialog.component.js.map +1 -1
  9. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts +80 -16
  10. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts.map +1 -1
  11. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +146 -46
  12. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js.map +1 -1
  13. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +329 -27
  14. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  15. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +794 -262
  16. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  17. package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts +76 -0
  18. package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts.map +1 -1
  19. package/dist/lib/custom/AIAgents/ai-agent-management.service.js +77 -33
  20. package/dist/lib/custom/AIAgents/ai-agent-management.service.js.map +1 -1
  21. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts +69 -15
  22. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts.map +1 -1
  23. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +182 -74
  24. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js.map +1 -1
  25. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts +105 -25
  26. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts.map +1 -1
  27. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +272 -112
  28. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -1
  29. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts +32 -6
  30. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts.map +1 -1
  31. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +71 -19
  32. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js.map +1 -1
  33. package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts +10 -0
  34. package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts.map +1 -1
  35. package/dist/lib/custom/AIAgents/new-agent-dialog.service.js +27 -7
  36. package/dist/lib/custom/AIAgents/new-agent-dialog.service.js.map +1 -1
  37. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts +65 -15
  38. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts.map +1 -1
  39. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +152 -52
  40. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
  41. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts +81 -15
  42. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts.map +1 -1
  43. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +145 -45
  44. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js.map +1 -1
  45. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +71 -17
  46. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -1
  47. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +175 -67
  48. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
  49. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +173 -27
  50. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
  51. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +385 -93
  52. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  53. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.d.ts +64 -4
  54. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.d.ts.map +1 -1
  55. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +129 -29
  56. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js.map +1 -1
  57. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +260 -27
  58. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
  59. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +686 -238
  60. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  61. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts +10 -0
  62. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts.map +1 -1
  63. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js +17 -9
  64. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js.map +1 -1
  65. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts +74 -16
  66. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts.map +1 -1
  67. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +174 -58
  68. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js.map +1 -1
  69. package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts +108 -14
  70. package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts.map +1 -1
  71. package/dist/lib/custom/Actions/action-execution-log-form.component.js +258 -70
  72. package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
  73. package/dist/lib/custom/Actions/action-form.component.d.ts +198 -14
  74. package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
  75. package/dist/lib/custom/Actions/action-form.component.js +387 -107
  76. package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
  77. package/dist/lib/custom/BridgeProviders/bridge-provider-features.d.ts +12 -6
  78. package/dist/lib/custom/BridgeProviders/bridge-provider-features.d.ts.map +1 -1
  79. package/dist/lib/custom/BridgeProviders/bridge-provider-features.js +41 -29
  80. package/dist/lib/custom/BridgeProviders/bridge-provider-features.js.map +1 -1
  81. package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js +14 -14
  82. package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js.map +1 -1
  83. package/dist/lib/custom/Companies/company-overview.panel.d.ts +1 -1
  84. package/dist/lib/custom/Companies/company-overview.panel.js +2 -2
  85. package/dist/lib/custom/Companies/company-overview.panel.js.map +1 -1
  86. package/dist/lib/custom/Conversations/conversation-overview.panel.d.ts +1 -1
  87. package/dist/lib/custom/Conversations/conversation-overview.panel.js +2 -2
  88. package/dist/lib/custom/Conversations/conversation-overview.panel.js.map +1 -1
  89. package/dist/lib/custom/Employees/employee-overview.panel.d.ts +1 -1
  90. package/dist/lib/custom/Employees/employee-overview.panel.js +2 -2
  91. package/dist/lib/custom/Employees/employee-overview.panel.js.map +1 -1
  92. package/dist/lib/custom/Entities/entity-form.component.d.ts +209 -28
  93. package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
  94. package/dist/lib/custom/Entities/entity-form.component.js +494 -138
  95. package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
  96. package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts +5 -1
  97. package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts.map +1 -1
  98. package/dist/lib/custom/EntityActions/entityaction.form.component.js +10 -2
  99. package/dist/lib/custom/EntityActions/entityaction.form.component.js.map +1 -1
  100. package/dist/lib/custom/Files/file-form.component.d.ts +1 -1
  101. package/dist/lib/custom/Files/file-form.component.js +2 -2
  102. package/dist/lib/custom/Files/file-form.component.js.map +1 -1
  103. package/dist/lib/custom/Lists/list-form.component.d.ts +300 -36
  104. package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
  105. package/dist/lib/custom/Lists/list-form.component.js +664 -208
  106. package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
  107. package/dist/lib/custom/MLModels/ml-model-view-models.d.ts +31 -0
  108. package/dist/lib/custom/MLModels/ml-model-view-models.d.ts.map +1 -1
  109. package/dist/lib/custom/MLModels/ml-model-view-models.js +52 -16
  110. package/dist/lib/custom/MLModels/ml-model-view-models.js.map +1 -1
  111. package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts +107 -10
  112. package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts.map +1 -1
  113. package/dist/lib/custom/MLModels/ps-model-detail.component.js +291 -101
  114. package/dist/lib/custom/MLModels/ps-model-detail.component.js.map +1 -1
  115. package/dist/lib/custom/Queries/query-form.component.d.ts +201 -26
  116. package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
  117. package/dist/lib/custom/Queries/query-form.component.js +429 -109
  118. package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
  119. package/dist/lib/custom/Queries/query-run-dialog.component.d.ts +107 -14
  120. package/dist/lib/custom/Queries/query-run-dialog.component.d.ts.map +1 -1
  121. package/dist/lib/custom/Queries/query-run-dialog.component.js +249 -79
  122. package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
  123. package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts +110 -4
  124. package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts.map +1 -1
  125. package/dist/lib/custom/RecordProcesses/record-process-form.component.js +858 -86
  126. package/dist/lib/custom/RecordProcesses/record-process-form.component.js.map +1 -1
  127. package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts +1 -1
  128. package/dist/lib/custom/SearchScopes/searchscope-form.component.js +4 -4
  129. package/dist/lib/custom/SearchScopes/searchscope-form.component.js.map +1 -1
  130. package/dist/lib/custom/SessionBridges/session-bridge-form.component.js.map +1 -1
  131. package/dist/lib/custom/Templates/template-param-dialog.component.d.ts +77 -13
  132. package/dist/lib/custom/Templates/template-param-dialog.component.d.ts.map +1 -1
  133. package/dist/lib/custom/Templates/template-param-dialog.component.js +196 -78
  134. package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
  135. package/dist/lib/custom/Templates/template-params-grid.component.d.ts +49 -7
  136. package/dist/lib/custom/Templates/template-params-grid.component.d.ts.map +1 -1
  137. package/dist/lib/custom/Templates/template-params-grid.component.js +132 -44
  138. package/dist/lib/custom/Templates/template-params-grid.component.js.map +1 -1
  139. package/dist/lib/custom/Templates/templates-form.component.d.ts +142 -17
  140. package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
  141. package/dist/lib/custom/Templates/templates-form.component.js +333 -113
  142. package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
  143. package/dist/lib/custom/Tests/entity-link-pill.component.d.ts +24 -4
  144. package/dist/lib/custom/Tests/entity-link-pill.component.d.ts.map +1 -1
  145. package/dist/lib/custom/Tests/entity-link-pill.component.js +64 -20
  146. package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
  147. package/dist/lib/custom/Tests/test-form.component.d.ts +217 -27
  148. package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
  149. package/dist/lib/custom/Tests/test-form.component.js +549 -169
  150. package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
  151. package/dist/lib/custom/Tests/test-run-checks.d.ts +2 -0
  152. package/dist/lib/custom/Tests/test-run-checks.d.ts.map +1 -1
  153. package/dist/lib/custom/Tests/test-run-checks.js +5 -1
  154. package/dist/lib/custom/Tests/test-run-checks.js.map +1 -1
  155. package/dist/lib/custom/Tests/test-run-feedback-form.component.d.ts +2 -0
  156. package/dist/lib/custom/Tests/test-run-feedback-form.component.d.ts.map +1 -1
  157. package/dist/lib/custom/Tests/test-run-feedback-form.component.js +5 -1
  158. package/dist/lib/custom/Tests/test-run-feedback-form.component.js.map +1 -1
  159. package/dist/lib/custom/Tests/test-run-form.component.d.ts +146 -18
  160. package/dist/lib/custom/Tests/test-run-form.component.d.ts.map +1 -1
  161. package/dist/lib/custom/Tests/test-run-form.component.js +362 -106
  162. package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
  163. package/dist/lib/custom/Tests/test-suite-form.component.d.ts +390 -47
  164. package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
  165. package/dist/lib/custom/Tests/test-suite-form.component.js +1015 -343
  166. package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
  167. package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts +214 -26
  168. package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts.map +1 -1
  169. package/dist/lib/custom/Tests/test-suite-run-form.component.js +535 -159
  170. package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
  171. package/dist/lib/custom/Users/user-overview.panel.d.ts +1 -1
  172. package/dist/lib/custom/Users/user-overview.panel.js +2 -2
  173. package/dist/lib/custom/Users/user-overview.panel.js.map +1 -1
  174. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +208 -29
  175. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
  176. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +446 -138
  177. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
  178. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts +6 -0
  179. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts.map +1 -1
  180. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js +16 -4
  181. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js.map +1 -1
  182. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts +50 -6
  183. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
  184. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +84 -12
  185. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
  186. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts +89 -5
  187. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts.map +1 -1
  188. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +216 -70
  189. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js.map +1 -1
  190. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts +62 -3
  191. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts.map +1 -1
  192. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js +140 -42
  193. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js.map +1 -1
  194. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +81 -10
  195. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
  196. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +165 -37
  197. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  198. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +140 -15
  199. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
  200. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +326 -100
  201. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  202. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts +101 -15
  203. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts.map +1 -1
  204. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js +281 -97
  205. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js.map +1 -1
  206. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts +43 -25
  207. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts.map +1 -1
  208. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js +100 -64
  209. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js.map +1 -1
  210. package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts +14 -2
  211. package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts.map +1 -1
  212. package/dist/lib/custom/ai-agent-run/flow/constellation.component.js +71 -53
  213. package/dist/lib/custom/ai-agent-run/flow/constellation.component.js.map +1 -1
  214. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts +14 -2
  215. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts.map +1 -1
  216. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js +70 -52
  217. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js.map +1 -1
  218. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts +8 -0
  219. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts.map +1 -1
  220. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js +22 -6
  221. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js.map +1 -1
  222. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts +24 -2
  223. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts.map +1 -1
  224. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js +91 -59
  225. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js.map +1 -1
  226. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts +10 -2
  227. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts.map +1 -1
  228. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js +33 -17
  229. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js.map +1 -1
  230. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.d.ts +2 -0
  231. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.d.ts.map +1 -1
  232. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.js +34 -30
  233. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.js.map +1 -1
  234. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts +14 -2
  235. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts.map +1 -1
  236. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js +69 -51
  237. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js.map +1 -1
  238. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts +38 -12
  239. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts.map +1 -1
  240. package/dist/lib/custom/shared/entity-selector-dialog.component.js +103 -51
  241. package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
  242. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.d.ts.map +1 -1
  243. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js +59 -51
  244. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
  245. package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js +76 -74
  246. package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js.map +1 -1
  247. package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js +27 -25
  248. package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js.map +1 -1
  249. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  250. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +155 -119
  251. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  252. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts +5 -1
  253. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts.map +1 -1
  254. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js +11 -3
  255. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js.map +1 -1
  256. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.d.ts +2 -0
  257. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.d.ts.map +1 -1
  258. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js +16 -12
  259. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js.map +1 -1
  260. package/dist/lib/panels/content-sources/website-crawler-settings.panel.d.ts +1 -1
  261. package/dist/lib/panels/content-sources/website-crawler-settings.panel.js +2 -2
  262. package/dist/lib/panels/content-sources/website-crawler-settings.panel.js.map +1 -1
  263. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts +45 -19
  264. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts.map +1 -1
  265. package/dist/lib/panels/model-predictions/model-prediction.logic.js +95 -43
  266. package/dist/lib/panels/model-predictions/model-prediction.logic.js.map +1 -1
  267. package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts +20 -16
  268. package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts.map +1 -1
  269. package/dist/lib/panels/model-predictions/model-prediction.panel.js +73 -65
  270. package/dist/lib/panels/model-predictions/model-prediction.panel.js.map +1 -1
  271. package/dist/lib/shared/components/template-editor.component.d.ts +133 -14
  272. package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
  273. package/dist/lib/shared/components/template-editor.component.js +322 -124
  274. package/dist/lib/shared/components/template-editor.component.js.map +1 -1
  275. package/package.json +43 -42
@@ -6,7 +6,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  };
7
7
  import { Component, ViewChild, inject } from '@angular/core';
8
8
  import { Subject } from 'rxjs';
9
- import { BaseEntity, CompositeKey } from '@memberjunction/core';
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
11
  import { BaseFormComponent } from '@memberjunction/ng-base-forms';
12
12
  import { MJGlobal, MJEventType, RegisterClass, UUIDsEqual } from '@memberjunction/global';
@@ -775,16 +775,16 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
775
775
  /** Pending re-read of the run tree while a detached workflow is still running. */
776
776
  this.workflowPollTimer = null;
777
777
  // UI state
778
- this.activeTab = 'timeline';
779
- this.selectedTimelineItem = null;
780
- this.jsonPanelExpanded = false;
781
- this.loading = false;
778
+ this.ActiveTab = 'timeline';
779
+ this.SelectedTimelineItem = null;
780
+ this.JsonPanelExpanded = false;
781
+ this.Loading = false;
782
782
  this.error = null;
783
- this.analyticsLoaded = false;
784
- this.visualizationLoaded = false;
785
- this.agent = null;
783
+ this.AnalyticsLoaded = false;
784
+ this.VisualizationLoaded = false;
785
+ this.Agent = null;
786
786
  // Cost metrics using shared service
787
- this.costMetrics = null;
787
+ this.CostMetrics = null;
788
788
  // Cached parsed results to prevent redundant JSON parsing
789
789
  this._cachedParsedResult = null;
790
790
  this._cachedParsedStartingPayload = null;
@@ -797,7 +797,7 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
797
797
  this.costService = inject(AIAgentRunCostService);
798
798
  this.appManager = inject(ApplicationManager);
799
799
  // Instance of data helper per component
800
- this.dataHelper = new AIAgentRunDataHelper();
800
+ this.DataHelper = new AIAgentRunDataHelper();
801
801
  /**
802
802
  * The run's complete execution tree — loaded ONCE here and shared with every tab.
803
803
  *
@@ -807,11 +807,123 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
807
807
  * different run than the one beside it. Sharing it also means a refresh updates all three at once
808
808
  * rather than whichever one the user happens to open next.
809
809
  */
810
- this.runTree = null;
810
+ this.RunTree = null;
811
811
  /** True while the tree is loading, so a tab can say so rather than render an empty run. */
812
- this.runTreeLoading = false;
812
+ this.RunTreeLoading = false;
813
813
  /** Why the tree could not be loaded, or null. Surfaced rather than swallowed. */
814
- this.runTreeError = null;
814
+ this.RunTreeError = null;
815
+ }
816
+ /** @deprecated Use {@link ActiveTab}. */
817
+ get activeTab() {
818
+ return this.ActiveTab;
819
+ }
820
+ /** @deprecated Use {@link ActiveTab}. */
821
+ set activeTab(value) {
822
+ this.ActiveTab = value;
823
+ }
824
+ /** @deprecated Use {@link SelectedTimelineItem}. */
825
+ get selectedTimelineItem() {
826
+ return this.SelectedTimelineItem;
827
+ }
828
+ /** @deprecated Use {@link SelectedTimelineItem}. */
829
+ set selectedTimelineItem(value) {
830
+ this.SelectedTimelineItem = value;
831
+ }
832
+ /** @deprecated Use {@link JsonPanelExpanded}. */
833
+ get jsonPanelExpanded() {
834
+ return this.JsonPanelExpanded;
835
+ }
836
+ /** @deprecated Use {@link JsonPanelExpanded}. */
837
+ set jsonPanelExpanded(value) {
838
+ this.JsonPanelExpanded = value;
839
+ }
840
+ /** @deprecated Use {@link Loading}. */
841
+ get loading() {
842
+ return this.Loading;
843
+ }
844
+ /** @deprecated Use {@link Loading}. */
845
+ set loading(value) {
846
+ this.Loading = value;
847
+ }
848
+ /** @deprecated Use {@link AnalyticsLoaded}. */
849
+ get analyticsLoaded() {
850
+ return this.AnalyticsLoaded;
851
+ }
852
+ /** @deprecated Use {@link AnalyticsLoaded}. */
853
+ set analyticsLoaded(value) {
854
+ this.AnalyticsLoaded = value;
855
+ }
856
+ /** @deprecated Use {@link VisualizationLoaded}. */
857
+ get visualizationLoaded() {
858
+ return this.VisualizationLoaded;
859
+ }
860
+ /** @deprecated Use {@link VisualizationLoaded}. */
861
+ set visualizationLoaded(value) {
862
+ this.VisualizationLoaded = value;
863
+ }
864
+ /** @deprecated Use {@link Agent}. */
865
+ get agent() {
866
+ return this.Agent;
867
+ }
868
+ /** @deprecated Use {@link Agent}. */
869
+ set agent(value) {
870
+ this.Agent = value;
871
+ }
872
+ /** @deprecated Use {@link CostMetrics}. */
873
+ get costMetrics() {
874
+ return this.CostMetrics;
875
+ }
876
+ /** @deprecated Use {@link CostMetrics}. */
877
+ set costMetrics(value) {
878
+ this.CostMetrics = value;
879
+ }
880
+ /** @deprecated Use {@link TimelineComponent}. */
881
+ get timelineComponent() {
882
+ return this.TimelineComponent;
883
+ }
884
+ /** @deprecated Use {@link TimelineComponent}. */
885
+ set timelineComponent(value) {
886
+ this.TimelineComponent = value;
887
+ }
888
+ /** @deprecated Use {@link AnalyticsComponent}. */
889
+ get analyticsComponent() {
890
+ return this.AnalyticsComponent;
891
+ }
892
+ /** @deprecated Use {@link AnalyticsComponent}. */
893
+ set analyticsComponent(value) {
894
+ this.AnalyticsComponent = value;
895
+ }
896
+ /** @deprecated Use {@link DataHelper}. */
897
+ get dataHelper() {
898
+ return this.DataHelper;
899
+ }
900
+ /** @deprecated Use {@link DataHelper}. */
901
+ set dataHelper(value) {
902
+ this.DataHelper = value;
903
+ }
904
+ /** @deprecated Use {@link RunTree}. */
905
+ get runTree() {
906
+ return this.RunTree;
907
+ }
908
+ /** @deprecated Use {@link RunTree}. */
909
+ set runTree(value) {
910
+ this.RunTree = value;
911
+ }
912
+ /** @deprecated Use {@link RunTreeLoading}. */
913
+ get runTreeLoading() {
914
+ return this.RunTreeLoading;
915
+ }
916
+ /** @deprecated Use {@link RunTreeLoading}. */
917
+ set runTreeLoading(value) {
918
+ this.RunTreeLoading = value;
919
+ }
920
+ /** @deprecated Use {@link RunTreeError}. */
921
+ get runTreeError() {
922
+ return this.RunTreeError;
923
+ }
924
+ /** @deprecated Use {@link RunTreeError}. */
925
+ set runTreeError(value) {
926
+ this.RunTreeError = value;
815
927
  }
816
928
  /**
817
929
  * Loads (or reloads) the shared run tree.
@@ -822,23 +934,23 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
822
934
  async loadRunTree() {
823
935
  if (!this.record?.ID)
824
936
  return;
825
- this.runTreeLoading = true;
826
- this.runTreeError = null;
937
+ this.RunTreeLoading = true;
938
+ this.RunTreeError = null;
827
939
  try {
828
940
  const result = await LoadAgentRunTree(this.record.ID, this.RunQueryToUse);
829
- this.runTree = result.Root;
830
- this.runTreeError = result.ErrorMessage;
941
+ this.RunTree = result.Root;
942
+ this.RunTreeError = result.ErrorMessage;
831
943
  if (result.Truncated) {
832
- this.runTreeError =
944
+ this.RunTreeError =
833
945
  `This run nests deeper than ${MAX_AGENT_RUN_TREE_DEPTH} levels; what is shown is truncated.`;
834
946
  }
835
947
  }
836
948
  catch (e) {
837
- this.runTreeError = e instanceof Error ? e.message : String(e);
838
- this.runTree = null;
949
+ this.RunTreeError = e instanceof Error ? e.message : String(e);
950
+ this.RunTree = null;
839
951
  }
840
952
  finally {
841
- this.runTreeLoading = false;
953
+ this.RunTreeLoading = false;
842
954
  this.scheduleWorkflowPoll();
843
955
  }
844
956
  }
@@ -855,9 +967,9 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
855
967
  * snapshot of a moving thing, with nothing saying so.
856
968
  */
857
969
  get WorkflowStillRunning() {
858
- if (!this.runTree)
970
+ if (!this.RunTree)
859
971
  return false;
860
- for (const node of WalkAgentRunTree(this.runTree)) {
972
+ for (const node of WalkAgentRunTree(this.RunTree)) {
861
973
  if (node.NodeType !== 'Task' && node.NodeType !== 'TaskGraph')
862
974
  continue;
863
975
  if (!TERMINAL_TASK_STATUSES.has(node.Status))
@@ -893,7 +1005,7 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
893
1005
  async ngOnInit() {
894
1006
  await super.ngOnInit();
895
1007
  if (this.record && this.record.ID) {
896
- await this.dataHelper.loadAgentRunData(this.record.ID);
1008
+ await this.DataHelper.loadAgentRunData(this.record.ID);
897
1009
  await this.loadRunTree();
898
1010
  await this.loadAgent();
899
1011
  await this.loadCostMetrics();
@@ -915,9 +1027,9 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
915
1027
  this.entityEventSubscription?.unsubscribe();
916
1028
  this.entityEventSubscription = null;
917
1029
  this.clearParsedCache();
918
- this.dataHelper.clearData();
919
- this.costMetrics = null;
920
- this.agent = null;
1030
+ this.DataHelper.clearData();
1031
+ this.CostMetrics = null;
1032
+ this.Agent = null;
921
1033
  }
922
1034
  subscribeToRunEvents() {
923
1035
  if (this.entityEventSubscription)
@@ -937,7 +1049,24 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
937
1049
  * use case here); `remote-invalidate` covers writes from a separate
938
1050
  * server process if GraphQL cache-invalidation is wired up.
939
1051
  */
940
- handleEntityEvent(mjEvent) {
1052
+ /**
1053
+ * Fire-and-forget: nothing consumes the return, which is what lets this be async. It has to be,
1054
+ * because a remote event no longer carries the row unless the deployment allowlisted the entity
1055
+ * — the fields below come from a keyed re-read instead (see `ResolveEntityEventRow`).
1056
+ *
1057
+ * Because the subscriber in `subscribeToRunEvents` drops the promise, a throw here would surface
1058
+ * as an unhandled rejection; the body is wrapped so it is logged instead, the same way
1059
+ * `FormBuilderResourceComponent.handleEntityEvent` handles it.
1060
+ */
1061
+ async handleEntityEvent(mjEvent) {
1062
+ try {
1063
+ await this.handleEntityEventUnguarded(mjEvent);
1064
+ }
1065
+ catch (err) {
1066
+ LogError(`AIAgentRunForm.handleEntityEvent: ${err instanceof Error ? err.message : String(err)}`);
1067
+ }
1068
+ }
1069
+ async handleEntityEventUnguarded(mjEvent) {
941
1070
  if (mjEvent.event !== MJEventType.ComponentEvent)
942
1071
  return;
943
1072
  if (mjEvent.eventCode !== BaseEntity.BaseEventCode)
@@ -957,19 +1086,26 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
957
1086
  // Status change on THIS run row.
958
1087
  const savedID = this.resolveEventID(evt);
959
1088
  if (savedID && UUIDsEqual(savedID, runId)) {
960
- this.refreshData();
1089
+ this.RefreshData();
961
1090
  // If the run completed, drop the subscription — no further
962
1091
  // writes are expected and we don't want to hold the listener.
963
- const newStatus = this.resolveEventField(evt, 'Status');
1092
+ // Resolved only once the id has matched, so an unrelated run's event costs no read.
1093
+ const row = await this.resolveEventRow(evt);
1094
+ const newStatus = row?.['Status'];
964
1095
  if (newStatus && newStatus !== 'Running') {
965
1096
  this.unsubscribeFromRunEvents();
966
1097
  }
967
1098
  }
968
1099
  return;
969
1100
  }
970
- // Steps still carry AgentRunID, so a step write can be correlated exactly to this run.
1101
+ // Steps still carry AgentRunID, so a step write can be correlated exactly to this run. Unlike
1102
+ // `Status` above, this read is NOT behind an id match — it cannot be, because AgentRunID is a
1103
+ // foreign key on the step and there is nothing to compare until the row is in hand. So while
1104
+ // this form is open on a Running agent, every step save anywhere in the deployment costs it
1105
+ // one keyed read (or nothing, if the entity is allowlisted for broadcast). It is bounded by
1106
+ // the run's lifetime: `unsubscribeFromRunEvents()` fires once the run leaves 'Running'.
971
1107
  if (entityName === 'MJ: AI Agent Run Steps') {
972
- const childAgentRunId = this.resolveEventField(evt, 'AgentRunID');
1108
+ const childAgentRunId = (await this.resolveEventRow(evt))?.['AgentRunID'];
973
1109
  if (childAgentRunId && UUIDsEqual(childAgentRunId, runId)) {
974
1110
  this.refreshRunDataDebounced();
975
1111
  }
@@ -1023,22 +1159,16 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1023
1159
  }
1024
1160
  return null;
1025
1161
  }
1026
- resolveEventField(evt, fieldName) {
1027
- if (evt.baseEntity) {
1028
- const val = evt.baseEntity.Get?.(fieldName);
1029
- return val ?? null;
1030
- }
1031
- const payload = evt.payload;
1032
- if (!payload?.recordData)
1033
- return null;
1034
- try {
1035
- const row = JSON.parse(payload.recordData);
1036
- const v = row?.[fieldName];
1037
- return (v ?? null);
1038
- }
1039
- catch {
1040
- return null;
1041
- }
1162
+ /**
1163
+ * The row behind an event, for the two fields this component needs that the primary key cannot
1164
+ * give it (`Status` on the run, `AgentRunID` on a step).
1165
+ *
1166
+ * A remote event carries the row only for entities a deployment has opted into broadcasting;
1167
+ * otherwise this re-reads that one record as the signed-in user, so a session that may not read
1168
+ * it gets nothing rather than someone else's data.
1169
+ */
1170
+ async resolveEventRow(evt) {
1171
+ return await ResolveEntityEventRow(evt, this.ProviderToUse);
1042
1172
  }
1043
1173
  /**
1044
1174
  * Collapse rapid bursts of step/prompt/action events into a single
@@ -1052,7 +1182,7 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1052
1182
  this.refreshInFlight = false;
1053
1183
  if (!this.record?.ID)
1054
1184
  return;
1055
- this.dataHelper.loadAgentRunData(this.record.ID, true);
1185
+ this.DataHelper.loadAgentRunData(this.record.ID, true);
1056
1186
  });
1057
1187
  }
1058
1188
  async loadAgent() {
@@ -1062,7 +1192,7 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1062
1192
  const md = this.ProviderToUse;
1063
1193
  const agent = await md.GetEntityObject('MJ: AI Agents');
1064
1194
  if (agent && await agent.Load(this.record.AgentID)) {
1065
- this.agent = agent;
1195
+ this.Agent = agent;
1066
1196
  this.cdr.detectChanges();
1067
1197
  }
1068
1198
  }
@@ -1074,12 +1204,12 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1074
1204
  if (!this.record?.ID)
1075
1205
  return;
1076
1206
  try {
1077
- this.costMetrics = await this.costService.getAgentRunCostMetrics(this.record.ID);
1207
+ this.CostMetrics = await this.costService.getAgentRunCostMetrics(this.record.ID);
1078
1208
  this.cdr.markForCheck();
1079
1209
  }
1080
1210
  catch (error) {
1081
1211
  console.error('Error loading cost metrics:', error);
1082
- this.costMetrics = {
1212
+ this.CostMetrics = {
1083
1213
  totalCost: 0,
1084
1214
  totalPrompts: 0,
1085
1215
  totalTokensInput: 0,
@@ -1089,20 +1219,24 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1089
1219
  };
1090
1220
  }
1091
1221
  }
1092
- changeTab(tab) {
1093
- this.activeTab = tab;
1222
+ ChangeTab(tab) {
1223
+ this.ActiveTab = tab;
1094
1224
  // Lazy load the Visualization (playable + static flow) view on first access
1095
- if (tab === 'visualization' && !this.visualizationLoaded) {
1096
- this.visualizationLoaded = true;
1225
+ if (tab === 'visualization' && !this.VisualizationLoaded) {
1226
+ this.VisualizationLoaded = true;
1097
1227
  this.cdr.markForCheck();
1098
1228
  }
1099
1229
  // Lazy load analytics when the tab is first accessed
1100
- if (tab === 'analytics' && !this.analyticsLoaded) {
1101
- this.analyticsLoaded = true;
1230
+ if (tab === 'analytics' && !this.AnalyticsLoaded) {
1231
+ this.AnalyticsLoaded = true;
1102
1232
  this.cdr.markForCheck();
1103
1233
  }
1104
1234
  }
1105
- calculateDuration(start, end) {
1235
+ /** @deprecated Use {@link ChangeTab}. */
1236
+ changeTab(tab) {
1237
+ return this.ChangeTab(tab);
1238
+ }
1239
+ CalculateDuration(start, end) {
1106
1240
  if (!end)
1107
1241
  return 'Running...';
1108
1242
  const ms = end.getTime() - start.getTime();
@@ -1114,38 +1248,70 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1114
1248
  return `${Math.floor(ms / 60000)}m ${Math.floor((ms % 60000) / 1000)}s`;
1115
1249
  return `${Math.floor(ms / 3600000)}h ${Math.floor((ms % 3600000) / 60000)}m`;
1116
1250
  }
1251
+ /** @deprecated Use {@link CalculateDuration}. */
1252
+ calculateDuration(start, end) {
1253
+ return this.CalculateDuration(start, end);
1254
+ }
1255
+ SelectTimelineItem(item) {
1256
+ this.SelectedTimelineItem = item;
1257
+ this.JsonPanelExpanded = true;
1258
+ this.cdr.markForCheck();
1259
+ }
1260
+ /** @deprecated Use {@link SelectTimelineItem}. */
1117
1261
  selectTimelineItem(item) {
1118
- this.selectedTimelineItem = item;
1119
- this.jsonPanelExpanded = true;
1262
+ return this.SelectTimelineItem(item);
1263
+ }
1264
+ CloseJsonPanel() {
1265
+ this.SelectedTimelineItem = null;
1120
1266
  this.cdr.markForCheck();
1121
1267
  }
1268
+ /** @deprecated Use {@link CloseJsonPanel}. */
1122
1269
  closeJsonPanel() {
1123
- this.selectedTimelineItem = null;
1124
- this.cdr.markForCheck();
1270
+ return this.CloseJsonPanel();
1125
1271
  }
1126
- navigateToSubRun(runId) {
1272
+ NavigateToSubRun(runId) {
1127
1273
  SharedService.Instance.OpenEntityRecord("MJ: AI Agent Runs", CompositeKey.FromID(runId));
1128
1274
  }
1129
- navigateToParentRun() {
1275
+ /** @deprecated Use {@link NavigateToSubRun}. */
1276
+ navigateToSubRun(runId) {
1277
+ return this.NavigateToSubRun(runId);
1278
+ }
1279
+ NavigateToParentRun() {
1130
1280
  if (this.record.ParentRunID) {
1131
1281
  SharedService.Instance.OpenEntityRecord("MJ: AI Agent Runs", CompositeKey.FromID(this.record.ParentRunID));
1132
1282
  }
1133
1283
  }
1134
- navigateToActionLog(logId) {
1284
+ /** @deprecated Use {@link NavigateToParentRun}. */
1285
+ navigateToParentRun() {
1286
+ return this.NavigateToParentRun();
1287
+ }
1288
+ NavigateToActionLog(logId) {
1135
1289
  SharedService.Instance.OpenEntityRecord("MJ: Action Execution Logs", CompositeKey.FromID(logId));
1136
1290
  }
1137
- openEntityRecord(entityName, recordId) {
1291
+ /** @deprecated Use {@link NavigateToActionLog}. */
1292
+ navigateToActionLog(logId) {
1293
+ return this.NavigateToActionLog(logId);
1294
+ }
1295
+ OpenEntityRecord(entityName, recordId) {
1138
1296
  if (recordId) {
1139
1297
  SharedService.Instance.OpenEntityRecord(entityName, CompositeKey.FromURLSegment(this.ProviderToUse.EntityByName(entityName), recordId));
1140
1298
  }
1141
1299
  }
1142
- navigateToEntityRecord(event) {
1300
+ /** @deprecated Use {@link OpenEntityRecord}. */
1301
+ openEntityRecord(entityName, recordId) {
1302
+ return this.OpenEntityRecord(entityName, recordId);
1303
+ }
1304
+ NavigateToEntityRecord(event) {
1143
1305
  SharedService.Instance.OpenEntityRecord(event.entityName, CompositeKey.FromURLSegment(this.ProviderToUse.EntityByName(event.entityName), event.recordId));
1144
1306
  }
1307
+ /** @deprecated Use {@link NavigateToEntityRecord}. */
1308
+ navigateToEntityRecord(event) {
1309
+ return this.NavigateToEntityRecord(event);
1310
+ }
1145
1311
  /**
1146
1312
  * Navigate to the conversation in the Chat application
1147
1313
  */
1148
- navigateToConversation() {
1314
+ NavigateToConversation() {
1149
1315
  if (!this.record?.ConversationID)
1150
1316
  return;
1151
1317
  // Find the Chat app
@@ -1157,7 +1323,11 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1157
1323
  // Navigate to the Conversations nav item with the conversationId parameter
1158
1324
  this.navigationService.OpenNavItemByName('Conversations', { conversationId: this.record.ConversationID }, chatApp.ID);
1159
1325
  }
1160
- refreshData() {
1326
+ /** @deprecated Use {@link NavigateToConversation}. */
1327
+ navigateToConversation() {
1328
+ return this.NavigateToConversation();
1329
+ }
1330
+ RefreshData() {
1161
1331
  // Reload the agent run record to get latest status
1162
1332
  if (this.record?.ID) {
1163
1333
  // Clear parsed cache when refreshing data
@@ -1168,16 +1338,20 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1168
1338
  this.costService.clearCache(this.record.ID);
1169
1339
  this.loadCostMetrics();
1170
1340
  // Reload data through helper - this will update all components (force reload for refresh)
1171
- this.dataHelper.loadAgentRunData(this.record.ID, true);
1341
+ this.DataHelper.loadAgentRunData(this.record.ID, true);
1172
1342
  void this.loadRunTree();
1173
1343
  // Trigger analytics refresh
1174
- if (this.analyticsComponent) {
1175
- this.analyticsComponent.loadData();
1344
+ if (this.AnalyticsComponent) {
1345
+ this.AnalyticsComponent.loadData();
1176
1346
  }
1177
1347
  });
1178
1348
  }
1179
1349
  }
1180
- getStatusIcon(status) {
1350
+ /** @deprecated Use {@link RefreshData}. */
1351
+ refreshData() {
1352
+ return this.RefreshData();
1353
+ }
1354
+ GetStatusIcon(status) {
1181
1355
  const iconMap = {
1182
1356
  'Running': 'fa-circle-notch fa-spin',
1183
1357
  'Completed': 'fa-check-circle',
@@ -1187,7 +1361,11 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1187
1361
  };
1188
1362
  return iconMap[status] || 'fa-question-circle';
1189
1363
  }
1190
- async copyToClipboard(text) {
1364
+ /** @deprecated Use {@link GetStatusIcon}. */
1365
+ getStatusIcon(status) {
1366
+ return this.GetStatusIcon(status);
1367
+ }
1368
+ async CopyToClipboard(text) {
1191
1369
  try {
1192
1370
  await navigator.clipboard.writeText(text);
1193
1371
  // Could show a toast notification here
@@ -1196,10 +1374,14 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1196
1374
  console.error('Failed to copy to clipboard:', err);
1197
1375
  }
1198
1376
  }
1377
+ /** @deprecated Use {@link CopyToClipboard}. */
1378
+ async copyToClipboard(text) {
1379
+ return this.CopyToClipboard(text);
1380
+ }
1199
1381
  /**
1200
1382
  * Get the Result field with recursive JSON parsing applied
1201
1383
  */
1202
- get parsedResult() {
1384
+ get ParsedResult() {
1203
1385
  if (!this.record?.Result) {
1204
1386
  return '';
1205
1387
  }
@@ -1236,10 +1418,14 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1236
1418
  return fallbackResult;
1237
1419
  }
1238
1420
  }
1421
+ /** @deprecated Use {@link ParsedResult}. */
1422
+ get parsedResult() {
1423
+ return this.ParsedResult;
1424
+ }
1239
1425
  /**
1240
1426
  * Get the Starting Payload field with recursive JSON parsing applied
1241
1427
  */
1242
- get parsedStartingPayload() {
1428
+ get ParsedStartingPayload() {
1243
1429
  if (!this.record?.StartingPayload) {
1244
1430
  return '';
1245
1431
  }
@@ -1276,10 +1462,14 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1276
1462
  return fallbackResult;
1277
1463
  }
1278
1464
  }
1465
+ /** @deprecated Use {@link ParsedStartingPayload}. */
1466
+ get parsedStartingPayload() {
1467
+ return this.ParsedStartingPayload;
1468
+ }
1279
1469
  /**
1280
1470
  * Get the Final Payload (state) field with recursive JSON parsing applied
1281
1471
  */
1282
- get parsedFinalPayload() {
1472
+ get ParsedFinalPayload() {
1283
1473
  if (!this.record?.FinalPayload)
1284
1474
  return '';
1285
1475
  // Return cached result if available
@@ -1315,10 +1505,14 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1315
1505
  return fallbackResult;
1316
1506
  }
1317
1507
  }
1508
+ /** @deprecated Use {@link ParsedFinalPayload}. */
1509
+ get parsedFinalPayload() {
1510
+ return this.ParsedFinalPayload;
1511
+ }
1318
1512
  /**
1319
1513
  * Get the Data field with recursive JSON parsing applied
1320
1514
  */
1321
- get parsedData() {
1515
+ get ParsedData() {
1322
1516
  if (!this.record?.Data)
1323
1517
  return '';
1324
1518
  // Return cached result if available
@@ -1354,10 +1548,14 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1354
1548
  return fallbackResult;
1355
1549
  }
1356
1550
  }
1551
+ /** @deprecated Use {@link ParsedData}. */
1552
+ get parsedData() {
1553
+ return this.ParsedData;
1554
+ }
1357
1555
  /**
1358
1556
  * Get parsed Starting Payload as an object for deep diff
1359
1557
  */
1360
- get startingPayloadObject() {
1558
+ get StartingPayloadObject() {
1361
1559
  if (!this.record?.StartingPayload)
1362
1560
  return null;
1363
1561
  try {
@@ -1383,10 +1581,14 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1383
1581
  return null;
1384
1582
  }
1385
1583
  }
1584
+ /** @deprecated Use {@link StartingPayloadObject}. */
1585
+ get startingPayloadObject() {
1586
+ return this.StartingPayloadObject;
1587
+ }
1386
1588
  /**
1387
1589
  * Get parsed Final Payload as an object for deep diff
1388
1590
  */
1389
- get finalPayloadObject() {
1591
+ get FinalPayloadObject() {
1390
1592
  if (!this.record?.FinalPayload)
1391
1593
  return null;
1392
1594
  try {
@@ -1412,6 +1614,10 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1412
1614
  return null;
1413
1615
  }
1414
1616
  }
1617
+ /** @deprecated Use {@link FinalPayloadObject}. */
1618
+ get finalPayloadObject() {
1619
+ return this.FinalPayloadObject;
1620
+ }
1415
1621
  /**
1416
1622
  * Clear all cached parsed results
1417
1623
  */
@@ -1430,19 +1636,19 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1430
1636
  let parsedCount = 0;
1431
1637
  // Parse all fields that exist
1432
1638
  if (this.record?.Result) {
1433
- this.parsedResult; // Triggers parsing and caching
1639
+ this.ParsedResult; // Triggers parsing and caching
1434
1640
  parsedCount++;
1435
1641
  }
1436
1642
  if (this.record?.StartingPayload) {
1437
- this.parsedStartingPayload; // Triggers parsing and caching
1643
+ this.ParsedStartingPayload; // Triggers parsing and caching
1438
1644
  parsedCount++;
1439
1645
  }
1440
1646
  if (this.record?.FinalPayload) {
1441
- this.parsedFinalPayload; // Triggers parsing and caching
1647
+ this.ParsedFinalPayload; // Triggers parsing and caching
1442
1648
  parsedCount++;
1443
1649
  }
1444
1650
  if (this.record?.Data) {
1445
- this.parsedData; // Triggers parsing and caching
1651
+ this.ParsedData; // Triggers parsing and caching
1446
1652
  parsedCount++;
1447
1653
  }
1448
1654
  this._allParsingComplete = true;
@@ -1454,23 +1660,31 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1454
1660
  /**
1455
1661
  * Check if all parsing is complete - used by template
1456
1662
  */
1457
- get isParsingComplete() {
1663
+ get IsParsingComplete() {
1458
1664
  return this._allParsingComplete;
1459
1665
  }
1666
+ /** @deprecated Use {@link IsParsingComplete}. */
1667
+ get isParsingComplete() {
1668
+ return this.IsParsingComplete;
1669
+ }
1460
1670
  /**
1461
1671
  * Check if we have both payloads to show diff
1462
1672
  */
1463
- get showPayloadDiff() {
1673
+ get ShowPayloadDiff() {
1464
1674
  return !!(this.record?.StartingPayload && this.record?.FinalPayload);
1465
1675
  }
1676
+ /** @deprecated Use {@link ShowPayloadDiff}. */
1677
+ get showPayloadDiff() {
1678
+ return this.ShowPayloadDiff;
1679
+ }
1466
1680
  /**
1467
1681
  * Check if selected timeline item is a step with payload changes
1468
1682
  */
1469
- get showStepPayloadDiff() {
1470
- if (!this.selectedTimelineItem || this.selectedTimelineItem.type !== 'step') {
1683
+ get ShowStepPayloadDiff() {
1684
+ if (!this.SelectedTimelineItem || this.SelectedTimelineItem.type !== 'step') {
1471
1685
  return false;
1472
1686
  }
1473
- const stepData = this.selectedTimelineItem.data;
1687
+ const stepData = this.SelectedTimelineItem.data;
1474
1688
  if (stepData && (stepData.PayloadAtStart?.trim().length > 0
1475
1689
  || stepData.PayloadAtEnd?.trim().length > 0)) {
1476
1690
  return stepData.PayloadAtStart !== stepData.PayloadAtEnd;
@@ -1479,14 +1693,18 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1479
1693
  return false;
1480
1694
  }
1481
1695
  }
1696
+ /** @deprecated Use {@link ShowStepPayloadDiff}. */
1697
+ get showStepPayloadDiff() {
1698
+ return this.ShowStepPayloadDiff;
1699
+ }
1482
1700
  /**
1483
1701
  * Get parsed PayloadAtStart for the selected step
1484
1702
  */
1485
- get stepPayloadAtStartObject() {
1486
- if (!this.selectedTimelineItem || this.selectedTimelineItem.type !== 'step') {
1703
+ get StepPayloadAtStartObject() {
1704
+ if (!this.SelectedTimelineItem || this.SelectedTimelineItem.type !== 'step') {
1487
1705
  return null;
1488
1706
  }
1489
- const stepData = this.selectedTimelineItem.data;
1707
+ const stepData = this.SelectedTimelineItem.data;
1490
1708
  if (!stepData || !stepData.PayloadAtStart) {
1491
1709
  return null;
1492
1710
  }
@@ -1510,14 +1728,18 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1510
1728
  return null;
1511
1729
  }
1512
1730
  }
1731
+ /** @deprecated Use {@link StepPayloadAtStartObject}. */
1732
+ get stepPayloadAtStartObject() {
1733
+ return this.StepPayloadAtStartObject;
1734
+ }
1513
1735
  /**
1514
1736
  * Get parsed PayloadAtEnd for the selected step
1515
1737
  */
1516
- get stepPayloadAtEndObject() {
1517
- if (!this.selectedTimelineItem || this.selectedTimelineItem.type !== 'step') {
1738
+ get StepPayloadAtEndObject() {
1739
+ if (!this.SelectedTimelineItem || this.SelectedTimelineItem.type !== 'step') {
1518
1740
  return null;
1519
1741
  }
1520
- const stepData = this.selectedTimelineItem.data;
1742
+ const stepData = this.SelectedTimelineItem.data;
1521
1743
  if (!stepData || !stepData.PayloadAtEnd) {
1522
1744
  return null;
1523
1745
  }
@@ -1541,13 +1763,17 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
1541
1763
  return null;
1542
1764
  }
1543
1765
  }
1766
+ /** @deprecated Use {@link StepPayloadAtEndObject}. */
1767
+ get stepPayloadAtEndObject() {
1768
+ return this.StepPayloadAtEndObject;
1769
+ }
1544
1770
  static { this.ɵfac = /*@__PURE__*/ (() => { let ɵMJAIAgentRunFormComponentExtended_BaseFactory; return function MJAIAgentRunFormComponentExtended_Factory(__ngFactoryType__) { return (ɵMJAIAgentRunFormComponentExtended_BaseFactory || (ɵMJAIAgentRunFormComponentExtended_BaseFactory = i0.ɵɵgetInheritedFactory(MJAIAgentRunFormComponentExtended)))(__ngFactoryType__ || MJAIAgentRunFormComponentExtended); }; })(); }
1545
1771
  static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJAIAgentRunFormComponentExtended, selectors: [["mj-ai-agent-run-form"]], viewQuery: function MJAIAgentRunFormComponentExtended_Query(rf, ctx) { if (rf & 1) {
1546
1772
  i0.ɵɵviewQuery(AIAgentRunTimelineComponent, 5)(AIAgentRunAnalyticsComponent, 5);
1547
1773
  } if (rf & 2) {
1548
1774
  let _t;
1549
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.timelineComponent = _t.first);
1550
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.analyticsComponent = _t.first);
1775
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.TimelineComponent = _t.first);
1776
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.AnalyticsComponent = _t.first);
1551
1777
  } }, 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) {
1552
1778
  i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "div", 3)(3, "div", 4)(4, "div", 5)(5, "div", 6);
1553
1779
  i0.ɵɵconditionalCreate(6, MJAIAgentRunFormComponentExtended_Conditional_6_Template, 1, 2, "img", 7);
@@ -1684,10 +1910,10 @@ export { MJAIAgentRunFormComponentExtended };
1684
1910
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJAIAgentRunFormComponentExtended, [{
1685
1911
  type: Component,
1686
1912
  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"] }]
1687
- }], null, { timelineComponent: [{
1913
+ }], null, { TimelineComponent: [{
1688
1914
  type: ViewChild,
1689
1915
  args: [AIAgentRunTimelineComponent]
1690
- }], analyticsComponent: [{
1916
+ }], AnalyticsComponent: [{
1691
1917
  type: ViewChild,
1692
1918
  args: [AIAgentRunAnalyticsComponent]
1693
1919
  }] }); })();