@memberjunction/ng-core-entity-forms 6.1.0-edge.0 → 6.1.0-edge.2

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 (182) hide show
  1. package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.d.ts +19 -2
  2. package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.d.ts.map +1 -1
  3. package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.js +50 -9
  4. package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.js.map +1 -1
  5. package/dist/lib/custom/AIAgents/agent-form-tabs.d.ts +59 -0
  6. package/dist/lib/custom/AIAgents/agent-form-tabs.d.ts.map +1 -0
  7. package/dist/lib/custom/AIAgents/agent-form-tabs.js +53 -0
  8. package/dist/lib/custom/AIAgents/agent-form-tabs.js.map +1 -0
  9. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +54 -0
  10. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  11. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +1300 -1143
  12. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  13. package/dist/lib/custom/EntityActions/entityaction.form.component.js +9 -9
  14. package/dist/lib/custom/EntityActions/entityaction.form.component.js.map +1 -1
  15. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +25 -1
  16. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
  17. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +228 -170
  18. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
  19. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts +60 -2
  20. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts.map +1 -1
  21. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +372 -188
  22. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js.map +1 -1
  23. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts +9 -0
  24. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts.map +1 -1
  25. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js +86 -51
  26. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js.map +1 -1
  27. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +73 -4
  28. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
  29. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +133 -7
  30. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  31. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +49 -1
  32. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
  33. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +383 -264
  34. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  35. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts +10 -1
  36. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts.map +1 -1
  37. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js +25 -3
  38. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js.map +1 -1
  39. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts +21 -1
  40. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts.map +1 -1
  41. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js +11 -0
  42. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js.map +1 -1
  43. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.d.ts +28 -0
  44. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.d.ts.map +1 -0
  45. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.js +120 -0
  46. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.js.map +1 -0
  47. package/dist/lib/custom/ai-agent-run/run-tree-timeline-projection.d.ts +90 -0
  48. package/dist/lib/custom/ai-agent-run/run-tree-timeline-projection.d.ts.map +1 -0
  49. package/dist/lib/custom/ai-agent-run/run-tree-timeline-projection.js +326 -0
  50. package/dist/lib/custom/ai-agent-run/run-tree-timeline-projection.js.map +1 -0
  51. package/dist/lib/custom/custom-forms.module.d.ts +14 -13
  52. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  53. package/dist/lib/custom/custom-forms.module.js +8 -1
  54. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  55. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
  56. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +59 -41
  57. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
  58. package/dist/lib/generated/Entities/MJAIAgentCredential/mjaiagentcredential.form.component.d.ts +10 -0
  59. package/dist/lib/generated/Entities/MJAIAgentCredential/mjaiagentcredential.form.component.d.ts.map +1 -0
  60. package/dist/lib/generated/Entities/MJAIAgentCredential/mjaiagentcredential.form.component.js +78 -0
  61. package/dist/lib/generated/Entities/MJAIAgentCredential/mjaiagentcredential.form.component.js.map +1 -0
  62. package/dist/lib/generated/Entities/MJAIAgentHarness/mjaiagentharness.form.component.d.ts +10 -0
  63. package/dist/lib/generated/Entities/{MJReportSnapshot/mjreportsnapshot.form.component.d.ts.map → MJAIAgentHarness/mjaiagentharness.form.component.d.ts.map} +1 -1
  64. package/dist/lib/generated/Entities/MJAIAgentHarness/mjaiagentharness.form.component.js +90 -0
  65. package/dist/lib/generated/Entities/MJAIAgentHarness/mjaiagentharness.form.component.js.map +1 -0
  66. package/dist/lib/generated/Entities/MJAIAgentRequest/mjaiagentrequest.form.component.js +8 -6
  67. package/dist/lib/generated/Entities/MJAIAgentRequest/mjaiagentrequest.form.component.js.map +1 -1
  68. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.d.ts.map +1 -1
  69. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +105 -83
  70. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
  71. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.d.ts.map +1 -1
  72. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js +184 -164
  73. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js.map +1 -1
  74. package/dist/lib/generated/Entities/MJAIModelType/mjaimodeltype.form.component.js +25 -23
  75. package/dist/lib/generated/Entities/MJAIModelType/mjaimodeltype.form.component.js.map +1 -1
  76. package/dist/lib/generated/Entities/MJAIModelVendor/mjaimodelvendor.form.component.js +15 -13
  77. package/dist/lib/generated/Entities/MJAIModelVendor/mjaimodelvendor.form.component.js.map +1 -1
  78. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.d.ts.map +1 -1
  79. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js +43 -25
  80. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js.map +1 -1
  81. package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.d.ts.map +1 -1
  82. package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js +31 -13
  83. package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js.map +1 -1
  84. package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js +31 -31
  85. package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js.map +1 -1
  86. package/dist/lib/generated/Entities/MJActionExecutionLog/mjactionexecutionlog.form.component.js +11 -11
  87. package/dist/lib/generated/Entities/MJActionExecutionLog/mjactionexecutionlog.form.component.js.map +1 -1
  88. package/dist/lib/generated/Entities/MJActionParam/mjactionparam.form.component.d.ts.map +1 -1
  89. package/dist/lib/generated/Entities/MJActionParam/mjactionparam.form.component.js +5 -23
  90. package/dist/lib/generated/Entities/MJActionParam/mjactionparam.form.component.js.map +1 -1
  91. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js +2 -2
  92. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js.map +1 -1
  93. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.d.ts.map +1 -1
  94. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js +31 -49
  95. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js.map +1 -1
  96. package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.d.ts.map +1 -1
  97. package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js +38 -56
  98. package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js.map +1 -1
  99. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.d.ts.map +1 -1
  100. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js +31 -13
  101. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js.map +1 -1
  102. package/dist/lib/generated/Entities/MJDataContext/mjdatacontext.form.component.d.ts.map +1 -1
  103. package/dist/lib/generated/Entities/MJDataContext/mjdatacontext.form.component.js +7 -25
  104. package/dist/lib/generated/Entities/MJDataContext/mjdatacontext.form.component.js.map +1 -1
  105. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +3 -3
  106. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
  107. package/dist/lib/generated/Entities/MJEntityAction/mjentityaction.form.component.js +38 -36
  108. package/dist/lib/generated/Entities/MJEntityAction/mjentityaction.form.component.js.map +1 -1
  109. package/dist/lib/generated/Entities/MJEntityActionParam/mjentityactionparam.form.component.d.ts.map +1 -1
  110. package/dist/lib/generated/Entities/MJEntityActionParam/mjentityactionparam.form.component.js +7 -13
  111. package/dist/lib/generated/Entities/MJEntityActionParam/mjentityactionparam.form.component.js.map +1 -1
  112. package/dist/lib/generated/Entities/MJEntityRelationship/mjentityrelationship.form.component.js +12 -10
  113. package/dist/lib/generated/Entities/MJEntityRelationship/mjentityrelationship.form.component.js.map +1 -1
  114. package/dist/lib/generated/Entities/MJEnvironment/mjenvironment.form.component.d.ts.map +1 -1
  115. package/dist/lib/generated/Entities/MJEnvironment/mjenvironment.form.component.js +15 -33
  116. package/dist/lib/generated/Entities/MJEnvironment/mjenvironment.form.component.js.map +1 -1
  117. package/dist/lib/generated/Entities/MJOutputDeliveryType/mjoutputdeliverytype.form.component.d.ts.map +1 -1
  118. package/dist/lib/generated/Entities/MJOutputDeliveryType/mjoutputdeliverytype.form.component.js +6 -25
  119. package/dist/lib/generated/Entities/MJOutputDeliveryType/mjoutputdeliverytype.form.component.js.map +1 -1
  120. package/dist/lib/generated/Entities/MJOutputFormatType/mjoutputformattype.form.component.d.ts.map +1 -1
  121. package/dist/lib/generated/Entities/MJOutputFormatType/mjoutputformattype.form.component.js +6 -25
  122. package/dist/lib/generated/Entities/MJOutputFormatType/mjoutputformattype.form.component.js.map +1 -1
  123. package/dist/lib/generated/Entities/MJScheduledJob/mjscheduledjob.form.component.d.ts.map +1 -1
  124. package/dist/lib/generated/Entities/MJScheduledJob/mjscheduledjob.form.component.js +45 -25
  125. package/dist/lib/generated/Entities/MJScheduledJob/mjscheduledjob.form.component.js.map +1 -1
  126. package/dist/lib/generated/Entities/MJTask/mjtask.form.component.d.ts.map +1 -1
  127. package/dist/lib/generated/Entities/MJTask/mjtask.form.component.js +68 -24
  128. package/dist/lib/generated/Entities/MJTask/mjtask.form.component.js.map +1 -1
  129. package/dist/lib/generated/Entities/MJTaskDependency/mjtaskdependency.form.component.d.ts.map +1 -1
  130. package/dist/lib/generated/Entities/MJTaskDependency/mjtaskdependency.form.component.js +20 -6
  131. package/dist/lib/generated/Entities/MJTaskDependency/mjtaskdependency.form.component.js.map +1 -1
  132. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  133. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +372 -462
  134. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  135. package/dist/lib/generated/generated-forms.module.d.ts +375 -389
  136. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  137. package/dist/lib/generated/generated-forms.module.js +158 -215
  138. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  139. package/package.json +43 -42
  140. package/dist/lib/generated/Entities/MJOutputTriggerType/mjoutputtriggertype.form.component.d.ts +0 -10
  141. package/dist/lib/generated/Entities/MJOutputTriggerType/mjoutputtriggertype.form.component.d.ts.map +0 -1
  142. package/dist/lib/generated/Entities/MJOutputTriggerType/mjoutputtriggertype.form.component.js +0 -83
  143. package/dist/lib/generated/Entities/MJOutputTriggerType/mjoutputtriggertype.form.component.js.map +0 -1
  144. package/dist/lib/generated/Entities/MJReport/mjreport.form.component.d.ts +0 -10
  145. package/dist/lib/generated/Entities/MJReport/mjreport.form.component.d.ts.map +0 -1
  146. package/dist/lib/generated/Entities/MJReport/mjreport.form.component.js +0 -161
  147. package/dist/lib/generated/Entities/MJReport/mjreport.form.component.js.map +0 -1
  148. package/dist/lib/generated/Entities/MJReportCategory/mjreportcategory.form.component.d.ts +0 -10
  149. package/dist/lib/generated/Entities/MJReportCategory/mjreportcategory.form.component.d.ts.map +0 -1
  150. package/dist/lib/generated/Entities/MJReportCategory/mjreportcategory.form.component.js +0 -113
  151. package/dist/lib/generated/Entities/MJReportCategory/mjreportcategory.form.component.js.map +0 -1
  152. package/dist/lib/generated/Entities/MJReportSnapshot/mjreportsnapshot.form.component.d.ts +0 -10
  153. package/dist/lib/generated/Entities/MJReportSnapshot/mjreportsnapshot.form.component.js +0 -72
  154. package/dist/lib/generated/Entities/MJReportSnapshot/mjreportsnapshot.form.component.js.map +0 -1
  155. package/dist/lib/generated/Entities/MJReportUserState/mjreportuserstate.form.component.d.ts +0 -10
  156. package/dist/lib/generated/Entities/MJReportUserState/mjreportuserstate.form.component.d.ts.map +0 -1
  157. package/dist/lib/generated/Entities/MJReportUserState/mjreportuserstate.form.component.js +0 -72
  158. package/dist/lib/generated/Entities/MJReportUserState/mjreportuserstate.form.component.js.map +0 -1
  159. package/dist/lib/generated/Entities/MJReportVersion/mjreportversion.form.component.d.ts +0 -10
  160. package/dist/lib/generated/Entities/MJReportVersion/mjreportversion.form.component.d.ts.map +0 -1
  161. package/dist/lib/generated/Entities/MJReportVersion/mjreportversion.form.component.js +0 -78
  162. package/dist/lib/generated/Entities/MJReportVersion/mjreportversion.form.component.js.map +0 -1
  163. package/dist/lib/generated/Entities/MJScheduledAction/mjscheduledaction.form.component.d.ts +0 -10
  164. package/dist/lib/generated/Entities/MJScheduledAction/mjscheduledaction.form.component.d.ts.map +0 -1
  165. package/dist/lib/generated/Entities/MJScheduledAction/mjscheduledaction.form.component.js +0 -135
  166. package/dist/lib/generated/Entities/MJScheduledAction/mjscheduledaction.form.component.js.map +0 -1
  167. package/dist/lib/generated/Entities/MJScheduledActionParam/mjscheduledactionparam.form.component.d.ts +0 -10
  168. package/dist/lib/generated/Entities/MJScheduledActionParam/mjscheduledactionparam.form.component.d.ts.map +0 -1
  169. package/dist/lib/generated/Entities/MJScheduledActionParam/mjscheduledactionparam.form.component.js +0 -76
  170. package/dist/lib/generated/Entities/MJScheduledActionParam/mjscheduledactionparam.form.component.js.map +0 -1
  171. package/dist/lib/generated/Entities/MJWorkflow/mjworkflow.form.component.d.ts +0 -10
  172. package/dist/lib/generated/Entities/MJWorkflow/mjworkflow.form.component.d.ts.map +0 -1
  173. package/dist/lib/generated/Entities/MJWorkflow/mjworkflow.form.component.js +0 -121
  174. package/dist/lib/generated/Entities/MJWorkflow/mjworkflow.form.component.js.map +0 -1
  175. package/dist/lib/generated/Entities/MJWorkflowEngine/mjworkflowengine.form.component.d.ts +0 -10
  176. package/dist/lib/generated/Entities/MJWorkflowEngine/mjworkflowengine.form.component.d.ts.map +0 -1
  177. package/dist/lib/generated/Entities/MJWorkflowEngine/mjworkflowengine.form.component.js +0 -87
  178. package/dist/lib/generated/Entities/MJWorkflowEngine/mjworkflowengine.form.component.js.map +0 -1
  179. package/dist/lib/generated/Entities/MJWorkflowRun/mjworkflowrun.form.component.d.ts +0 -10
  180. package/dist/lib/generated/Entities/MJWorkflowRun/mjworkflowrun.form.component.d.ts.map +0 -1
  181. package/dist/lib/generated/Entities/MJWorkflowRun/mjworkflowrun.form.component.js +0 -80
  182. package/dist/lib/generated/Entities/MJWorkflowRun/mjworkflowrun.form.component.js.map +0 -1
@@ -1,5 +1,6 @@
1
1
  import { Component, Input, Output, EventEmitter } from '@angular/core';
2
2
  import { MJAIAgentRunStepEntity } from '@memberjunction/core-entities';
3
+ import { ResolveTaskGraphPositions } from '@memberjunction/ai-core-plus';
3
4
  import { ParseJSONRecursive } from '@memberjunction/global';
4
5
  import * as i0 from "@angular/core";
5
6
  import * as i1 from "@angular/common";
@@ -7,35 +8,56 @@ import * as i2 from "@angular/forms";
7
8
  import * as i3 from "@memberjunction/ng-ui-components";
8
9
  import * as i4 from "@memberjunction/ng-code-editor";
9
10
  import * as i5 from "@memberjunction/ng-deep-diff";
11
+ import * as i6 from "@memberjunction/ng-task-graph-editor";
10
12
  const _c0 = a0 => ({ $implicit: a0 });
11
13
  const _forTrack0 = ($index, $item) => $item.SkillID;
12
14
  const _forTrack1 = ($index, $item) => $item.id;
13
15
  function AIAgentRunStepDetailComponent_Conditional_0_Conditional_24_Template(rf, ctx) { if (rf & 1) {
16
+ i0.ɵɵelementStart(0, "div", 10);
17
+ i0.ɵɵelement(1, "mj-alert", 19);
18
+ i0.ɵɵelementEnd();
19
+ } if (rf & 2) {
20
+ const ctx_r1 = i0.ɵɵnextContext(2);
21
+ i0.ɵɵadvance();
22
+ i0.ɵɵproperty("Variant", ctx_r1.StepNotice.Variant)("Message", ctx_r1.StepNotice.Message);
23
+ } }
24
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_25_Template(rf, ctx) { if (rf & 1) {
14
25
  const _r3 = i0.ɵɵgetCurrentView();
15
- i0.ɵɵelementStart(0, "div", 10)(1, "button", 17);
16
- i0.ɵɵlistener("click", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_24_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onNavigateToActionLog(ctx_r1.selectedTimelineItem.data.ID)); });
17
- i0.ɵɵelement(2, "i", 18);
26
+ i0.ɵɵelementStart(0, "div", 11)(1, "button", 20);
27
+ i0.ɵɵlistener("click", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_25_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onNavigateToActionLog(ctx_r1.selectedTimelineItem.data.ID)); });
28
+ i0.ɵɵelement(2, "i", 21);
18
29
  i0.ɵɵtext(3, " View Action Execution Log ");
19
30
  i0.ɵɵelementEnd()();
20
31
  } }
21
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_25_Conditional_1_Template(rf, ctx) { if (rf & 1) {
32
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_26_Conditional_1_Template(rf, ctx) { if (rf & 1) {
22
33
  const _r5 = i0.ɵɵgetCurrentView();
23
- i0.ɵɵelementStart(0, "button", 20);
24
- i0.ɵɵlistener("click", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_25_Conditional_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.detailPaneTab = "diff"); });
25
- i0.ɵɵelement(1, "i", 22);
34
+ i0.ɵɵelementStart(0, "button", 23);
35
+ i0.ɵɵlistener("click", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_26_Conditional_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.detailPaneTab = "graph"); });
36
+ i0.ɵɵelement(1, "i", 25);
37
+ i0.ɵɵtext(2, " Workflow ");
38
+ i0.ɵɵelementEnd();
39
+ } if (rf & 2) {
40
+ const ctx_r1 = i0.ɵɵnextContext(3);
41
+ i0.ɵɵclassProp("active", ctx_r1.detailPaneTab === "graph");
42
+ } }
43
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_26_Conditional_2_Template(rf, ctx) { if (rf & 1) {
44
+ const _r6 = i0.ɵɵgetCurrentView();
45
+ i0.ɵɵelementStart(0, "button", 23);
46
+ i0.ɵɵlistener("click", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_26_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.detailPaneTab = "diff"); });
47
+ i0.ɵɵelement(1, "i", 26);
26
48
  i0.ɵɵtext(2, " Payload Changes ");
27
49
  i0.ɵɵelementEnd();
28
50
  } if (rf & 2) {
29
51
  const ctx_r1 = i0.ɵɵnextContext(3);
30
52
  i0.ɵɵclassProp("active", ctx_r1.detailPaneTab === "diff");
31
53
  } }
32
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_25_Conditional_2_Template(rf, ctx) { if (rf & 1) {
33
- const _r6 = i0.ɵɵgetCurrentView();
34
- i0.ɵɵelementStart(0, "button", 20);
35
- i0.ɵɵlistener("click", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_25_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.detailPaneTab = "skills"); });
36
- i0.ɵɵelement(1, "i", 23);
54
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_26_Conditional_3_Template(rf, ctx) { if (rf & 1) {
55
+ const _r7 = i0.ɵɵgetCurrentView();
56
+ i0.ɵɵelementStart(0, "button", 23);
57
+ i0.ɵɵlistener("click", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_26_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.detailPaneTab = "skills"); });
58
+ i0.ɵɵelement(1, "i", 27);
37
59
  i0.ɵɵtext(2, " Skills ");
38
- i0.ɵɵelementStart(3, "span", 24);
60
+ i0.ɵɵelementStart(3, "span", 28);
39
61
  i0.ɵɵtext(4);
40
62
  i0.ɵɵelementEnd()();
41
63
  } if (rf & 2) {
@@ -44,8 +66,8 @@ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_25_Conditional_
44
66
  i0.ɵɵadvance(4);
45
67
  i0.ɵɵtextInterpolate(ctx_r1.stepSkillInvocations.length);
46
68
  } }
47
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_25_Conditional_3_Conditional_3_Template(rf, ctx) { if (rf & 1) {
48
- i0.ɵɵelementStart(0, "span", 24);
69
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_26_Conditional_4_Conditional_3_Template(rf, ctx) { if (rf & 1) {
70
+ i0.ɵɵelementStart(0, "span", 28);
49
71
  i0.ɵɵtext(1);
50
72
  i0.ɵɵelementEnd();
51
73
  } if (rf & 2) {
@@ -53,13 +75,13 @@ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_25_Conditional_
53
75
  i0.ɵɵadvance();
54
76
  i0.ɵɵtextInterpolate(ctx_r1.scratchpadTaskChangeCount);
55
77
  } }
56
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_25_Conditional_3_Template(rf, ctx) { if (rf & 1) {
57
- const _r7 = i0.ɵɵgetCurrentView();
58
- i0.ɵɵelementStart(0, "button", 20);
59
- i0.ɵɵlistener("click", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_25_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.detailPaneTab = "scratchpad"); });
60
- i0.ɵɵelement(1, "i", 25);
78
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_26_Conditional_4_Template(rf, ctx) { if (rf & 1) {
79
+ const _r8 = i0.ɵɵgetCurrentView();
80
+ i0.ɵɵelementStart(0, "button", 23);
81
+ i0.ɵɵlistener("click", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_26_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.detailPaneTab = "scratchpad"); });
82
+ i0.ɵɵelement(1, "i", 29);
61
83
  i0.ɵɵtext(2, " Scratchpad ");
62
- i0.ɵɵconditionalCreate(3, AIAgentRunStepDetailComponent_Conditional_0_Conditional_25_Conditional_3_Conditional_3_Template, 2, 1, "span", 24);
84
+ i0.ɵɵconditionalCreate(3, AIAgentRunStepDetailComponent_Conditional_0_Conditional_26_Conditional_4_Conditional_3_Template, 2, 1, "span", 28);
63
85
  i0.ɵɵelementEnd();
64
86
  } if (rf & 2) {
65
87
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -67,217 +89,241 @@ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_25_Conditional_
67
89
  i0.ɵɵadvance(3);
68
90
  i0.ɵɵconditional(ctx_r1.scratchpadTaskChangeCount > 0 ? 3 : -1);
69
91
  } }
70
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_25_Template(rf, ctx) { if (rf & 1) {
92
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_26_Template(rf, ctx) { if (rf & 1) {
71
93
  const _r4 = i0.ɵɵgetCurrentView();
72
- i0.ɵɵelementStart(0, "div", 11);
73
- i0.ɵɵconditionalCreate(1, AIAgentRunStepDetailComponent_Conditional_0_Conditional_25_Conditional_1_Template, 3, 2, "button", 19);
74
- i0.ɵɵconditionalCreate(2, AIAgentRunStepDetailComponent_Conditional_0_Conditional_25_Conditional_2_Template, 5, 3, "button", 19);
75
- i0.ɵɵconditionalCreate(3, AIAgentRunStepDetailComponent_Conditional_0_Conditional_25_Conditional_3_Template, 4, 3, "button", 19);
76
- i0.ɵɵelementStart(4, "button", 20);
77
- i0.ɵɵlistener("click", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_25_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.detailPaneTab = "json"); });
78
- i0.ɵɵelement(5, "i", 21);
79
- i0.ɵɵtext(6, " Full JSON ");
94
+ i0.ɵɵelementStart(0, "div", 12);
95
+ i0.ɵɵconditionalCreate(1, AIAgentRunStepDetailComponent_Conditional_0_Conditional_26_Conditional_1_Template, 3, 2, "button", 22);
96
+ i0.ɵɵconditionalCreate(2, AIAgentRunStepDetailComponent_Conditional_0_Conditional_26_Conditional_2_Template, 3, 2, "button", 22);
97
+ i0.ɵɵconditionalCreate(3, AIAgentRunStepDetailComponent_Conditional_0_Conditional_26_Conditional_3_Template, 5, 3, "button", 22);
98
+ i0.ɵɵconditionalCreate(4, AIAgentRunStepDetailComponent_Conditional_0_Conditional_26_Conditional_4_Template, 4, 3, "button", 22);
99
+ i0.ɵɵelementStart(5, "button", 23);
100
+ i0.ɵɵlistener("click", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_26_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.detailPaneTab = "json"); });
101
+ i0.ɵɵelement(6, "i", 24);
102
+ i0.ɵɵtext(7, " Full JSON ");
80
103
  i0.ɵɵelementEnd()();
81
104
  } if (rf & 2) {
82
105
  const ctx_r1 = i0.ɵɵnextContext(2);
83
106
  i0.ɵɵadvance();
84
- i0.ɵɵconditional(ctx_r1.showStepPayloadDiff ? 1 : -1);
107
+ i0.ɵɵconditional(ctx_r1.showGraphTab ? 1 : -1);
85
108
  i0.ɵɵadvance();
86
- i0.ɵɵconditional(ctx_r1.showSkillsTab ? 2 : -1);
109
+ i0.ɵɵconditional(ctx_r1.showStepPayloadDiff ? 2 : -1);
87
110
  i0.ɵɵadvance();
88
- i0.ɵɵconditional(ctx_r1.showScratchpadTab ? 3 : -1);
111
+ i0.ɵɵconditional(ctx_r1.showSkillsTab ? 3 : -1);
112
+ i0.ɵɵadvance();
113
+ i0.ɵɵconditional(ctx_r1.showScratchpadTab ? 4 : -1);
89
114
  i0.ɵɵadvance();
90
115
  i0.ɵɵclassProp("active", ctx_r1.detailPaneTab === "json");
91
116
  } }
92
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_27_For_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
93
- i0.ɵɵelementStart(0, "div", 30);
94
- i0.ɵɵelement(1, "i", 37);
117
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_28_Conditional_2_Template(rf, ctx) { if (rf & 1) {
118
+ i0.ɵɵelement(0, "mj-alert", 31);
119
+ } }
120
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_28_Template(rf, ctx) { if (rf & 1) {
121
+ const _r9 = i0.ɵɵgetCurrentView();
122
+ i0.ɵɵelementStart(0, "div", 14)(1, "div", 30);
123
+ i0.ɵɵconditionalCreate(2, AIAgentRunStepDetailComponent_Conditional_0_Conditional_28_Conditional_2_Template, 1, 0, "mj-alert", 31);
124
+ i0.ɵɵelementStart(3, "button", 32);
125
+ i0.ɵɵlistener("click", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_28_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.RequestSaveAsWorkflow()); });
126
+ i0.ɵɵelement(4, "i", 33);
127
+ i0.ɵɵtext(5, " Save as Workflow ");
128
+ i0.ɵɵelementEnd()();
129
+ i0.ɵɵelement(6, "mj-task-graph-editor", 34);
130
+ i0.ɵɵelementEnd();
131
+ } if (rf & 2) {
132
+ const ctx_r1 = i0.ɵɵnextContext(2);
133
+ i0.ɵɵadvance(2);
134
+ i0.ɵɵconditional(ctx_r1.stepTaskGraphWasFolded ? 2 : -1);
135
+ i0.ɵɵadvance(4);
136
+ i0.ɵɵproperty("Spec", ctx_r1.stepTaskGraph)("NodePositions", ctx_r1.stepTaskGraphPositions)("ReadOnly", true)("ShowPalette", false);
137
+ } }
138
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_For_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
139
+ i0.ɵɵelementStart(0, "div", 39);
140
+ i0.ɵɵelement(1, "i", 46);
95
141
  i0.ɵɵtext(2);
96
142
  i0.ɵɵelementEnd();
97
143
  } if (rf & 2) {
98
- const inv_r8 = i0.ɵɵnextContext().$implicit;
144
+ const inv_r10 = i0.ɵɵnextContext().$implicit;
99
145
  i0.ɵɵadvance(2);
100
- i0.ɵɵtextInterpolate1(" ", inv_r8.Reason, " ");
146
+ i0.ɵɵtextInterpolate1(" ", inv_r10.Reason, " ");
101
147
  } }
102
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_27_For_2_Template(rf, ctx) { if (rf & 1) {
103
- i0.ɵɵelementStart(0, "div", 26)(1, "div", 27)(2, "span", 28);
104
- i0.ɵɵelement(3, "i", 23);
148
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_For_2_Template(rf, ctx) { if (rf & 1) {
149
+ i0.ɵɵelementStart(0, "div", 35)(1, "div", 36)(2, "span", 37);
150
+ i0.ɵɵelement(3, "i", 27);
105
151
  i0.ɵɵtext(4);
106
152
  i0.ɵɵelementEnd();
107
- i0.ɵɵelementStart(5, "span", 29);
153
+ i0.ɵɵelementStart(5, "span", 38);
108
154
  i0.ɵɵtext(6);
109
155
  i0.ɵɵelementEnd()();
110
- i0.ɵɵconditionalCreate(7, AIAgentRunStepDetailComponent_Conditional_0_Conditional_27_For_2_Conditional_7_Template, 3, 1, "div", 30);
111
- i0.ɵɵelementStart(8, "div", 31)(9, "div", 32);
156
+ i0.ɵɵconditionalCreate(7, AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_For_2_Conditional_7_Template, 3, 1, "div", 39);
157
+ i0.ɵɵelementStart(8, "div", 40)(9, "div", 41);
112
158
  i0.ɵɵtext(10, "Provenance of Authority");
113
159
  i0.ɵɵelementEnd();
114
- i0.ɵɵelementStart(11, "div", 33)(12, "span", 34);
160
+ i0.ɵɵelementStart(11, "div", 42)(12, "span", 43);
115
161
  i0.ɵɵtext(13, "Requested By");
116
162
  i0.ɵɵelementEnd();
117
- i0.ɵɵelementStart(14, "span", 35);
163
+ i0.ɵɵelementStart(14, "span", 44);
118
164
  i0.ɵɵtext(15);
119
165
  i0.ɵɵelementEnd()();
120
- i0.ɵɵelementStart(16, "div", 33)(17, "span", 34);
166
+ i0.ɵɵelementStart(16, "div", 42)(17, "span", 43);
121
167
  i0.ɵɵtext(18, "Agent AcceptsSkills");
122
168
  i0.ɵɵelementEnd();
123
- i0.ɵɵelementStart(19, "span", 35);
169
+ i0.ɵɵelementStart(19, "span", 44);
124
170
  i0.ɵɵtext(20);
125
171
  i0.ɵɵelementEnd()();
126
- i0.ɵɵelementStart(21, "div", 33)(22, "span", 34);
172
+ i0.ɵɵelementStart(21, "div", 42)(22, "span", 43);
127
173
  i0.ɵɵtext(23, "Skill ActivationMode");
128
174
  i0.ɵɵelementEnd();
129
- i0.ɵɵelementStart(24, "span", 35);
175
+ i0.ɵɵelementStart(24, "span", 44);
130
176
  i0.ɵɵtext(25);
131
177
  i0.ɵɵelementEnd()();
132
- i0.ɵɵelementStart(26, "div", 33)(27, "span", 34);
178
+ i0.ɵɵelementStart(26, "div", 42)(27, "span", 43);
133
179
  i0.ɵɵtext(28, "Agent SkillActivationMode");
134
180
  i0.ɵɵelementEnd();
135
- i0.ɵɵelementStart(29, "span", 35);
181
+ i0.ɵɵelementStart(29, "span", 44);
136
182
  i0.ɵɵtext(30);
137
183
  i0.ɵɵelementEnd()();
138
- i0.ɵɵelementStart(31, "div", 33)(32, "span", 34);
184
+ i0.ɵɵelementStart(31, "div", 42)(32, "span", 43);
139
185
  i0.ɵɵtext(33, "Skill ID");
140
186
  i0.ɵɵelementEnd();
141
- i0.ɵɵelementStart(34, "span", 36);
187
+ i0.ɵɵelementStart(34, "span", 45);
142
188
  i0.ɵɵtext(35);
143
189
  i0.ɵɵelementEnd()()()();
144
190
  } if (rf & 2) {
145
- const inv_r8 = ctx.$implicit;
191
+ const inv_r10 = ctx.$implicit;
146
192
  const ctx_r1 = i0.ɵɵnextContext(3);
147
- i0.ɵɵattribute("data-activation", inv_r8.ActivationType);
193
+ i0.ɵɵattribute("data-activation", inv_r10.ActivationType);
148
194
  i0.ɵɵadvance(4);
149
- i0.ɵɵtextInterpolate1(" ", inv_r8.SkillName, " ");
195
+ i0.ɵɵtextInterpolate1(" ", inv_r10.SkillName, " ");
150
196
  i0.ɵɵadvance();
151
- i0.ɵɵattribute("data-activation", inv_r8.ActivationType);
197
+ i0.ɵɵattribute("data-activation", inv_r10.ActivationType);
152
198
  i0.ɵɵadvance();
153
- i0.ɵɵtextInterpolate1(" ", ctx_r1.GetActivationTypeLabel(inv_r8), " ");
199
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.GetActivationTypeLabel(inv_r10), " ");
154
200
  i0.ɵɵadvance();
155
- i0.ɵɵconditional(inv_r8.Reason ? 7 : -1);
201
+ i0.ɵɵconditional(inv_r10.Reason ? 7 : -1);
156
202
  i0.ɵɵadvance(8);
157
- i0.ɵɵtextInterpolate(inv_r8.Provenance.RequestedBy === "user-request" ? "User (/skill mention)" : "Agent decision");
203
+ i0.ɵɵtextInterpolate(inv_r10.Provenance.RequestedBy === "user-request" ? "User (/skill mention)" : "Agent decision");
158
204
  i0.ɵɵadvance(5);
159
- i0.ɵɵtextInterpolate(inv_r8.Provenance.AgentAcceptsSkills);
205
+ i0.ɵɵtextInterpolate(inv_r10.Provenance.AgentAcceptsSkills);
160
206
  i0.ɵɵadvance(5);
161
- i0.ɵɵtextInterpolate(inv_r8.Provenance.SkillActivationMode);
207
+ i0.ɵɵtextInterpolate(inv_r10.Provenance.SkillActivationMode);
162
208
  i0.ɵɵadvance(5);
163
- i0.ɵɵtextInterpolate(inv_r8.Provenance.AgentSkillActivationMode);
209
+ i0.ɵɵtextInterpolate(inv_r10.Provenance.AgentSkillActivationMode);
164
210
  i0.ɵɵadvance(5);
165
- i0.ɵɵtextInterpolate(inv_r8.SkillID);
211
+ i0.ɵɵtextInterpolate(inv_r10.SkillID);
166
212
  } }
167
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_27_Template(rf, ctx) { if (rf & 1) {
168
- i0.ɵɵelementStart(0, "div", 13);
169
- i0.ɵɵrepeaterCreate(1, AIAgentRunStepDetailComponent_Conditional_0_Conditional_27_For_2_Template, 36, 10, "div", 26, _forTrack0);
213
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Template(rf, ctx) { if (rf & 1) {
214
+ i0.ɵɵelementStart(0, "div", 15);
215
+ i0.ɵɵrepeaterCreate(1, AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_For_2_Template, 36, 10, "div", 35, _forTrack0);
170
216
  i0.ɵɵelementEnd();
171
217
  } if (rf & 2) {
172
218
  const ctx_r1 = i0.ɵɵnextContext(2);
173
219
  i0.ɵɵadvance();
174
220
  i0.ɵɵrepeater(ctx_r1.stepSkillInvocations);
175
221
  } }
176
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_28_Template(rf, ctx) { if (rf & 1) {
177
- i0.ɵɵelementStart(0, "div", 14);
178
- i0.ɵɵelement(1, "mj-deep-diff", 38);
222
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_30_Template(rf, ctx) { if (rf & 1) {
223
+ i0.ɵɵelementStart(0, "div", 16);
224
+ i0.ɵɵelement(1, "mj-deep-diff", 47);
179
225
  i0.ɵɵelementEnd();
180
226
  } if (rf & 2) {
181
227
  const ctx_r1 = i0.ɵɵnextContext(2);
182
228
  i0.ɵɵadvance();
183
229
  i0.ɵɵproperty("oldValue", ctx_r1.stepPayloadAtStartObject)("newValue", ctx_r1.stepPayloadAtEndObject)("title", "")("showSummary", true)("showUnchanged", false)("expandAll", false)("maxDepth", 8)("maxStringLength", 150)("treatNullAsUndefined", true);
184
230
  } }
185
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_11_Conditional_1_Template(rf, ctx) { if (rf & 1) {
186
- i0.ɵɵelement(0, "mj-deep-diff", 38);
231
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_11_Conditional_1_Template(rf, ctx) { if (rf & 1) {
232
+ i0.ɵɵelement(0, "mj-deep-diff", 47);
187
233
  } if (rf & 2) {
188
234
  const ctx_r1 = i0.ɵɵnextContext(4);
189
235
  i0.ɵɵproperty("oldValue", ctx_r1.stepScratchpadInput)("newValue", ctx_r1.stepScratchpadOutput)("title", "")("showSummary", true)("showUnchanged", false)("expandAll", true)("maxDepth", 6)("maxStringLength", 300)("treatNullAsUndefined", true);
190
236
  } }
191
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_11_Conditional_2_ng_container_2_Template(rf, ctx) { if (rf & 1) {
237
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_11_Conditional_2_ng_container_2_Template(rf, ctx) { if (rf & 1) {
192
238
  i0.ɵɵelementContainer(0);
193
239
  } }
194
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_11_Conditional_2_Template(rf, ctx) { if (rf & 1) {
195
- i0.ɵɵelement(0, "mj-empty-state", 47);
196
- i0.ɵɵelementStart(1, "div", 48);
197
- i0.ɵɵtemplate(2, AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_11_Conditional_2_ng_container_2_Template, 1, 0, "ng-container", 49);
240
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_11_Conditional_2_Template(rf, ctx) { if (rf & 1) {
241
+ i0.ɵɵelement(0, "mj-empty-state", 56);
242
+ i0.ɵɵelementStart(1, "div", 57);
243
+ i0.ɵɵtemplate(2, AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_11_Conditional_2_ng_container_2_Template, 1, 0, "ng-container", 58);
198
244
  i0.ɵɵelementEnd();
199
245
  } if (rf & 2) {
200
246
  const ctx_r1 = i0.ɵɵnextContext(4);
201
- const scratchpadSnapshotTpl_r10 = i0.ɵɵreference(2);
247
+ const scratchpadSnapshotTpl_r12 = i0.ɵɵreference(2);
202
248
  i0.ɵɵadvance(2);
203
- i0.ɵɵproperty("ngTemplateOutlet", scratchpadSnapshotTpl_r10)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, ctx_r1.stepScratchpadOutput));
249
+ i0.ɵɵproperty("ngTemplateOutlet", scratchpadSnapshotTpl_r12)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, ctx_r1.stepScratchpadOutput));
204
250
  } }
205
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_11_Conditional_3_Template(rf, ctx) { if (rf & 1) {
206
- i0.ɵɵelement(0, "mj-empty-state", 46);
251
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_11_Conditional_3_Template(rf, ctx) { if (rf & 1) {
252
+ i0.ɵɵelement(0, "mj-empty-state", 55);
207
253
  } }
208
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_11_Template(rf, ctx) { if (rf & 1) {
209
- i0.ɵɵelementStart(0, "div", 44);
210
- i0.ɵɵconditionalCreate(1, AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_11_Conditional_1_Template, 1, 9, "mj-deep-diff", 38)(2, AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_11_Conditional_2_Template, 3, 4)(3, AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_11_Conditional_3_Template, 1, 0, "mj-empty-state", 46);
254
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_11_Template(rf, ctx) { if (rf & 1) {
255
+ i0.ɵɵelementStart(0, "div", 53);
256
+ i0.ɵɵconditionalCreate(1, AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_11_Conditional_1_Template, 1, 9, "mj-deep-diff", 47)(2, AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_11_Conditional_2_Template, 3, 4)(3, AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_11_Conditional_3_Template, 1, 0, "mj-empty-state", 55);
211
257
  i0.ɵɵelementEnd();
212
258
  } if (rf & 2) {
213
259
  const ctx_r1 = i0.ɵɵnextContext(3);
214
260
  i0.ɵɵadvance();
215
261
  i0.ɵɵconditional(ctx_r1.stepScratchpadInput && ctx_r1.stepScratchpadOutput ? 1 : ctx_r1.stepScratchpadOutput ? 2 : 3);
216
262
  } }
217
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_12_Conditional_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {
263
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_12_Conditional_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {
218
264
  i0.ɵɵelementContainer(0);
219
265
  } }
220
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_12_Conditional_1_Template(rf, ctx) { if (rf & 1) {
221
- i0.ɵɵtemplate(0, AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_12_Conditional_1_ng_container_0_Template, 1, 0, "ng-container", 49);
266
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_12_Conditional_1_Template(rf, ctx) { if (rf & 1) {
267
+ i0.ɵɵtemplate(0, AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_12_Conditional_1_ng_container_0_Template, 1, 0, "ng-container", 58);
222
268
  } if (rf & 2) {
223
269
  const ctx_r1 = i0.ɵɵnextContext(4);
224
- const scratchpadSnapshotTpl_r10 = i0.ɵɵreference(2);
225
- i0.ɵɵproperty("ngTemplateOutlet", scratchpadSnapshotTpl_r10)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, ctx_r1.stepScratchpadInput));
270
+ const scratchpadSnapshotTpl_r12 = i0.ɵɵreference(2);
271
+ i0.ɵɵproperty("ngTemplateOutlet", scratchpadSnapshotTpl_r12)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, ctx_r1.stepScratchpadInput));
226
272
  } }
227
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_12_Conditional_2_Template(rf, ctx) { if (rf & 1) {
228
- i0.ɵɵelement(0, "mj-empty-state", 50);
273
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_12_Conditional_2_Template(rf, ctx) { if (rf & 1) {
274
+ i0.ɵɵelement(0, "mj-empty-state", 59);
229
275
  } }
230
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_12_Template(rf, ctx) { if (rf & 1) {
231
- i0.ɵɵelementStart(0, "div", 45);
232
- i0.ɵɵconditionalCreate(1, AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_12_Conditional_1_Template, 1, 4, "ng-container")(2, AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_12_Conditional_2_Template, 1, 0, "mj-empty-state", 50);
276
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_12_Template(rf, ctx) { if (rf & 1) {
277
+ i0.ɵɵelementStart(0, "div", 54);
278
+ i0.ɵɵconditionalCreate(1, AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_12_Conditional_1_Template, 1, 4, "ng-container")(2, AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_12_Conditional_2_Template, 1, 0, "mj-empty-state", 59);
233
279
  i0.ɵɵelementEnd();
234
280
  } if (rf & 2) {
235
281
  const ctx_r1 = i0.ɵɵnextContext(3);
236
282
  i0.ɵɵadvance();
237
283
  i0.ɵɵconditional(ctx_r1.stepScratchpadInput ? 1 : 2);
238
284
  } }
239
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_13_Conditional_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {
285
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_13_Conditional_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {
240
286
  i0.ɵɵelementContainer(0);
241
287
  } }
242
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_13_Conditional_1_Template(rf, ctx) { if (rf & 1) {
243
- i0.ɵɵtemplate(0, AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_13_Conditional_1_ng_container_0_Template, 1, 0, "ng-container", 49);
288
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_13_Conditional_1_Template(rf, ctx) { if (rf & 1) {
289
+ i0.ɵɵtemplate(0, AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_13_Conditional_1_ng_container_0_Template, 1, 0, "ng-container", 58);
244
290
  } if (rf & 2) {
245
291
  const ctx_r1 = i0.ɵɵnextContext(4);
246
- const scratchpadSnapshotTpl_r10 = i0.ɵɵreference(2);
247
- i0.ɵɵproperty("ngTemplateOutlet", scratchpadSnapshotTpl_r10)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, ctx_r1.stepScratchpadOutput));
292
+ const scratchpadSnapshotTpl_r12 = i0.ɵɵreference(2);
293
+ i0.ɵɵproperty("ngTemplateOutlet", scratchpadSnapshotTpl_r12)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, ctx_r1.stepScratchpadOutput));
248
294
  } }
249
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_13_Conditional_2_Template(rf, ctx) { if (rf & 1) {
250
- i0.ɵɵelement(0, "mj-empty-state", 51);
295
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_13_Conditional_2_Template(rf, ctx) { if (rf & 1) {
296
+ i0.ɵɵelement(0, "mj-empty-state", 60);
251
297
  } }
252
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_13_Template(rf, ctx) { if (rf & 1) {
253
- i0.ɵɵelementStart(0, "div", 45);
254
- i0.ɵɵconditionalCreate(1, AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_13_Conditional_1_Template, 1, 4, "ng-container")(2, AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_13_Conditional_2_Template, 1, 0, "mj-empty-state", 51);
298
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_13_Template(rf, ctx) { if (rf & 1) {
299
+ i0.ɵɵelementStart(0, "div", 54);
300
+ i0.ɵɵconditionalCreate(1, AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_13_Conditional_1_Template, 1, 4, "ng-container")(2, AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_13_Conditional_2_Template, 1, 0, "mj-empty-state", 60);
255
301
  i0.ɵɵelementEnd();
256
302
  } if (rf & 2) {
257
303
  const ctx_r1 = i0.ɵɵnextContext(3);
258
304
  i0.ɵɵadvance();
259
305
  i0.ɵɵconditional(ctx_r1.stepScratchpadOutput ? 1 : 2);
260
306
  } }
261
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Template(rf, ctx) { if (rf & 1) {
262
- const _r9 = i0.ɵɵgetCurrentView();
263
- i0.ɵɵelementStart(0, "div", 15)(1, "div", 39)(2, "button", 40);
264
- i0.ɵɵlistener("click", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.scratchpadSubTab = "diff"); });
265
- i0.ɵɵelement(3, "i", 41);
307
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Template(rf, ctx) { if (rf & 1) {
308
+ const _r11 = i0.ɵɵgetCurrentView();
309
+ i0.ɵɵelementStart(0, "div", 17)(1, "div", 48)(2, "button", 49);
310
+ i0.ɵɵlistener("click", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.scratchpadSubTab = "diff"); });
311
+ i0.ɵɵelement(3, "i", 50);
266
312
  i0.ɵɵtext(4, " Diff ");
267
313
  i0.ɵɵelementEnd();
268
- i0.ɵɵelementStart(5, "button", 40);
269
- i0.ɵɵlistener("click", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.scratchpadSubTab = "input"); });
270
- i0.ɵɵelement(6, "i", 42);
314
+ i0.ɵɵelementStart(5, "button", 49);
315
+ i0.ɵɵlistener("click", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.scratchpadSubTab = "input"); });
316
+ i0.ɵɵelement(6, "i", 51);
271
317
  i0.ɵɵtext(7, " Input ");
272
318
  i0.ɵɵelementEnd();
273
- i0.ɵɵelementStart(8, "button", 40);
274
- i0.ɵɵlistener("click", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.scratchpadSubTab = "output"); });
275
- i0.ɵɵelement(9, "i", 43);
319
+ i0.ɵɵelementStart(8, "button", 49);
320
+ i0.ɵɵlistener("click", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.scratchpadSubTab = "output"); });
321
+ i0.ɵɵelement(9, "i", 52);
276
322
  i0.ɵɵtext(10, " Output ");
277
323
  i0.ɵɵelementEnd()();
278
- i0.ɵɵconditionalCreate(11, AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_11_Template, 4, 1, "div", 44);
279
- i0.ɵɵconditionalCreate(12, AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_12_Template, 3, 1, "div", 45);
280
- i0.ɵɵconditionalCreate(13, AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Conditional_13_Template, 3, 1, "div", 45);
324
+ i0.ɵɵconditionalCreate(11, AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_11_Template, 4, 1, "div", 53);
325
+ i0.ɵɵconditionalCreate(12, AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_12_Template, 3, 1, "div", 54);
326
+ i0.ɵɵconditionalCreate(13, AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Conditional_13_Template, 3, 1, "div", 54);
281
327
  i0.ɵɵelementEnd();
282
328
  } if (rf & 2) {
283
329
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -294,14 +340,14 @@ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Template(rf,
294
340
  i0.ɵɵadvance();
295
341
  i0.ɵɵconditional(ctx_r1.scratchpadSubTab === "output" ? 13 : -1);
296
342
  } }
297
- function AIAgentRunStepDetailComponent_Conditional_0_Conditional_30_Template(rf, ctx) { if (rf & 1) {
298
- const _r11 = i0.ɵɵgetCurrentView();
299
- i0.ɵɵelementStart(0, "div", 16)(1, "div", 52)(2, "button", 53);
300
- i0.ɵɵlistener("click", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_30_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onCopyToClipboard()); });
301
- i0.ɵɵelement(3, "i", 54);
343
+ function AIAgentRunStepDetailComponent_Conditional_0_Conditional_32_Template(rf, ctx) { if (rf & 1) {
344
+ const _r13 = i0.ɵɵgetCurrentView();
345
+ i0.ɵɵelementStart(0, "div", 18)(1, "div", 61)(2, "button", 62);
346
+ i0.ɵɵlistener("click", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_32_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onCopyToClipboard()); });
347
+ i0.ɵɵelement(3, "i", 63);
302
348
  i0.ɵɵelementEnd()();
303
- i0.ɵɵelementStart(4, "mj-code-editor", 55);
304
- i0.ɵɵtwoWayListener("ngModelChange", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_30_Template_mj_code_editor_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.selectedItemJsonString, $event) || (ctx_r1.selectedItemJsonString = $event); return i0.ɵɵresetView($event); });
349
+ i0.ɵɵelementStart(4, "mj-code-editor", 64);
350
+ i0.ɵɵtwoWayListener("ngModelChange", function AIAgentRunStepDetailComponent_Conditional_0_Conditional_32_Template_mj_code_editor_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.selectedItemJsonString, $event) || (ctx_r1.selectedItemJsonString = $event); return i0.ɵɵresetView($event); });
305
351
  i0.ɵɵelementEnd()();
306
352
  } if (rf & 2) {
307
353
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -337,13 +383,15 @@ function AIAgentRunStepDetailComponent_Conditional_0_Template(rf, ctx) { if (rf
337
383
  i0.ɵɵelementStart(22, "span");
338
384
  i0.ɵɵtext(23);
339
385
  i0.ɵɵelementEnd()()();
340
- i0.ɵɵconditionalCreate(24, AIAgentRunStepDetailComponent_Conditional_0_Conditional_24_Template, 4, 0, "div", 10);
341
- i0.ɵɵconditionalCreate(25, AIAgentRunStepDetailComponent_Conditional_0_Conditional_25_Template, 7, 5, "div", 11);
342
- i0.ɵɵelementStart(26, "div", 12);
343
- i0.ɵɵconditionalCreate(27, AIAgentRunStepDetailComponent_Conditional_0_Conditional_27_Template, 3, 0, "div", 13);
344
- i0.ɵɵconditionalCreate(28, AIAgentRunStepDetailComponent_Conditional_0_Conditional_28_Template, 2, 9, "div", 14);
345
- i0.ɵɵconditionalCreate(29, AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Template, 14, 9, "div", 15);
346
- i0.ɵɵconditionalCreate(30, AIAgentRunStepDetailComponent_Conditional_0_Conditional_30_Template, 5, 3, "div", 16);
386
+ i0.ɵɵconditionalCreate(24, AIAgentRunStepDetailComponent_Conditional_0_Conditional_24_Template, 2, 2, "div", 10);
387
+ i0.ɵɵconditionalCreate(25, AIAgentRunStepDetailComponent_Conditional_0_Conditional_25_Template, 4, 0, "div", 11);
388
+ i0.ɵɵconditionalCreate(26, AIAgentRunStepDetailComponent_Conditional_0_Conditional_26_Template, 8, 6, "div", 12);
389
+ i0.ɵɵelementStart(27, "div", 13);
390
+ i0.ɵɵconditionalCreate(28, AIAgentRunStepDetailComponent_Conditional_0_Conditional_28_Template, 7, 5, "div", 14);
391
+ i0.ɵɵconditionalCreate(29, AIAgentRunStepDetailComponent_Conditional_0_Conditional_29_Template, 3, 0, "div", 15);
392
+ i0.ɵɵconditionalCreate(30, AIAgentRunStepDetailComponent_Conditional_0_Conditional_30_Template, 2, 9, "div", 16);
393
+ i0.ɵɵconditionalCreate(31, AIAgentRunStepDetailComponent_Conditional_0_Conditional_31_Template, 14, 9, "div", 17);
394
+ i0.ɵɵconditionalCreate(32, AIAgentRunStepDetailComponent_Conditional_0_Conditional_32_Template, 5, 3, "div", 18);
347
395
  i0.ɵɵelementEnd()()();
348
396
  } if (rf & 2) {
349
397
  const ctx_r1 = i0.ɵɵnextContext();
@@ -360,120 +408,124 @@ function AIAgentRunStepDetailComponent_Conditional_0_Template(rf, ctx) { if (rf
360
408
  i0.ɵɵadvance(5);
361
409
  i0.ɵɵtextInterpolate(ctx_r1.selectedTimelineItem.duration || "N/A");
362
410
  i0.ɵɵadvance();
363
- i0.ɵɵconditional(ctx_r1.selectedTimelineItem.type === "action" && (ctx_r1.selectedTimelineItem.data == null ? null : ctx_r1.selectedTimelineItem.data.ID) ? 24 : -1);
411
+ i0.ɵɵconditional(ctx_r1.StepNotice ? 24 : -1);
412
+ i0.ɵɵadvance();
413
+ i0.ɵɵconditional(ctx_r1.selectedTimelineItem.type === "action" && (ctx_r1.selectedTimelineItem.data == null ? null : ctx_r1.selectedTimelineItem.data.ID) ? 25 : -1);
414
+ i0.ɵɵadvance();
415
+ i0.ɵɵconditional(ctx_r1.showStepPayloadDiff || ctx_r1.showScratchpadTab || ctx_r1.showSkillsTab || ctx_r1.showGraphTab ? 26 : -1);
364
416
  i0.ɵɵadvance();
365
- i0.ɵɵconditional(ctx_r1.showStepPayloadDiff || ctx_r1.showScratchpadTab || ctx_r1.showSkillsTab ? 25 : -1);
417
+ i0.ɵɵclassProp("with-tabs", ctx_r1.showStepPayloadDiff || ctx_r1.showScratchpadTab || ctx_r1.showSkillsTab || ctx_r1.showGraphTab);
366
418
  i0.ɵɵadvance();
367
- i0.ɵɵclassProp("with-tabs", ctx_r1.showStepPayloadDiff || ctx_r1.showScratchpadTab || ctx_r1.showSkillsTab);
419
+ i0.ɵɵconditional(ctx_r1.detailPaneTab === "graph" && ctx_r1.showGraphTab ? 28 : -1);
368
420
  i0.ɵɵadvance();
369
- i0.ɵɵconditional(ctx_r1.detailPaneTab === "skills" && ctx_r1.showSkillsTab ? 27 : -1);
421
+ i0.ɵɵconditional(ctx_r1.detailPaneTab === "skills" && ctx_r1.showSkillsTab ? 29 : -1);
370
422
  i0.ɵɵadvance();
371
- i0.ɵɵconditional(ctx_r1.detailPaneTab === "diff" && ctx_r1.showStepPayloadDiff ? 28 : -1);
423
+ i0.ɵɵconditional(ctx_r1.detailPaneTab === "diff" && ctx_r1.showStepPayloadDiff ? 30 : -1);
372
424
  i0.ɵɵadvance();
373
- i0.ɵɵconditional(ctx_r1.detailPaneTab === "scratchpad" && ctx_r1.showScratchpadTab ? 29 : -1);
425
+ i0.ɵɵconditional(ctx_r1.detailPaneTab === "scratchpad" && ctx_r1.showScratchpadTab ? 31 : -1);
374
426
  i0.ɵɵadvance();
375
- i0.ɵɵconditional(ctx_r1.detailPaneTab === "json" || !ctx_r1.showStepPayloadDiff && !ctx_r1.showScratchpadTab ? 30 : -1);
427
+ i0.ɵɵconditional(ctx_r1.detailPaneTab === "json" || !ctx_r1.showStepPayloadDiff && !ctx_r1.showScratchpadTab ? 32 : -1);
376
428
  } }
377
429
  function AIAgentRunStepDetailComponent_ng_template_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
378
- i0.ɵɵelementStart(0, "div", 56)(1, "h4");
379
- i0.ɵɵelement(2, "i", 59);
430
+ i0.ɵɵelementStart(0, "div", 65)(1, "h4");
431
+ i0.ɵɵelement(2, "i", 68);
380
432
  i0.ɵɵtext(3, " Notes");
381
433
  i0.ɵɵelementEnd();
382
- i0.ɵɵelementStart(4, "div", 60);
434
+ i0.ɵɵelementStart(4, "div", 69);
383
435
  i0.ɵɵtext(5);
384
436
  i0.ɵɵelementEnd()();
385
437
  } if (rf & 2) {
386
- const snapshot_r12 = i0.ɵɵnextContext().$implicit;
438
+ const snapshot_r14 = i0.ɵɵnextContext().$implicit;
387
439
  i0.ɵɵadvance(5);
388
- i0.ɵɵtextInterpolate(snapshot_r12.notes);
440
+ i0.ɵɵtextInterpolate(snapshot_r14.notes);
389
441
  } }
390
442
  function AIAgentRunStepDetailComponent_ng_template_1_Conditional_2_For_6_Case_2_Template(rf, ctx) { if (rf & 1) {
391
- i0.ɵɵelement(0, "i", 65);
443
+ i0.ɵɵelement(0, "i", 74);
392
444
  } }
393
445
  function AIAgentRunStepDetailComponent_ng_template_1_Conditional_2_For_6_Case_3_Template(rf, ctx) { if (rf & 1) {
394
- i0.ɵɵelement(0, "i", 66);
446
+ i0.ɵɵelement(0, "i", 75);
395
447
  } }
396
448
  function AIAgentRunStepDetailComponent_ng_template_1_Conditional_2_For_6_Case_4_Template(rf, ctx) { if (rf & 1) {
397
- i0.ɵɵelement(0, "i", 67);
449
+ i0.ɵɵelement(0, "i", 76);
398
450
  } }
399
451
  function AIAgentRunStepDetailComponent_ng_template_1_Conditional_2_For_6_Case_5_Template(rf, ctx) { if (rf & 1) {
400
- i0.ɵɵelement(0, "i", 68);
452
+ i0.ɵɵelement(0, "i", 77);
401
453
  } }
402
454
  function AIAgentRunStepDetailComponent_ng_template_1_Conditional_2_For_6_Conditional_11_Template(rf, ctx) { if (rf & 1) {
403
- i0.ɵɵelementStart(0, "span", 72);
455
+ i0.ɵɵelementStart(0, "span", 81);
404
456
  i0.ɵɵtext(1);
405
457
  i0.ɵɵelementEnd();
406
458
  } if (rf & 2) {
407
- const task_r13 = i0.ɵɵnextContext().$implicit;
459
+ const task_r15 = i0.ɵɵnextContext().$implicit;
408
460
  i0.ɵɵadvance();
409
- i0.ɵɵtextInterpolate(task_r13.notes);
461
+ i0.ɵɵtextInterpolate(task_r15.notes);
410
462
  } }
411
463
  function AIAgentRunStepDetailComponent_ng_template_1_Conditional_2_For_6_Template(rf, ctx) { if (rf & 1) {
412
- i0.ɵɵelementStart(0, "div", 63)(1, "span", 64);
413
- i0.ɵɵconditionalCreate(2, AIAgentRunStepDetailComponent_ng_template_1_Conditional_2_For_6_Case_2_Template, 1, 0, "i", 65)(3, AIAgentRunStepDetailComponent_ng_template_1_Conditional_2_For_6_Case_3_Template, 1, 0, "i", 66)(4, AIAgentRunStepDetailComponent_ng_template_1_Conditional_2_For_6_Case_4_Template, 1, 0, "i", 67)(5, AIAgentRunStepDetailComponent_ng_template_1_Conditional_2_For_6_Case_5_Template, 1, 0, "i", 68);
464
+ i0.ɵɵelementStart(0, "div", 72)(1, "span", 73);
465
+ i0.ɵɵconditionalCreate(2, AIAgentRunStepDetailComponent_ng_template_1_Conditional_2_For_6_Case_2_Template, 1, 0, "i", 74)(3, AIAgentRunStepDetailComponent_ng_template_1_Conditional_2_For_6_Case_3_Template, 1, 0, "i", 75)(4, AIAgentRunStepDetailComponent_ng_template_1_Conditional_2_For_6_Case_4_Template, 1, 0, "i", 76)(5, AIAgentRunStepDetailComponent_ng_template_1_Conditional_2_For_6_Case_5_Template, 1, 0, "i", 77);
414
466
  i0.ɵɵelementEnd();
415
- i0.ɵɵelementStart(6, "div", 69)(7, "span", 70);
467
+ i0.ɵɵelementStart(6, "div", 78)(7, "span", 79);
416
468
  i0.ɵɵtext(8);
417
469
  i0.ɵɵelementEnd();
418
- i0.ɵɵelementStart(9, "span", 71);
470
+ i0.ɵɵelementStart(9, "span", 80);
419
471
  i0.ɵɵtext(10);
420
472
  i0.ɵɵelementEnd();
421
- i0.ɵɵconditionalCreate(11, AIAgentRunStepDetailComponent_ng_template_1_Conditional_2_For_6_Conditional_11_Template, 2, 1, "span", 72);
473
+ i0.ɵɵconditionalCreate(11, AIAgentRunStepDetailComponent_ng_template_1_Conditional_2_For_6_Conditional_11_Template, 2, 1, "span", 81);
422
474
  i0.ɵɵelementEnd();
423
- i0.ɵɵelementStart(12, "span", 73);
475
+ i0.ɵɵelementStart(12, "span", 82);
424
476
  i0.ɵɵtext(13);
425
477
  i0.ɵɵelementEnd()();
426
478
  } if (rf & 2) {
427
479
  let tmp_16_0;
428
- const task_r13 = ctx.$implicit;
429
- i0.ɵɵattribute("data-status", task_r13.status);
480
+ const task_r15 = ctx.$implicit;
481
+ i0.ɵɵattribute("data-status", task_r15.status);
430
482
  i0.ɵɵadvance();
431
- i0.ɵɵattribute("data-status", task_r13.status);
483
+ i0.ɵɵattribute("data-status", task_r15.status);
432
484
  i0.ɵɵadvance();
433
- i0.ɵɵconditional((tmp_16_0 = task_r13.status) === "completed" ? 2 : tmp_16_0 === "in_progress" ? 3 : tmp_16_0 === "blocked" ? 4 : 5);
485
+ i0.ɵɵconditional((tmp_16_0 = task_r15.status) === "completed" ? 2 : tmp_16_0 === "in_progress" ? 3 : tmp_16_0 === "blocked" ? 4 : 5);
434
486
  i0.ɵɵadvance(6);
435
- i0.ɵɵtextInterpolate(task_r13.id);
487
+ i0.ɵɵtextInterpolate(task_r15.id);
436
488
  i0.ɵɵadvance(2);
437
- i0.ɵɵtextInterpolate(task_r13.title);
489
+ i0.ɵɵtextInterpolate(task_r15.title);
438
490
  i0.ɵɵadvance();
439
- i0.ɵɵconditional(task_r13.notes ? 11 : -1);
491
+ i0.ɵɵconditional(task_r15.notes ? 11 : -1);
440
492
  i0.ɵɵadvance();
441
- i0.ɵɵattribute("data-status", task_r13.status);
493
+ i0.ɵɵattribute("data-status", task_r15.status);
442
494
  i0.ɵɵadvance();
443
- i0.ɵɵtextInterpolate(task_r13.status);
495
+ i0.ɵɵtextInterpolate(task_r15.status);
444
496
  } }
445
497
  function AIAgentRunStepDetailComponent_ng_template_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
446
- i0.ɵɵelementStart(0, "div", 57)(1, "h4");
447
- i0.ɵɵelement(2, "i", 61);
498
+ i0.ɵɵelementStart(0, "div", 66)(1, "h4");
499
+ i0.ɵɵelement(2, "i", 70);
448
500
  i0.ɵɵtext(3);
449
501
  i0.ɵɵelementEnd();
450
- i0.ɵɵelementStart(4, "div", 62);
451
- i0.ɵɵrepeaterCreate(5, AIAgentRunStepDetailComponent_ng_template_1_Conditional_2_For_6_Template, 14, 8, "div", 63, _forTrack1);
502
+ i0.ɵɵelementStart(4, "div", 71);
503
+ i0.ɵɵrepeaterCreate(5, AIAgentRunStepDetailComponent_ng_template_1_Conditional_2_For_6_Template, 14, 8, "div", 72, _forTrack1);
452
504
  i0.ɵɵelementEnd()();
453
505
  } if (rf & 2) {
454
- const snapshot_r12 = i0.ɵɵnextContext().$implicit;
506
+ const snapshot_r14 = i0.ɵɵnextContext().$implicit;
455
507
  i0.ɵɵadvance(3);
456
- i0.ɵɵtextInterpolate1(" Tasks (", snapshot_r12.tasks.length, ")");
508
+ i0.ɵɵtextInterpolate1(" Tasks (", snapshot_r14.tasks.length, ")");
457
509
  i0.ɵɵadvance(2);
458
- i0.ɵɵrepeater(snapshot_r12.tasks);
510
+ i0.ɵɵrepeater(snapshot_r14.tasks);
459
511
  } }
460
512
  function AIAgentRunStepDetailComponent_ng_template_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
461
- i0.ɵɵelement(0, "mj-empty-state", 58);
513
+ i0.ɵɵelement(0, "mj-empty-state", 67);
462
514
  } }
463
515
  function AIAgentRunStepDetailComponent_ng_template_1_Template(rf, ctx) { if (rf & 1) {
464
- i0.ɵɵelementStart(0, "div", 48);
465
- i0.ɵɵconditionalCreate(1, AIAgentRunStepDetailComponent_ng_template_1_Conditional_1_Template, 6, 1, "div", 56);
466
- i0.ɵɵconditionalCreate(2, AIAgentRunStepDetailComponent_ng_template_1_Conditional_2_Template, 7, 1, "div", 57);
467
- i0.ɵɵconditionalCreate(3, AIAgentRunStepDetailComponent_ng_template_1_Conditional_3_Template, 1, 0, "mj-empty-state", 58);
516
+ i0.ɵɵelementStart(0, "div", 57);
517
+ i0.ɵɵconditionalCreate(1, AIAgentRunStepDetailComponent_ng_template_1_Conditional_1_Template, 6, 1, "div", 65);
518
+ i0.ɵɵconditionalCreate(2, AIAgentRunStepDetailComponent_ng_template_1_Conditional_2_Template, 7, 1, "div", 66);
519
+ i0.ɵɵconditionalCreate(3, AIAgentRunStepDetailComponent_ng_template_1_Conditional_3_Template, 1, 0, "mj-empty-state", 67);
468
520
  i0.ɵɵelementEnd();
469
521
  } if (rf & 2) {
470
- const snapshot_r12 = ctx.$implicit;
522
+ const snapshot_r14 = ctx.$implicit;
471
523
  i0.ɵɵadvance();
472
- i0.ɵɵconditional(snapshot_r12.notes ? 1 : -1);
524
+ i0.ɵɵconditional(snapshot_r14.notes ? 1 : -1);
473
525
  i0.ɵɵadvance();
474
- i0.ɵɵconditional((snapshot_r12.tasks == null ? null : snapshot_r12.tasks.length) > 0 ? 2 : -1);
526
+ i0.ɵɵconditional((snapshot_r14.tasks == null ? null : snapshot_r14.tasks.length) > 0 ? 2 : -1);
475
527
  i0.ɵɵadvance();
476
- i0.ɵɵconditional(!snapshot_r12.notes && (!snapshot_r12.tasks || snapshot_r12.tasks.length === 0) ? 3 : -1);
528
+ i0.ɵɵconditional(!snapshot_r14.notes && (!snapshot_r14.tasks || snapshot_r14.tasks.length === 0) ? 3 : -1);
477
529
  } }
478
530
  export class AIAgentRunStepDetailComponent {
479
531
  constructor(cdr) {
@@ -482,6 +534,14 @@ export class AIAgentRunStepDetailComponent {
482
534
  this.closePanel = new EventEmitter();
483
535
  this.navigateToActionLog = new EventEmitter();
484
536
  this.copyToClipboard = new EventEmitter();
537
+ /**
538
+ * The user asked to promote this run's graph into a reusable workflow (D17).
539
+ *
540
+ * Intent only — this component renders a run, it does not persist agents. The host performs the
541
+ * conversion and the `AgentSpecSync` write, which keeps the one place that writes an agent the
542
+ * one place that writes an agent.
543
+ */
544
+ this.saveAsWorkflowRequested = new EventEmitter();
485
545
  this.selectedItemJsonString = '{}';
486
546
  this.detailPaneTab = 'diff';
487
547
  this.scratchpadSubTab = 'diff';
@@ -494,6 +554,11 @@ export class AIAgentRunStepDetailComponent {
494
554
  if (this.showStepPayloadDiff) {
495
555
  this.detailPaneTab = 'diff';
496
556
  }
557
+ else if (this.showGraphTab) {
558
+ // A TaskGraph step's whole content IS the graph; opening on the JSON would bury the one
559
+ // thing the step exists to show.
560
+ this.detailPaneTab = 'graph';
561
+ }
497
562
  else if (this.showSkillsTab && this.selectedTimelineItem.data?.StepType === 'Skill') {
498
563
  this.detailPaneTab = 'skills';
499
564
  }
@@ -510,6 +575,50 @@ export class AIAgentRunStepDetailComponent {
510
575
  this.cdr.detectChanges();
511
576
  }
512
577
  }
578
+ /**
579
+ * What to say about a step that never executed, or null when it ran.
580
+ *
581
+ * **Why this needs saying at all.** A workflow persists every step at submission, before anything
582
+ * runs — the rows are the dispatcher's work queue, and the skip cascade is computed from the graph
583
+ * they form. So a branch the workflow did not take still has a row, and opening it shows a
584
+ * perfectly normal record with empty payloads. Without a word of explanation the reader is left to
585
+ * work out whether that emptiness is a branch that was not chosen, work still queued, or a step
586
+ * that broke silently — three very different situations that look identical in JSON.
587
+ *
588
+ * The distinction between Skipped and Blocked is load-bearing and deliberately preserved here:
589
+ * `Skipped` means the workflow chose another route, `Blocked` means something upstream failed. The
590
+ * dispatcher separated them precisely because conflating them made every conditional workflow look
591
+ * half-broken.
592
+ */
593
+ get StepNotice() {
594
+ const item = this.selectedTimelineItem;
595
+ if (!item?.data?.IsWorkflowStep)
596
+ return null;
597
+ switch (item.status) {
598
+ case 'Skipped':
599
+ return {
600
+ Variant: 'info',
601
+ Message: 'This step never ran — the workflow took another route. Its row exists because ' +
602
+ 'every step is created when the workflow is submitted, so the record of the branch ' +
603
+ 'that was not taken survives. Nothing went wrong here.',
604
+ };
605
+ case 'Blocked':
606
+ return {
607
+ Variant: 'error',
608
+ Message: 'This step could not run: something it depended on failed, so no path to it was ' +
609
+ 'left. It is not a branch that lost — it is work that became unreachable.',
610
+ };
611
+ case 'Pending':
612
+ return {
613
+ Variant: 'warning',
614
+ Message: 'This step has not started yet. A workflow runs on the dispatcher and outlives the ' +
615
+ 'agent run that submitted it, so a finished run can still contain steps that are ' +
616
+ 'queued or in flight.',
617
+ };
618
+ default:
619
+ return null;
620
+ }
621
+ }
513
622
  getSelectedItemJson() {
514
623
  if (!this.selectedTimelineItem)
515
624
  return '{}';
@@ -651,6 +760,79 @@ export class AIAgentRunStepDetailComponent {
651
760
  GetActivationTypeLabel(inv) {
652
761
  return inv.ActivationType === 'requested' ? 'User Requested' : 'Agent Self-Activated';
653
762
  }
763
+ /**
764
+ * Whether the Workflow tab should be shown — true for a `TaskGraph` step that carries a spec.
765
+ *
766
+ * Phase 3 writes this step for EVERY emitted graph, dispatched or constant-folded, so a folded
767
+ * single-node graph is just as promotable as a dispatched one. That was the point of recording
768
+ * the fold rather than letting it vanish.
769
+ */
770
+ get showGraphTab() {
771
+ return this.stepTaskGraph !== null;
772
+ }
773
+ /**
774
+ * The `TaskGraphSpec` recorded on a `TaskGraph` step, or null.
775
+ *
776
+ * Read from InputData, falling back to OutputData: the step records the spec on the way in, and
777
+ * a malformed or absent payload simply means no tab rather than a broken panel.
778
+ */
779
+ get stepTaskGraph() {
780
+ if (!this.selectedTimelineItem || this.selectedTimelineItem.type !== 'step')
781
+ return null;
782
+ if (this.selectedTimelineItem.data?.StepType !== 'TaskGraph')
783
+ return null;
784
+ for (const raw of [this.selectedTimelineItem.data?.InputData, this.selectedTimelineItem.data?.OutputData]) {
785
+ if (!raw)
786
+ continue;
787
+ try {
788
+ const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;
789
+ const spec = parsed?.spec;
790
+ if (spec?.tasks?.length)
791
+ return spec;
792
+ }
793
+ catch {
794
+ // A step whose payload cannot be parsed shows no tab, which is honest — better than a
795
+ // canvas rendering half a graph.
796
+ }
797
+ }
798
+ return null;
799
+ }
800
+ /**
801
+ * Where the recorded graph's nodes go on the canvas.
802
+ *
803
+ * Without this the editor receives a spec and no geometry, so every node projects to the origin —
804
+ * all of them, in one place. The canvas then rescues it with a deferred layout pass whose
805
+ * zoom-to-fit measures a bounding box one node wide, and a four-step workflow renders as a single
806
+ * enormous box at 265%. The positions exist the whole time: a workflow compiled from a Flow agent
807
+ * carries the arrangement its author dragged into place, on every node.
808
+ */
809
+ get stepTaskGraphPositions() {
810
+ const spec = this.stepTaskGraph;
811
+ if (!spec)
812
+ return null;
813
+ return ResolveTaskGraphPositions(spec);
814
+ }
815
+ /** True when the recorded graph was constant-folded rather than dispatched (D9). */
816
+ get stepTaskGraphWasFolded() {
817
+ if (!this.selectedTimelineItem)
818
+ return false;
819
+ const raw = this.selectedTimelineItem.data?.InputData;
820
+ if (!raw)
821
+ return false;
822
+ try {
823
+ const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;
824
+ return parsed?.folded === true;
825
+ }
826
+ catch {
827
+ return false;
828
+ }
829
+ }
830
+ /** Asks the host to save this run's graph as a reusable workflow. */
831
+ RequestSaveAsWorkflow() {
832
+ const spec = this.stepTaskGraph;
833
+ if (spec)
834
+ this.saveAsWorkflowRequested.emit(spec);
835
+ }
654
836
  /**
655
837
  * Whether the scratchpad tab should be shown (step has scratchpad data in InputData or OutputData)
656
838
  */
@@ -725,16 +907,16 @@ export class AIAgentRunStepDetailComponent {
725
907
  }
726
908
  }
727
909
  static { this.ɵfac = function AIAgentRunStepDetailComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AIAgentRunStepDetailComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; }
728
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AIAgentRunStepDetailComponent, selectors: [["mj-ai-agent-run-step-detail"]], inputs: { selectedTimelineItem: "selectedTimelineItem" }, outputs: { closePanel: "closePanel", navigateToActionLog: "navigateToActionLog", copyToClipboard: "copyToClipboard" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 3, vars: 1, consts: [["scratchpadSnapshotTpl", ""], [1, "json-detail-pane"], [1, "json-pane-header"], [1, "fas", 3, "ngClass"], ["title", "Close", 1, "btn-icon", 3, "click"], [1, "fas", "fa-times"], [1, "json-pane-content"], [1, "json-meta"], [1, "meta-item"], [1, "status-badge", "small"], [1, "action-link"], [1, "detail-pane-tabs"], [1, "detail-pane-content"], [1, "skills-content"], [1, "step-payload-diff"], [1, "scratchpad-content"], [1, "json-viewer"], [1, "btn-link", 3, "click"], [1, "fas", "fa-external-link-alt"], [1, "detail-tab", 3, "active"], [1, "detail-tab", 3, "click"], [1, "fa-solid", "fa-code"], [1, "fa-solid", "fa-code-branch"], [1, "fa-solid", "fa-wand-magic-sparkles"], [1, "tab-badge"], [1, "fa-solid", "fa-clipboard-list"], [1, "skill-invocation-card"], [1, "skill-invocation-header"], [1, "skill-invocation-name"], [1, "skill-invocation-type"], [1, "skill-invocation-reason"], [1, "skill-invocation-provenance"], [1, "provenance-title"], [1, "provenance-row"], [1, "provenance-label"], [1, "provenance-value"], [1, "provenance-value", "provenance-id"], [1, "fa-solid", "fa-quote-left"], [3, "oldValue", "newValue", "title", "showSummary", "showUnchanged", "expandAll", "maxDepth", "maxStringLength", "treatNullAsUndefined"], [1, "scratchpad-sub-tabs"], [1, "scratchpad-sub-tab", 3, "click"], [1, "fa-solid", "fa-code-compare"], [1, "fa-solid", "fa-arrow-right-to-bracket"], [1, "fa-solid", "fa-arrow-right-from-bracket"], [1, "scratchpad-diff-view"], [1, "scratchpad-snapshot-view"], ["Size", "compact", "Icon", "fa-solid fa-circle-info", "Title", "No scratchpad changes in this step"], ["Size", "compact", "Icon", "fa-solid fa-circle-plus", "Title", "Scratchpad created in this step (no prior state)"], [1, "scratchpad-snapshot"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], ["Size", "compact", "Icon", "fa-solid fa-circle-info", "Title", "No scratchpad input for this step"], ["Size", "compact", "Icon", "fa-solid fa-circle-info", "Title", "No scratchpad output for this step"], [1, "json-toolbar"], ["title", "Copy JSON", 1, "btn-icon", 3, "click"], [1, "fas", "fa-copy"], [2, "width", "100%", 3, "ngModelChange", "ngModel", "language", "readonly"], [1, "scratchpad-notes-section"], [1, "scratchpad-tasks-section"], ["Size", "compact", "Icon", "fa-solid fa-circle-info", "Title", "Empty scratchpad"], [1, "fa-solid", "fa-note-sticky"], [1, "scratchpad-notes-content"], [1, "fa-solid", "fa-list-check"], [1, "scratchpad-task-list"], [1, "scratchpad-task-item"], [1, "task-status-indicator"], [1, "fa-solid", "fa-circle-check"], [1, "fa-solid", "fa-spinner"], [1, "fa-solid", "fa-circle-xmark"], [1, "fa-regular", "fa-circle"], [1, "task-content"], [1, "task-id"], [1, "task-title"], [1, "task-notes"], [1, "task-status-badge"]], template: function AIAgentRunStepDetailComponent_Template(rf, ctx) { if (rf & 1) {
729
- i0.ɵɵconditionalCreate(0, AIAgentRunStepDetailComponent_Conditional_0_Template, 31, 14, "div", 1);
910
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AIAgentRunStepDetailComponent, selectors: [["mj-ai-agent-run-step-detail"]], inputs: { selectedTimelineItem: "selectedTimelineItem" }, outputs: { closePanel: "closePanel", navigateToActionLog: "navigateToActionLog", copyToClipboard: "copyToClipboard", saveAsWorkflowRequested: "saveAsWorkflowRequested" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 3, vars: 1, consts: [["scratchpadSnapshotTpl", ""], [1, "json-detail-pane"], [1, "json-pane-header"], [1, "fas", 3, "ngClass"], ["title", "Close", 1, "btn-icon", 3, "click"], [1, "fas", "fa-times"], [1, "json-pane-content"], [1, "json-meta"], [1, "meta-item"], [1, "status-badge", "small"], [1, "step-notice"], [1, "action-link"], [1, "detail-pane-tabs"], [1, "detail-pane-content"], [1, "detail-graph"], [1, "skills-content"], [1, "step-payload-diff"], [1, "scratchpad-content"], [1, "json-viewer"], ["Size", "sm", 3, "Variant", "Message"], [1, "btn-link", 3, "click"], [1, "fas", "fa-external-link-alt"], [1, "detail-tab", 3, "active"], [1, "detail-tab", 3, "click"], [1, "fa-solid", "fa-code"], [1, "fa-solid", "fa-diagram-project"], [1, "fa-solid", "fa-code-branch"], [1, "fa-solid", "fa-wand-magic-sparkles"], [1, "tab-badge"], [1, "fa-solid", "fa-clipboard-list"], [1, "detail-graph__actions"], ["Variant", "info", "Size", "sm", "Message", "This ran inline as a single step \u2014 a workflow of one needs no scheduling. You can still save it."], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click"], [1, "fa-solid", "fa-floppy-disk"], [1, "detail-graph__canvas", 3, "Spec", "NodePositions", "ReadOnly", "ShowPalette"], [1, "skill-invocation-card"], [1, "skill-invocation-header"], [1, "skill-invocation-name"], [1, "skill-invocation-type"], [1, "skill-invocation-reason"], [1, "skill-invocation-provenance"], [1, "provenance-title"], [1, "provenance-row"], [1, "provenance-label"], [1, "provenance-value"], [1, "provenance-value", "provenance-id"], [1, "fa-solid", "fa-quote-left"], [3, "oldValue", "newValue", "title", "showSummary", "showUnchanged", "expandAll", "maxDepth", "maxStringLength", "treatNullAsUndefined"], [1, "scratchpad-sub-tabs"], [1, "scratchpad-sub-tab", 3, "click"], [1, "fa-solid", "fa-code-compare"], [1, "fa-solid", "fa-arrow-right-to-bracket"], [1, "fa-solid", "fa-arrow-right-from-bracket"], [1, "scratchpad-diff-view"], [1, "scratchpad-snapshot-view"], ["Size", "compact", "Icon", "fa-solid fa-circle-info", "Title", "No scratchpad changes in this step"], ["Size", "compact", "Icon", "fa-solid fa-circle-plus", "Title", "Scratchpad created in this step (no prior state)"], [1, "scratchpad-snapshot"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], ["Size", "compact", "Icon", "fa-solid fa-circle-info", "Title", "No scratchpad input for this step"], ["Size", "compact", "Icon", "fa-solid fa-circle-info", "Title", "No scratchpad output for this step"], [1, "json-toolbar"], ["title", "Copy JSON", 1, "btn-icon", 3, "click"], [1, "fas", "fa-copy"], [2, "width", "100%", 3, "ngModelChange", "ngModel", "language", "readonly"], [1, "scratchpad-notes-section"], [1, "scratchpad-tasks-section"], ["Size", "compact", "Icon", "fa-solid fa-circle-info", "Title", "Empty scratchpad"], [1, "fa-solid", "fa-note-sticky"], [1, "scratchpad-notes-content"], [1, "fa-solid", "fa-list-check"], [1, "scratchpad-task-list"], [1, "scratchpad-task-item"], [1, "task-status-indicator"], [1, "fa-solid", "fa-circle-check"], [1, "fa-solid", "fa-spinner"], [1, "fa-solid", "fa-circle-xmark"], [1, "fa-regular", "fa-circle"], [1, "task-content"], [1, "task-id"], [1, "task-title"], [1, "task-notes"], [1, "task-status-badge"]], template: function AIAgentRunStepDetailComponent_Template(rf, ctx) { if (rf & 1) {
911
+ i0.ɵɵconditionalCreate(0, AIAgentRunStepDetailComponent_Conditional_0_Template, 33, 16, "div", 1);
730
912
  i0.ɵɵtemplate(1, AIAgentRunStepDetailComponent_ng_template_1_Template, 4, 3, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
731
913
  } if (rf & 2) {
732
914
  i0.ɵɵconditional(ctx.selectedTimelineItem ? 0 : -1);
733
- } }, dependencies: [i1.NgClass, i1.NgTemplateOutlet, i2.NgControlStatus, i2.NgModel, i3.MJEmptyStateComponent, i4.CodeEditorComponent, i5.DeepDiffComponent], styles: [".json-detail-pane[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n}\n\n.json-pane-header[_ngcontent-%COMP%] {\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: var(--mj-bg-surface-sunken);\n}\n\n.json-pane-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn-icon[_ngcontent-%COMP%] {\n background: none;\n border: none;\n padding: 4px 8px;\n cursor: pointer;\n color: var(--mj-text-muted);\n border-radius: 4px;\n transition: all 0.2s;\n}\n\n.btn-icon[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-text-primary) 5%, transparent);\n color: var(--mj-text-secondary);\n}\n\n.json-pane-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.json-meta[_ngcontent-%COMP%] {\n padding: 16px;\n display: flex;\n gap: 24px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.meta-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.meta-item[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n font-weight: 600;\n}\n\n.meta-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.small[_ngcontent-%COMP%] {\n padding: 2px 6px;\n font-size: 10px;\n}\n\n.status-badge[data-status=\"Running\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-badge[data-status=\"Completed\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-badge[data-status=\"Failed\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-badge[data-status=\"Cancelled\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.action-link[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\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 font-size: 13px;\n}\n\n.btn-link[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.detail-pane-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 0;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n padding: 0 16px;\n}\n\n.detail-tab[_ngcontent-%COMP%] {\n padding: 12px 16px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-muted);\n transition: all 0.2s;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.detail-tab[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-text-primary) 2%, transparent);\n}\n\n.detail-tab.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.detail-pane-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-height: 0; \n\n}\n\n\n\n\n\n\n\n\n.json-viewer[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n position: relative;\n overflow: hidden;\n min-height: 0; \n\n}\n\n.json-toolbar[_ngcontent-%COMP%] {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 10;\n display: flex;\n gap: 4px;\n}\n\n.step-payload-diff[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n min-height: 0; \n\n}\n\n\n\n.json-viewer[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n\n\n.tab-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 9px;\n font-size: 10px;\n font-weight: 700;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n\n\n.scratchpad-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-height: 0;\n}\n\n\n\n.scratchpad-sub-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 0;\n padding: 0 16px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n}\n\n.scratchpad-sub-tab[_ngcontent-%COMP%] {\n padding: 8px 12px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n font-size: 12px;\n color: var(--mj-text-muted);\n transition: all 0.2s;\n display: flex;\n align-items: center;\n gap: 5px;\n}\n\n.scratchpad-sub-tab[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-text-primary) 2%, transparent);\n}\n\n.scratchpad-sub-tab.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n\n\n.scratchpad-diff-view[_ngcontent-%COMP%], \n.scratchpad-snapshot-view[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n min-height: 0;\n}\n\n\n\n.scratchpad-snapshot[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.scratchpad-notes-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%], \n.scratchpad-tasks-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.scratchpad-notes-content[_ngcontent-%COMP%] {\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n border: 1px solid var(--mj-border-subtle);\n font-size: 13px;\n line-height: 1.5;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n\n\n.scratchpad-task-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.scratchpad-task-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 8px 12px;\n border-radius: 6px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n transition: background 0.15s;\n}\n\n.scratchpad-task-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n.task-status-indicator[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 16px;\n margin-top: 2px;\n font-size: 14px;\n}\n\n.task-status-indicator[data-status=\"completed\"][_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.task-status-indicator[data-status=\"in_progress\"][_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.task-status-indicator[data-status=\"blocked\"][_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.task-status-indicator[data-status=\"pending\"][_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n\n\n.task-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.task-id[_ngcontent-%COMP%] {\n font-size: 10px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n}\n\n.task-title[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\n line-height: 1.4;\n}\n\n.task-notes[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n line-height: 1.4;\n font-style: italic;\n}\n\n\n\n.task-status-badge[_ngcontent-%COMP%] {\n flex-shrink: 0;\n padding: 2px 6px;\n border-radius: 4px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n white-space: nowrap;\n}\n\n.task-status-badge[data-status=\"completed\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.task-status-badge[data-status=\"in_progress\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.task-status-badge[data-status=\"blocked\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.task-status-badge[data-status=\"pending\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-text-muted) 15%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n}\n\n\n\n\n\n.skills-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 12px;\n}\n\n.skill-invocation-card[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 12px 14px;\n background: var(--mj-bg-surface);\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n.skill-invocation-card[data-activation=\"auto\"][_ngcontent-%COMP%] {\n border-left-color: var(--mj-status-warning);\n}\n\n.skill-invocation-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.skill-invocation-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.skill-invocation-name[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.skill-invocation-type[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n padding: 2px 10px;\n border-radius: 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.skill-invocation-type[data-activation=\"auto\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text);\n}\n\n.skill-invocation-reason[_ngcontent-%COMP%] {\n margin-top: 8px;\n font-size: 13px;\n font-style: italic;\n color: var(--mj-text-secondary);\n display: flex;\n gap: 8px;\n align-items: baseline;\n}\n\n.skill-invocation-reason[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 10px;\n}\n\n.skill-invocation-provenance[_ngcontent-%COMP%] {\n margin-top: 10px;\n padding-top: 10px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.provenance-title[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n margin-bottom: 6px;\n}\n\n.provenance-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n font-size: 12px;\n padding: 2px 0;\n}\n\n.provenance-label[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n.provenance-value[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.provenance-id[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 11px;\n color: var(--mj-text-muted);\n}"] }); }
915
+ } }, dependencies: [i1.NgClass, i1.NgTemplateOutlet, i2.NgControlStatus, i2.NgModel, i3.MJEmptyStateComponent, i3.MJAlertComponent, i3.MJButtonDirective, i4.CodeEditorComponent, i5.DeepDiffComponent, i6.TaskGraphEditorComponent], styles: [".json-detail-pane[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n}\n\n.json-pane-header[_ngcontent-%COMP%] {\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: var(--mj-bg-surface-sunken);\n}\n\n.json-pane-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn-icon[_ngcontent-%COMP%] {\n background: none;\n border: none;\n padding: 4px 8px;\n cursor: pointer;\n color: var(--mj-text-muted);\n border-radius: 4px;\n transition: all 0.2s;\n}\n\n.btn-icon[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-text-primary) 5%, transparent);\n color: var(--mj-text-secondary);\n}\n\n.json-pane-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.json-meta[_ngcontent-%COMP%] {\n padding: 16px;\n display: flex;\n gap: 24px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.meta-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.meta-item[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n font-weight: 600;\n}\n\n.meta-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.small[_ngcontent-%COMP%] {\n padding: 2px 6px;\n font-size: 10px;\n}\n\n.status-badge[data-status=\"Running\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-badge[data-status=\"Completed\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-badge[data-status=\"Failed\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-badge[data-status=\"Cancelled\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.action-link[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\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 font-size: 13px;\n}\n\n.btn-link[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.detail-pane-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 0;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n padding: 0 16px;\n}\n\n.detail-tab[_ngcontent-%COMP%] {\n padding: 12px 16px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-muted);\n transition: all 0.2s;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.detail-tab[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-text-primary) 2%, transparent);\n}\n\n.detail-tab.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.detail-pane-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-height: 0; \n\n}\n\n\n\n\n\n\n\n\n.json-viewer[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n position: relative;\n overflow: hidden;\n min-height: 0; \n\n}\n\n.json-toolbar[_ngcontent-%COMP%] {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 10;\n display: flex;\n gap: 4px;\n}\n\n.step-payload-diff[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n min-height: 0; \n\n}\n\n\n\n.json-viewer[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n\n\n.tab-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 9px;\n font-size: 10px;\n font-weight: 700;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n\n\n.scratchpad-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-height: 0;\n}\n\n\n\n.scratchpad-sub-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 0;\n padding: 0 16px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n}\n\n.scratchpad-sub-tab[_ngcontent-%COMP%] {\n padding: 8px 12px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n font-size: 12px;\n color: var(--mj-text-muted);\n transition: all 0.2s;\n display: flex;\n align-items: center;\n gap: 5px;\n}\n\n.scratchpad-sub-tab[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-text-primary) 2%, transparent);\n}\n\n.scratchpad-sub-tab.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n\n\n.scratchpad-diff-view[_ngcontent-%COMP%], \n.scratchpad-snapshot-view[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n min-height: 0;\n}\n\n\n\n.scratchpad-snapshot[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.scratchpad-notes-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%], \n.scratchpad-tasks-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.scratchpad-notes-content[_ngcontent-%COMP%] {\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n border: 1px solid var(--mj-border-subtle);\n font-size: 13px;\n line-height: 1.5;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n\n\n.scratchpad-task-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.scratchpad-task-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 8px 12px;\n border-radius: 6px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n transition: background 0.15s;\n}\n\n.scratchpad-task-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n.task-status-indicator[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 16px;\n margin-top: 2px;\n font-size: 14px;\n}\n\n.task-status-indicator[data-status=\"completed\"][_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.task-status-indicator[data-status=\"in_progress\"][_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.task-status-indicator[data-status=\"blocked\"][_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.task-status-indicator[data-status=\"pending\"][_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n\n\n.task-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.task-id[_ngcontent-%COMP%] {\n font-size: 10px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n}\n\n.task-title[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\n line-height: 1.4;\n}\n\n.task-notes[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n line-height: 1.4;\n font-style: italic;\n}\n\n\n\n.task-status-badge[_ngcontent-%COMP%] {\n flex-shrink: 0;\n padding: 2px 6px;\n border-radius: 4px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n white-space: nowrap;\n}\n\n.task-status-badge[data-status=\"completed\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.task-status-badge[data-status=\"in_progress\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.task-status-badge[data-status=\"blocked\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.task-status-badge[data-status=\"pending\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-text-muted) 15%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n}\n\n\n\n\n\n.skills-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 12px;\n}\n\n.skill-invocation-card[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 12px 14px;\n background: var(--mj-bg-surface);\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n.skill-invocation-card[data-activation=\"auto\"][_ngcontent-%COMP%] {\n border-left-color: var(--mj-status-warning);\n}\n\n.skill-invocation-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.skill-invocation-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.skill-invocation-name[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.skill-invocation-type[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n padding: 2px 10px;\n border-radius: 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.skill-invocation-type[data-activation=\"auto\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text);\n}\n\n.skill-invocation-reason[_ngcontent-%COMP%] {\n margin-top: 8px;\n font-size: 13px;\n font-style: italic;\n color: var(--mj-text-secondary);\n display: flex;\n gap: 8px;\n align-items: baseline;\n}\n\n.skill-invocation-reason[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 10px;\n}\n\n.skill-invocation-provenance[_ngcontent-%COMP%] {\n margin-top: 10px;\n padding-top: 10px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.provenance-title[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n margin-bottom: 6px;\n}\n\n.provenance-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n font-size: 12px;\n padding: 2px 0;\n}\n\n.provenance-label[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n.provenance-value[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.provenance-id[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n\n\n.detail-graph[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n}\n\n.detail-graph__actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-sm, 0.5rem);\n padding: var(--mj-space-sm, 0.5rem);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n\n\n.detail-graph__canvas[_ngcontent-%COMP%] {\n flex: 1 1 auto;\n min-height: 0;\n}\n\n\n\n\n.step-notice[_ngcontent-%COMP%] {\n padding: 0 var(--mj-space-3, 12px) var(--mj-space-2, 8px);\n}"] }); }
734
916
  }
735
917
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AIAgentRunStepDetailComponent, [{
736
918
  type: Component,
737
- args: [{ standalone: false, selector: 'mj-ai-agent-run-step-detail', template: "@if (selectedTimelineItem) {\n <div class=\"json-detail-pane\">\n <div class=\"json-pane-header\">\n <h3>\n <i class=\"fas\" [ngClass]=\"selectedTimelineItem.icon\"></i>\n {{ selectedTimelineItem.title }}\n </h3>\n <button class=\"btn-icon\" (click)=\"onClosePanel()\" title=\"Close\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"json-pane-content\">\n <div class=\"json-meta\">\n <div class=\"meta-item\">\n <label>Type</label>\n <span>{{ selectedTimelineItem.type }}</span>\n </div>\n <div class=\"meta-item\">\n <label>Status</label>\n <span class=\"status-badge small\" [attr.data-status]=\"selectedTimelineItem.status\">\n {{ selectedTimelineItem.status }}\n </span>\n </div>\n <div class=\"meta-item\">\n <label>Duration</label>\n <span>{{ selectedTimelineItem.duration || 'N/A' }}</span>\n </div>\n </div>\n <!-- Action-specific link -->\n @if (selectedTimelineItem.type === 'action' && selectedTimelineItem.data?.ID) {\n <div class=\"action-link\">\n <button class=\"btn-link\" (click)=\"onNavigateToActionLog(selectedTimelineItem.data.ID)\">\n <i class=\"fas fa-external-link-alt\"></i> View Action Execution Log\n </button>\n </div>\n }\n <!-- Tab Navigation - Show when we have payload diff or scratchpad data -->\n @if (showStepPayloadDiff || showScratchpadTab || showSkillsTab) {\n <div class=\"detail-pane-tabs\">\n @if (showStepPayloadDiff) {\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'diff'\"\n (click)=\"detailPaneTab = 'diff'\">\n <i class=\"fa-solid fa-code-branch\"></i>\n Payload Changes\n </button>\n }\n @if (showSkillsTab) {\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'skills'\"\n (click)=\"detailPaneTab = 'skills'\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n Skills\n <span class=\"tab-badge\">{{ stepSkillInvocations.length }}</span>\n </button>\n }\n @if (showScratchpadTab) {\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'scratchpad'\"\n (click)=\"detailPaneTab = 'scratchpad'\">\n <i class=\"fa-solid fa-clipboard-list\"></i>\n Scratchpad\n @if (scratchpadTaskChangeCount > 0) {\n <span class=\"tab-badge\">{{ scratchpadTaskChangeCount }}</span>\n }\n </button>\n }\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'json'\"\n (click)=\"detailPaneTab = 'json'\">\n <i class=\"fa-solid fa-code\"></i>\n Full JSON\n </button>\n </div>\n }\n <!-- Tab Content -->\n <div class=\"detail-pane-content\" [class.with-tabs]=\"showStepPayloadDiff || showScratchpadTab || showSkillsTab\">\n <!-- Skills Tab \u2014 skill-invocation observability (activation type, provenance of authority, reason) -->\n @if (detailPaneTab === 'skills' && showSkillsTab) {\n <div class=\"skills-content\">\n @for (inv of stepSkillInvocations; track inv.SkillID) {\n <div class=\"skill-invocation-card\" [attr.data-activation]=\"inv.ActivationType\">\n <div class=\"skill-invocation-header\">\n <span class=\"skill-invocation-name\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n {{ inv.SkillName }}\n </span>\n <span class=\"skill-invocation-type\" [attr.data-activation]=\"inv.ActivationType\">\n {{ GetActivationTypeLabel(inv) }}\n </span>\n </div>\n @if (inv.Reason) {\n <div class=\"skill-invocation-reason\">\n <i class=\"fa-solid fa-quote-left\"></i>\n {{ inv.Reason }}\n </div>\n }\n <div class=\"skill-invocation-provenance\">\n <div class=\"provenance-title\">Provenance of Authority</div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Requested By</span>\n <span class=\"provenance-value\">{{ inv.Provenance.RequestedBy === 'user-request' ? 'User (/skill mention)' : 'Agent decision' }}</span>\n </div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Agent AcceptsSkills</span>\n <span class=\"provenance-value\">{{ inv.Provenance.AgentAcceptsSkills }}</span>\n </div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Skill ActivationMode</span>\n <span class=\"provenance-value\">{{ inv.Provenance.SkillActivationMode }}</span>\n </div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Agent SkillActivationMode</span>\n <span class=\"provenance-value\">{{ inv.Provenance.AgentSkillActivationMode }}</span>\n </div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Skill ID</span>\n <span class=\"provenance-value provenance-id\">{{ inv.SkillID }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n }\n <!-- Payload Diff Tab -->\n @if (detailPaneTab === 'diff' && showStepPayloadDiff) {\n <div class=\"step-payload-diff\">\n <mj-deep-diff\n [oldValue]=\"stepPayloadAtStartObject\"\n [newValue]=\"stepPayloadAtEndObject\"\n [title]=\"''\"\n [showSummary]=\"true\"\n [showUnchanged]=\"false\"\n [expandAll]=\"false\"\n [maxDepth]=\"8\"\n [maxStringLength]=\"150\"\n [treatNullAsUndefined]=\"true\">\n </mj-deep-diff>\n </div>\n }\n <!-- Scratchpad Tab -->\n @if (detailPaneTab === 'scratchpad' && showScratchpadTab) {\n <div class=\"scratchpad-content\">\n <div class=\"scratchpad-sub-tabs\">\n <button\n class=\"scratchpad-sub-tab\"\n [class.active]=\"scratchpadSubTab === 'diff'\"\n (click)=\"scratchpadSubTab = 'diff'\">\n <i class=\"fa-solid fa-code-compare\"></i> Diff\n </button>\n <button\n class=\"scratchpad-sub-tab\"\n [class.active]=\"scratchpadSubTab === 'input'\"\n (click)=\"scratchpadSubTab = 'input'\">\n <i class=\"fa-solid fa-arrow-right-to-bracket\"></i> Input\n </button>\n <button\n class=\"scratchpad-sub-tab\"\n [class.active]=\"scratchpadSubTab === 'output'\"\n (click)=\"scratchpadSubTab = 'output'\">\n <i class=\"fa-solid fa-arrow-right-from-bracket\"></i> Output\n </button>\n </div>\n <!-- Scratchpad Diff Sub-Tab -->\n @if (scratchpadSubTab === 'diff') {\n <div class=\"scratchpad-diff-view\">\n @if (stepScratchpadInput && stepScratchpadOutput) {\n <mj-deep-diff\n [oldValue]=\"stepScratchpadInput\"\n [newValue]=\"stepScratchpadOutput\"\n [title]=\"''\"\n [showSummary]=\"true\"\n [showUnchanged]=\"false\"\n [expandAll]=\"true\"\n [maxDepth]=\"6\"\n [maxStringLength]=\"300\"\n [treatNullAsUndefined]=\"true\">\n </mj-deep-diff>\n } @else if (stepScratchpadOutput) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-plus\"\n Title=\"Scratchpad created in this step (no prior state)\" />\n <div class=\"scratchpad-snapshot\">\n <ng-container *ngTemplateOutlet=\"scratchpadSnapshotTpl; context: { $implicit: stepScratchpadOutput }\"></ng-container>\n </div>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No scratchpad changes in this step\" />\n }\n </div>\n }\n <!-- Scratchpad Input Sub-Tab -->\n @if (scratchpadSubTab === 'input') {\n <div class=\"scratchpad-snapshot-view\">\n @if (stepScratchpadInput) {\n <ng-container *ngTemplateOutlet=\"scratchpadSnapshotTpl; context: { $implicit: stepScratchpadInput }\"></ng-container>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No scratchpad input for this step\" />\n }\n </div>\n }\n <!-- Scratchpad Output Sub-Tab -->\n @if (scratchpadSubTab === 'output') {\n <div class=\"scratchpad-snapshot-view\">\n @if (stepScratchpadOutput) {\n <ng-container *ngTemplateOutlet=\"scratchpadSnapshotTpl; context: { $implicit: stepScratchpadOutput }\"></ng-container>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No scratchpad output for this step\" />\n }\n </div>\n }\n </div>\n }\n <!-- Full JSON Tab -->\n @if (detailPaneTab === 'json' || (!showStepPayloadDiff && !showScratchpadTab)) {\n <div class=\"json-viewer\">\n <div class=\"json-toolbar\">\n <button class=\"btn-icon\" title=\"Copy JSON\" (click)=\"onCopyToClipboard()\">\n <i class=\"fas fa-copy\"></i>\n </button>\n </div>\n <mj-code-editor\n [(ngModel)]=\"selectedItemJsonString\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"width: 100%;\">\n </mj-code-editor>\n </div>\n }\n </div>\n </div>\n </div>\n}\n\n<!-- Reusable scratchpad snapshot template -->\n<ng-template #scratchpadSnapshotTpl let-snapshot>\n <div class=\"scratchpad-snapshot\">\n @if (snapshot.notes) {\n <div class=\"scratchpad-notes-section\">\n <h4><i class=\"fa-solid fa-note-sticky\"></i> Notes</h4>\n <div class=\"scratchpad-notes-content\">{{ snapshot.notes }}</div>\n </div>\n }\n @if (snapshot.tasks?.length > 0) {\n <div class=\"scratchpad-tasks-section\">\n <h4><i class=\"fa-solid fa-list-check\"></i> Tasks ({{ snapshot.tasks.length }})</h4>\n <div class=\"scratchpad-task-list\">\n @for (task of snapshot.tasks; track task.id) {\n <div class=\"scratchpad-task-item\" [attr.data-status]=\"task.status\">\n <span class=\"task-status-indicator\" [attr.data-status]=\"task.status\">\n @switch (task.status) {\n @case ('completed') { <i class=\"fa-solid fa-circle-check\"></i> }\n @case ('in_progress') { <i class=\"fa-solid fa-spinner\"></i> }\n @case ('blocked') { <i class=\"fa-solid fa-circle-xmark\"></i> }\n @default { <i class=\"fa-regular fa-circle\"></i> }\n }\n </span>\n <div class=\"task-content\">\n <span class=\"task-id\">{{ task.id }}</span>\n <span class=\"task-title\">{{ task.title }}</span>\n @if (task.notes) {\n <span class=\"task-notes\">{{ task.notes }}</span>\n }\n </div>\n <span class=\"task-status-badge\" [attr.data-status]=\"task.status\">{{ task.status }}</span>\n </div>\n }\n </div>\n </div>\n }\n @if (!snapshot.notes && (!snapshot.tasks || snapshot.tasks.length === 0)) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"Empty scratchpad\" />\n }\n </div>\n</ng-template>", styles: [".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;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: var(--mj-bg-surface-sunken);\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.btn-icon {\n background: none;\n border: none;\n padding: 4px 8px;\n cursor: pointer;\n color: var(--mj-text-muted);\n border-radius: 4px;\n transition: all 0.2s;\n}\n\n.btn-icon:hover {\n background: color-mix(in srgb, var(--mj-text-primary) 5%, transparent);\n color: var(--mj-text-secondary);\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;\n display: flex;\n gap: 24px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.meta-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.meta-item label {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n font-weight: 600;\n}\n\n.meta-item span {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.status-badge {\n display: inline-flex;\n align-items: center;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.small {\n padding: 2px 6px;\n font-size: 10px;\n}\n\n.status-badge[data-status=\"Running\"] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\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.action-link {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.btn-link {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\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 font-size: 13px;\n}\n\n.btn-link:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.detail-pane-tabs {\n display: flex;\n gap: 0;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n padding: 0 16px;\n}\n\n.detail-tab {\n padding: 12px 16px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-muted);\n transition: all 0.2s;\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%, transparent);\n}\n\n.detail-tab.active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.detail-pane-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-height: 0; /* Allow flexbox to properly size */\n}\n\n/* \n.detail-pane-content.with-tabs {\n // No explicit height needed with flexbox \n} \n*/\n\n.json-viewer {\n flex: 1;\n display: flex;\n flex-direction: column;\n position: relative;\n overflow: hidden;\n min-height: 0; /* Important for flexbox children to respect overflow */\n}\n\n.json-toolbar {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 10;\n display: flex;\n gap: 4px;\n}\n\n.step-payload-diff {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n min-height: 0; /* Allow proper scrolling */\n}\n\n/* Specific styling for mj-code-editor container */\n.json-viewer mj-code-editor {\n flex: 1;\n overflow: hidden;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n/* Tab badge for change count */\n.tab-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 9px;\n font-size: 10px;\n font-weight: 700;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n/* Scratchpad content area */\n.scratchpad-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-height: 0;\n}\n\n/* Scratchpad sub-tabs */\n.scratchpad-sub-tabs {\n display: flex;\n gap: 0;\n padding: 0 16px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n}\n\n.scratchpad-sub-tab {\n padding: 8px 12px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n font-size: 12px;\n color: var(--mj-text-muted);\n transition: all 0.2s;\n display: flex;\n align-items: center;\n gap: 5px;\n}\n\n.scratchpad-sub-tab:hover {\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-text-primary) 2%, transparent);\n}\n\n.scratchpad-sub-tab.active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n/* Scratchpad diff and snapshot views */\n.scratchpad-diff-view,\n.scratchpad-snapshot-view {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n min-height: 0;\n}\n\n/* Scratchpad snapshot rendering */\n.scratchpad-snapshot {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.scratchpad-notes-section h4,\n.scratchpad-tasks-section h4 {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.scratchpad-notes-content {\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n border: 1px solid var(--mj-border-subtle);\n font-size: 13px;\n line-height: 1.5;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n/* Task list */\n.scratchpad-task-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.scratchpad-task-item {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 8px 12px;\n border-radius: 6px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n transition: background 0.15s;\n}\n\n.scratchpad-task-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* Task status indicator icon */\n.task-status-indicator {\n flex-shrink: 0;\n width: 16px;\n margin-top: 2px;\n font-size: 14px;\n}\n\n.task-status-indicator[data-status=\"completed\"] {\n color: var(--mj-status-success);\n}\n\n.task-status-indicator[data-status=\"in_progress\"] {\n color: var(--mj-brand-primary);\n}\n\n.task-status-indicator[data-status=\"blocked\"] {\n color: var(--mj-status-error);\n}\n\n.task-status-indicator[data-status=\"pending\"] {\n color: var(--mj-text-muted);\n}\n\n/* Task content */\n.task-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.task-id {\n font-size: 10px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n}\n\n.task-title {\n font-size: 13px;\n color: var(--mj-text-primary);\n line-height: 1.4;\n}\n\n.task-notes {\n font-size: 12px;\n color: var(--mj-text-secondary);\n line-height: 1.4;\n font-style: italic;\n}\n\n/* Task status badge */\n.task-status-badge {\n flex-shrink: 0;\n padding: 2px 6px;\n border-radius: 4px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n white-space: nowrap;\n}\n\n.task-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.task-status-badge[data-status=\"in_progress\"] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.task-status-badge[data-status=\"blocked\"] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.task-status-badge[data-status=\"pending\"] {\n background: color-mix(in srgb, var(--mj-text-muted) 15%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n}\n\n/* ============================================================\n Skills tab \u2014 skill-invocation observability cards\n ============================================================ */\n.skills-content {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 12px;\n}\n\n.skill-invocation-card {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 12px 14px;\n background: var(--mj-bg-surface);\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n.skill-invocation-card[data-activation=\"auto\"] {\n border-left-color: var(--mj-status-warning);\n}\n\n.skill-invocation-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.skill-invocation-name {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.skill-invocation-name i {\n color: var(--mj-brand-primary);\n}\n\n.skill-invocation-type {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n padding: 2px 10px;\n border-radius: 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.skill-invocation-type[data-activation=\"auto\"] {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text);\n}\n\n.skill-invocation-reason {\n margin-top: 8px;\n font-size: 13px;\n font-style: italic;\n color: var(--mj-text-secondary);\n display: flex;\n gap: 8px;\n align-items: baseline;\n}\n\n.skill-invocation-reason i {\n color: var(--mj-text-muted);\n font-size: 10px;\n}\n\n.skill-invocation-provenance {\n margin-top: 10px;\n padding-top: 10px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.provenance-title {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n margin-bottom: 6px;\n}\n\n.provenance-row {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n font-size: 12px;\n padding: 2px 0;\n}\n\n.provenance-label {\n color: var(--mj-text-secondary);\n}\n\n.provenance-value {\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.provenance-id {\n font-family: monospace;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n"] }]
919
+ args: [{ standalone: false, selector: 'mj-ai-agent-run-step-detail', template: "@if (selectedTimelineItem) {\n <div class=\"json-detail-pane\">\n <div class=\"json-pane-header\">\n <h3>\n <i class=\"fas\" [ngClass]=\"selectedTimelineItem.icon\"></i>\n {{ selectedTimelineItem.title }}\n </h3>\n <button class=\"btn-icon\" (click)=\"onClosePanel()\" title=\"Close\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"json-pane-content\">\n <div class=\"json-meta\">\n <div class=\"meta-item\">\n <label>Type</label>\n <span>{{ selectedTimelineItem.type }}</span>\n </div>\n <div class=\"meta-item\">\n <label>Status</label>\n <span class=\"status-badge small\" [attr.data-status]=\"selectedTimelineItem.status\">\n {{ selectedTimelineItem.status }}\n </span>\n </div>\n <div class=\"meta-item\">\n <label>Duration</label>\n <span>{{ selectedTimelineItem.duration || 'N/A' }}</span>\n </div>\n </div>\n <!-- Why a workflow step has nothing to show: it never ran. Above the tabs, because it explains\n the emptiness the reader is about to look at. -->\n @if (StepNotice) {\n <div class=\"step-notice\">\n <mj-alert [Variant]=\"StepNotice.Variant\" Size=\"sm\" [Message]=\"StepNotice.Message\"></mj-alert>\n </div>\n }\n <!-- Action-specific link -->\n @if (selectedTimelineItem.type === 'action' && selectedTimelineItem.data?.ID) {\n <div class=\"action-link\">\n <button class=\"btn-link\" (click)=\"onNavigateToActionLog(selectedTimelineItem.data.ID)\">\n <i class=\"fas fa-external-link-alt\"></i> View Action Execution Log\n </button>\n </div>\n }\n <!-- Tab Navigation - Show when we have payload diff or scratchpad data -->\n @if (showStepPayloadDiff || showScratchpadTab || showSkillsTab || showGraphTab) {\n <div class=\"detail-pane-tabs\">\n @if (showGraphTab) {\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'graph'\"\n (click)=\"detailPaneTab = 'graph'\">\n <i class=\"fa-solid fa-diagram-project\"></i>\n Workflow\n </button>\n }\n @if (showStepPayloadDiff) {\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'diff'\"\n (click)=\"detailPaneTab = 'diff'\">\n <i class=\"fa-solid fa-code-branch\"></i>\n Payload Changes\n </button>\n }\n @if (showSkillsTab) {\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'skills'\"\n (click)=\"detailPaneTab = 'skills'\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n Skills\n <span class=\"tab-badge\">{{ stepSkillInvocations.length }}</span>\n </button>\n }\n @if (showScratchpadTab) {\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'scratchpad'\"\n (click)=\"detailPaneTab = 'scratchpad'\">\n <i class=\"fa-solid fa-clipboard-list\"></i>\n Scratchpad\n @if (scratchpadTaskChangeCount > 0) {\n <span class=\"tab-badge\">{{ scratchpadTaskChangeCount }}</span>\n }\n </button>\n }\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'json'\"\n (click)=\"detailPaneTab = 'json'\">\n <i class=\"fa-solid fa-code\"></i>\n Full JSON\n </button>\n </div>\n }\n <!-- Tab Content -->\n <div class=\"detail-pane-content\" [class.with-tabs]=\"showStepPayloadDiff || showScratchpadTab || showSkillsTab || showGraphTab\">\n <!-- Skills Tab \u2014 skill-invocation observability (activation type, provenance of authority, reason) -->\n @if (detailPaneTab === 'graph' && showGraphTab) {\n <div class=\"detail-graph\">\n <div class=\"detail-graph__actions\">\n @if (stepTaskGraphWasFolded) {\n <!-- The fold is recorded rather than silent (D9), so the reader can see WHY this\n graph never reached the dispatcher instead of inferring it. -->\n <mj-alert Variant=\"info\" Size=\"sm\"\n Message=\"This ran inline as a single step \u2014 a workflow of one needs no scheduling. You can still save it.\">\n </mj-alert>\n }\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"RequestSaveAsWorkflow()\">\n <i class=\"fa-solid fa-floppy-disk\"></i> Save as Workflow\n </button>\n </div>\n <mj-task-graph-editor\n class=\"detail-graph__canvas\"\n [Spec]=\"stepTaskGraph\"\n [NodePositions]=\"stepTaskGraphPositions\"\n [ReadOnly]=\"true\"\n [ShowPalette]=\"false\">\n </mj-task-graph-editor>\n </div>\n }\n @if (detailPaneTab === 'skills' && showSkillsTab) {\n <div class=\"skills-content\">\n @for (inv of stepSkillInvocations; track inv.SkillID) {\n <div class=\"skill-invocation-card\" [attr.data-activation]=\"inv.ActivationType\">\n <div class=\"skill-invocation-header\">\n <span class=\"skill-invocation-name\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n {{ inv.SkillName }}\n </span>\n <span class=\"skill-invocation-type\" [attr.data-activation]=\"inv.ActivationType\">\n {{ GetActivationTypeLabel(inv) }}\n </span>\n </div>\n @if (inv.Reason) {\n <div class=\"skill-invocation-reason\">\n <i class=\"fa-solid fa-quote-left\"></i>\n {{ inv.Reason }}\n </div>\n }\n <div class=\"skill-invocation-provenance\">\n <div class=\"provenance-title\">Provenance of Authority</div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Requested By</span>\n <span class=\"provenance-value\">{{ inv.Provenance.RequestedBy === 'user-request' ? 'User (/skill mention)' : 'Agent decision' }}</span>\n </div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Agent AcceptsSkills</span>\n <span class=\"provenance-value\">{{ inv.Provenance.AgentAcceptsSkills }}</span>\n </div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Skill ActivationMode</span>\n <span class=\"provenance-value\">{{ inv.Provenance.SkillActivationMode }}</span>\n </div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Agent SkillActivationMode</span>\n <span class=\"provenance-value\">{{ inv.Provenance.AgentSkillActivationMode }}</span>\n </div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Skill ID</span>\n <span class=\"provenance-value provenance-id\">{{ inv.SkillID }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n }\n <!-- Payload Diff Tab -->\n @if (detailPaneTab === 'diff' && showStepPayloadDiff) {\n <div class=\"step-payload-diff\">\n <mj-deep-diff\n [oldValue]=\"stepPayloadAtStartObject\"\n [newValue]=\"stepPayloadAtEndObject\"\n [title]=\"''\"\n [showSummary]=\"true\"\n [showUnchanged]=\"false\"\n [expandAll]=\"false\"\n [maxDepth]=\"8\"\n [maxStringLength]=\"150\"\n [treatNullAsUndefined]=\"true\">\n </mj-deep-diff>\n </div>\n }\n <!-- Scratchpad Tab -->\n @if (detailPaneTab === 'scratchpad' && showScratchpadTab) {\n <div class=\"scratchpad-content\">\n <div class=\"scratchpad-sub-tabs\">\n <button\n class=\"scratchpad-sub-tab\"\n [class.active]=\"scratchpadSubTab === 'diff'\"\n (click)=\"scratchpadSubTab = 'diff'\">\n <i class=\"fa-solid fa-code-compare\"></i> Diff\n </button>\n <button\n class=\"scratchpad-sub-tab\"\n [class.active]=\"scratchpadSubTab === 'input'\"\n (click)=\"scratchpadSubTab = 'input'\">\n <i class=\"fa-solid fa-arrow-right-to-bracket\"></i> Input\n </button>\n <button\n class=\"scratchpad-sub-tab\"\n [class.active]=\"scratchpadSubTab === 'output'\"\n (click)=\"scratchpadSubTab = 'output'\">\n <i class=\"fa-solid fa-arrow-right-from-bracket\"></i> Output\n </button>\n </div>\n <!-- Scratchpad Diff Sub-Tab -->\n @if (scratchpadSubTab === 'diff') {\n <div class=\"scratchpad-diff-view\">\n @if (stepScratchpadInput && stepScratchpadOutput) {\n <mj-deep-diff\n [oldValue]=\"stepScratchpadInput\"\n [newValue]=\"stepScratchpadOutput\"\n [title]=\"''\"\n [showSummary]=\"true\"\n [showUnchanged]=\"false\"\n [expandAll]=\"true\"\n [maxDepth]=\"6\"\n [maxStringLength]=\"300\"\n [treatNullAsUndefined]=\"true\">\n </mj-deep-diff>\n } @else if (stepScratchpadOutput) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-plus\"\n Title=\"Scratchpad created in this step (no prior state)\" />\n <div class=\"scratchpad-snapshot\">\n <ng-container *ngTemplateOutlet=\"scratchpadSnapshotTpl; context: { $implicit: stepScratchpadOutput }\"></ng-container>\n </div>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No scratchpad changes in this step\" />\n }\n </div>\n }\n <!-- Scratchpad Input Sub-Tab -->\n @if (scratchpadSubTab === 'input') {\n <div class=\"scratchpad-snapshot-view\">\n @if (stepScratchpadInput) {\n <ng-container *ngTemplateOutlet=\"scratchpadSnapshotTpl; context: { $implicit: stepScratchpadInput }\"></ng-container>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No scratchpad input for this step\" />\n }\n </div>\n }\n <!-- Scratchpad Output Sub-Tab -->\n @if (scratchpadSubTab === 'output') {\n <div class=\"scratchpad-snapshot-view\">\n @if (stepScratchpadOutput) {\n <ng-container *ngTemplateOutlet=\"scratchpadSnapshotTpl; context: { $implicit: stepScratchpadOutput }\"></ng-container>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No scratchpad output for this step\" />\n }\n </div>\n }\n </div>\n }\n <!-- Full JSON Tab -->\n @if (detailPaneTab === 'json' || (!showStepPayloadDiff && !showScratchpadTab)) {\n <div class=\"json-viewer\">\n <div class=\"json-toolbar\">\n <button class=\"btn-icon\" title=\"Copy JSON\" (click)=\"onCopyToClipboard()\">\n <i class=\"fas fa-copy\"></i>\n </button>\n </div>\n <mj-code-editor\n [(ngModel)]=\"selectedItemJsonString\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"width: 100%;\">\n </mj-code-editor>\n </div>\n }\n </div>\n </div>\n </div>\n}\n\n<!-- Reusable scratchpad snapshot template -->\n<ng-template #scratchpadSnapshotTpl let-snapshot>\n <div class=\"scratchpad-snapshot\">\n @if (snapshot.notes) {\n <div class=\"scratchpad-notes-section\">\n <h4><i class=\"fa-solid fa-note-sticky\"></i> Notes</h4>\n <div class=\"scratchpad-notes-content\">{{ snapshot.notes }}</div>\n </div>\n }\n @if (snapshot.tasks?.length > 0) {\n <div class=\"scratchpad-tasks-section\">\n <h4><i class=\"fa-solid fa-list-check\"></i> Tasks ({{ snapshot.tasks.length }})</h4>\n <div class=\"scratchpad-task-list\">\n @for (task of snapshot.tasks; track task.id) {\n <div class=\"scratchpad-task-item\" [attr.data-status]=\"task.status\">\n <span class=\"task-status-indicator\" [attr.data-status]=\"task.status\">\n @switch (task.status) {\n @case ('completed') { <i class=\"fa-solid fa-circle-check\"></i> }\n @case ('in_progress') { <i class=\"fa-solid fa-spinner\"></i> }\n @case ('blocked') { <i class=\"fa-solid fa-circle-xmark\"></i> }\n @default { <i class=\"fa-regular fa-circle\"></i> }\n }\n </span>\n <div class=\"task-content\">\n <span class=\"task-id\">{{ task.id }}</span>\n <span class=\"task-title\">{{ task.title }}</span>\n @if (task.notes) {\n <span class=\"task-notes\">{{ task.notes }}</span>\n }\n </div>\n <span class=\"task-status-badge\" [attr.data-status]=\"task.status\">{{ task.status }}</span>\n </div>\n }\n </div>\n </div>\n }\n @if (!snapshot.notes && (!snapshot.tasks || snapshot.tasks.length === 0)) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"Empty scratchpad\" />\n }\n </div>\n</ng-template>", styles: [".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;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: var(--mj-bg-surface-sunken);\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.btn-icon {\n background: none;\n border: none;\n padding: 4px 8px;\n cursor: pointer;\n color: var(--mj-text-muted);\n border-radius: 4px;\n transition: all 0.2s;\n}\n\n.btn-icon:hover {\n background: color-mix(in srgb, var(--mj-text-primary) 5%, transparent);\n color: var(--mj-text-secondary);\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;\n display: flex;\n gap: 24px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.meta-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.meta-item label {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n font-weight: 600;\n}\n\n.meta-item span {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.status-badge {\n display: inline-flex;\n align-items: center;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.small {\n padding: 2px 6px;\n font-size: 10px;\n}\n\n.status-badge[data-status=\"Running\"] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\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.action-link {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.btn-link {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\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 font-size: 13px;\n}\n\n.btn-link:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.detail-pane-tabs {\n display: flex;\n gap: 0;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n padding: 0 16px;\n}\n\n.detail-tab {\n padding: 12px 16px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-muted);\n transition: all 0.2s;\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%, transparent);\n}\n\n.detail-tab.active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.detail-pane-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-height: 0; /* Allow flexbox to properly size */\n}\n\n/* \n.detail-pane-content.with-tabs {\n // No explicit height needed with flexbox \n} \n*/\n\n.json-viewer {\n flex: 1;\n display: flex;\n flex-direction: column;\n position: relative;\n overflow: hidden;\n min-height: 0; /* Important for flexbox children to respect overflow */\n}\n\n.json-toolbar {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 10;\n display: flex;\n gap: 4px;\n}\n\n.step-payload-diff {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n min-height: 0; /* Allow proper scrolling */\n}\n\n/* Specific styling for mj-code-editor container */\n.json-viewer mj-code-editor {\n flex: 1;\n overflow: hidden;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n/* Tab badge for change count */\n.tab-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 9px;\n font-size: 10px;\n font-weight: 700;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n/* Scratchpad content area */\n.scratchpad-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-height: 0;\n}\n\n/* Scratchpad sub-tabs */\n.scratchpad-sub-tabs {\n display: flex;\n gap: 0;\n padding: 0 16px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n}\n\n.scratchpad-sub-tab {\n padding: 8px 12px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n font-size: 12px;\n color: var(--mj-text-muted);\n transition: all 0.2s;\n display: flex;\n align-items: center;\n gap: 5px;\n}\n\n.scratchpad-sub-tab:hover {\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-text-primary) 2%, transparent);\n}\n\n.scratchpad-sub-tab.active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n/* Scratchpad diff and snapshot views */\n.scratchpad-diff-view,\n.scratchpad-snapshot-view {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n min-height: 0;\n}\n\n/* Scratchpad snapshot rendering */\n.scratchpad-snapshot {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.scratchpad-notes-section h4,\n.scratchpad-tasks-section h4 {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.scratchpad-notes-content {\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n border: 1px solid var(--mj-border-subtle);\n font-size: 13px;\n line-height: 1.5;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n/* Task list */\n.scratchpad-task-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.scratchpad-task-item {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 8px 12px;\n border-radius: 6px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n transition: background 0.15s;\n}\n\n.scratchpad-task-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* Task status indicator icon */\n.task-status-indicator {\n flex-shrink: 0;\n width: 16px;\n margin-top: 2px;\n font-size: 14px;\n}\n\n.task-status-indicator[data-status=\"completed\"] {\n color: var(--mj-status-success);\n}\n\n.task-status-indicator[data-status=\"in_progress\"] {\n color: var(--mj-brand-primary);\n}\n\n.task-status-indicator[data-status=\"blocked\"] {\n color: var(--mj-status-error);\n}\n\n.task-status-indicator[data-status=\"pending\"] {\n color: var(--mj-text-muted);\n}\n\n/* Task content */\n.task-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.task-id {\n font-size: 10px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n}\n\n.task-title {\n font-size: 13px;\n color: var(--mj-text-primary);\n line-height: 1.4;\n}\n\n.task-notes {\n font-size: 12px;\n color: var(--mj-text-secondary);\n line-height: 1.4;\n font-style: italic;\n}\n\n/* Task status badge */\n.task-status-badge {\n flex-shrink: 0;\n padding: 2px 6px;\n border-radius: 4px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n white-space: nowrap;\n}\n\n.task-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.task-status-badge[data-status=\"in_progress\"] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.task-status-badge[data-status=\"blocked\"] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.task-status-badge[data-status=\"pending\"] {\n background: color-mix(in srgb, var(--mj-text-muted) 15%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n}\n\n/* ============================================================\n Skills tab \u2014 skill-invocation observability cards\n ============================================================ */\n.skills-content {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 12px;\n}\n\n.skill-invocation-card {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 12px 14px;\n background: var(--mj-bg-surface);\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n.skill-invocation-card[data-activation=\"auto\"] {\n border-left-color: var(--mj-status-warning);\n}\n\n.skill-invocation-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.skill-invocation-name {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.skill-invocation-name i {\n color: var(--mj-brand-primary);\n}\n\n.skill-invocation-type {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n padding: 2px 10px;\n border-radius: 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.skill-invocation-type[data-activation=\"auto\"] {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text);\n}\n\n.skill-invocation-reason {\n margin-top: 8px;\n font-size: 13px;\n font-style: italic;\n color: var(--mj-text-secondary);\n display: flex;\n gap: 8px;\n align-items: baseline;\n}\n\n.skill-invocation-reason i {\n color: var(--mj-text-muted);\n font-size: 10px;\n}\n\n.skill-invocation-provenance {\n margin-top: 10px;\n padding-top: 10px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.provenance-title {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n margin-bottom: 6px;\n}\n\n.provenance-row {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n font-size: 12px;\n padding: 2px 0;\n}\n\n.provenance-label {\n color: var(--mj-text-secondary);\n}\n\n.provenance-value {\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.provenance-id {\n font-family: monospace;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n/* Workflow tab \u2014 the recorded task graph, read-only, with the Save as Workflow action. */\n.detail-graph {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n}\n\n.detail-graph__actions {\n display: flex;\n align-items: center;\n gap: var(--mj-space-sm, 0.5rem);\n padding: var(--mj-space-sm, 0.5rem);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n/* min-height:0 is what lets the canvas actually shrink inside the flex column. */\n.detail-graph__canvas {\n flex: 1 1 auto;\n min-height: 0;\n}\n\n/* Explanation for a step that never executed \u2014 see StepNotice. Sits above the tabs because it\n accounts for the emptiness the reader is about to look at. */\n.step-notice {\n padding: 0 var(--mj-space-3, 12px) var(--mj-space-2, 8px);\n}\n"] }]
738
920
  }], () => [{ type: i0.ChangeDetectorRef }], { selectedTimelineItem: [{
739
921
  type: Input
740
922
  }], closePanel: [{
@@ -743,6 +925,8 @@ export class AIAgentRunStepDetailComponent {
743
925
  type: Output
744
926
  }], copyToClipboard: [{
745
927
  type: Output
928
+ }], saveAsWorkflowRequested: [{
929
+ type: Output
746
930
  }] }); })();
747
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIAgentRunStepDetailComponent, { className: "AIAgentRunStepDetailComponent", filePath: "src/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.ts", lineNumber: 22 }); })();
931
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIAgentRunStepDetailComponent, { className: "AIAgentRunStepDetailComponent", filePath: "src/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.ts", lineNumber: 24 }); })();
748
932
  //# sourceMappingURL=ai-agent-run-step-detail.component.js.map