@memberjunction/ng-ai-test-harness 2.58.0 → 2.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,18 +1,16 @@
1
- import { Component, Input, Output, EventEmitter } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
1
+ import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
3
2
  import * as i0 from "@angular/core";
4
- const _forTrack0 = ($index, $item) => $item.id;
5
3
  function ExecutionNodeComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
6
4
  const _r1 = i0.ɵɵgetCurrentView();
7
- i0.ɵɵelementStart(0, "i", 17);
8
- i0.ɵɵlistener("click", function ExecutionNodeComponent_Conditional_2_Template_i_click_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onToggleNode($event)); });
5
+ i0.ɵɵelementStart(0, "i", 19);
6
+ i0.ɵɵlistener("click", function ExecutionNodeComponent_Conditional_2_Template_i_click_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onToggleChildren($event)); });
9
7
  i0.ɵɵelementEnd();
10
8
  } if (rf & 2) {
11
9
  const ctx_r1 = i0.ɵɵnextContext();
12
- i0.ɵɵclassProp("fa-chevron-down", ctx_r1.node.expanded)("fa-chevron-right", !ctx_r1.node.expanded);
10
+ i0.ɵɵclassProp("fa-chevron-down", ctx_r1.expanded)("fa-chevron-right", !ctx_r1.expanded);
13
11
  } }
14
- function ExecutionNodeComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
15
- i0.ɵɵelement(0, "span", 3);
12
+ function ExecutionNodeComponent_Case_4_Template(rf, ctx) { if (rf & 1) {
13
+ i0.ɵɵelement(0, "i", 4);
16
14
  } }
17
15
  function ExecutionNodeComponent_Case_5_Template(rf, ctx) { if (rf & 1) {
18
16
  i0.ɵɵelement(0, "i", 5);
@@ -23,56 +21,62 @@ function ExecutionNodeComponent_Case_6_Template(rf, ctx) { if (rf & 1) {
23
21
  function ExecutionNodeComponent_Case_7_Template(rf, ctx) { if (rf & 1) {
24
22
  i0.ɵɵelement(0, "i", 7);
25
23
  } }
26
- function ExecutionNodeComponent_Case_8_Template(rf, ctx) { if (rf & 1) {
27
- i0.ɵɵelement(0, "i", 8);
24
+ function ExecutionNodeComponent_Case_9_Template(rf, ctx) { if (rf & 1) {
25
+ i0.ɵɵelement(0, "i", 9);
28
26
  } }
29
27
  function ExecutionNodeComponent_Case_10_Template(rf, ctx) { if (rf & 1) {
30
28
  i0.ɵɵelement(0, "i", 10);
31
29
  } }
32
- function ExecutionNodeComponent_Case_11_Template(rf, ctx) { if (rf & 1) {
33
- i0.ɵɵelement(0, "i", 11);
34
- } }
35
- function ExecutionNodeComponent_Case_12_Conditional_0_Template(rf, ctx) { if (rf & 1) {
30
+ function ExecutionNodeComponent_Case_11_Conditional_0_Template(rf, ctx) { if (rf & 1) {
36
31
  i0.ɵɵelement(0, "i");
37
32
  } if (rf & 2) {
38
33
  const ctx_r1 = i0.ɵɵnextContext(2);
39
- i0.ɵɵclassMap(ctx_r1.node.actionIconClass);
34
+ i0.ɵɵclassMap(ctx_r1.getActionIconClass());
40
35
  } }
41
- function ExecutionNodeComponent_Case_12_Conditional_1_Template(rf, ctx) { if (rf & 1) {
42
- i0.ɵɵelement(0, "i", 19);
36
+ function ExecutionNodeComponent_Case_11_Conditional_1_Template(rf, ctx) { if (rf & 1) {
37
+ i0.ɵɵelement(0, "i", 21);
43
38
  } }
44
- function ExecutionNodeComponent_Case_12_Template(rf, ctx) { if (rf & 1) {
45
- i0.ɵɵtemplate(0, ExecutionNodeComponent_Case_12_Conditional_0_Template, 1, 2, "i", 18)(1, ExecutionNodeComponent_Case_12_Conditional_1_Template, 1, 0, "i", 19);
39
+ function ExecutionNodeComponent_Case_11_Template(rf, ctx) { if (rf & 1) {
40
+ i0.ɵɵtemplate(0, ExecutionNodeComponent_Case_11_Conditional_0_Template, 1, 2, "i", 20)(1, ExecutionNodeComponent_Case_11_Conditional_1_Template, 1, 0, "i", 21);
46
41
  } if (rf & 2) {
47
42
  const ctx_r1 = i0.ɵɵnextContext();
48
- i0.ɵɵconditional(ctx_r1.node.actionIconClass ? 0 : 1);
43
+ i0.ɵɵconditional(ctx_r1.getActionIconClass() ? 0 : 1);
49
44
  } }
50
- function ExecutionNodeComponent_Case_13_Conditional_0_Template(rf, ctx) { if (rf & 1) {
51
- i0.ɵɵelement(0, "img", 20);
45
+ function ExecutionNodeComponent_Case_12_Conditional_0_Template(rf, ctx) { if (rf & 1) {
46
+ i0.ɵɵelement(0, "img", 22);
52
47
  } if (rf & 2) {
53
48
  const ctx_r1 = i0.ɵɵnextContext(2);
54
- i0.ɵɵproperty("src", ctx_r1.node.agentLogoURL, i0.ɵɵsanitizeUrl)("alt", ctx_r1.node.agentName || "Agent");
49
+ i0.ɵɵproperty("src", ctx_r1.getAgentLogoURL(), i0.ɵɵsanitizeUrl)("alt", ctx_r1.getAgentName() || "Agent");
55
50
  } }
56
- function ExecutionNodeComponent_Case_13_Conditional_1_Template(rf, ctx) { if (rf & 1) {
51
+ function ExecutionNodeComponent_Case_12_Conditional_1_Template(rf, ctx) { if (rf & 1) {
57
52
  i0.ɵɵelement(0, "i");
58
53
  } if (rf & 2) {
59
54
  const ctx_r1 = i0.ɵɵnextContext(2);
60
- i0.ɵɵclassMap(ctx_r1.node.agentIconClass);
55
+ i0.ɵɵclassMap(ctx_r1.getAgentIconClass());
61
56
  } }
62
- function ExecutionNodeComponent_Case_13_Conditional_2_Template(rf, ctx) { if (rf & 1) {
63
- i0.ɵɵelement(0, "i", 21);
57
+ function ExecutionNodeComponent_Case_12_Conditional_2_Template(rf, ctx) { if (rf & 1) {
58
+ i0.ɵɵelement(0, "i", 23);
64
59
  } }
65
- function ExecutionNodeComponent_Case_13_Template(rf, ctx) { if (rf & 1) {
66
- i0.ɵɵtemplate(0, ExecutionNodeComponent_Case_13_Conditional_0_Template, 1, 2, "img", 20)(1, ExecutionNodeComponent_Case_13_Conditional_1_Template, 1, 2, "i", 18)(2, ExecutionNodeComponent_Case_13_Conditional_2_Template, 1, 0, "i", 21);
60
+ function ExecutionNodeComponent_Case_12_Template(rf, ctx) { if (rf & 1) {
61
+ i0.ɵɵtemplate(0, ExecutionNodeComponent_Case_12_Conditional_0_Template, 1, 2, "img", 22)(1, ExecutionNodeComponent_Case_12_Conditional_1_Template, 1, 2, "i", 20)(2, ExecutionNodeComponent_Case_12_Conditional_2_Template, 1, 0, "i", 23);
67
62
  } if (rf & 2) {
68
63
  const ctx_r1 = i0.ɵɵnextContext();
69
- i0.ɵɵconditional(ctx_r1.node.agentLogoURL ? 0 : ctx_r1.node.agentIconClass ? 1 : 2);
64
+ i0.ɵɵconditional(ctx_r1.getAgentLogoURL() ? 0 : ctx_r1.getAgentIconClass() ? 1 : 2);
65
+ } }
66
+ function ExecutionNodeComponent_Case_13_Template(rf, ctx) { if (rf & 1) {
67
+ i0.ɵɵelement(0, "i", 11);
70
68
  } }
71
69
  function ExecutionNodeComponent_Case_14_Template(rf, ctx) { if (rf & 1) {
72
70
  i0.ɵɵelement(0, "i", 12);
73
71
  } }
74
- function ExecutionNodeComponent_Case_15_Template(rf, ctx) { if (rf & 1) {
75
- i0.ɵɵelement(0, "i", 13);
72
+ function ExecutionNodeComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
73
+ i0.ɵɵelementStart(0, "small", 14);
74
+ i0.ɵɵtext(1);
75
+ i0.ɵɵelementEnd();
76
+ } if (rf & 2) {
77
+ const ctx_r1 = i0.ɵɵnextContext();
78
+ i0.ɵɵadvance();
79
+ i0.ɵɵtextInterpolate1("[Level ", ctx_r1.depth, "]");
76
80
  } }
77
81
  function ExecutionNodeComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
78
82
  i0.ɵɵelementStart(0, "span", 15);
@@ -81,179 +85,192 @@ function ExecutionNodeComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
81
85
  } if (rf & 2) {
82
86
  const ctx_r1 = i0.ɵɵnextContext();
83
87
  i0.ɵɵadvance();
84
- i0.ɵɵtextInterpolate(ctx_r1.formatDuration(ctx_r1.node.duration));
88
+ i0.ɵɵtextInterpolate(ctx_r1.formatDuration(ctx_r1.getDuration()));
85
89
  } }
86
90
  function ExecutionNodeComponent_Conditional_19_Conditional_1_Template(rf, ctx) { if (rf & 1) {
87
- i0.ɵɵelementStart(0, "span", 22);
91
+ i0.ɵɵelementStart(0, "span", 24);
88
92
  i0.ɵɵtext(1);
89
93
  i0.ɵɵelementEnd();
90
94
  } if (rf & 2) {
91
95
  const ctx_r1 = i0.ɵɵnextContext(2);
92
96
  i0.ɵɵadvance();
93
- i0.ɵɵtextInterpolate1("", ctx_r1.node.tokensUsed, " tokens");
97
+ i0.ɵɵtextInterpolate1("", ctx_r1.getTokensUsed(), " tokens");
94
98
  } }
95
99
  function ExecutionNodeComponent_Conditional_19_Conditional_2_Template(rf, ctx) { if (rf & 1) {
96
- i0.ɵɵelementStart(0, "span", 23);
100
+ i0.ɵɵelementStart(0, "span", 25);
97
101
  i0.ɵɵtext(1);
98
102
  i0.ɵɵelementEnd();
99
103
  } if (rf & 2) {
100
104
  const ctx_r1 = i0.ɵɵnextContext(2);
101
105
  i0.ɵɵadvance();
102
- i0.ɵɵtextInterpolate1("$", ctx_r1.node.cost.toFixed(4), "");
106
+ i0.ɵɵtextInterpolate1("$", ctx_r1.getCost().toFixed(4), "");
103
107
  } }
104
108
  function ExecutionNodeComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
105
109
  i0.ɵɵelementStart(0, "span", 16);
106
- i0.ɵɵtemplate(1, ExecutionNodeComponent_Conditional_19_Conditional_1_Template, 2, 1, "span", 22)(2, ExecutionNodeComponent_Conditional_19_Conditional_2_Template, 2, 1, "span", 23);
110
+ i0.ɵɵtemplate(1, ExecutionNodeComponent_Conditional_19_Conditional_1_Template, 2, 1, "span", 24)(2, ExecutionNodeComponent_Conditional_19_Conditional_2_Template, 2, 1, "span", 25);
107
111
  i0.ɵɵelementEnd();
108
112
  } if (rf & 2) {
109
113
  const ctx_r1 = i0.ɵɵnextContext();
110
114
  i0.ɵɵadvance();
111
- i0.ɵɵconditional(ctx_r1.node.tokensUsed ? 1 : -1);
115
+ i0.ɵɵconditional(ctx_r1.getTokensUsed() ? 1 : -1);
116
+ i0.ɵɵadvance();
117
+ i0.ɵɵconditional(ctx_r1.getCost() ? 2 : -1);
118
+ } }
119
+ function ExecutionNodeComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
120
+ const _r3 = i0.ɵɵgetCurrentView();
121
+ i0.ɵɵelementStart(0, "button", 26);
122
+ i0.ɵɵlistener("click", function ExecutionNodeComponent_Conditional_20_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onToggleDetails($event)); });
123
+ i0.ɵɵelement(1, "i", 27);
124
+ i0.ɵɵelementEnd();
125
+ } if (rf & 2) {
126
+ const ctx_r1 = i0.ɵɵnextContext();
127
+ i0.ɵɵproperty("title", ctx_r1.detailsExpanded ? "Hide details" : "Show details");
112
128
  i0.ɵɵadvance();
113
- i0.ɵɵconditional(ctx_r1.node.cost ? 2 : -1);
129
+ i0.ɵɵclassProp("fa-info", !ctx_r1.detailsExpanded)("fa-times", ctx_r1.detailsExpanded);
114
130
  } }
115
- function ExecutionNodeComponent_Conditional_20_Conditional_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
116
- i0.ɵɵelementStart(0, "div", 26);
131
+ function ExecutionNodeComponent_Conditional_21_Conditional_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
132
+ i0.ɵɵelementStart(0, "div", 31);
117
133
  i0.ɵɵtext(1);
118
134
  i0.ɵɵelementEnd();
119
135
  } if (rf & 2) {
120
136
  const ctx_r1 = i0.ɵɵnextContext(3);
121
137
  i0.ɵɵadvance();
122
- i0.ɵɵtextInterpolate(ctx_r1.node.name);
138
+ i0.ɵɵtextInterpolate(ctx_r1.step.StepName);
123
139
  } }
124
- function ExecutionNodeComponent_Conditional_20_Conditional_0_Conditional_2_Template(rf, ctx) { if (rf & 1) {
125
- i0.ɵɵelement(0, "div", 27);
140
+ function ExecutionNodeComponent_Conditional_21_Conditional_0_Conditional_2_Template(rf, ctx) { if (rf & 1) {
141
+ i0.ɵɵelement(0, "div", 32);
126
142
  } if (rf & 2) {
127
143
  const ctx_r1 = i0.ɵɵnextContext(3);
128
- i0.ɵɵproperty("innerHTML", ctx_r1.formatMarkdown(ctx_r1.node.detailsMarkdown), i0.ɵɵsanitizeHtml);
144
+ i0.ɵɵproperty("innerHTML", ctx_r1.formatMarkdown(ctx_r1.getDetailsMarkdown()), i0.ɵɵsanitizeHtml);
129
145
  } }
130
- function ExecutionNodeComponent_Conditional_20_Conditional_0_Template(rf, ctx) { if (rf & 1) {
131
- i0.ɵɵelementStart(0, "div", 24);
132
- i0.ɵɵtemplate(1, ExecutionNodeComponent_Conditional_20_Conditional_0_Conditional_1_Template, 2, 1, "div", 26)(2, ExecutionNodeComponent_Conditional_20_Conditional_0_Conditional_2_Template, 1, 1, "div", 27);
146
+ function ExecutionNodeComponent_Conditional_21_Conditional_0_Template(rf, ctx) { if (rf & 1) {
147
+ i0.ɵɵelementStart(0, "div", 28);
148
+ i0.ɵɵtemplate(1, ExecutionNodeComponent_Conditional_21_Conditional_0_Conditional_1_Template, 2, 1, "div", 31)(2, ExecutionNodeComponent_Conditional_21_Conditional_0_Conditional_2_Template, 1, 1, "div", 32);
133
149
  i0.ɵɵelementEnd();
134
150
  } if (rf & 2) {
135
151
  const ctx_r1 = i0.ɵɵnextContext(2);
136
152
  i0.ɵɵadvance();
137
153
  i0.ɵɵconditional(ctx_r1.isNameTruncated() ? 1 : -1);
138
154
  i0.ɵɵadvance();
139
- i0.ɵɵconditional(ctx_r1.node.detailsMarkdown ? 2 : -1);
155
+ i0.ɵɵconditional(ctx_r1.getDetailsMarkdown() ? 2 : -1);
140
156
  } }
141
- function ExecutionNodeComponent_Conditional_20_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
142
- i0.ɵɵelementStart(0, "div", 28)(1, "div", 30);
143
- i0.ɵɵelement(2, "i", 31);
157
+ function ExecutionNodeComponent_Conditional_21_Conditional_2_Template(rf, ctx) { if (rf & 1) {
158
+ i0.ɵɵelementStart(0, "div", 29)(1, "div", 33);
159
+ i0.ɵɵelement(2, "i", 34);
144
160
  i0.ɵɵtext(3, " Error ");
145
161
  i0.ɵɵelementEnd();
146
- i0.ɵɵelementStart(4, "div", 32);
162
+ i0.ɵɵelementStart(4, "div", 35);
147
163
  i0.ɵɵtext(5);
148
164
  i0.ɵɵelementEnd()();
149
165
  } if (rf & 2) {
150
- const ctx_r1 = i0.ɵɵnextContext(3);
166
+ const ctx_r1 = i0.ɵɵnextContext(2);
151
167
  i0.ɵɵadvance(5);
152
- i0.ɵɵtextInterpolate(ctx_r1.node.error);
168
+ i0.ɵɵtextInterpolate(ctx_r1.step.ErrorMessage);
153
169
  } }
154
- function ExecutionNodeComponent_Conditional_20_Conditional_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
155
- i0.ɵɵelementStart(0, "div", 29)(1, "div", 30);
156
- i0.ɵɵelement(2, "i", 33);
170
+ function ExecutionNodeComponent_Conditional_21_Conditional_3_Template(rf, ctx) { if (rf & 1) {
171
+ i0.ɵɵelementStart(0, "div", 30)(1, "div", 33);
172
+ i0.ɵɵelement(2, "i", 36);
157
173
  i0.ɵɵtext(3, " Input ");
158
174
  i0.ɵɵelementEnd();
159
- i0.ɵɵelementStart(4, "div", 32);
175
+ i0.ɵɵelementStart(4, "div", 35);
160
176
  i0.ɵɵtext(5);
161
177
  i0.ɵɵelementEnd()();
162
178
  } if (rf & 2) {
163
- const ctx_r1 = i0.ɵɵnextContext(3);
179
+ const ctx_r1 = i0.ɵɵnextContext(2);
164
180
  i0.ɵɵadvance(5);
165
- i0.ɵɵtextInterpolate(ctx_r1.node.inputPreview);
181
+ i0.ɵɵtextInterpolate(ctx_r1.getInputPreview());
166
182
  } }
167
- function ExecutionNodeComponent_Conditional_20_Conditional_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
168
- i0.ɵɵelementStart(0, "div", 29)(1, "div", 30);
169
- i0.ɵɵelement(2, "i", 34);
183
+ function ExecutionNodeComponent_Conditional_21_Conditional_4_Template(rf, ctx) { if (rf & 1) {
184
+ i0.ɵɵelementStart(0, "div", 30)(1, "div", 33);
185
+ i0.ɵɵelement(2, "i", 37);
170
186
  i0.ɵɵtext(3, " Output ");
171
187
  i0.ɵɵelementEnd();
172
- i0.ɵɵelementStart(4, "div", 32);
188
+ i0.ɵɵelementStart(4, "div", 35);
173
189
  i0.ɵɵtext(5);
174
190
  i0.ɵɵelementEnd()();
175
191
  } if (rf & 2) {
176
- const ctx_r1 = i0.ɵɵnextContext(3);
192
+ const ctx_r1 = i0.ɵɵnextContext(2);
177
193
  i0.ɵɵadvance(5);
178
- i0.ɵɵtextInterpolate(ctx_r1.node.outputPreview);
194
+ i0.ɵɵtextInterpolate(ctx_r1.getOutputPreview());
179
195
  } }
180
- function ExecutionNodeComponent_Conditional_20_Conditional_1_Template(rf, ctx) { if (rf & 1) {
181
- i0.ɵɵelementStart(0, "div", 25);
182
- i0.ɵɵtemplate(1, ExecutionNodeComponent_Conditional_20_Conditional_1_Conditional_1_Template, 6, 1, "div", 28)(2, ExecutionNodeComponent_Conditional_20_Conditional_1_Conditional_2_Template, 6, 1, "div", 29)(3, ExecutionNodeComponent_Conditional_20_Conditional_1_Conditional_3_Template, 6, 1, "div", 29);
196
+ function ExecutionNodeComponent_Conditional_21_Conditional_5_Template(rf, ctx) { if (rf & 1) {
197
+ i0.ɵɵelementStart(0, "div", 30)(1, "div", 35);
198
+ i0.ɵɵtext(2, "No additional details available for this step.");
199
+ i0.ɵɵelementEnd()();
200
+ } }
201
+ function ExecutionNodeComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
202
+ i0.ɵɵtemplate(0, ExecutionNodeComponent_Conditional_21_Conditional_0_Template, 3, 2, "div", 28);
203
+ i0.ɵɵelementStart(1, "div", 18);
204
+ i0.ɵɵtemplate(2, ExecutionNodeComponent_Conditional_21_Conditional_2_Template, 6, 1, "div", 29)(3, ExecutionNodeComponent_Conditional_21_Conditional_3_Template, 6, 1, "div", 30)(4, ExecutionNodeComponent_Conditional_21_Conditional_4_Template, 6, 1, "div", 30)(5, ExecutionNodeComponent_Conditional_21_Conditional_5_Template, 3, 0, "div", 30);
183
205
  i0.ɵɵelementEnd();
184
206
  } if (rf & 2) {
185
- const ctx_r1 = i0.ɵɵnextContext(2);
186
- i0.ɵɵadvance();
187
- i0.ɵɵconditional(ctx_r1.node.error ? 1 : -1);
207
+ const ctx_r1 = i0.ɵɵnextContext();
208
+ i0.ɵɵconditional(ctx_r1.getDetailsMarkdown() || ctx_r1.isNameTruncated() ? 0 : -1);
209
+ i0.ɵɵadvance(2);
210
+ i0.ɵɵconditional(ctx_r1.step.ErrorMessage ? 2 : -1);
188
211
  i0.ɵɵadvance();
189
- i0.ɵɵconditional(ctx_r1.node.inputPreview ? 2 : -1);
212
+ i0.ɵɵconditional(ctx_r1.getInputPreview() ? 3 : -1);
190
213
  i0.ɵɵadvance();
191
- i0.ɵɵconditional(ctx_r1.node.outputPreview ? 3 : -1);
192
- } }
193
- function ExecutionNodeComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
194
- i0.ɵɵtemplate(0, ExecutionNodeComponent_Conditional_20_Conditional_0_Template, 3, 2, "div", 24)(1, ExecutionNodeComponent_Conditional_20_Conditional_1_Template, 4, 3, "div", 25);
195
- } if (rf & 2) {
196
- const ctx_r1 = i0.ɵɵnextContext();
197
- i0.ɵɵconditional(ctx_r1.node.detailsMarkdown || ctx_r1.isNameTruncated() ? 0 : -1);
214
+ i0.ɵɵconditional(ctx_r1.getOutputPreview() ? 4 : -1);
198
215
  i0.ɵɵadvance();
199
- i0.ɵɵconditional(ctx_r1.node.inputPreview || ctx_r1.node.outputPreview || ctx_r1.node.error ? 1 : -1);
200
- } }
201
- function ExecutionNodeComponent_Conditional_21_For_1_Template(rf, ctx) { if (rf & 1) {
202
- const _r3 = i0.ɵɵgetCurrentView();
203
- i0.ɵɵelementStart(0, "mj-execution-node", 36);
204
- i0.ɵɵlistener("toggleNode", function ExecutionNodeComponent_Conditional_21_For_1_Template_mj_execution_node_toggleNode_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleNode.emit($event)); })("userInteracted", function ExecutionNodeComponent_Conditional_21_For_1_Template_mj_execution_node_userInteracted_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.userInteracted.emit()); });
205
- i0.ɵɵelementEnd();
206
- } if (rf & 2) {
207
- const child_r4 = ctx.$implicit;
208
- i0.ɵɵproperty("node", child_r4);
209
- } }
210
- function ExecutionNodeComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
211
- i0.ɵɵrepeaterCreate(0, ExecutionNodeComponent_Conditional_21_For_1_Template, 1, 1, "mj-execution-node", 35, _forTrack0);
212
- } if (rf & 2) {
213
- const ctx_r1 = i0.ɵɵnextContext();
214
- i0.ɵɵrepeater(ctx_r1.node.children);
216
+ i0.ɵɵconditional(!ctx_r1.step.ErrorMessage && !ctx_r1.getInputPreview() && !ctx_r1.getOutputPreview() && !ctx_r1.getDetailsMarkdown() && !ctx_r1.isNameTruncated() ? 5 : -1);
215
217
  } }
216
218
  export class ExecutionNodeComponent {
217
219
  constructor() {
220
+ this.depth = 0;
221
+ this.agentPath = [];
222
+ this.expanded = false;
223
+ this.detailsExpanded = false;
218
224
  this.toggleNode = new EventEmitter();
225
+ this.toggleDetails = new EventEmitter();
219
226
  this.userInteracted = new EventEmitter();
220
227
  }
221
- hasExpandableContent() {
222
- return !!(this.node.children && this.node.children.length > 0) ||
223
- this.node.type === 'sub-agent' ||
224
- this.node.type === 'action' ||
225
- !!this.node.inputPreview ||
226
- !!this.node.outputPreview ||
227
- !!this.node.error ||
228
- !!this.node.detailsMarkdown;
229
- }
230
228
  hasChildren() {
231
- return !!(this.node.children && this.node.children.length > 0);
229
+ return this.step.StepType === 'Sub-Agent' &&
230
+ !!this.step.SubAgentRun?.Steps &&
231
+ this.step.SubAgentRun.Steps.length > 0;
232
+ }
233
+ onToggleChildren(event) {
234
+ if (event) {
235
+ event.stopPropagation();
236
+ }
237
+ if (this.hasChildren()) {
238
+ this.toggleNode.emit();
239
+ this.userInteracted.emit();
240
+ }
232
241
  }
233
- onToggleNode(event) {
242
+ onToggleDetails(event) {
234
243
  if (event) {
235
244
  event.stopPropagation();
236
245
  }
237
- if (this.hasExpandableContent()) {
238
- this.toggleNode.emit(this.node);
246
+ if (this.hasNodeDetails()) {
247
+ this.toggleDetails.emit();
239
248
  this.userInteracted.emit();
240
249
  }
241
250
  }
242
251
  onDoubleClick() {
243
- if (this.hasExpandableContent()) {
244
- this.toggleNode.emit(this.node);
252
+ if (this.hasChildren()) {
253
+ this.toggleNode.emit();
245
254
  this.userInteracted.emit();
246
255
  }
247
256
  }
257
+ hasNodeDetails() {
258
+ return !!this.step.InputData ||
259
+ !!this.step.OutputData ||
260
+ !!this.step.ErrorMessage ||
261
+ !!this.getDetailsMarkdown() ||
262
+ this.isNameTruncated();
263
+ }
248
264
  getTruncatedName() {
249
265
  const maxLength = 120;
250
- if (this.node.name.length <= maxLength) {
251
- return this.node.name;
266
+ const name = this.getStepName();
267
+ if (name.length <= maxLength) {
268
+ return name;
252
269
  }
253
- return this.node.name.substring(0, maxLength) + '...';
270
+ return name.substring(0, maxLength) + '...';
254
271
  }
255
272
  isNameTruncated() {
256
- return this.node.name.length > 120;
273
+ return this.step.StepName.length > 120;
257
274
  }
258
275
  formatDuration(ms) {
259
276
  if (ms < 1000)
@@ -265,13 +282,170 @@ export class ExecutionNodeComponent {
265
282
  return `${minutes}m ${seconds}s`;
266
283
  }
267
284
  getNodeTitle() {
268
- if (this.node.type === 'sub-agent' && this.node.agentName) {
269
- return `Sub-agent: ${this.node.agentName}`;
285
+ if (this.step.StepType === 'Sub-Agent' && this.getAgentName()) {
286
+ return `Sub-agent: ${this.getAgentName()}`;
287
+ }
288
+ if (this.step.StepType === 'Actions' && this.getActionName()) {
289
+ return `Action: ${this.getActionName()}`;
290
+ }
291
+ return this.step.StepType;
292
+ }
293
+ // Getter methods for step data
294
+ getStepName() {
295
+ // Extract just the first line if the name contains markdown
296
+ const lines = this.step.StepName.split('\n');
297
+ return lines[0].trim();
298
+ }
299
+ getStepTypeClass() {
300
+ const typeMap = {
301
+ 'Validation': 'validation',
302
+ 'Prompt': 'prompt',
303
+ 'Actions': 'action',
304
+ 'Sub-Agent': 'sub-agent',
305
+ 'Decision': 'decision',
306
+ 'Chat': 'chat'
307
+ };
308
+ return typeMap[this.step.StepType] || 'prompt';
309
+ }
310
+ getStatusClass() {
311
+ const statusMap = {
312
+ 'Pending': 'pending',
313
+ 'Running': 'running',
314
+ 'Completed': 'completed',
315
+ 'Failed': 'failed',
316
+ 'Cancelled': 'failed',
317
+ 'Paused': 'pending'
318
+ };
319
+ // Use override if provided, otherwise use actual status
320
+ const status = this.overrideDisplayStatus || this.step.Status;
321
+ return statusMap[status] || 'pending';
322
+ }
323
+ getDuration() {
324
+ if (!this.step.StartedAt || !this.step.CompletedAt)
325
+ return 0;
326
+ return new Date(this.step.CompletedAt).getTime() - new Date(this.step.StartedAt).getTime();
327
+ }
328
+ getTokensUsed() {
329
+ // Check if this is a prompt step with token data
330
+ if (this.step.StepType === 'Prompt' && this.step.PromptRun) {
331
+ return this.step.PromptRun.TokensUsed || undefined;
332
+ }
333
+ return undefined;
334
+ }
335
+ getCost() {
336
+ // Check if this is a prompt step with cost data
337
+ if (this.step.StepType === 'Prompt' && this.step.PromptRun) {
338
+ return this.step.PromptRun.TotalCost || undefined;
339
+ }
340
+ return undefined;
341
+ }
342
+ getDetailsMarkdown() {
343
+ // Check if the step name contains markdown details after the first line
344
+ const lines = this.step.StepName.split('\n');
345
+ if (lines.length > 1) {
346
+ return lines.slice(1).join('\n').trim();
347
+ }
348
+ return undefined;
349
+ }
350
+ getInputPreview() {
351
+ if (!this.step.InputData)
352
+ return undefined;
353
+ try {
354
+ const parsed = JSON.parse(this.step.InputData);
355
+ // Extract meaningful preview
356
+ if (parsed.promptName)
357
+ return `Prompt: ${parsed.promptName}`;
358
+ if (parsed.actionName)
359
+ return `Action: ${parsed.actionName}`;
360
+ if (parsed.subAgentName)
361
+ return `Sub-agent: ${parsed.subAgentName}`;
362
+ if (parsed.message)
363
+ return parsed.message;
364
+ if (parsed.userMessage)
365
+ return parsed.userMessage;
366
+ // Fallback to stringified preview
367
+ const str = JSON.stringify(parsed, null, 2);
368
+ return str.length > 500 ? str.substring(0, 500) + '...' : str;
369
+ }
370
+ catch {
371
+ return typeof this.step.InputData === 'string' ? this.step.InputData : JSON.stringify(this.step.InputData);
372
+ }
373
+ }
374
+ getOutputPreview() {
375
+ if (!this.step.OutputData)
376
+ return undefined;
377
+ try {
378
+ const parsed = JSON.parse(this.step.OutputData);
379
+ // Show action results clearly
380
+ if (parsed.actionResult) {
381
+ const result = parsed.actionResult;
382
+ let preview = '';
383
+ if (result.success !== undefined) {
384
+ preview += `Success: ${result.success}\n`;
385
+ }
386
+ if (result.resultCode) {
387
+ preview += `Result Code: ${result.resultCode}\n`;
388
+ }
389
+ if (result.message) {
390
+ preview += `Message: ${result.message}\n`;
391
+ }
392
+ if (result.result) {
393
+ preview += `Result: ${typeof result.result === 'object' ? JSON.stringify(result.result, null, 2) : result.result}`;
394
+ }
395
+ return preview.trim();
396
+ }
397
+ // Show prompt results
398
+ if (parsed.promptResult) {
399
+ const result = parsed.promptResult;
400
+ let preview = '';
401
+ if (result.success !== undefined) {
402
+ preview += `Success: ${result.success}\n`;
403
+ }
404
+ if (result.content) {
405
+ preview += `Content: ${result.content}`;
406
+ }
407
+ return preview;
408
+ }
409
+ // Fallback
410
+ const str = JSON.stringify(parsed, null, 2);
411
+ return str.length > 500 ? str.substring(0, 500) + '...' : str;
270
412
  }
271
- if (this.node.type === 'action' && this.node.actionName) {
272
- return `Action: ${this.node.actionName}`;
413
+ catch {
414
+ return typeof this.step.OutputData === 'string' ? this.step.OutputData : JSON.stringify(this.step.OutputData);
415
+ }
416
+ }
417
+ // Methods to extract metadata from input/output data
418
+ getAgentName() {
419
+ if (this.step.StepType === 'Sub-Agent' && this.step.SubAgentRun) {
420
+ return this.step.SubAgentRun.Agent || undefined;
421
+ }
422
+ return this.parseMetadata('subAgentName');
423
+ }
424
+ getAgentIconClass() {
425
+ return this.parseMetadata('subAgentIconClass') || this.parseMetadata('agentIconClass');
426
+ }
427
+ getAgentLogoURL() {
428
+ return this.parseMetadata('subAgentLogoURL') || this.parseMetadata('agentLogoURL');
429
+ }
430
+ getActionName() {
431
+ if (this.step.StepType === 'Actions' && this.step.ActionExecutionLog) {
432
+ return this.step.ActionExecutionLog.Action;
433
+ }
434
+ return this.parseMetadata('actionName');
435
+ }
436
+ getActionIconClass() {
437
+ return this.parseMetadata('actionIconClass');
438
+ }
439
+ parseMetadata(key) {
440
+ if (!this.step.InputData)
441
+ return undefined;
442
+ try {
443
+ const parsed = JSON.parse(this.step.InputData);
444
+ return parsed[key];
445
+ }
446
+ catch {
447
+ return undefined;
273
448
  }
274
- return this.node.type;
275
449
  }
276
450
  formatMarkdown(markdown) {
277
451
  // Basic markdown formatting
@@ -302,72 +476,77 @@ export class ExecutionNodeComponent {
302
476
  return html;
303
477
  }
304
478
  static { this.ɵfac = function ExecutionNodeComponent_Factory(t) { return new (t || ExecutionNodeComponent)(); }; }
305
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ExecutionNodeComponent, selectors: [["mj-execution-node"]], inputs: { node: "node" }, outputs: { toggleNode: "toggleNode", userInteracted: "userInteracted" }, standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 22, vars: 15, consts: [[1, "tree-node"], [1, "node-header", 3, "dblclick"], [1, "expand-icon", "fa-solid", 3, "fa-chevron-down", "fa-chevron-right"], [1, "expand-spacer"], [1, "status-icon"], [1, "fa-regular", "fa-circle"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-times-circle"], [1, "type-icon", 3, "title"], [1, "fa-solid", "fa-shield-halved"], [1, "fa-solid", "fa-brain"], [1, "fa-solid", "fa-code-branch"], [1, "fa-solid", "fa-comments"], [1, "node-name"], [1, "node-duration"], [1, "node-metrics"], [1, "expand-icon", "fa-solid", 3, "click"], [3, "class"], [1, "fa-solid", "fa-bolt"], [1, "agent-logo-icon", 3, "src", "alt"], [1, "fa-solid", "fa-sitemap"], [1, "tokens"], [1, "cost"], [1, "markdown-details"], [1, "node-details"], [1, "full-name"], [1, "detail-content", "markdown", 3, "innerHTML"], [1, "detail-section", "error"], [1, "detail-section"], [1, "detail-label"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "detail-content"], [1, "fa-solid", "fa-sign-in-alt"], [1, "fa-solid", "fa-sign-out-alt"], [3, "node"], [3, "toggleNode", "userInteracted", "node"]], template: function ExecutionNodeComponent_Template(rf, ctx) { if (rf & 1) {
479
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ExecutionNodeComponent, selectors: [["mj-execution-node"]], inputs: { step: "step", depth: "depth", agentPath: "agentPath", expanded: "expanded", detailsExpanded: "detailsExpanded", overrideDisplayStatus: "overrideDisplayStatus" }, outputs: { toggleNode: "toggleNode", toggleDetails: "toggleDetails", userInteracted: "userInteracted" }, decls: 22, vars: 20, consts: [[1, "tree-node"], [1, "node-header", 3, "dblclick"], ["title", "Toggle children", 1, "expand-icon", "fa-solid", 3, "fa-chevron-down", "fa-chevron-right"], [1, "status-icon"], [1, "fa-regular", "fa-circle"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-times-circle"], [1, "type-icon", 3, "title"], [1, "fa-solid", "fa-shield-halved"], [1, "fa-solid", "fa-brain"], [1, "fa-solid", "fa-code-branch"], [1, "fa-solid", "fa-comments"], [1, "node-name"], [2, "color", "#666", "margin-right", "8px"], [1, "node-duration"], [1, "node-metrics"], [1, "details-toggle-btn", 3, "title"], [1, "node-details"], ["title", "Toggle children", 1, "expand-icon", "fa-solid", 3, "click"], [3, "class"], [1, "fa-solid", "fa-bolt"], [1, "agent-logo-icon", 3, "src", "alt"], [1, "fa-solid", "fa-sitemap"], [1, "tokens"], [1, "cost"], [1, "details-toggle-btn", 3, "click", "title"], [1, "fa-solid"], [1, "markdown-details"], [1, "detail-section", "error"], [1, "detail-section"], [1, "full-name"], [1, "detail-content", "markdown", 3, "innerHTML"], [1, "detail-label"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "detail-content"], [1, "fa-solid", "fa-sign-in-alt"], [1, "fa-solid", "fa-sign-out-alt"]], template: function ExecutionNodeComponent_Template(rf, ctx) { if (rf & 1) {
306
480
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1);
307
481
  i0.ɵɵlistener("dblclick", function ExecutionNodeComponent_Template_div_dblclick_1_listener() { return ctx.onDoubleClick(); });
308
- i0.ɵɵtemplate(2, ExecutionNodeComponent_Conditional_2_Template, 1, 4, "i", 2)(3, ExecutionNodeComponent_Conditional_3_Template, 1, 0, "span", 3);
309
- i0.ɵɵelementStart(4, "span", 4);
310
- i0.ɵɵtemplate(5, ExecutionNodeComponent_Case_5_Template, 1, 0, "i", 5)(6, ExecutionNodeComponent_Case_6_Template, 1, 0, "i", 6)(7, ExecutionNodeComponent_Case_7_Template, 1, 0, "i", 7)(8, ExecutionNodeComponent_Case_8_Template, 1, 0, "i", 8);
482
+ i0.ɵɵtemplate(2, ExecutionNodeComponent_Conditional_2_Template, 1, 4, "i", 2);
483
+ i0.ɵɵelementStart(3, "span", 3);
484
+ i0.ɵɵtemplate(4, ExecutionNodeComponent_Case_4_Template, 1, 0, "i", 4)(5, ExecutionNodeComponent_Case_5_Template, 1, 0, "i", 5)(6, ExecutionNodeComponent_Case_6_Template, 1, 0, "i", 6)(7, ExecutionNodeComponent_Case_7_Template, 1, 0, "i", 7);
311
485
  i0.ɵɵelementEnd();
312
- i0.ɵɵelementStart(9, "span", 9);
313
- i0.ɵɵtemplate(10, ExecutionNodeComponent_Case_10_Template, 1, 0, "i", 10)(11, ExecutionNodeComponent_Case_11_Template, 1, 0, "i", 11)(12, ExecutionNodeComponent_Case_12_Template, 2, 1)(13, ExecutionNodeComponent_Case_13_Template, 3, 1)(14, ExecutionNodeComponent_Case_14_Template, 1, 0, "i", 12)(15, ExecutionNodeComponent_Case_15_Template, 1, 0, "i", 13);
486
+ i0.ɵɵelementStart(8, "span", 8);
487
+ i0.ɵɵtemplate(9, ExecutionNodeComponent_Case_9_Template, 1, 0, "i", 9)(10, ExecutionNodeComponent_Case_10_Template, 1, 0, "i", 10)(11, ExecutionNodeComponent_Case_11_Template, 2, 1)(12, ExecutionNodeComponent_Case_12_Template, 3, 1)(13, ExecutionNodeComponent_Case_13_Template, 1, 0, "i", 11)(14, ExecutionNodeComponent_Case_14_Template, 1, 0, "i", 12);
314
488
  i0.ɵɵelementEnd();
315
- i0.ɵɵelementStart(16, "span", 14);
489
+ i0.ɵɵelementStart(15, "span", 13);
490
+ i0.ɵɵtemplate(16, ExecutionNodeComponent_Conditional_16_Template, 2, 1, "small", 14);
316
491
  i0.ɵɵtext(17);
317
492
  i0.ɵɵelementEnd();
318
- i0.ɵɵtemplate(18, ExecutionNodeComponent_Conditional_18_Template, 2, 1, "span", 15)(19, ExecutionNodeComponent_Conditional_19_Template, 3, 2, "span", 16);
493
+ i0.ɵɵtemplate(18, ExecutionNodeComponent_Conditional_18_Template, 2, 1, "span", 15)(19, ExecutionNodeComponent_Conditional_19_Template, 3, 2, "span", 16)(20, ExecutionNodeComponent_Conditional_20_Template, 2, 5, "button", 17);
319
494
  i0.ɵɵelementEnd();
320
- i0.ɵɵtemplate(20, ExecutionNodeComponent_Conditional_20_Template, 2, 2)(21, ExecutionNodeComponent_Conditional_21_Template, 2, 0);
495
+ i0.ɵɵtemplate(21, ExecutionNodeComponent_Conditional_21_Template, 6, 5, "div", 18);
321
496
  i0.ɵɵelementEnd();
322
497
  } if (rf & 2) {
323
- let tmp_4_0;
324
498
  let tmp_6_0;
325
- i0.ɵɵstyleProp("margin-left", ctx.node.depth > 0 ? ctx.node.depth * 20 : 0, "px");
326
- i0.ɵɵclassProp("expanded", ctx.node.expanded);
327
- i0.ɵɵadvance(2);
328
- i0.ɵɵconditional(ctx.hasExpandableContent() ? 2 : 3);
499
+ let tmp_8_0;
500
+ i0.ɵɵclassMap("depth-" + ctx.depth + " type-" + ctx.getStepTypeClass());
501
+ i0.ɵɵclassProp("expanded", ctx.expanded)("has-children", ctx.hasChildren())("details-expanded", ctx.detailsExpanded);
329
502
  i0.ɵɵadvance(2);
330
- i0.ɵɵclassMap("status-" + ctx.node.status);
503
+ i0.ɵɵconditional(ctx.hasChildren() ? 2 : -1);
331
504
  i0.ɵɵadvance();
332
- i0.ɵɵconditional((tmp_4_0 = ctx.node.status) === "pending" ? 5 : tmp_4_0 === "running" ? 6 : tmp_4_0 === "completed" ? 7 : tmp_4_0 === "failed" ? 8 : -1);
505
+ i0.ɵɵclassMap("status-" + ctx.getStatusClass());
506
+ i0.ɵɵadvance();
507
+ i0.ɵɵconditional((tmp_6_0 = ctx.getStatusClass()) === "pending" ? 4 : tmp_6_0 === "running" ? 5 : tmp_6_0 === "completed" ? 6 : tmp_6_0 === "failed" ? 7 : -1);
333
508
  i0.ɵɵadvance(4);
334
509
  i0.ɵɵproperty("title", ctx.getNodeTitle());
335
510
  i0.ɵɵadvance();
336
- i0.ɵɵconditional((tmp_6_0 = ctx.node.type) === "validation" ? 10 : tmp_6_0 === "prompt" ? 11 : tmp_6_0 === "action" ? 12 : tmp_6_0 === "sub-agent" ? 13 : tmp_6_0 === "decision" ? 14 : tmp_6_0 === "chat" ? 15 : -1);
511
+ i0.ɵɵconditional((tmp_8_0 = ctx.getStepTypeClass()) === "validation" ? 9 : tmp_8_0 === "prompt" ? 10 : tmp_8_0 === "action" ? 11 : tmp_8_0 === "sub-agent" ? 12 : tmp_8_0 === "decision" ? 13 : tmp_8_0 === "chat" ? 14 : -1);
337
512
  i0.ɵɵadvance(7);
513
+ i0.ɵɵconditional(ctx.step.StepType === "Sub-Agent" && ctx.depth > 0 ? 16 : -1);
514
+ i0.ɵɵadvance();
338
515
  i0.ɵɵtextInterpolate1(" ", ctx.getTruncatedName(), " ");
339
516
  i0.ɵɵadvance();
340
- i0.ɵɵconditional(ctx.node.duration ? 18 : -1);
517
+ i0.ɵɵconditional(ctx.getDuration() ? 18 : -1);
341
518
  i0.ɵɵadvance();
342
- i0.ɵɵconditional(ctx.node.tokensUsed || ctx.node.cost ? 19 : -1);
519
+ i0.ɵɵconditional(ctx.getTokensUsed() || ctx.getCost() ? 19 : -1);
343
520
  i0.ɵɵadvance();
344
- i0.ɵɵconditional(ctx.node.expanded ? 20 : -1);
521
+ i0.ɵɵconditional(ctx.hasNodeDetails() ? 20 : -1);
345
522
  i0.ɵɵadvance();
346
- i0.ɵɵconditional(ctx.node.expanded && ctx.node.children ? 21 : -1);
347
- } }, dependencies: [ExecutionNodeComponent, CommonModule], styles: ["[_nghost-%COMP%] {\n display: block;\n width: 100%;\n }\n \n .tree-node[_ngcontent-%COMP%] {\n margin-bottom: 4px;\n }\n \n .node-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: #f8f9fa;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n transition: all 0.2s ease;\n user-select: none;\n }\n \n .node-header[_ngcontent-%COMP%]:hover {\n background: #e8f0fe;\n border-color: #2196f3;\n }\n \n .expand-icon[_ngcontent-%COMP%] {\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n text-align: center;\n color: #666;\n font-size: 10px;\n cursor: pointer;\n border-radius: 3px;\n transition: all 0.2s ease;\n }\n \n .expand-icon[_ngcontent-%COMP%]:hover {\n background: #e0e0e0;\n color: #333;\n }\n \n .expand-spacer[_ngcontent-%COMP%] {\n width: 20px;\n text-align: center;\n }\n \n .status-icon[_ngcontent-%COMP%] {\n width: 20px;\n text-align: center;\n font-size: 14px;\n }\n \n .status-pending[_ngcontent-%COMP%] { color: #999; }\n .status-running[_ngcontent-%COMP%] { color: #2196f3; }\n .status-completed[_ngcontent-%COMP%] { color: #4caf50; }\n .status-failed[_ngcontent-%COMP%] { color: #f44336; }\n \n .type-icon[_ngcontent-%COMP%] {\n width: 20px;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n color: #666;\n }\n \n .agent-logo-icon[_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n object-fit: cover;\n border-radius: 3px;\n }\n \n .node-name[_ngcontent-%COMP%] {\n flex: 1;\n font-size: 13px;\n font-weight: 500;\n color: #1a1a1a;\n }\n \n \n .node-duration[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #666;\n font-weight: 500;\n }\n \n .node-metrics[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n font-size: 12px;\n }\n \n .tokens[_ngcontent-%COMP%] {\n color: #666;\n }\n \n .cost[_ngcontent-%COMP%] {\n color: #2196f3;\n font-weight: 500;\n }\n \n .node-details[_ngcontent-%COMP%] {\n margin: 8px 0 8px 44px;\n padding: 12px;\n background: #f5f5f5;\n border-radius: 4px;\n font-size: 12px;\n }\n \n .detail-section[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n }\n \n .detail-section[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n }\n \n .detail-section.error[_ngcontent-%COMP%] {\n color: #d32f2f;\n }\n \n .detail-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n margin-bottom: 4px;\n color: #555;\n }\n \n .detail-content[_ngcontent-%COMP%] {\n white-space: pre-wrap;\n word-break: break-word;\n color: #333;\n line-height: 1.4;\n }\n \n .markdown-details[_ngcontent-%COMP%] {\n margin: 8px 0 8px 44px;\n padding: 12px;\n background: #f9f9f9;\n border-left: 3px solid #2196f3;\n border-radius: 0 4px 4px 0;\n font-size: 13px;\n }\n \n .markdown[_ngcontent-%COMP%] h3[_ngcontent-%COMP%], .markdown[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 8px 0 4px 0;\n color: #1a1a1a;\n }\n \n .markdown[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n \n .markdown[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n font-size: 13px;\n }\n \n .markdown[_ngcontent-%COMP%] ul[_ngcontent-%COMP%] {\n margin: 4px 0;\n padding-left: 20px;\n }\n \n .markdown[_ngcontent-%COMP%] li[_ngcontent-%COMP%] {\n margin: 2px 0;\n }\n \n .markdown[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n background: #e8e8e8;\n padding: 1px 4px;\n border-radius: 3px;\n font-size: 12px;\n }\n \n .markdown[_ngcontent-%COMP%] pre[_ngcontent-%COMP%] {\n background: #f5f5f5;\n padding: 8px;\n border-radius: 4px;\n overflow-x: auto;\n margin: 4px 0;\n }\n \n .markdown[_ngcontent-%COMP%] pre[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n background: none;\n padding: 0;\n }\n \n .markdown[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n font-weight: 600;\n color: #1a1a1a;\n }\n \n .markdown[_ngcontent-%COMP%] em[_ngcontent-%COMP%] {\n font-style: italic;\n color: #555;\n }\n \n .full-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: #1a1a1a;\n margin-bottom: 8px;\n padding-bottom: 8px;\n border-bottom: 1px solid #e0e0e0;\n word-wrap: break-word;\n }"] }); }
523
+ i0.ɵɵconditional(ctx.detailsExpanded ? 21 : -1);
524
+ } }, styles: ["[_nghost-%COMP%] {\n display: block;\n width: 100%;\n }\n \n \n\n .tree-node[_ngcontent-%COMP%] {\n margin: 4px 0;\n position: relative;\n }\n \n \n\n .depth-0[_ngcontent-%COMP%] { \n margin-left: 0;\n position: relative;\n z-index: 2;\n }\n .depth-0[_ngcontent-%COMP%]::after {\n display: none;\n }\n .depth-0[_ngcontent-%COMP%] .node-header[_ngcontent-%COMP%] { \n background: #f8f9fa;\n border: 2px solid #e0e0e0;\n font-weight: 600;\n position: relative;\n z-index: 10;\n }\n \n \n\n .depth-1[_ngcontent-%COMP%] {\n margin-left: 24px;\n }\n .depth-1[_ngcontent-%COMP%] .node-header[_ngcontent-%COMP%] {\n background: #fafafa;\n border-color: #d0d0d0;\n }\n \n .depth-2[_ngcontent-%COMP%] {\n margin-left: 48px;\n }\n .depth-2[_ngcontent-%COMP%] .node-header[_ngcontent-%COMP%] {\n background: #fcfcfc;\n border-color: #c0c0c0;\n }\n \n .depth-3[_ngcontent-%COMP%] {\n margin-left: 72px;\n }\n .depth-3[_ngcontent-%COMP%] .node-header[_ngcontent-%COMP%] {\n background: #fdfdfd;\n border-color: #b0b0b0;\n }\n \n .depth-4[_ngcontent-%COMP%] {\n margin-left: 96px;\n }\n .depth-4[_ngcontent-%COMP%] .node-header[_ngcontent-%COMP%] {\n background: #fefefe;\n border-color: #a0a0a0;\n }\n \n .depth-5[_ngcontent-%COMP%] {\n margin-left: 120px;\n }\n .depth-5[_ngcontent-%COMP%] .node-header[_ngcontent-%COMP%] {\n background: #fefefe;\n border-color: #a0a0a0;\n }\n \n .depth-6[_ngcontent-%COMP%] {\n margin-left: 144px;\n }\n .depth-6[_ngcontent-%COMP%] .node-header[_ngcontent-%COMP%] {\n background: #fefefe;\n border-color: #a0a0a0;\n }\n\n \n\n .depth-0[_ngcontent-%COMP%] { \n position: relative;\n overflow: hidden;\n z-index: 2;\n }\n .depth-0[_ngcontent-%COMP%] .node-header[_ngcontent-%COMP%] { \n background: #f8f9fa;\n position: relative;\n z-index: 2;\n }\n \n \n\n .depth-0.has-children[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: 12px;\n top: 0;\n width: 2px;\n height: 100%;\n border-left: 2px dotted #c0c7d0;\n z-index: 0; \n\n }\n \n \n\n .depth-1[_ngcontent-%COMP%] { \n margin-left: 30px;\n padding-left: 12px;\n position: relative;\n z-index: 1;\n }\n .depth-1[_ngcontent-%COMP%] .node-header[_ngcontent-%COMP%] { \n background: #fafbfc;\n position: relative;\n z-index: 1;\n }\n \n \n\n .depth-1[_ngcontent-%COMP%]::after {\n content: '';\n position: absolute;\n left: -15px;\n top: 12px;\n width: 25px;\n height: 2px;\n border-bottom: 2px dotted #c0c7d0;\n z-index: 1;\n }\n \n \n\n .tree-node.details-expanded[_ngcontent-%COMP%] > .node-header[_ngcontent-%COMP%] {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n border-bottom: 1px solid #2196f3;\n }\n \n .node-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n transition: all 0.2s ease;\n user-select: none;\n position: relative;\n z-index: 5;\n background: white;\n }\n \n .node-header[_ngcontent-%COMP%]:hover {\n background: var(--gray-700);\n border-color: var(--mj-blue) !important;\n }\n \n \n\n .tree-node.type-sub-agent[_ngcontent-%COMP%] > .node-header[_ngcontent-%COMP%] {\n border-left: 4px solid var(--mj-blue);\n }\n \n \n\n .tree-node.type-action[_ngcontent-%COMP%] > .node-header[_ngcontent-%COMP%] {\n border-left: 4px solid #4caf50;\n }\n \n .expand-icon[_ngcontent-%COMP%] {\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n text-align: center;\n color: #666;\n font-size: 10px;\n cursor: pointer;\n border-radius: 3px;\n transition: all 0.2s ease;\n z-index: 10; \n\n position: relative;\n }\n \n .expand-icon[_ngcontent-%COMP%]:hover {\n background: #e0e0e0;\n color: #333;\n }\n \n .status-icon[_ngcontent-%COMP%] {\n width: 20px;\n text-align: center;\n font-size: 14px;\n }\n \n .status-pending[_ngcontent-%COMP%] { color: #999; }\n .status-running[_ngcontent-%COMP%] { color: #2196f3; }\n .status-completed[_ngcontent-%COMP%] { color: #4caf50; }\n .status-failed[_ngcontent-%COMP%] { color: #f44336; }\n \n .type-icon[_ngcontent-%COMP%] {\n width: 20px;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n color: #666;\n }\n \n .agent-logo-icon[_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n object-fit: cover;\n border-radius: 3px;\n }\n \n .node-name[_ngcontent-%COMP%] {\n flex: 1;\n font-size: 13px;\n font-weight: 500;\n color: #1a1a1a;\n }\n \n \n .node-duration[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #666;\n font-weight: 500;\n }\n \n .node-metrics[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n font-size: 12px;\n }\n \n .tokens[_ngcontent-%COMP%] {\n color: #666;\n }\n \n .cost[_ngcontent-%COMP%] {\n color: #2196f3;\n font-weight: 500;\n }\n \n \n\n .details-toggle-btn[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 12px;\n color: #666;\n margin-left: 4px;\n }\n \n .details-toggle-btn[_ngcontent-%COMP%]:hover {\n background: #f0f0f0;\n border-color: #2196f3;\n color: #2196f3;\n }\n \n .details-toggle-btn[_ngcontent-%COMP%]:active {\n background: #e3f2fd;\n }\n \n \n\n .tree-node.details-expanded[_ngcontent-%COMP%] .details-toggle-btn[_ngcontent-%COMP%] {\n background: #2196f3;\n border-color: #2196f3;\n color: white;\n }\n \n .tree-node.details-expanded[_ngcontent-%COMP%] .details-toggle-btn[_ngcontent-%COMP%]:hover {\n background: #1976d2;\n border-color: #1976d2;\n }\n \n .node-details[_ngcontent-%COMP%] {\n margin: 0 5px;\n padding: 16px;\n background: var(--gray-600);\n border: 1px solid var(--gray-700);\n border-top: none;\n border-radius: 0 0 6px 6px;\n font-size: 12px;\n position: relative;\n z-index: 4;\n }\n \n .detail-section[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n }\n \n .detail-section[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n }\n \n .detail-section.error[_ngcontent-%COMP%] {\n color: #d32f2f;\n }\n \n .detail-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n margin-bottom: 4px;\n color: #555;\n }\n \n .detail-content[_ngcontent-%COMP%] {\n white-space: pre-wrap;\n word-break: break-word;\n color: #333;\n line-height: 1.4;\n }\n \n .markdown-details[_ngcontent-%COMP%] {\n padding: 16px 16px 0 16px;\n background: var(--gray-600);\n border: 1px solid var(--gray-700);\n border-bottom: none;\n border-top: none;\n margin: 0 5px;\n }\n \n .markdown[_ngcontent-%COMP%] h3[_ngcontent-%COMP%], .markdown[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 8px 0 4px 0;\n color: #1a1a1a;\n }\n \n .markdown[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n \n .markdown[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n font-size: 13px;\n }\n \n .markdown[_ngcontent-%COMP%] ul[_ngcontent-%COMP%] {\n margin: 4px 0;\n padding-left: 20px;\n }\n \n .markdown[_ngcontent-%COMP%] li[_ngcontent-%COMP%] {\n margin: 2px 0;\n }\n \n .markdown[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n background: #e8e8e8;\n padding: 1px 4px;\n border-radius: 3px;\n font-size: 12px;\n }\n \n .markdown[_ngcontent-%COMP%] pre[_ngcontent-%COMP%] {\n background: #f5f5f5;\n padding: 8px;\n border-radius: 4px;\n overflow-x: auto;\n margin: 4px 0;\n }\n \n .markdown[_ngcontent-%COMP%] pre[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n background: none;\n padding: 0;\n }\n \n .markdown[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n font-weight: 600;\n color: #1a1a1a;\n }\n \n .markdown[_ngcontent-%COMP%] em[_ngcontent-%COMP%] {\n font-style: italic;\n color: #555;\n }\n \n .full-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: #1a1a1a;\n padding-bottom: 8px;\n border-bottom: 1px solid #e0e0e0;\n word-wrap: break-word;\n }"], changeDetection: 0 }); }
348
525
  }
349
526
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ExecutionNodeComponent, [{
350
527
  type: Component,
351
- args: [{ selector: 'mj-execution-node', standalone: true, imports: [CommonModule], template: `
528
+ args: [{ selector: 'mj-execution-node', changeDetection: ChangeDetectionStrategy.OnPush, template: `
352
529
  <div class="tree-node"
353
- [class.expanded]="node.expanded"
354
- [style.margin-left.px]="node.depth > 0 ? node.depth * 20 : 0">
530
+ [class.expanded]="expanded"
531
+ [class.has-children]="hasChildren()"
532
+ [class.details-expanded]="detailsExpanded"
533
+ [class]="'depth-' + depth + ' type-' + getStepTypeClass()">
355
534
 
356
535
  <!-- Node Header -->
357
- <div class="node-header" (dblclick)="onDoubleClick()">
358
- <!-- Expand/Collapse Icon -->
359
- @if (hasExpandableContent()) {
536
+ <div class="node-header"
537
+ (dblclick)="onDoubleClick()">
538
+ <!-- Expand/Collapse Icon - Only show if node has children -->
539
+ @if (hasChildren()) {
360
540
  <i class="expand-icon fa-solid"
361
- [class.fa-chevron-down]="node.expanded"
362
- [class.fa-chevron-right]="!node.expanded"
363
- (click)="onToggleNode($event)"></i>
364
- } @else {
365
- <span class="expand-spacer"></span>
541
+ [class.fa-chevron-down]="expanded"
542
+ [class.fa-chevron-right]="!expanded"
543
+ (click)="onToggleChildren($event)"
544
+ title="Toggle children"></i>
366
545
  }
367
546
 
368
547
  <!-- Status Icon -->
369
- <span class="status-icon" [class]="'status-' + node.status">
370
- @switch (node.status) {
548
+ <span class="status-icon" [class]="'status-' + getStatusClass()">
549
+ @switch (getStatusClass()) {
371
550
  @case ('pending') {
372
551
  <i class="fa-regular fa-circle"></i>
373
552
  }
@@ -385,7 +564,7 @@ export class ExecutionNodeComponent {
385
564
 
386
565
  <!-- Type Icon -->
387
566
  <span class="type-icon" [title]="getNodeTitle()">
388
- @switch (node.type) {
567
+ @switch (getStepTypeClass()) {
389
568
  @case ('validation') {
390
569
  <i class="fa-solid fa-shield-halved"></i>
391
570
  }
@@ -393,17 +572,17 @@ export class ExecutionNodeComponent {
393
572
  <i class="fa-solid fa-brain"></i>
394
573
  }
395
574
  @case ('action') {
396
- @if (node.actionIconClass) {
397
- <i [class]="node.actionIconClass"></i>
575
+ @if (getActionIconClass()) {
576
+ <i [class]="getActionIconClass()"></i>
398
577
  } @else {
399
578
  <i class="fa-solid fa-bolt"></i>
400
579
  }
401
580
  }
402
581
  @case ('sub-agent') {
403
- @if (node.agentLogoURL) {
404
- <img [src]="node.agentLogoURL" [alt]="node.agentName || 'Agent'" class="agent-logo-icon">
405
- } @else if (node.agentIconClass) {
406
- <i [class]="node.agentIconClass"></i>
582
+ @if (getAgentLogoURL()) {
583
+ <img [src]="getAgentLogoURL()" [alt]="getAgentName() || 'Agent'" class="agent-logo-icon">
584
+ } @else if (getAgentIconClass()) {
585
+ <i [class]="getAgentIconClass()"></i>
407
586
  } @else {
408
587
  <i class="fa-solid fa-sitemap"></i>
409
588
  }
@@ -417,91 +596,112 @@ export class ExecutionNodeComponent {
417
596
  }
418
597
  </span>
419
598
 
420
- <!-- Node Name -->
599
+ <!-- Node Name with depth indicator for sub-agents -->
421
600
  <span class="node-name">
601
+ @if (step.StepType === 'Sub-Agent' && depth > 0) {
602
+ <small style="color: #666; margin-right: 8px;">[Level {{ depth }}]</small>
603
+ }
422
604
  {{ getTruncatedName() }}
423
605
  </span>
424
606
 
425
607
  <!-- Duration -->
426
- @if (node.duration) {
427
- <span class="node-duration">{{ formatDuration(node.duration) }}</span>
608
+ @if (getDuration()) {
609
+ <span class="node-duration">{{ formatDuration(getDuration()) }}</span>
428
610
  }
429
611
 
430
612
  <!-- Tokens/Cost -->
431
- @if (node.tokensUsed || node.cost) {
613
+ @if (getTokensUsed() || getCost()) {
432
614
  <span class="node-metrics">
433
- @if (node.tokensUsed) {
434
- <span class="tokens">{{ node.tokensUsed }} tokens</span>
615
+ @if (getTokensUsed()) {
616
+ <span class="tokens">{{ getTokensUsed() }} tokens</span>
435
617
  }
436
- @if (node.cost) {
437
- <span class="cost">\${{ node.cost.toFixed(4) }}</span>
618
+ @if (getCost()) {
619
+ <span class="cost">\${{ getCost()!.toFixed(4) }}</span>
438
620
  }
439
621
  </span>
440
622
  }
623
+
624
+ <!-- Details Toggle Button - Only show if node has details -->
625
+ @if (hasNodeDetails()) {
626
+ <button class="details-toggle-btn"
627
+ (click)="onToggleDetails($event)"
628
+ [title]="detailsExpanded ? 'Hide details' : 'Show details'">
629
+ <i class="fa-solid"
630
+ [class.fa-info]="!detailsExpanded"
631
+ [class.fa-times]="detailsExpanded"></i>
632
+ </button>
633
+ }
441
634
  </div>
442
635
 
443
- <!-- All Details (when expanded) -->
444
- @if (node.expanded) {
636
+ <!-- Node Details (when details are expanded) -->
637
+ @if (detailsExpanded) {
445
638
  <!-- Show markdown details first if available -->
446
- @if (node.detailsMarkdown || isNameTruncated()) {
639
+ @if (getDetailsMarkdown() || isNameTruncated()) {
447
640
  <div class="markdown-details">
448
641
  @if (isNameTruncated()) {
449
- <div class="full-name">{{ node.name }}</div>
642
+ <div class="full-name">{{ step.StepName }}</div>
450
643
  }
451
- @if (node.detailsMarkdown) {
452
- <div class="detail-content markdown" [innerHTML]="formatMarkdown(node.detailsMarkdown)"></div>
644
+ @if (getDetailsMarkdown()) {
645
+ <div class="detail-content markdown" [innerHTML]="formatMarkdown(getDetailsMarkdown()!)"></div>
453
646
  }
454
647
  </div>
455
648
  }
456
649
 
457
- @if (node.inputPreview || node.outputPreview || node.error) {
650
+ <!-- Always show details section if node is expanded, even if some content is empty -->
458
651
  <div class="node-details">
459
- @if (node.error) {
652
+ @if (step.ErrorMessage) {
460
653
  <div class="detail-section error">
461
654
  <div class="detail-label">
462
655
  <i class="fa-solid fa-exclamation-triangle"></i> Error
463
656
  </div>
464
- <div class="detail-content">{{ node.error }}</div>
657
+ <div class="detail-content">{{ step.ErrorMessage }}</div>
465
658
  </div>
466
659
  }
467
- @if (node.inputPreview) {
660
+ @if (getInputPreview()) {
468
661
  <div class="detail-section">
469
662
  <div class="detail-label">
470
663
  <i class="fa-solid fa-sign-in-alt"></i> Input
471
664
  </div>
472
- <div class="detail-content">{{ node.inputPreview }}</div>
665
+ <div class="detail-content">{{ getInputPreview() }}</div>
473
666
  </div>
474
667
  }
475
- @if (node.outputPreview) {
668
+ @if (getOutputPreview()) {
476
669
  <div class="detail-section">
477
670
  <div class="detail-label">
478
671
  <i class="fa-solid fa-sign-out-alt"></i> Output
479
672
  </div>
480
- <div class="detail-content">{{ node.outputPreview }}</div>
673
+ <div class="detail-content">{{ getOutputPreview() }}</div>
674
+ </div>
675
+ }
676
+ @if (!step.ErrorMessage && !getInputPreview() && !getOutputPreview() && !getDetailsMarkdown() && !isNameTruncated()) {
677
+ <div class="detail-section">
678
+ <div class="detail-content">No additional details available for this step.</div>
481
679
  </div>
482
680
  }
483
681
  </div>
484
- }
485
682
  }
486
683
 
487
- <!-- Children (when expanded) -->
488
- @if (node.expanded && node.children) {
489
- @for (child of node.children; track child.id) {
490
- <mj-execution-node
491
- [node]="child"
492
- (toggleNode)="toggleNode.emit($event)"
493
- (userInteracted)="userInteracted.emit()">
494
- </mj-execution-node>
495
- }
496
- }
684
+ <!-- Note: Sub-agent children are rendered by the parent component to maintain proper depth tracking -->
497
685
  </div>
498
- `, styles: ["\n :host {\n display: block;\n width: 100%;\n }\n \n .tree-node {\n margin-bottom: 4px;\n }\n \n .node-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: #f8f9fa;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n transition: all 0.2s ease;\n user-select: none;\n }\n \n .node-header:hover {\n background: #e8f0fe;\n border-color: #2196f3;\n }\n \n .expand-icon {\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n text-align: center;\n color: #666;\n font-size: 10px;\n cursor: pointer;\n border-radius: 3px;\n transition: all 0.2s ease;\n }\n \n .expand-icon:hover {\n background: #e0e0e0;\n color: #333;\n }\n \n .expand-spacer {\n width: 20px;\n text-align: center;\n }\n \n .status-icon {\n width: 20px;\n text-align: center;\n font-size: 14px;\n }\n \n .status-pending { color: #999; }\n .status-running { color: #2196f3; }\n .status-completed { color: #4caf50; }\n .status-failed { color: #f44336; }\n \n .type-icon {\n width: 20px;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n color: #666;\n }\n \n .agent-logo-icon {\n width: 16px;\n height: 16px;\n object-fit: cover;\n border-radius: 3px;\n }\n \n .node-name {\n flex: 1;\n font-size: 13px;\n font-weight: 500;\n color: #1a1a1a;\n }\n \n \n .node-duration {\n font-size: 12px;\n color: #666;\n font-weight: 500;\n }\n \n .node-metrics {\n display: flex;\n gap: 12px;\n font-size: 12px;\n }\n \n .tokens {\n color: #666;\n }\n \n .cost {\n color: #2196f3;\n font-weight: 500;\n }\n \n .node-details {\n margin: 8px 0 8px 44px;\n padding: 12px;\n background: #f5f5f5;\n border-radius: 4px;\n font-size: 12px;\n }\n \n .detail-section {\n margin-bottom: 8px;\n }\n \n .detail-section:last-child {\n margin-bottom: 0;\n }\n \n .detail-section.error {\n color: #d32f2f;\n }\n \n .detail-label {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n margin-bottom: 4px;\n color: #555;\n }\n \n .detail-content {\n white-space: pre-wrap;\n word-break: break-word;\n color: #333;\n line-height: 1.4;\n }\n \n .markdown-details {\n margin: 8px 0 8px 44px;\n padding: 12px;\n background: #f9f9f9;\n border-left: 3px solid #2196f3;\n border-radius: 0 4px 4px 0;\n font-size: 13px;\n }\n \n .markdown h3, .markdown h4 {\n margin: 8px 0 4px 0;\n color: #1a1a1a;\n }\n \n .markdown h3 {\n font-size: 14px;\n }\n \n .markdown h4 {\n font-size: 13px;\n }\n \n .markdown ul {\n margin: 4px 0;\n padding-left: 20px;\n }\n \n .markdown li {\n margin: 2px 0;\n }\n \n .markdown code {\n background: #e8e8e8;\n padding: 1px 4px;\n border-radius: 3px;\n font-size: 12px;\n }\n \n .markdown pre {\n background: #f5f5f5;\n padding: 8px;\n border-radius: 4px;\n overflow-x: auto;\n margin: 4px 0;\n }\n \n .markdown pre code {\n background: none;\n padding: 0;\n }\n \n .markdown strong {\n font-weight: 600;\n color: #1a1a1a;\n }\n \n .markdown em {\n font-style: italic;\n color: #555;\n }\n \n .full-name {\n font-weight: 600;\n color: #1a1a1a;\n margin-bottom: 8px;\n padding-bottom: 8px;\n border-bottom: 1px solid #e0e0e0;\n word-wrap: break-word;\n }\n "] }]
499
- }], null, { node: [{
686
+ `, styles: ["\n :host {\n display: block;\n width: 100%;\n }\n \n /* Depth-based indentation - each level indents by 24px */\n .tree-node {\n margin: 4px 0;\n position: relative;\n }\n \n /* Root level nodes (depth 0) */\n .depth-0 { \n margin-left: 0;\n position: relative;\n z-index: 2;\n }\n .depth-0::after {\n display: none;\n }\n .depth-0 .node-header { \n background: #f8f9fa;\n border: 2px solid #e0e0e0;\n font-weight: 600;\n position: relative;\n z-index: 10;\n }\n \n /* Sub-level nodes with increasing indentation */\n .depth-1 {\n margin-left: 24px;\n }\n .depth-1 .node-header {\n background: #fafafa;\n border-color: #d0d0d0;\n }\n \n .depth-2 {\n margin-left: 48px;\n }\n .depth-2 .node-header {\n background: #fcfcfc;\n border-color: #c0c0c0;\n }\n \n .depth-3 {\n margin-left: 72px;\n }\n .depth-3 .node-header {\n background: #fdfdfd;\n border-color: #b0b0b0;\n }\n \n .depth-4 {\n margin-left: 96px;\n }\n .depth-4 .node-header {\n background: #fefefe;\n border-color: #a0a0a0;\n }\n \n .depth-5 {\n margin-left: 120px;\n }\n .depth-5 .node-header {\n background: #fefefe;\n border-color: #a0a0a0;\n }\n \n .depth-6 {\n margin-left: 144px;\n }\n .depth-6 .node-header {\n background: #fefefe;\n border-color: #a0a0a0;\n }\n\n /* Root level - higher z-index to hide lines behind it */\n .depth-0 { \n position: relative;\n overflow: hidden;\n z-index: 2;\n }\n .depth-0 .node-header { \n background: #f8f9fa;\n position: relative;\n z-index: 2;\n }\n \n /* Only add left padding for nodes with children (that show chevrons) */\n .depth-0.has-children::before {\n content: '';\n position: absolute;\n left: 12px;\n top: 0;\n width: 2px;\n height: 100%;\n border-left: 2px dotted #c0c7d0;\n z-index: 0; /* Behind everything */\n }\n \n /* Child level - only for nodes that actually have parent chevrons */\n .depth-1 { \n margin-left: 30px;\n padding-left: 12px;\n position: relative;\n z-index: 1;\n }\n .depth-1 .node-header { \n background: #fafbfc;\n position: relative;\n z-index: 1;\n }\n \n /* Horizontal line connecting to each child node - only when parent has children */\n .depth-1::after {\n content: '';\n position: absolute;\n left: -15px;\n top: 12px;\n width: 25px;\n height: 2px;\n border-bottom: 2px dotted #c0c7d0;\n z-index: 1;\n }\n \n /* Visual indicator when details are expanded */\n .tree-node.details-expanded > .node-header {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n border-bottom: 1px solid #2196f3;\n }\n \n .node-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n transition: all 0.2s ease;\n user-select: none;\n position: relative;\n z-index: 5;\n background: white;\n }\n \n .node-header:hover {\n background: var(--gray-700);\n border-color: var(--mj-blue) !important;\n }\n \n /* Sub-agent specific styling */\n .tree-node.type-sub-agent > .node-header {\n border-left: 4px solid var(--mj-blue);\n }\n \n /* Action specific styling */\n .tree-node.type-action > .node-header {\n border-left: 4px solid #4caf50;\n }\n \n .expand-icon {\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n text-align: center;\n color: #666;\n font-size: 10px;\n cursor: pointer;\n border-radius: 3px;\n transition: all 0.2s ease;\n z-index: 10; /* Ensure expand icon is clickable */\n position: relative;\n }\n \n .expand-icon:hover {\n background: #e0e0e0;\n color: #333;\n }\n \n .status-icon {\n width: 20px;\n text-align: center;\n font-size: 14px;\n }\n \n .status-pending { color: #999; }\n .status-running { color: #2196f3; }\n .status-completed { color: #4caf50; }\n .status-failed { color: #f44336; }\n \n .type-icon {\n width: 20px;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n color: #666;\n }\n \n .agent-logo-icon {\n width: 16px;\n height: 16px;\n object-fit: cover;\n border-radius: 3px;\n }\n \n .node-name {\n flex: 1;\n font-size: 13px;\n font-weight: 500;\n color: #1a1a1a;\n }\n \n \n .node-duration {\n font-size: 12px;\n color: #666;\n font-weight: 500;\n }\n \n .node-metrics {\n display: flex;\n gap: 12px;\n font-size: 12px;\n }\n \n .tokens {\n color: #666;\n }\n \n .cost {\n color: #2196f3;\n font-weight: 500;\n }\n \n /* Details Toggle Button */\n .details-toggle-btn {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 12px;\n color: #666;\n margin-left: 4px;\n }\n \n .details-toggle-btn:hover {\n background: #f0f0f0;\n border-color: #2196f3;\n color: #2196f3;\n }\n \n .details-toggle-btn:active {\n background: #e3f2fd;\n }\n \n /* When details are expanded, style the button differently */\n .tree-node.details-expanded .details-toggle-btn {\n background: #2196f3;\n border-color: #2196f3;\n color: white;\n }\n \n .tree-node.details-expanded .details-toggle-btn:hover {\n background: #1976d2;\n border-color: #1976d2;\n }\n \n .node-details {\n margin: 0 5px;\n padding: 16px;\n background: var(--gray-600);\n border: 1px solid var(--gray-700);\n border-top: none;\n border-radius: 0 0 6px 6px;\n font-size: 12px;\n position: relative;\n z-index: 4;\n }\n \n .detail-section {\n margin-bottom: 8px;\n }\n \n .detail-section:last-child {\n margin-bottom: 0;\n }\n \n .detail-section.error {\n color: #d32f2f;\n }\n \n .detail-label {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n margin-bottom: 4px;\n color: #555;\n }\n \n .detail-content {\n white-space: pre-wrap;\n word-break: break-word;\n color: #333;\n line-height: 1.4;\n }\n \n .markdown-details {\n padding: 16px 16px 0 16px;\n background: var(--gray-600);\n border: 1px solid var(--gray-700);\n border-bottom: none;\n border-top: none;\n margin: 0 5px;\n }\n \n .markdown h3, .markdown h4 {\n margin: 8px 0 4px 0;\n color: #1a1a1a;\n }\n \n .markdown h3 {\n font-size: 14px;\n }\n \n .markdown h4 {\n font-size: 13px;\n }\n \n .markdown ul {\n margin: 4px 0;\n padding-left: 20px;\n }\n \n .markdown li {\n margin: 2px 0;\n }\n \n .markdown code {\n background: #e8e8e8;\n padding: 1px 4px;\n border-radius: 3px;\n font-size: 12px;\n }\n \n .markdown pre {\n background: #f5f5f5;\n padding: 8px;\n border-radius: 4px;\n overflow-x: auto;\n margin: 4px 0;\n }\n \n .markdown pre code {\n background: none;\n padding: 0;\n }\n \n .markdown strong {\n font-weight: 600;\n color: #1a1a1a;\n }\n \n .markdown em {\n font-style: italic;\n color: #555;\n }\n \n .full-name {\n font-weight: 600;\n color: #1a1a1a;\n padding-bottom: 8px;\n border-bottom: 1px solid #e0e0e0;\n word-wrap: break-word;\n }\n "] }]
687
+ }], null, { step: [{
688
+ type: Input
689
+ }], depth: [{
690
+ type: Input
691
+ }], agentPath: [{
692
+ type: Input
693
+ }], expanded: [{
694
+ type: Input
695
+ }], detailsExpanded: [{
696
+ type: Input
697
+ }], overrideDisplayStatus: [{
500
698
  type: Input
501
699
  }], toggleNode: [{
502
700
  type: Output
701
+ }], toggleDetails: [{
702
+ type: Output
503
703
  }], userInteracted: [{
504
704
  type: Output
505
705
  }] }); })();
506
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ExecutionNodeComponent, { className: "ExecutionNodeComponent", filePath: "lib/agent-execution-node.component.ts", lineNumber: 372 }); })();
706
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ExecutionNodeComponent, { className: "ExecutionNodeComponent", filePath: "lib/agent-execution-node.component.ts", lineNumber: 556 }); })();
507
707
  //# sourceMappingURL=agent-execution-node.component.js.map