@memberjunction/ng-core-entity-forms 2.69.0 → 2.70.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.
@@ -18,7 +18,8 @@ import * as i4 from "@progress/kendo-angular-layout";
18
18
  import * as i5 from "@progress/kendo-angular-buttons";
19
19
  import * as i6 from "@memberjunction/ng-form-toolbar";
20
20
  import * as i7 from "@memberjunction/ng-code-editor";
21
- import * as i8 from "@angular/common";
21
+ import * as i8 from "./chat-message-viewer.component";
22
+ import * as i9 from "@angular/common";
22
23
  const _forTrack0 = ($index, $item) => $item.attemptNumber;
23
24
  const _forTrack1 = ($index, $item) => $item.ID;
24
25
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_11_Template(rf, ctx) { if (rf & 1) {
@@ -31,7 +32,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_11_Template(
31
32
  i0.ɵɵtextInterpolate1("#", ctx_r1.record.ID.substring(0, 8), "");
32
33
  } }
33
34
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_16_Template(rf, ctx) { if (rf & 1) {
34
- i0.ɵɵelementStart(0, "span", 32);
35
+ i0.ɵɵelementStart(0, "span", 33);
35
36
  i0.ɵɵelement(1, "i");
36
37
  i0.ɵɵtext(2);
37
38
  i0.ɵɵelementEnd();
@@ -45,9 +46,9 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_16_Template(
45
46
  } }
46
47
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_17_Template(rf, ctx) { if (rf & 1) {
47
48
  const _r3 = i0.ɵɵgetCurrentView();
48
- i0.ɵɵelementStart(0, "span", 33);
49
+ i0.ɵɵelementStart(0, "span", 34);
49
50
  i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_17_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.navigateToEntity("AI Prompts", ctx_r1.prompt.ID)); });
50
- i0.ɵɵelement(1, "i", 34);
51
+ i0.ɵɵelement(1, "i", 35);
51
52
  i0.ɵɵtext(2);
52
53
  i0.ɵɵelementEnd();
53
54
  } if (rf & 2) {
@@ -57,9 +58,9 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_17_Template(
57
58
  } }
58
59
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_18_Template(rf, ctx) { if (rf & 1) {
59
60
  const _r4 = i0.ɵɵgetCurrentView();
60
- i0.ɵɵelementStart(0, "span", 35);
61
+ i0.ɵɵelementStart(0, "span", 36);
61
62
  i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_18_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.navigateToEntity("AI Models", ctx_r1.model.ID)); });
62
- i0.ɵɵelement(1, "i", 36);
63
+ i0.ɵɵelement(1, "i", 37);
63
64
  i0.ɵɵtext(2);
64
65
  i0.ɵɵelementEnd();
65
66
  } if (rf & 2) {
@@ -69,9 +70,9 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_18_Template(
69
70
  } }
70
71
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_19_Template(rf, ctx) { if (rf & 1) {
71
72
  const _r5 = i0.ɵɵgetCurrentView();
72
- i0.ɵɵelementStart(0, "span", 37);
73
+ i0.ɵɵelementStart(0, "span", 38);
73
74
  i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_19_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.navigateToEntity("MJ: AI Vendors", ctx_r1.record.VendorID)); });
74
- i0.ɵɵelement(1, "i", 38);
75
+ i0.ɵɵelement(1, "i", 39);
75
76
  i0.ɵɵtext(2);
76
77
  i0.ɵɵelementEnd();
77
78
  } if (rf & 2) {
@@ -81,7 +82,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_19_Template(
81
82
  } }
82
83
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_45_Template(rf, ctx) { if (rf & 1) {
83
84
  i0.ɵɵelementStart(0, "div", 21);
84
- i0.ɵɵelement(1, "i", 39);
85
+ i0.ɵɵelement(1, "i", 40);
85
86
  i0.ɵɵelementStart(2, "div", 23)(3, "div", 24);
86
87
  i0.ɵɵtext(4, "Started");
87
88
  i0.ɵɵelementEnd();
@@ -95,47 +96,154 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_45_Template(
95
96
  i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(7, 1, ctx_r1.record.RunAt, "short"));
96
97
  } }
97
98
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_49_Conditional_3_Template(rf, ctx) { if (rf & 1) {
98
- i0.ɵɵelementStart(0, "span", 41);
99
+ i0.ɵɵelementStart(0, "span", 42);
99
100
  i0.ɵɵtext(1, "JSON");
100
101
  i0.ɵɵelementEnd();
101
102
  } }
102
103
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_49_Template(rf, ctx) { if (rf & 1) {
103
- i0.ɵɵelementStart(0, "span", 40);
104
- i0.ɵɵelement(1, "i", 34);
105
- i0.ɵɵtext(2, " Input Messages ");
106
- i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_49_Conditional_3_Template, 2, 0, "span", 41);
104
+ i0.ɵɵelementStart(0, "span", 41);
105
+ i0.ɵɵelement(1, "i", 35);
106
+ i0.ɵɵtext(2, " Input ");
107
+ i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_49_Conditional_3_Template, 2, 0, "span", 42);
107
108
  i0.ɵɵelementEnd();
108
109
  } if (rf & 2) {
109
110
  const ctx_r1 = i0.ɵɵnextContext(2);
110
111
  i0.ɵɵadvance(3);
111
112
  i0.ɵɵconditional(ctx_r1.record.Messages && ctx_r1.record.Messages.trim() !== "" ? 3 : -1);
112
113
  } }
114
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_ng_template_2_Conditional_3_Template(rf, ctx) { if (rf & 1) {
115
+ i0.ɵɵelementStart(0, "span", 58);
116
+ i0.ɵɵtext(1);
117
+ i0.ɵɵelementEnd();
118
+ } if (rf & 2) {
119
+ const ctx_r1 = i0.ɵɵnextContext(5);
120
+ i0.ɵɵadvance();
121
+ i0.ɵɵtextInterpolate1("(", ctx_r1.chatMessages.length, ")");
122
+ } }
123
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_ng_template_2_Template(rf, ctx) { if (rf & 1) {
124
+ i0.ɵɵelementStart(0, "span", 56);
125
+ i0.ɵɵelement(1, "i", 57);
126
+ i0.ɵɵtext(2, " Messages ");
127
+ i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_ng_template_2_Conditional_3_Template, 2, 1, "span", 58);
128
+ i0.ɵɵelementEnd();
129
+ } if (rf & 2) {
130
+ const ctx_r1 = i0.ɵɵnextContext(4);
131
+ i0.ɵɵadvance(3);
132
+ i0.ɵɵconditional(ctx_r1.chatMessages.length > 0 ? 3 : -1);
133
+ } }
134
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
135
+ i0.ɵɵelementStart(0, "div", 49);
136
+ i0.ɵɵelement(1, "i", 59);
137
+ i0.ɵɵelementStart(2, "p");
138
+ i0.ɵɵtext(3, "Loading messages...");
139
+ i0.ɵɵelementEnd()();
140
+ } }
141
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
142
+ i0.ɵɵelement(0, "mj-chat-message-viewer", 50);
143
+ } if (rf & 2) {
144
+ const ctx_r1 = i0.ɵɵnextContext(4);
145
+ i0.ɵɵproperty("messages", ctx_r1.chatMessages);
146
+ } }
147
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
148
+ i0.ɵɵelementStart(0, "div", 45);
149
+ i0.ɵɵelement(1, "i", 60);
150
+ i0.ɵɵelementStart(2, "p");
151
+ i0.ɵɵtext(3, "No chat messages found");
152
+ i0.ɵɵelementEnd()();
153
+ } }
154
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_ng_template_8_Conditional_3_Template(rf, ctx) { if (rf & 1) {
155
+ i0.ɵɵelementStart(0, "span", 42);
156
+ i0.ɵɵtext(1, "Object");
157
+ i0.ɵɵelementEnd();
158
+ } }
159
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_ng_template_8_Template(rf, ctx) { if (rf & 1) {
160
+ i0.ɵɵelementStart(0, "span", 56);
161
+ i0.ɵɵelement(1, "i", 61);
162
+ i0.ɵɵtext(2, " Data ");
163
+ i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_ng_template_8_Conditional_3_Template, 2, 0, "span", 42);
164
+ i0.ɵɵelementEnd();
165
+ } if (rf & 2) {
166
+ const ctx_r1 = i0.ɵɵnextContext(4);
167
+ i0.ɵɵadvance(3);
168
+ i0.ɵɵconditional(ctx_r1.inputData ? 3 : -1);
169
+ } }
170
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_10_Template(rf, ctx) { if (rf & 1) {
171
+ const _r7 = i0.ɵɵgetCurrentView();
172
+ i0.ɵɵelementStart(0, "div", 51)(1, "div", 52)(2, "button", 53);
173
+ i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_10_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.copyToClipboard(ctx_r1.formattedData, "Data")); });
174
+ i0.ɵɵelement(3, "i", 54);
175
+ i0.ɵɵtext(4, " Copy ");
176
+ i0.ɵɵelementEnd()();
177
+ i0.ɵɵelementStart(5, "mj-code-editor", 62);
178
+ i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_10_Template_mj_code_editor_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedData, $event) || (ctx_r1.formattedData = $event); return i0.ɵɵresetView($event); });
179
+ i0.ɵɵelementEnd()();
180
+ } if (rf & 2) {
181
+ const ctx_r1 = i0.ɵɵnextContext(4);
182
+ i0.ɵɵadvance(5);
183
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formattedData);
184
+ i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
185
+ } }
186
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_11_Template(rf, ctx) { if (rf & 1) {
187
+ i0.ɵɵelementStart(0, "div", 45);
188
+ i0.ɵɵelement(1, "i", 61);
189
+ i0.ɵɵelementStart(2, "p");
190
+ i0.ɵɵtext(3, "No data object found");
191
+ i0.ɵɵelementEnd()();
192
+ } }
193
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_ng_template_13_Template(rf, ctx) { if (rf & 1) {
194
+ i0.ɵɵelementStart(0, "span", 56);
195
+ i0.ɵɵelement(1, "i", 63);
196
+ i0.ɵɵtext(2, " Raw ");
197
+ i0.ɵɵelementEnd();
198
+ } }
113
199
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Template(rf, ctx) { if (rf & 1) {
114
200
  const _r6 = i0.ɵɵgetCurrentView();
115
- i0.ɵɵelementStart(0, "div", 43)(1, "div", 45)(2, "button", 46);
116
- i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.copyToClipboard(ctx_r1.formattedMessages, "Messages")); });
117
- i0.ɵɵelement(3, "i", 47);
118
- i0.ɵɵtext(4, " Copy ");
201
+ i0.ɵɵelementStart(0, "div", 44)(1, "kendo-expansionpanel", 46);
202
+ i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_ng_template_2_Template, 4, 1, "ng-template", 47);
203
+ i0.ɵɵelementStart(3, "div", 48);
204
+ i0.ɵɵtemplate(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_4_Template, 4, 0, "div", 49)(5, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_5_Template, 1, 1, "mj-chat-message-viewer", 50)(6, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_6_Template, 4, 0, "div", 45);
119
205
  i0.ɵɵelementEnd()();
120
- i0.ɵɵelementStart(5, "mj-code-editor", 48);
121
- i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Template_mj_code_editor_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedMessages, $event) || (ctx_r1.formattedMessages = $event); return i0.ɵɵresetView($event); });
206
+ i0.ɵɵelementStart(7, "kendo-expansionpanel", 46);
207
+ i0.ɵɵtemplate(8, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_ng_template_8_Template, 4, 1, "ng-template", 47);
208
+ i0.ɵɵelementStart(9, "div", 48);
209
+ i0.ɵɵtemplate(10, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_10_Template, 6, 4, "div", 51)(11, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_11_Template, 4, 0, "div", 45);
122
210
  i0.ɵɵelementEnd()();
211
+ i0.ɵɵelementStart(12, "kendo-expansionpanel", 46);
212
+ i0.ɵɵtemplate(13, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_ng_template_13_Template, 3, 0, "ng-template", 47);
213
+ i0.ɵɵelementStart(14, "div", 48)(15, "div", 51)(16, "div", 52)(17, "button", 53);
214
+ i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.copyToClipboard(ctx_r1.formattedMessages, "Messages")); });
215
+ i0.ɵɵelement(18, "i", 54);
216
+ i0.ɵɵtext(19, " Copy ");
217
+ i0.ɵɵelementEnd()();
218
+ i0.ɵɵelementStart(20, "mj-code-editor", 55);
219
+ i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Template_mj_code_editor_ngModelChange_20_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedMessages, $event) || (ctx_r1.formattedMessages = $event); return i0.ɵɵresetView($event); });
220
+ i0.ɵɵelementEnd()()()()();
123
221
  } if (rf & 2) {
124
222
  const ctx_r1 = i0.ɵɵnextContext(3);
125
- i0.ɵɵadvance(5);
223
+ i0.ɵɵadvance();
224
+ i0.ɵɵproperty("expanded", ctx_r1.messagesExpanded)("animation", false);
225
+ i0.ɵɵadvance(3);
226
+ i0.ɵɵconditional(ctx_r1.isParsingMessages || ctx_r1.isLoadingRelatedData ? 4 : ctx_r1.chatMessages.length > 0 ? 5 : 6);
227
+ i0.ɵɵadvance(3);
228
+ i0.ɵɵproperty("expanded", ctx_r1.dataExpanded)("animation", false);
229
+ i0.ɵɵadvance(3);
230
+ i0.ɵɵconditional(ctx_r1.inputData && ctx_r1.formattedData ? 10 : 11);
231
+ i0.ɵɵadvance(2);
232
+ i0.ɵɵproperty("expanded", ctx_r1.rawExpanded)("animation", false);
233
+ i0.ɵɵadvance(8);
126
234
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formattedMessages);
127
235
  i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
128
236
  } }
129
237
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_2_Template(rf, ctx) { if (rf & 1) {
130
- i0.ɵɵelementStart(0, "div", 44);
131
- i0.ɵɵelement(1, "i", 49);
238
+ i0.ɵɵelementStart(0, "div", 45);
239
+ i0.ɵɵelement(1, "i", 60);
132
240
  i0.ɵɵelementStart(2, "p");
133
241
  i0.ɵɵtext(3, "No input messages recorded");
134
242
  i0.ɵɵelementEnd()();
135
243
  } }
136
244
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Template(rf, ctx) { if (rf & 1) {
137
- i0.ɵɵelementStart(0, "div", 42);
138
- i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Template, 6, 4, "div", 43)(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_2_Template, 4, 0, "div", 44);
245
+ i0.ɵɵelementStart(0, "div", 43);
246
+ i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Template, 21, 12, "div", 44)(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_2_Template, 4, 0, "div", 45);
139
247
  i0.ɵɵelementEnd();
140
248
  } if (rf & 2) {
141
249
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -143,20 +251,20 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Template(
143
251
  i0.ɵɵconditional(ctx_r1.record.Messages && ctx_r1.record.Messages.trim() !== "" ? 1 : 2);
144
252
  } }
145
253
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_52_Conditional_3_Template(rf, ctx) { if (rf & 1) {
146
- i0.ɵɵelementStart(0, "span", 41);
254
+ i0.ɵɵelementStart(0, "span", 42);
147
255
  i0.ɵɵtext(1, "JSON");
148
256
  i0.ɵɵelementEnd();
149
257
  } }
150
258
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_52_Conditional_4_Template(rf, ctx) { if (rf & 1) {
151
- i0.ɵɵelementStart(0, "span", 51);
259
+ i0.ɵɵelementStart(0, "span", 65);
152
260
  i0.ɵɵtext(1, "Error");
153
261
  i0.ɵɵelementEnd();
154
262
  } }
155
263
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_52_Template(rf, ctx) { if (rf & 1) {
156
- i0.ɵɵelementStart(0, "span", 40);
157
- i0.ɵɵelement(1, "i", 50);
264
+ i0.ɵɵelementStart(0, "span", 41);
265
+ i0.ɵɵelement(1, "i", 64);
158
266
  i0.ɵɵtext(2, " Result ");
159
- i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_52_Conditional_3_Template, 2, 0, "span", 41)(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_52_Conditional_4_Template, 2, 0, "span", 51);
267
+ i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_52_Conditional_3_Template, 2, 0, "span", 42)(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_52_Conditional_4_Template, 2, 0, "span", 65);
160
268
  i0.ɵɵelementEnd();
161
269
  } if (rf & 2) {
162
270
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -166,9 +274,9 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_52_Template(
166
274
  i0.ɵɵconditional(ctx_r1.record.ErrorMessage ? 4 : -1);
167
275
  } }
168
276
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_1_Template(rf, ctx) { if (rf & 1) {
169
- i0.ɵɵelementStart(0, "div", 52);
170
- i0.ɵɵelement(1, "i", 53);
171
- i0.ɵɵelementStart(2, "div", 54)(3, "h4");
277
+ i0.ɵɵelementStart(0, "div", 66);
278
+ i0.ɵɵelement(1, "i", 67);
279
+ i0.ɵɵelementStart(2, "div", 68)(3, "h4");
172
280
  i0.ɵɵtext(4, "Error Message");
173
281
  i0.ɵɵelementEnd();
174
282
  i0.ɵɵelementStart(5, "p");
@@ -180,14 +288,14 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Condition
180
288
  i0.ɵɵtextInterpolate(ctx_r1.record.ErrorMessage);
181
289
  } }
182
290
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_2_Template(rf, ctx) { if (rf & 1) {
183
- const _r7 = i0.ɵɵgetCurrentView();
184
- i0.ɵɵelementStart(0, "div", 43)(1, "div", 45)(2, "button", 46);
185
- i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_2_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.copyToClipboard(ctx_r1.formattedResult, "Result")); });
186
- i0.ɵɵelement(3, "i", 47);
291
+ const _r8 = i0.ɵɵgetCurrentView();
292
+ i0.ɵɵelementStart(0, "div", 51)(1, "div", 52)(2, "button", 53);
293
+ i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_2_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.copyToClipboard(ctx_r1.formattedResult, "Result")); });
294
+ i0.ɵɵelement(3, "i", 54);
187
295
  i0.ɵɵtext(4, " Copy ");
188
296
  i0.ɵɵelementEnd()();
189
- i0.ɵɵelementStart(5, "mj-code-editor", 55);
190
- i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_2_Template_mj_code_editor_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedResult, $event) || (ctx_r1.formattedResult = $event); return i0.ɵɵresetView($event); });
297
+ i0.ɵɵelementStart(5, "mj-code-editor", 69);
298
+ i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_2_Template_mj_code_editor_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedResult, $event) || (ctx_r1.formattedResult = $event); return i0.ɵɵresetView($event); });
191
299
  i0.ɵɵelementEnd()();
192
300
  } if (rf & 2) {
193
301
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -196,15 +304,15 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Condition
196
304
  i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
197
305
  } }
198
306
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_3_Template(rf, ctx) { if (rf & 1) {
199
- i0.ɵɵelementStart(0, "div", 44);
200
- i0.ɵɵelement(1, "i", 56);
307
+ i0.ɵɵelementStart(0, "div", 45);
308
+ i0.ɵɵelement(1, "i", 70);
201
309
  i0.ɵɵelementStart(2, "p");
202
310
  i0.ɵɵtext(3, "No result data recorded");
203
311
  i0.ɵɵelementEnd()();
204
312
  } }
205
313
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Template(rf, ctx) { if (rf & 1) {
206
- i0.ɵɵelementStart(0, "div", 42);
207
- i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_1_Template, 7, 1, "div", 52)(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_2_Template, 6, 4, "div", 43)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_3_Template, 4, 0, "div", 44);
314
+ i0.ɵɵelementStart(0, "div", 43);
315
+ i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_1_Template, 7, 1, "div", 66)(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_2_Template, 6, 4, "div", 51)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_3_Template, 4, 0, "div", 45);
208
316
  i0.ɵɵelementEnd();
209
317
  } if (rf & 2) {
210
318
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -214,13 +322,13 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Template(
214
322
  i0.ɵɵconditional(ctx_r1.record.Result && ctx_r1.record.Result.trim() !== "" ? 2 : !ctx_r1.record.ErrorMessage ? 3 : -1);
215
323
  } }
216
324
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_55_Template(rf, ctx) { if (rf & 1) {
217
- i0.ɵɵelementStart(0, "span", 40);
218
- i0.ɵɵelement(1, "i", 57);
325
+ i0.ɵɵelementStart(0, "span", 41);
326
+ i0.ɵɵelement(1, "i", 71);
219
327
  i0.ɵɵtext(2, " Token Usage & Metrics ");
220
328
  i0.ɵɵelementEnd();
221
329
  } }
222
330
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_9_Template(rf, ctx) { if (rf & 1) {
223
- i0.ɵɵelementStart(0, "div", 63)(1, "span");
331
+ i0.ɵɵelementStart(0, "div", 77)(1, "span");
224
332
  i0.ɵɵtext(2);
225
333
  i0.ɵɵelementEnd()();
226
334
  } if (rf & 2) {
@@ -229,7 +337,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Condition
229
337
  i0.ɵɵtextInterpolate1("Rollup: ", ctx_r1.formatTokens(ctx_r1.record.TokensPromptRollup), "");
230
338
  } }
231
339
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_17_Template(rf, ctx) { if (rf & 1) {
232
- i0.ɵɵelementStart(0, "div", 63)(1, "span");
340
+ i0.ɵɵelementStart(0, "div", 77)(1, "span");
233
341
  i0.ɵɵtext(2);
234
342
  i0.ɵɵelementEnd()();
235
343
  } if (rf & 2) {
@@ -238,7 +346,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Condition
238
346
  i0.ɵɵtextInterpolate1("Rollup: ", ctx_r1.formatTokens(ctx_r1.record.TokensCompletionRollup), "");
239
347
  } }
240
348
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_25_Template(rf, ctx) { if (rf & 1) {
241
- i0.ɵɵelementStart(0, "div", 63)(1, "span");
349
+ i0.ɵɵelementStart(0, "div", 77)(1, "span");
242
350
  i0.ɵɵtext(2);
243
351
  i0.ɵɵelementEnd()();
244
352
  } if (rf & 2) {
@@ -247,7 +355,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Condition
247
355
  i0.ɵɵtextInterpolate1("Rollup: ", ctx_r1.formatTokens(ctx_r1.record.TokensUsedRollup), "");
248
356
  } }
249
357
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_33_Template(rf, ctx) { if (rf & 1) {
250
- i0.ɵɵelementStart(0, "div", 63)(1, "span");
358
+ i0.ɵɵelementStart(0, "div", 77)(1, "span");
251
359
  i0.ɵɵtext(2);
252
360
  i0.ɵɵelementEnd()();
253
361
  } if (rf & 2) {
@@ -256,7 +364,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Condition
256
364
  i0.ɵɵtextInterpolate1("Total: ", ctx_r1.formatCost(ctx_r1.record.TotalCost), "");
257
365
  } }
258
366
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_34_Template(rf, ctx) { if (rf & 1) {
259
- i0.ɵɵelementStart(0, "div", 65);
367
+ i0.ɵɵelementStart(0, "div", 79);
260
368
  i0.ɵɵtext(1);
261
369
  i0.ɵɵelementEnd();
262
370
  } if (rf & 2) {
@@ -265,7 +373,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Condition
265
373
  i0.ɵɵtextInterpolate(ctx_r1.record.CostCurrency);
266
374
  } }
267
375
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_36_Template(rf, ctx) { if (rf & 1) {
268
- i0.ɵɵelementStart(0, "div", 67)(1, "span", 24);
376
+ i0.ɵɵelementStart(0, "div", 81)(1, "span", 24);
269
377
  i0.ɵɵtext(2, "Execution Order:");
270
378
  i0.ɵɵelementEnd();
271
379
  i0.ɵɵelementStart(3, "span", 25);
@@ -277,7 +385,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Condition
277
385
  i0.ɵɵtextInterpolate(ctx_r1.record.ExecutionOrder);
278
386
  } }
279
387
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_37_Template(rf, ctx) { if (rf & 1) {
280
- i0.ɵɵelementStart(0, "div", 67)(1, "span", 24);
388
+ i0.ɵɵelementStart(0, "div", 81)(1, "span", 24);
281
389
  i0.ɵɵtext(2, "Configuration:");
282
390
  i0.ɵɵelementEnd();
283
391
  i0.ɵɵelementStart(3, "span", 25);
@@ -289,14 +397,14 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Condition
289
397
  i0.ɵɵtextInterpolate(ctx_r1.record.Configuration);
290
398
  } }
291
399
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_38_Template(rf, ctx) { if (rf & 1) {
292
- const _r8 = i0.ɵɵgetCurrentView();
293
- i0.ɵɵelementStart(0, "div", 67)(1, "span", 24);
400
+ const _r9 = i0.ɵɵgetCurrentView();
401
+ i0.ɵɵelementStart(0, "div", 81)(1, "span", 24);
294
402
  i0.ɵɵtext(2, "Agent:");
295
403
  i0.ɵɵelementEnd();
296
- i0.ɵɵelementStart(3, "span", 68);
297
- i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_38_Template_span_click_3_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.navigateToEntity("AI Agents", ctx_r1.record.AgentID)); });
404
+ i0.ɵɵelementStart(3, "span", 82);
405
+ i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_38_Template_span_click_3_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.navigateToEntity("AI Agents", ctx_r1.record.AgentID)); });
298
406
  i0.ɵɵtext(4);
299
- i0.ɵɵelement(5, "i", 69);
407
+ i0.ɵɵelement(5, "i", 83);
300
408
  i0.ɵɵelementEnd()();
301
409
  } if (rf & 2) {
302
410
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -304,48 +412,48 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Condition
304
412
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Agent, " ");
305
413
  } }
306
414
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Template(rf, ctx) { if (rf & 1) {
307
- i0.ɵɵelementStart(0, "div", 42)(1, "div", 58)(2, "div", 59)(3, "div", 60);
308
- i0.ɵɵelement(4, "i", 61);
415
+ i0.ɵɵelementStart(0, "div", 43)(1, "div", 72)(2, "div", 73)(3, "div", 74);
416
+ i0.ɵɵelement(4, "i", 75);
309
417
  i0.ɵɵelementStart(5, "h4");
310
418
  i0.ɵɵtext(6, "Prompt Tokens");
311
419
  i0.ɵɵelementEnd()();
312
- i0.ɵɵelementStart(7, "div", 62);
420
+ i0.ɵɵelementStart(7, "div", 76);
313
421
  i0.ɵɵtext(8);
314
422
  i0.ɵɵelementEnd();
315
- i0.ɵɵtemplate(9, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_9_Template, 3, 1, "div", 63);
423
+ i0.ɵɵtemplate(9, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_9_Template, 3, 1, "div", 77);
316
424
  i0.ɵɵelementEnd();
317
- i0.ɵɵelementStart(10, "div", 59)(11, "div", 60);
318
- i0.ɵɵelement(12, "i", 64);
425
+ i0.ɵɵelementStart(10, "div", 73)(11, "div", 74);
426
+ i0.ɵɵelement(12, "i", 78);
319
427
  i0.ɵɵelementStart(13, "h4");
320
428
  i0.ɵɵtext(14, "Completion Tokens");
321
429
  i0.ɵɵelementEnd()();
322
- i0.ɵɵelementStart(15, "div", 62);
430
+ i0.ɵɵelementStart(15, "div", 76);
323
431
  i0.ɵɵtext(16);
324
432
  i0.ɵɵelementEnd();
325
- i0.ɵɵtemplate(17, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_17_Template, 3, 1, "div", 63);
433
+ i0.ɵɵtemplate(17, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_17_Template, 3, 1, "div", 77);
326
434
  i0.ɵɵelementEnd();
327
- i0.ɵɵelementStart(18, "div", 59)(19, "div", 60);
435
+ i0.ɵɵelementStart(18, "div", 73)(19, "div", 74);
328
436
  i0.ɵɵelement(20, "i", 26);
329
437
  i0.ɵɵelementStart(21, "h4");
330
438
  i0.ɵɵtext(22, "Total Tokens");
331
439
  i0.ɵɵelementEnd()();
332
- i0.ɵɵelementStart(23, "div", 62);
440
+ i0.ɵɵelementStart(23, "div", 76);
333
441
  i0.ɵɵtext(24);
334
442
  i0.ɵɵelementEnd();
335
- i0.ɵɵtemplate(25, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_25_Template, 3, 1, "div", 63);
443
+ i0.ɵɵtemplate(25, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_25_Template, 3, 1, "div", 77);
336
444
  i0.ɵɵelementEnd();
337
- i0.ɵɵelementStart(26, "div", 59)(27, "div", 60);
445
+ i0.ɵɵelementStart(26, "div", 73)(27, "div", 74);
338
446
  i0.ɵɵelement(28, "i", 27);
339
447
  i0.ɵɵelementStart(29, "h4");
340
448
  i0.ɵɵtext(30, "Cost");
341
449
  i0.ɵɵelementEnd()();
342
- i0.ɵɵelementStart(31, "div", 62);
450
+ i0.ɵɵelementStart(31, "div", 76);
343
451
  i0.ɵɵtext(32);
344
452
  i0.ɵɵelementEnd();
345
- i0.ɵɵtemplate(33, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_33_Template, 3, 1, "div", 63)(34, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_34_Template, 2, 1, "div", 65);
453
+ i0.ɵɵtemplate(33, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_33_Template, 3, 1, "div", 77)(34, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_34_Template, 2, 1, "div", 79);
346
454
  i0.ɵɵelementEnd()();
347
- i0.ɵɵelementStart(35, "div", 66);
348
- i0.ɵɵtemplate(36, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_36_Template, 5, 1, "div", 67)(37, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_37_Template, 5, 1, "div", 67)(38, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_38_Template, 6, 1, "div", 67);
455
+ i0.ɵɵelementStart(35, "div", 80);
456
+ i0.ɵɵtemplate(36, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_36_Template, 5, 1, "div", 81)(37, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_37_Template, 5, 1, "div", 81)(38, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_38_Template, 6, 1, "div", 81);
349
457
  i0.ɵɵelementEnd()();
350
458
  } if (rf & 2) {
351
459
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -375,7 +483,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Template(
375
483
  i0.ɵɵconditional(ctx_r1.record.AgentID ? 38 : -1);
376
484
  } }
377
485
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
378
- i0.ɵɵelementStart(0, "span", 71);
486
+ i0.ɵɵelementStart(0, "span", 58);
379
487
  i0.ɵɵtext(1);
380
488
  i0.ɵɵelementEnd();
381
489
  } if (rf & 2) {
@@ -384,20 +492,20 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_templa
384
492
  i0.ɵɵtextInterpolate1("(", ctx_r1.record.ValidationAttemptCount, " attempts)");
385
493
  } }
386
494
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
387
- i0.ɵɵelementStart(0, "span", 72);
495
+ i0.ɵɵelementStart(0, "span", 85);
388
496
  i0.ɵɵtext(1, "Passed");
389
497
  i0.ɵɵelementEnd();
390
498
  } }
391
499
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
392
- i0.ɵɵelementStart(0, "span", 51);
500
+ i0.ɵɵelementStart(0, "span", 65);
393
501
  i0.ɵɵtext(1, "Failed");
394
502
  i0.ɵɵelementEnd();
395
503
  } }
396
504
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_1_Template(rf, ctx) { if (rf & 1) {
397
- i0.ɵɵelementStart(0, "span", 40);
398
- i0.ɵɵelement(1, "i", 70);
505
+ i0.ɵɵelementStart(0, "span", 41);
506
+ i0.ɵɵelement(1, "i", 84);
399
507
  i0.ɵɵtext(2, " Validation & Retries ");
400
- i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_1_Conditional_3_Template, 2, 1, "span", 71)(4, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_1_Conditional_4_Template, 2, 0, "span", 72)(5, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_1_Conditional_5_Template, 2, 0, "span", 51);
508
+ i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_1_Conditional_3_Template, 2, 1, "span", 58)(4, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_1_Conditional_4_Template, 2, 0, "span", 85)(5, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_1_Conditional_5_Template, 2, 0, "span", 65);
401
509
  i0.ɵɵelementEnd();
402
510
  } if (rf & 2) {
403
511
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -407,7 +515,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_templa
407
515
  i0.ɵɵconditional(ctx_r1.record.FinalValidationPassed ? 4 : ctx_r1.record.FinalValidationPassed === false ? 5 : -1);
408
516
  } }
409
517
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_29_Conditional_6_Template(rf, ctx) { if (rf & 1) {
410
- i0.ɵɵelementStart(0, "span", 83);
518
+ i0.ɵɵelementStart(0, "span", 96);
411
519
  i0.ɵɵtext(1);
412
520
  i0.ɵɵelementEnd();
413
521
  } if (rf & 2) {
@@ -416,14 +524,14 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_templa
416
524
  i0.ɵɵtextInterpolate1("", ctx_r1.record.ValidationErrorCount, " validation errors");
417
525
  } }
418
526
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_29_Template(rf, ctx) { if (rf & 1) {
419
- i0.ɵɵelementStart(0, "div", 78)(1, "h5");
420
- i0.ɵɵelement(2, "i", 53);
527
+ i0.ɵɵelementStart(0, "div", 91)(1, "h5");
528
+ i0.ɵɵelement(2, "i", 67);
421
529
  i0.ɵɵtext(3, " Final Validation Error");
422
530
  i0.ɵɵelementEnd();
423
531
  i0.ɵɵelementStart(4, "p");
424
532
  i0.ɵɵtext(5);
425
533
  i0.ɵɵelementEnd();
426
- i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_29_Conditional_6_Template, 2, 1, "span", 83);
534
+ i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_29_Conditional_6_Template, 2, 1, "span", 96);
427
535
  i0.ɵɵelementEnd();
428
536
  } if (rf & 2) {
429
537
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -433,8 +541,8 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_templa
433
541
  i0.ɵɵconditional(ctx_r1.record && ctx_r1.record.ValidationErrorCount && ctx_r1.record.ValidationErrorCount > 0 ? 6 : -1);
434
542
  } }
435
543
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_30_Template(rf, ctx) { if (rf & 1) {
436
- i0.ɵɵelementStart(0, "div", 79)(1, "h5");
437
- i0.ɵɵelement(2, "i", 84);
544
+ i0.ɵɵelementStart(0, "div", 92)(1, "h5");
545
+ i0.ɵɵelement(2, "i", 97);
438
546
  i0.ɵɵtext(3, " Most Common Error");
439
547
  i0.ɵɵelementEnd();
440
548
  i0.ɵɵelementStart(4, "p");
@@ -446,23 +554,23 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_templa
446
554
  i0.ɵɵtextInterpolate(ctx_r1.record.CommonValidationError);
447
555
  } }
448
556
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_31_Template(rf, ctx) { if (rf & 1) {
449
- i0.ɵɵelementStart(0, "div", 80)(1, "h4");
557
+ i0.ɵɵelementStart(0, "div", 93)(1, "h4");
450
558
  i0.ɵɵtext(2, "Retry Timeline");
451
559
  i0.ɵɵelementEnd();
452
- i0.ɵɵelementStart(3, "div", 85)(4, "div", 86);
560
+ i0.ɵɵelementStart(3, "div", 98)(4, "div", 99);
453
561
  i0.ɵɵelement(5, "i", 22);
454
562
  i0.ɵɵelementStart(6, "span");
455
563
  i0.ɵɵtext(7);
456
564
  i0.ɵɵpipe(8, "date");
457
565
  i0.ɵɵelementEnd()();
458
- i0.ɵɵelementStart(9, "div", 86);
459
- i0.ɵɵelement(10, "i", 87);
566
+ i0.ɵɵelementStart(9, "div", 99);
567
+ i0.ɵɵelement(10, "i", 100);
460
568
  i0.ɵɵelementStart(11, "span");
461
569
  i0.ɵɵtext(12);
462
570
  i0.ɵɵpipe(13, "date");
463
571
  i0.ɵɵelementEnd()();
464
- i0.ɵɵelementStart(14, "div", 86);
465
- i0.ɵɵelement(15, "i", 88);
572
+ i0.ɵɵelementStart(14, "div", 99);
573
+ i0.ɵɵelement(15, "i", 101);
466
574
  i0.ɵɵelementStart(16, "span");
467
575
  i0.ɵɵtext(17);
468
576
  i0.ɵɵelementEnd()()()();
@@ -476,65 +584,65 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_templa
476
584
  i0.ɵɵtextInterpolate1("Total Retry Duration: ", ctx_r1.formatDuration(ctx_r1.record.TotalRetryDurationMS), "");
477
585
  } }
478
586
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_For_5_Conditional_7_Conditional_2_Template(rf, ctx) { if (rf & 1) {
479
- i0.ɵɵelementStart(0, "span", 83);
587
+ i0.ɵɵelementStart(0, "span", 96);
480
588
  i0.ɵɵtext(1);
481
589
  i0.ɵɵelementEnd();
482
590
  } if (rf & 2) {
483
- const attempt_r9 = i0.ɵɵnextContext(2).$implicit;
591
+ const attempt_r10 = i0.ɵɵnextContext(2).$implicit;
484
592
  i0.ɵɵadvance();
485
- i0.ɵɵtextInterpolate1("(", attempt_r9.validationErrorCount, " errors)");
593
+ i0.ɵɵtextInterpolate1("(", attempt_r10.validationErrorCount, " errors)");
486
594
  } }
487
595
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_For_5_Conditional_7_Template(rf, ctx) { if (rf & 1) {
488
- i0.ɵɵelementStart(0, "span", 96);
596
+ i0.ɵɵelementStart(0, "span", 109);
489
597
  i0.ɵɵtext(1);
490
598
  i0.ɵɵelementEnd();
491
- i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_For_5_Conditional_7_Conditional_2_Template, 2, 1, "span", 83);
599
+ i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_For_5_Conditional_7_Conditional_2_Template, 2, 1, "span", 96);
492
600
  } if (rf & 2) {
493
- const attempt_r9 = i0.ɵɵnextContext().$implicit;
601
+ const attempt_r10 = i0.ɵɵnextContext().$implicit;
494
602
  i0.ɵɵadvance();
495
- i0.ɵɵtextInterpolate(attempt_r9.errorMessage || "Unknown error");
603
+ i0.ɵɵtextInterpolate(attempt_r10.errorMessage || "Unknown error");
496
604
  i0.ɵɵadvance();
497
- i0.ɵɵconditional(attempt_r9.validationErrorCount > 0 ? 2 : -1);
605
+ i0.ɵɵconditional(attempt_r10.validationErrorCount > 0 ? 2 : -1);
498
606
  } }
499
607
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_For_5_Conditional_8_Template(rf, ctx) { if (rf & 1) {
500
- i0.ɵɵelementStart(0, "span", 95);
608
+ i0.ɵɵelementStart(0, "span", 108);
501
609
  i0.ɵɵtext(1);
502
610
  i0.ɵɵelementEnd();
503
611
  } if (rf & 2) {
504
- const attempt_r9 = i0.ɵɵnextContext().$implicit;
612
+ const attempt_r10 = i0.ɵɵnextContext().$implicit;
505
613
  i0.ɵɵadvance();
506
- i0.ɵɵtextInterpolate1("Output: ", attempt_r9.outputLength, " chars");
614
+ i0.ɵɵtextInterpolate1("Output: ", attempt_r10.outputLength, " chars");
507
615
  } }
508
616
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_For_5_Template(rf, ctx) { if (rf & 1) {
509
- i0.ɵɵelementStart(0, "div", 91)(1, "div", 92);
617
+ i0.ɵɵelementStart(0, "div", 104)(1, "div", 105);
510
618
  i0.ɵɵelement(2, "i");
511
619
  i0.ɵɵtext(3);
512
620
  i0.ɵɵelementEnd();
513
- i0.ɵɵelementStart(4, "div", 93)(5, "span", 94);
621
+ i0.ɵɵelementStart(4, "div", 106)(5, "span", 107);
514
622
  i0.ɵɵtext(6);
515
623
  i0.ɵɵelementEnd();
516
- i0.ɵɵtemplate(7, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_For_5_Conditional_7_Template, 3, 2)(8, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_For_5_Conditional_8_Template, 2, 1, "span", 95);
624
+ i0.ɵɵtemplate(7, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_For_5_Conditional_7_Template, 3, 2)(8, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_For_5_Conditional_8_Template, 2, 1, "span", 108);
517
625
  i0.ɵɵelementEnd()();
518
626
  } if (rf & 2) {
519
- const attempt_r9 = ctx.$implicit;
520
- i0.ɵɵclassProp("success", attempt_r9.success)("failed", !attempt_r9.success);
627
+ const attempt_r10 = ctx.$implicit;
628
+ i0.ɵɵclassProp("success", attempt_r10.success)("failed", !attempt_r10.success);
521
629
  i0.ɵɵadvance(2);
522
- i0.ɵɵclassMap(attempt_r9.success ? "fa-solid fa-check" : "fa-solid fa-times");
630
+ i0.ɵɵclassMap(attempt_r10.success ? "fa-solid fa-check" : "fa-solid fa-times");
523
631
  i0.ɵɵadvance();
524
- i0.ɵɵtextInterpolate1(" Attempt #", attempt_r9.attemptNumber, " ");
632
+ i0.ɵɵtextInterpolate1(" Attempt #", attempt_r10.attemptNumber, " ");
525
633
  i0.ɵɵadvance(3);
526
- i0.ɵɵtextInterpolate(attempt_r9.timestamp);
634
+ i0.ɵɵtextInterpolate(attempt_r10.timestamp);
527
635
  i0.ɵɵadvance();
528
- i0.ɵɵconditional(!attempt_r9.success ? 7 : -1);
636
+ i0.ɵɵconditional(!attempt_r10.success ? 7 : -1);
529
637
  i0.ɵɵadvance();
530
- i0.ɵɵconditional(attempt_r9.outputLength ? 8 : -1);
638
+ i0.ɵɵconditional(attempt_r10.outputLength ? 8 : -1);
531
639
  } }
532
640
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_Template(rf, ctx) { if (rf & 1) {
533
- i0.ɵɵelementStart(0, "div", 81)(1, "h4");
641
+ i0.ɵɵelementStart(0, "div", 94)(1, "h4");
534
642
  i0.ɵɵtext(2, "Validation Attempts");
535
643
  i0.ɵɵelementEnd();
536
- i0.ɵɵelementStart(3, "div", 89);
537
- i0.ɵɵrepeaterCreate(4, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_For_5_Template, 9, 10, "div", 90, _forTrack0);
644
+ i0.ɵɵelementStart(3, "div", 102);
645
+ i0.ɵɵrepeaterCreate(4, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_For_5_Template, 9, 10, "div", 103, _forTrack0);
538
646
  i0.ɵɵelementEnd()();
539
647
  } if (rf & 2) {
540
648
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -542,12 +650,12 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_templa
542
650
  i0.ɵɵrepeater(ctx_r1.validationAttempts);
543
651
  } }
544
652
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_33_Template(rf, ctx) { if (rf & 1) {
545
- const _r10 = i0.ɵɵgetCurrentView();
546
- i0.ɵɵelementStart(0, "div", 82)(1, "h4");
653
+ const _r11 = i0.ɵɵgetCurrentView();
654
+ i0.ɵɵelementStart(0, "div", 95)(1, "h4");
547
655
  i0.ɵɵtext(2, "Validation Summary Details");
548
656
  i0.ɵɵelementEnd();
549
- i0.ɵɵelementStart(3, "div", 97)(4, "mj-code-editor", 98);
550
- i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_33_Template_mj_code_editor_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedValidationSummary, $event) || (ctx_r1.formattedValidationSummary = $event); return i0.ɵɵresetView($event); });
657
+ i0.ɵɵelementStart(3, "div", 110)(4, "mj-code-editor", 111);
658
+ i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_33_Template_mj_code_editor_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedValidationSummary, $event) || (ctx_r1.formattedValidationSummary = $event); return i0.ɵɵresetView($event); });
551
659
  i0.ɵɵelementEnd()()();
552
660
  } if (rf & 2) {
553
661
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -556,12 +664,12 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_templa
556
664
  i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
557
665
  } }
558
666
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_34_Template(rf, ctx) { if (rf & 1) {
559
- const _r11 = i0.ɵɵgetCurrentView();
560
- i0.ɵɵelementStart(0, "div", 82)(1, "h4");
667
+ const _r12 = i0.ɵɵgetCurrentView();
668
+ i0.ɵɵelementStart(0, "div", 95)(1, "h4");
561
669
  i0.ɵɵtext(2, "Validation Attempts (Raw JSON)");
562
670
  i0.ɵɵelementEnd();
563
- i0.ɵɵelementStart(3, "div", 97)(4, "mj-code-editor", 99);
564
- i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_34_Template_mj_code_editor_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedValidationAttempts, $event) || (ctx_r1.formattedValidationAttempts = $event); return i0.ɵɵresetView($event); });
671
+ i0.ɵɵelementStart(3, "div", 110)(4, "mj-code-editor", 112);
672
+ i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_34_Template_mj_code_editor_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedValidationAttempts, $event) || (ctx_r1.formattedValidationAttempts = $event); return i0.ɵɵresetView($event); });
565
673
  i0.ɵɵelementEnd()()();
566
674
  } if (rf & 2) {
567
675
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -570,40 +678,40 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_templa
570
678
  i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
571
679
  } }
572
680
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Template(rf, ctx) { if (rf & 1) {
573
- i0.ɵɵelementStart(0, "div", 42)(1, "div", 73)(2, "div", 74)(3, "h4");
681
+ i0.ɵɵelementStart(0, "div", 43)(1, "div", 86)(2, "div", 87)(3, "h4");
574
682
  i0.ɵɵtext(4, "Validation Summary");
575
683
  i0.ɵɵelementEnd();
576
- i0.ɵɵelementStart(5, "div", 75);
684
+ i0.ɵɵelementStart(5, "div", 88);
577
685
  i0.ɵɵelement(6, "i");
578
686
  i0.ɵɵtext(7);
579
687
  i0.ɵɵelementEnd()();
580
- i0.ɵɵelementStart(8, "div", 76)(9, "div", 77)(10, "div", 24);
688
+ i0.ɵɵelementStart(8, "div", 89)(9, "div", 90)(10, "div", 24);
581
689
  i0.ɵɵtext(11, "Total Attempts");
582
690
  i0.ɵɵelementEnd();
583
691
  i0.ɵɵelementStart(12, "div", 25);
584
692
  i0.ɵɵtext(13);
585
693
  i0.ɵɵelementEnd()();
586
- i0.ɵɵelementStart(14, "div", 77)(15, "div", 24);
694
+ i0.ɵɵelementStart(14, "div", 90)(15, "div", 24);
587
695
  i0.ɵɵtext(16, "Successful");
588
696
  i0.ɵɵelementEnd();
589
697
  i0.ɵɵelementStart(17, "div", 25);
590
698
  i0.ɵɵtext(18);
591
699
  i0.ɵɵelementEnd()();
592
- i0.ɵɵelementStart(19, "div", 77)(20, "div", 24);
700
+ i0.ɵɵelementStart(19, "div", 90)(20, "div", 24);
593
701
  i0.ɵɵtext(21, "Behavior");
594
702
  i0.ɵɵelementEnd();
595
703
  i0.ɵɵelementStart(22, "div", 25);
596
704
  i0.ɵɵtext(23);
597
705
  i0.ɵɵelementEnd()();
598
- i0.ɵɵelementStart(24, "div", 77)(25, "div", 24);
706
+ i0.ɵɵelementStart(24, "div", 90)(25, "div", 24);
599
707
  i0.ɵɵtext(26, "Retry Strategy");
600
708
  i0.ɵɵelementEnd();
601
709
  i0.ɵɵelementStart(27, "div", 25);
602
710
  i0.ɵɵtext(28);
603
711
  i0.ɵɵelementEnd()()();
604
- i0.ɵɵtemplate(29, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_29_Template, 7, 2, "div", 78)(30, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_30_Template, 6, 1, "div", 79);
712
+ i0.ɵɵtemplate(29, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_29_Template, 7, 2, "div", 91)(30, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_30_Template, 6, 1, "div", 92);
605
713
  i0.ɵɵelementEnd();
606
- i0.ɵɵtemplate(31, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_31_Template, 18, 9, "div", 80)(32, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_Template, 6, 0, "div", 81)(33, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_33_Template, 5, 4, "div", 82)(34, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_34_Template, 5, 4, "div", 82);
714
+ i0.ɵɵtemplate(31, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_31_Template, 18, 9, "div", 93)(32, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_Template, 6, 0, "div", 94)(33, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_33_Template, 5, 4, "div", 95)(34, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_34_Template, 5, 4, "div", 95);
607
715
  i0.ɵɵelementEnd();
608
716
  } if (rf & 2) {
609
717
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -635,7 +743,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_templa
635
743
  i0.ɵɵconditional(ctx_r1.record.ValidationAttempts ? 34 : -1);
636
744
  } }
637
745
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_Template(rf, ctx) { if (rf & 1) {
638
- i0.ɵɵelementStart(0, "kendo-panelbar-item", 29);
746
+ i0.ɵɵelementStart(0, "kendo-panelbar-item", 32);
639
747
  i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_1_Template, 6, 2, "ng-template", 30)(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Template, 35, 17, "ng-template", 31);
640
748
  i0.ɵɵelementEnd();
641
749
  } if (rf & 2) {
@@ -643,7 +751,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_Template(
643
751
  i0.ɵɵproperty("expanded", ctx_r1.validationExpanded);
644
752
  } }
645
753
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
646
- i0.ɵɵelementStart(0, "span", 71);
754
+ i0.ɵɵelementStart(0, "span", 58);
647
755
  i0.ɵɵtext(1);
648
756
  i0.ɵɵelementEnd();
649
757
  } if (rf & 2) {
@@ -652,10 +760,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_templa
652
760
  i0.ɵɵtextInterpolate1("(", ctx_r1.childRuns.length, " children)");
653
761
  } }
654
762
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_1_Template(rf, ctx) { if (rf & 1) {
655
- i0.ɵɵelementStart(0, "span", 40);
656
- i0.ɵɵelement(1, "i", 100);
763
+ i0.ɵɵelementStart(0, "span", 41);
764
+ i0.ɵɵelement(1, "i", 113);
657
765
  i0.ɵɵtext(2, " Run Hierarchy ");
658
- i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_1_Conditional_3_Template, 2, 1, "span", 71);
766
+ i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_1_Conditional_3_Template, 2, 1, "span", 58);
659
767
  i0.ɵɵelementEnd();
660
768
  } if (rf & 2) {
661
769
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -663,22 +771,22 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_templa
663
771
  i0.ɵɵconditional(ctx_r1.childRuns.length > 0 ? 3 : -1);
664
772
  } }
665
773
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
666
- const _r12 = i0.ɵɵgetCurrentView();
667
- i0.ɵɵelementStart(0, "div", 101)(1, "h4");
668
- i0.ɵɵelement(2, "i", 103);
774
+ const _r13 = i0.ɵɵgetCurrentView();
775
+ i0.ɵɵelementStart(0, "div", 114)(1, "h4");
776
+ i0.ɵɵelement(2, "i", 116);
669
777
  i0.ɵɵtext(3, " Parent Run");
670
778
  i0.ɵɵelementEnd();
671
- i0.ɵɵelementStart(4, "div", 104);
672
- i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_1_Template_div_click_4_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.navigateToEntity("MJ: AI Prompt Runs", ctx_r1.parentRun.ID)); });
673
- i0.ɵɵelementStart(5, "div", 105);
779
+ i0.ɵɵelementStart(4, "div", 117);
780
+ i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_1_Template_div_click_4_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.navigateToEntity("MJ: AI Prompt Runs", ctx_r1.parentRun.ID)); });
781
+ i0.ɵɵelementStart(5, "div", 118);
674
782
  i0.ɵɵelement(6, "i");
675
783
  i0.ɵɵelementEnd();
676
- i0.ɵɵelementStart(7, "div", 106)(8, "div", 107);
784
+ i0.ɵɵelementStart(7, "div", 119)(8, "div", 120);
677
785
  i0.ɵɵtext(9);
678
- i0.ɵɵelementStart(10, "span", 108);
786
+ i0.ɵɵelementStart(10, "span", 121);
679
787
  i0.ɵɵtext(11);
680
788
  i0.ɵɵelementEnd()();
681
- i0.ɵɵelementStart(12, "div", 109)(13, "span");
789
+ i0.ɵɵelementStart(12, "div", 122)(13, "span");
682
790
  i0.ɵɵelement(14, "i", 22);
683
791
  i0.ɵɵtext(15);
684
792
  i0.ɵɵelementEnd();
@@ -687,11 +795,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_templa
687
795
  i0.ɵɵtext(18);
688
796
  i0.ɵɵelementEnd();
689
797
  i0.ɵɵelementStart(19, "span");
690
- i0.ɵɵelement(20, "i", 39);
798
+ i0.ɵɵelement(20, "i", 40);
691
799
  i0.ɵɵtext(21);
692
800
  i0.ɵɵpipe(22, "date");
693
801
  i0.ɵɵelementEnd()()();
694
- i0.ɵɵelement(23, "i", 69);
802
+ i0.ɵɵelement(23, "i", 83);
695
803
  i0.ɵɵelementEnd()();
696
804
  } if (rf & 2) {
697
805
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -711,28 +819,28 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_templa
711
819
  i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(22, 9, ctx_r1.parentRun.RunAt, "short"), "");
712
820
  } }
713
821
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_2_For_6_Conditional_6_Template(rf, ctx) { if (rf & 1) {
714
- i0.ɵɵelementStart(0, "span", 114);
822
+ i0.ɵɵelementStart(0, "span", 127);
715
823
  i0.ɵɵtext(1);
716
824
  i0.ɵɵelementEnd();
717
825
  } if (rf & 2) {
718
- const childRun_r14 = i0.ɵɵnextContext().$implicit;
826
+ const childRun_r15 = i0.ɵɵnextContext().$implicit;
719
827
  i0.ɵɵadvance();
720
- i0.ɵɵtextInterpolate1("#", childRun_r14.ExecutionOrder, "");
828
+ i0.ɵɵtextInterpolate1("#", childRun_r15.ExecutionOrder, "");
721
829
  } }
722
830
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_2_For_6_Template(rf, ctx) { if (rf & 1) {
723
- const _r13 = i0.ɵɵgetCurrentView();
724
- i0.ɵɵelementStart(0, "div", 113);
725
- i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_2_For_6_Template_div_click_0_listener() { const childRun_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.navigateToEntity("MJ: AI Prompt Runs", childRun_r14.ID)); });
726
- i0.ɵɵelementStart(1, "div", 105);
831
+ const _r14 = i0.ɵɵgetCurrentView();
832
+ i0.ɵɵelementStart(0, "div", 126);
833
+ i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_2_For_6_Template_div_click_0_listener() { const childRun_r15 = i0.ɵɵrestoreView(_r14).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.navigateToEntity("MJ: AI Prompt Runs", childRun_r15.ID)); });
834
+ i0.ɵɵelementStart(1, "div", 118);
727
835
  i0.ɵɵelement(2, "i");
728
836
  i0.ɵɵelementEnd();
729
- i0.ɵɵelementStart(3, "div", 106)(4, "div", 107);
837
+ i0.ɵɵelementStart(3, "div", 119)(4, "div", 120);
730
838
  i0.ɵɵtext(5);
731
- i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_2_For_6_Conditional_6_Template, 2, 1, "span", 114);
732
- i0.ɵɵelementStart(7, "span", 108);
839
+ i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_2_For_6_Conditional_6_Template, 2, 1, "span", 127);
840
+ i0.ɵɵelementStart(7, "span", 121);
733
841
  i0.ɵɵtext(8);
734
842
  i0.ɵɵelementEnd()();
735
- i0.ɵɵelementStart(9, "div", 109)(10, "span", 115);
843
+ i0.ɵɵelementStart(9, "div", 122)(10, "span", 128);
736
844
  i0.ɵɵelement(11, "i");
737
845
  i0.ɵɵtext(12);
738
846
  i0.ɵɵelementEnd();
@@ -744,39 +852,39 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_templa
744
852
  i0.ɵɵelement(17, "i", 26);
745
853
  i0.ɵɵtext(18);
746
854
  i0.ɵɵelementEnd()()();
747
- i0.ɵɵelement(19, "i", 69);
855
+ i0.ɵɵelement(19, "i", 83);
748
856
  i0.ɵɵelementEnd();
749
857
  } if (rf & 2) {
750
- const childRun_r14 = ctx.$implicit;
858
+ const childRun_r15 = ctx.$implicit;
751
859
  const ctx_r1 = i0.ɵɵnextContext(5);
752
860
  i0.ɵɵadvance();
753
861
  i0.ɵɵstyleProp("background-color", ctx_r1.getStatusColor() + "20");
754
862
  i0.ɵɵadvance();
755
- i0.ɵɵclassMap("fa-solid " + ctx_r1.getRunTypeIcon(childRun_r14.RunType));
863
+ i0.ɵɵclassMap("fa-solid " + ctx_r1.getRunTypeIcon(childRun_r15.RunType));
756
864
  i0.ɵɵadvance(3);
757
- i0.ɵɵtextInterpolate1(" Child Run #", childRun_r14.ID.substring(0, 8), " ");
865
+ i0.ɵɵtextInterpolate1(" Child Run #", childRun_r15.ID.substring(0, 8), " ");
758
866
  i0.ɵɵadvance();
759
- i0.ɵɵconditional(childRun_r14.ExecutionOrder !== null ? 6 : -1);
867
+ i0.ɵɵconditional(childRun_r15.ExecutionOrder !== null ? 6 : -1);
760
868
  i0.ɵɵadvance(2);
761
- i0.ɵɵtextInterpolate(childRun_r14.RunType);
869
+ i0.ɵɵtextInterpolate(childRun_r15.RunType);
762
870
  i0.ɵɵadvance(2);
763
871
  i0.ɵɵstyleProp("color", ctx_r1.getStatusColor());
764
872
  i0.ɵɵadvance();
765
873
  i0.ɵɵclassMap("fa-solid " + ctx_r1.getStatusIcon());
766
874
  i0.ɵɵadvance();
767
- i0.ɵɵtextInterpolate1(" ", childRun_r14.Success ? "Success" : childRun_r14.ErrorMessage ? "Failed" : "Running", " ");
875
+ i0.ɵɵtextInterpolate1(" ", childRun_r15.Success ? "Success" : childRun_r15.ErrorMessage ? "Failed" : "Running", " ");
768
876
  i0.ɵɵadvance(3);
769
- i0.ɵɵtextInterpolate1(" ", ctx_r1.formatDuration(childRun_r14.ExecutionTimeMS), "");
877
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.formatDuration(childRun_r15.ExecutionTimeMS), "");
770
878
  i0.ɵɵadvance(3);
771
- i0.ɵɵtextInterpolate1(" ", ctx_r1.formatTokens(childRun_r14.TokensUsed), "");
879
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.formatTokens(childRun_r15.TokensUsed), "");
772
880
  } }
773
881
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
774
- i0.ɵɵelementStart(0, "div", 102)(1, "h4");
775
- i0.ɵɵelement(2, "i", 110);
882
+ i0.ɵɵelementStart(0, "div", 115)(1, "h4");
883
+ i0.ɵɵelement(2, "i", 123);
776
884
  i0.ɵɵtext(3, " Child Runs");
777
885
  i0.ɵɵelementEnd();
778
- i0.ɵɵelementStart(4, "div", 111);
779
- i0.ɵɵrepeaterCreate(5, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_2_For_6_Template, 20, 14, "div", 112, _forTrack1);
886
+ i0.ɵɵelementStart(4, "div", 124);
887
+ i0.ɵɵrepeaterCreate(5, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_2_For_6_Template, 20, 14, "div", 125, _forTrack1);
780
888
  i0.ɵɵelementEnd()();
781
889
  } if (rf & 2) {
782
890
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -784,8 +892,8 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_templa
784
892
  i0.ɵɵrepeater(ctx_r1.childRuns);
785
893
  } }
786
894
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Template(rf, ctx) { if (rf & 1) {
787
- i0.ɵɵelementStart(0, "div", 42);
788
- i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_1_Template, 24, 12, "div", 101)(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_2_Template, 7, 0, "div", 102);
895
+ i0.ɵɵelementStart(0, "div", 43);
896
+ i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_1_Template, 24, 12, "div", 114)(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_2_Template, 7, 0, "div", 115);
789
897
  i0.ɵɵelementEnd();
790
898
  } if (rf & 2) {
791
899
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -795,7 +903,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_templa
795
903
  i0.ɵɵconditional(ctx_r1.childRuns.length > 0 ? 2 : -1);
796
904
  } }
797
905
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_Template(rf, ctx) { if (rf & 1) {
798
- i0.ɵɵelementStart(0, "kendo-panelbar-item", 29);
906
+ i0.ɵɵelementStart(0, "kendo-panelbar-item", 32);
799
907
  i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_1_Template, 4, 1, "ng-template", 30)(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Template, 3, 2, "ng-template", 31);
800
908
  i0.ɵɵelementEnd();
801
909
  } if (rf & 2) {
@@ -803,21 +911,21 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_Template(
803
911
  i0.ɵɵproperty("expanded", ctx_r1.hierarchyExpanded);
804
912
  } }
805
913
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Template(rf, ctx) { if (rf & 1) {
806
- i0.ɵɵelementStart(0, "span", 40);
807
- i0.ɵɵelement(1, "i", 116);
914
+ i0.ɵɵelementStart(0, "span", 41);
915
+ i0.ɵɵelement(1, "i", 129);
808
916
  i0.ɵɵtext(2, " Additional Details ");
809
917
  i0.ɵɵelementEnd();
810
918
  } }
811
919
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_2_Template(rf, ctx) { if (rf & 1) {
812
- const _r15 = i0.ɵɵgetCurrentView();
813
- i0.ɵɵelementStart(0, "div", 118)(1, "label");
920
+ const _r16 = i0.ɵɵgetCurrentView();
921
+ i0.ɵɵelementStart(0, "div", 131)(1, "label");
814
922
  i0.ɵɵtext(2, "Agent");
815
923
  i0.ɵɵelementEnd();
816
- i0.ɵɵelementStart(3, "div", 126);
817
- i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_2_Template_div_click_3_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.navigateToEntity("AI Agents", ctx_r1.record.AgentID)); });
818
- i0.ɵɵelement(4, "i", 127);
924
+ i0.ɵɵelementStart(3, "div", 139);
925
+ i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_2_Template_div_click_3_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.navigateToEntity("AI Agents", ctx_r1.record.AgentID)); });
926
+ i0.ɵɵelement(4, "i", 140);
819
927
  i0.ɵɵtext(5);
820
- i0.ɵɵelement(6, "i", 69);
928
+ i0.ɵɵelement(6, "i", 83);
821
929
  i0.ɵɵelementEnd()();
822
930
  } if (rf & 2) {
823
931
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -825,11 +933,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Condition
825
933
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Agent || "Unknown", " ");
826
934
  } }
827
935
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_3_Template(rf, ctx) { if (rf & 1) {
828
- i0.ɵɵelementStart(0, "div", 118)(1, "label");
936
+ i0.ɵɵelementStart(0, "div", 131)(1, "label");
829
937
  i0.ɵɵtext(2, "Configuration");
830
938
  i0.ɵɵelementEnd();
831
- i0.ɵɵelementStart(3, "div", 119);
832
- i0.ɵɵelement(4, "i", 128);
939
+ i0.ɵɵelementStart(3, "div", 132);
940
+ i0.ɵɵelement(4, "i", 141);
833
941
  i0.ɵɵtext(5);
834
942
  i0.ɵɵelementEnd()();
835
943
  } if (rf & 2) {
@@ -838,10 +946,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Condition
838
946
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Configuration || "Unknown", " ");
839
947
  } }
840
948
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_4_Template(rf, ctx) { if (rf & 1) {
841
- i0.ɵɵelementStart(0, "div", 118)(1, "label");
949
+ i0.ɵɵelementStart(0, "div", 131)(1, "label");
842
950
  i0.ɵɵtext(2, "Run Type");
843
951
  i0.ɵɵelementEnd();
844
- i0.ɵɵelementStart(3, "div", 119);
952
+ i0.ɵɵelementStart(3, "div", 132);
845
953
  i0.ɵɵelement(4, "i");
846
954
  i0.ɵɵtext(5);
847
955
  i0.ɵɵelementEnd()();
@@ -853,11 +961,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Condition
853
961
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.RunType, " ");
854
962
  } }
855
963
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_5_Template(rf, ctx) { if (rf & 1) {
856
- i0.ɵɵelementStart(0, "div", 118)(1, "label");
964
+ i0.ɵɵelementStart(0, "div", 131)(1, "label");
857
965
  i0.ɵɵtext(2, "Response Format");
858
966
  i0.ɵɵelementEnd();
859
- i0.ɵɵelementStart(3, "div", 119);
860
- i0.ɵɵelement(4, "i", 129);
967
+ i0.ɵɵelementStart(3, "div", 132);
968
+ i0.ɵɵelement(4, "i", 63);
861
969
  i0.ɵɵtext(5);
862
970
  i0.ɵɵelementEnd()();
863
971
  } if (rf & 2) {
@@ -866,10 +974,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Condition
866
974
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.ResponseFormat, " ");
867
975
  } }
868
976
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_48_Template(rf, ctx) { if (rf & 1) {
869
- i0.ɵɵelementStart(0, "div", 118)(1, "label");
977
+ i0.ɵɵelementStart(0, "div", 131)(1, "label");
870
978
  i0.ɵɵtext(2, "Started At");
871
979
  i0.ɵɵelementEnd();
872
- i0.ɵɵelementStart(3, "div", 119);
980
+ i0.ɵɵelementStart(3, "div", 132);
873
981
  i0.ɵɵelement(4, "i", 22);
874
982
  i0.ɵɵtext(5);
875
983
  i0.ɵɵpipe(6, "date");
@@ -880,11 +988,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Condition
880
988
  i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(6, 1, ctx_r1.record.RunAt, "medium"), " ");
881
989
  } }
882
990
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_49_Template(rf, ctx) { if (rf & 1) {
883
- i0.ɵɵelementStart(0, "div", 118)(1, "label");
991
+ i0.ɵɵelementStart(0, "div", 131)(1, "label");
884
992
  i0.ɵɵtext(2, "Completed At");
885
993
  i0.ɵɵelementEnd();
886
- i0.ɵɵelementStart(3, "div", 119);
887
- i0.ɵɵelement(4, "i", 130);
994
+ i0.ɵɵelementStart(3, "div", 132);
995
+ i0.ɵɵelement(4, "i", 142);
888
996
  i0.ɵɵtext(5);
889
997
  i0.ɵɵpipe(6, "date");
890
998
  i0.ɵɵelementEnd()();
@@ -894,58 +1002,58 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Condition
894
1002
  i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(6, 1, ctx_r1.record.CompletedAt, "medium"), " ");
895
1003
  } }
896
1004
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Template(rf, ctx) { if (rf & 1) {
897
- i0.ɵɵelementStart(0, "div", 42)(1, "div", 117);
898
- i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_2_Template, 7, 1, "div", 118)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_3_Template, 6, 1, "div", 118)(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_4_Template, 6, 3, "div", 118)(5, AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_5_Template, 6, 1, "div", 118);
899
- i0.ɵɵelementStart(6, "div", 118)(7, "label");
1005
+ i0.ɵɵelementStart(0, "div", 43)(1, "div", 130);
1006
+ i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_2_Template, 7, 1, "div", 131)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_3_Template, 6, 1, "div", 131)(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_4_Template, 6, 3, "div", 131)(5, AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_5_Template, 6, 1, "div", 131);
1007
+ i0.ɵɵelementStart(6, "div", 131)(7, "label");
900
1008
  i0.ɵɵtext(8, "Temperature");
901
1009
  i0.ɵɵelementEnd();
902
- i0.ɵɵelementStart(9, "div", 119);
903
- i0.ɵɵelement(10, "i", 120);
1010
+ i0.ɵɵelementStart(9, "div", 132);
1011
+ i0.ɵɵelement(10, "i", 133);
904
1012
  i0.ɵɵtext(11);
905
1013
  i0.ɵɵelementEnd()();
906
- i0.ɵɵelementStart(12, "div", 118)(13, "label");
1014
+ i0.ɵɵelementStart(12, "div", 131)(13, "label");
907
1015
  i0.ɵɵtext(14, "Top P");
908
1016
  i0.ɵɵelementEnd();
909
- i0.ɵɵelementStart(15, "div", 119);
910
- i0.ɵɵelement(16, "i", 121);
1017
+ i0.ɵɵelementStart(15, "div", 132);
1018
+ i0.ɵɵelement(16, "i", 134);
911
1019
  i0.ɵɵtext(17);
912
1020
  i0.ɵɵelementEnd()();
913
- i0.ɵɵelementStart(18, "div", 118)(19, "label");
1021
+ i0.ɵɵelementStart(18, "div", 131)(19, "label");
914
1022
  i0.ɵɵtext(20, "Top K");
915
1023
  i0.ɵɵelementEnd();
916
- i0.ɵɵelementStart(21, "div", 119);
917
- i0.ɵɵelement(22, "i", 122);
1024
+ i0.ɵɵelementStart(21, "div", 132);
1025
+ i0.ɵɵelement(22, "i", 135);
918
1026
  i0.ɵɵtext(23);
919
1027
  i0.ɵɵelementEnd()();
920
- i0.ɵɵelementStart(24, "div", 118)(25, "label");
1028
+ i0.ɵɵelementStart(24, "div", 131)(25, "label");
921
1029
  i0.ɵɵtext(26, "Min P");
922
1030
  i0.ɵɵelementEnd();
923
- i0.ɵɵelementStart(27, "div", 119);
924
- i0.ɵɵelement(28, "i", 123);
1031
+ i0.ɵɵelementStart(27, "div", 132);
1032
+ i0.ɵɵelement(28, "i", 136);
925
1033
  i0.ɵɵtext(29);
926
1034
  i0.ɵɵelementEnd()();
927
- i0.ɵɵelementStart(30, "div", 118)(31, "label");
1035
+ i0.ɵɵelementStart(30, "div", 131)(31, "label");
928
1036
  i0.ɵɵtext(32, "Frequency Penalty");
929
1037
  i0.ɵɵelementEnd();
930
- i0.ɵɵelementStart(33, "div", 119);
931
- i0.ɵɵelement(34, "i", 84);
1038
+ i0.ɵɵelementStart(33, "div", 132);
1039
+ i0.ɵɵelement(34, "i", 97);
932
1040
  i0.ɵɵtext(35);
933
1041
  i0.ɵɵelementEnd()();
934
- i0.ɵɵelementStart(36, "div", 118)(37, "label");
1042
+ i0.ɵɵelementStart(36, "div", 131)(37, "label");
935
1043
  i0.ɵɵtext(38, "Presence Penalty");
936
1044
  i0.ɵɵelementEnd();
937
- i0.ɵɵelementStart(39, "div", 119);
938
- i0.ɵɵelement(40, "i", 124);
1045
+ i0.ɵɵelementStart(39, "div", 132);
1046
+ i0.ɵɵelement(40, "i", 137);
939
1047
  i0.ɵɵtext(41);
940
1048
  i0.ɵɵelementEnd()();
941
- i0.ɵɵelementStart(42, "div", 118)(43, "label");
1049
+ i0.ɵɵelementStart(42, "div", 131)(43, "label");
942
1050
  i0.ɵɵtext(44, "Seed");
943
1051
  i0.ɵɵelementEnd();
944
- i0.ɵɵelementStart(45, "div", 119);
945
- i0.ɵɵelement(46, "i", 125);
1052
+ i0.ɵɵelementStart(45, "div", 132);
1053
+ i0.ɵɵelement(46, "i", 138);
946
1054
  i0.ɵɵtext(47);
947
1055
  i0.ɵɵelementEnd()();
948
- i0.ɵɵtemplate(48, AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_48_Template, 7, 4, "div", 118)(49, AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_49_Template, 7, 4, "div", 118);
1056
+ i0.ɵɵtemplate(48, AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_48_Template, 7, 4, "div", 131)(49, AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_49_Template, 7, 4, "div", 131);
949
1057
  i0.ɵɵelementEnd()();
950
1058
  } if (rf & 2) {
951
1059
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -1038,16 +1146,17 @@ function AIPromptRunFormComponentExtended_Conditional_1_Template(rf, ctx) { if (
1038
1146
  i0.ɵɵtemplate(45, AIPromptRunFormComponentExtended_Conditional_1_Conditional_45_Template, 8, 4, "div", 21);
1039
1147
  i0.ɵɵelementEnd()();
1040
1148
  i0.ɵɵelementStart(46, "div", 28)(47, "kendo-panelbar")(48, "kendo-panelbar-item", 29);
1149
+ i0.ɵɵlistener("stateChange", function AIPromptRunFormComponentExtended_Conditional_1_Template_kendo_panelbar_item_stateChange_48_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onInputPanelToggle()); });
1041
1150
  i0.ɵɵtemplate(49, AIPromptRunFormComponentExtended_Conditional_1_ng_template_49_Template, 4, 1, "ng-template", 30)(50, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Template, 3, 1, "ng-template", 31);
1042
1151
  i0.ɵɵelementEnd();
1043
- i0.ɵɵelementStart(51, "kendo-panelbar-item", 29);
1152
+ i0.ɵɵelementStart(51, "kendo-panelbar-item", 32);
1044
1153
  i0.ɵɵtemplate(52, AIPromptRunFormComponentExtended_Conditional_1_ng_template_52_Template, 5, 2, "ng-template", 30)(53, AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Template, 4, 2, "ng-template", 31);
1045
1154
  i0.ɵɵelementEnd();
1046
- i0.ɵɵelementStart(54, "kendo-panelbar-item", 29);
1155
+ i0.ɵɵelementStart(54, "kendo-panelbar-item", 32);
1047
1156
  i0.ɵɵtemplate(55, AIPromptRunFormComponentExtended_Conditional_1_ng_template_55_Template, 3, 0, "ng-template", 30)(56, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Template, 39, 12, "ng-template", 31);
1048
1157
  i0.ɵɵelementEnd();
1049
- i0.ɵɵtemplate(57, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_Template, 3, 1, "kendo-panelbar-item", 29)(58, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_Template, 3, 1, "kendo-panelbar-item", 29);
1050
- i0.ɵɵelementStart(59, "kendo-panelbar-item", 29);
1158
+ i0.ɵɵtemplate(57, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_Template, 3, 1, "kendo-panelbar-item", 32)(58, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_Template, 3, 1, "kendo-panelbar-item", 32);
1159
+ i0.ɵɵelementStart(59, "kendo-panelbar-item", 32);
1051
1160
  i0.ɵɵtemplate(60, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Template, 3, 0, "ng-template", 30)(61, AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Template, 50, 27, "ng-template", 31);
1052
1161
  i0.ɵɵelementEnd()()()();
1053
1162
  } if (rf & 2) {
@@ -1084,7 +1193,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Template(rf, ctx) { if (
1084
1193
  i0.ɵɵadvance();
1085
1194
  i0.ɵɵconditional(ctx_r1.record.RunAt ? 45 : -1);
1086
1195
  i0.ɵɵadvance(3);
1087
- i0.ɵɵproperty("expanded", ctx_r1.messagesExpanded);
1196
+ i0.ɵɵproperty("expanded", ctx_r1.inputExpanded);
1088
1197
  i0.ɵɵadvance(3);
1089
1198
  i0.ɵɵproperty("expanded", ctx_r1.resultExpanded);
1090
1199
  i0.ɵɵadvance(3);
@@ -1107,7 +1216,11 @@ let AIPromptRunFormComponentExtended = class AIPromptRunFormComponentExtended ex
1107
1216
  this.childRuns = [];
1108
1217
  // UI state
1109
1218
  this.isLoadingRelatedData = false;
1219
+ this.isParsingMessages = true; // Add loading state for message parsing
1220
+ this.inputExpanded = true;
1110
1221
  this.messagesExpanded = true;
1222
+ this.dataExpanded = false; // Changed to false - often blank
1223
+ this.rawExpanded = false;
1111
1224
  this.resultExpanded = true;
1112
1225
  this.metricsExpanded = false;
1113
1226
  this.hierarchyExpanded = false;
@@ -1117,6 +1230,10 @@ let AIPromptRunFormComponentExtended = class AIPromptRunFormComponentExtended ex
1117
1230
  this.formattedResult = '';
1118
1231
  this.formattedValidationSummary = '';
1119
1232
  this.formattedValidationAttempts = '';
1233
+ this.formattedData = '';
1234
+ // Parsed input data
1235
+ this.chatMessages = [];
1236
+ this.inputData = null;
1120
1237
  // Validation data
1121
1238
  this.validationAttempts = [];
1122
1239
  this.validationSummary = null;
@@ -1129,6 +1246,19 @@ let AIPromptRunFormComponentExtended = class AIPromptRunFormComponentExtended ex
1129
1246
  this.loadValidationData();
1130
1247
  }
1131
1248
  }
1249
+ ngAfterViewInit() {
1250
+ // Force change detection to ensure expansion panels render correctly
1251
+ setTimeout(() => {
1252
+ this.cdr.detectChanges();
1253
+ }, 0);
1254
+ }
1255
+ onInputPanelToggle() {
1256
+ // Force change detection when parent panel is toggled
1257
+ // This helps ensure nested expansion panels render correctly
1258
+ setTimeout(() => {
1259
+ this.cdr.detectChanges();
1260
+ }, 100);
1261
+ }
1132
1262
  async loadRelatedData() {
1133
1263
  this.isLoadingRelatedData = true;
1134
1264
  try {
@@ -1176,6 +1306,7 @@ let AIPromptRunFormComponentExtended = class AIPromptRunFormComponentExtended ex
1176
1306
  this.childRuns = result.Results;
1177
1307
  }
1178
1308
  formatJsonFields() {
1309
+ this.isParsingMessages = true; // Start parsing
1179
1310
  const parseOptions = {
1180
1311
  extractInlineJson: true,
1181
1312
  maxDepth: 100,
@@ -1187,14 +1318,40 @@ let AIPromptRunFormComponentExtended = class AIPromptRunFormComponentExtended ex
1187
1318
  const parsed = JSON.parse(this.record.Messages);
1188
1319
  const recursivelyParsed = ParseJSONRecursive(parsed, parseOptions);
1189
1320
  this.formattedMessages = JSON.stringify(recursivelyParsed, null, 2);
1321
+ // Extract messages array and data
1322
+ if (recursivelyParsed && typeof recursivelyParsed === 'object') {
1323
+ // Extract chat messages if they exist
1324
+ if (recursivelyParsed.messages && Array.isArray(recursivelyParsed.messages)) {
1325
+ this.chatMessages = recursivelyParsed.messages;
1326
+ }
1327
+ else {
1328
+ this.chatMessages = [];
1329
+ }
1330
+ // Extract data object if it exists
1331
+ if (recursivelyParsed.data) {
1332
+ this.inputData = recursivelyParsed.data;
1333
+ this.formattedData = JSON.stringify(recursivelyParsed.data, null, 2);
1334
+ }
1335
+ else {
1336
+ this.inputData = null;
1337
+ this.formattedData = '';
1338
+ }
1339
+ }
1190
1340
  }
1191
1341
  catch {
1192
1342
  this.formattedMessages = this.record.Messages;
1343
+ this.chatMessages = [];
1344
+ this.inputData = null;
1345
+ this.formattedData = '';
1193
1346
  }
1194
1347
  }
1195
1348
  else {
1196
1349
  this.formattedMessages = '';
1350
+ this.chatMessages = [];
1351
+ this.inputData = null;
1352
+ this.formattedData = '';
1197
1353
  }
1354
+ this.isParsingMessages = false; // Done parsing
1198
1355
  // Format result with recursive JSON parsing
1199
1356
  if (this.record.Result) {
1200
1357
  try {
@@ -1376,14 +1533,14 @@ let AIPromptRunFormComponentExtended = class AIPromptRunFormComponentExtended ex
1376
1533
  this.validationExpanded = (this.record.ValidationAttemptCount || 0) > 1;
1377
1534
  }
1378
1535
  static { this.ɵfac = function AIPromptRunFormComponentExtended_Factory(t) { return new (t || AIPromptRunFormComponentExtended)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i1.SharedService), i0.ɵɵdirectiveInject(i2.Router), i0.ɵɵdirectiveInject(i2.ActivatedRoute), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; }
1379
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AIPromptRunFormComponentExtended, selectors: [["mj-ai-prompt-run-form"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [["form", "ngForm"], [1, "record-form-container"], [1, "record-form"], [3, "form"], [1, "prompt-run-header"], [1, "header-content"], [1, "run-overview"], [1, "run-icon-wrapper"], [1, "run-info"], [1, "run-title"], [1, "run-id"], [1, "run-meta"], [1, "status-badge"], [1, "run-type-badge", 3, "color"], ["title", "View Prompt", 1, "prompt-name"], ["title", "View Model", 1, "model-name"], ["title", "View Vendor", 1, "vendor-name"], [1, "run-actions"], ["kendoButton", "", "fillMode", "outline", "size", "small", "title", "Refresh data", 3, "click"], [1, "fa-solid", "fa-refresh"], [1, "metrics-bar"], [1, "metric-item"], [1, "fa-solid", "fa-clock"], [1, "metric-content"], [1, "metric-label"], [1, "metric-value"], [1, "fa-solid", "fa-coins"], [1, "fa-solid", "fa-dollar-sign"], [1, "form-content"], [3, "expanded"], ["kendoPanelBarItemTitle", ""], ["kendoPanelBarContent", ""], [1, "run-type-badge"], ["title", "View Prompt", 1, "prompt-name", 3, "click"], [1, "fa-solid", "fa-comment-dots"], ["title", "View Model", 1, "model-name", 3, "click"], [1, "fa-solid", "fa-microchip"], ["title", "View Vendor", 1, "vendor-name", 3, "click"], [1, "fa-solid", "fa-building"], [1, "fa-solid", "fa-calendar"], [1, "panel-title"], [1, "panel-badge"], [1, "panel-content"], [1, "json-editor-container"], [1, "empty-state"], [1, "json-toolbar"], ["kendoButton", "", "fillMode", "flat", "size", "small", "title", "Copy JSON", 3, "click"], [1, "fa-solid", "fa-copy"], ["name", "formattedMessages", 2, "height", "400px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-comment-slash"], [1, "fa-solid", "fa-square-check"], [1, "panel-badge", "error"], [1, "error-message"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "error-content"], ["name", "formattedResult", 2, "height", "400px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-inbox"], [1, "fa-solid", "fa-chart-line"], [1, "metrics-grid"], [1, "metric-card"], [1, "metric-header"], [1, "fa-solid", "fa-message"], [1, "metric-value", "large"], [1, "metric-rollup"], [1, "fa-solid", "fa-reply"], [1, "metric-currency"], [1, "additional-metrics"], [1, "metric-row"], [1, "metric-value", "link", 3, "click"], [1, "fa-solid", "fa-external-link"], [1, "fa-solid", "fa-shield-check"], [1, "panel-count"], [1, "panel-badge", "success"], [1, "validation-summary"], [1, "summary-header"], [1, "validation-status"], [1, "validation-metrics"], [1, "metric-card", "small"], [1, "validation-error"], [1, "common-error"], [1, "retry-timeline"], [1, "validation-attempts"], [1, "validation-json"], [1, "error-count"], [1, "fa-solid", "fa-repeat"], [1, "timeline-info"], [1, "timeline-stat"], [1, "fa-solid", "fa-flag-checkered"], [1, "fa-solid", "fa-stopwatch"], [1, "attempts-list"], [1, "attempt-item", 3, "success", "failed"], [1, "attempt-item"], [1, "attempt-number"], [1, "attempt-details"], [1, "attempt-time"], [1, "output-length"], [1, "attempt-error"], [1, "json-viewer-container"], ["name", "formattedValidationSummary", 2, "height", "200px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], ["name", "formattedValidationAttempts", 2, "height", "300px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-sitemap"], [1, "parent-run-section"], [1, "child-runs-section"], [1, "fa-solid", "fa-level-up-alt"], [1, "run-item", "parent", 3, "click"], [1, "run-item-icon"], [1, "run-item-content"], [1, "run-item-title"], [1, "run-item-type"], [1, "run-item-meta"], [1, "fa-solid", "fa-level-down-alt"], [1, "runs-list"], [1, "run-item", "child"], [1, "run-item", "child", 3, "click"], [1, "execution-order"], [1, "status-indicator"], [1, "fa-solid", "fa-info-circle"], [1, "detail-fields-grid"], [1, "detail-field"], [1, "detail-value"], [1, "fa-solid", "fa-temperature-high"], [1, "fa-solid", "fa-percentage"], [1, "fa-solid", "fa-list-ol"], [1, "fa-solid", "fa-filter"], [1, "fa-solid", "fa-plus-circle"], [1, "fa-solid", "fa-seedling"], ["title", "View Agent", 1, "detail-value", "clickable", 3, "click"], [1, "fa-solid", "fa-robot"], [1, "fa-solid", "fa-cog"], [1, "fa-solid", "fa-code"], [1, "fa-solid", "fa-check-circle"]], template: function AIPromptRunFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
1536
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AIPromptRunFormComponentExtended, selectors: [["mj-ai-prompt-run-form"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [["form", "ngForm"], [1, "record-form-container"], [1, "record-form"], [3, "form"], [1, "prompt-run-header"], [1, "header-content"], [1, "run-overview"], [1, "run-icon-wrapper"], [1, "run-info"], [1, "run-title"], [1, "run-id"], [1, "run-meta"], [1, "status-badge"], [1, "run-type-badge", 3, "color"], ["title", "View Prompt", 1, "prompt-name"], ["title", "View Model", 1, "model-name"], ["title", "View Vendor", 1, "vendor-name"], [1, "run-actions"], ["kendoButton", "", "fillMode", "outline", "size", "small", "title", "Refresh data", 3, "click"], [1, "fa-solid", "fa-refresh"], [1, "metrics-bar"], [1, "metric-item"], [1, "fa-solid", "fa-clock"], [1, "metric-content"], [1, "metric-label"], [1, "metric-value"], [1, "fa-solid", "fa-coins"], [1, "fa-solid", "fa-dollar-sign"], [1, "form-content"], [3, "stateChange", "expanded"], ["kendoPanelBarItemTitle", ""], ["kendoPanelBarContent", ""], [3, "expanded"], [1, "run-type-badge"], ["title", "View Prompt", 1, "prompt-name", 3, "click"], [1, "fa-solid", "fa-comment-dots"], ["title", "View Model", 1, "model-name", 3, "click"], [1, "fa-solid", "fa-microchip"], ["title", "View Vendor", 1, "vendor-name", 3, "click"], [1, "fa-solid", "fa-building"], [1, "fa-solid", "fa-calendar"], [1, "panel-title"], [1, "panel-badge"], [1, "panel-content"], [1, "nested-panels"], [1, "empty-state"], [1, "sub-expansion-panel", 3, "expanded", "animation"], ["kendoExpansionPanelTitleDirective", ""], [1, "sub-panel-content"], [1, "loading-state"], [3, "messages"], [1, "json-editor-container"], [1, "json-toolbar"], ["kendoButton", "", "fillMode", "flat", "size", "small", "title", "Copy JSON", 3, "click"], [1, "fa-solid", "fa-copy"], ["name", "formattedMessages", 2, "height", "400px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "sub-panel-title"], [1, "fa-solid", "fa-comments"], [1, "panel-count"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-comment-slash"], [1, "fa-solid", "fa-database"], ["name", "formattedData", 2, "height", "300px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-code"], [1, "fa-solid", "fa-square-check"], [1, "panel-badge", "error"], [1, "error-message"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "error-content"], ["name", "formattedResult", 2, "height", "400px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-inbox"], [1, "fa-solid", "fa-chart-line"], [1, "metrics-grid"], [1, "metric-card"], [1, "metric-header"], [1, "fa-solid", "fa-message"], [1, "metric-value", "large"], [1, "metric-rollup"], [1, "fa-solid", "fa-reply"], [1, "metric-currency"], [1, "additional-metrics"], [1, "metric-row"], [1, "metric-value", "link", 3, "click"], [1, "fa-solid", "fa-external-link"], [1, "fa-solid", "fa-shield-check"], [1, "panel-badge", "success"], [1, "validation-summary"], [1, "summary-header"], [1, "validation-status"], [1, "validation-metrics"], [1, "metric-card", "small"], [1, "validation-error"], [1, "common-error"], [1, "retry-timeline"], [1, "validation-attempts"], [1, "validation-json"], [1, "error-count"], [1, "fa-solid", "fa-repeat"], [1, "timeline-info"], [1, "timeline-stat"], [1, "fa-solid", "fa-flag-checkered"], [1, "fa-solid", "fa-stopwatch"], [1, "attempts-list"], [1, "attempt-item", 3, "success", "failed"], [1, "attempt-item"], [1, "attempt-number"], [1, "attempt-details"], [1, "attempt-time"], [1, "output-length"], [1, "attempt-error"], [1, "json-viewer-container"], ["name", "formattedValidationSummary", 2, "height", "200px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], ["name", "formattedValidationAttempts", 2, "height", "300px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-sitemap"], [1, "parent-run-section"], [1, "child-runs-section"], [1, "fa-solid", "fa-level-up-alt"], [1, "run-item", "parent", 3, "click"], [1, "run-item-icon"], [1, "run-item-content"], [1, "run-item-title"], [1, "run-item-type"], [1, "run-item-meta"], [1, "fa-solid", "fa-level-down-alt"], [1, "runs-list"], [1, "run-item", "child"], [1, "run-item", "child", 3, "click"], [1, "execution-order"], [1, "status-indicator"], [1, "fa-solid", "fa-info-circle"], [1, "detail-fields-grid"], [1, "detail-field"], [1, "detail-value"], [1, "fa-solid", "fa-temperature-high"], [1, "fa-solid", "fa-percentage"], [1, "fa-solid", "fa-list-ol"], [1, "fa-solid", "fa-filter"], [1, "fa-solid", "fa-plus-circle"], [1, "fa-solid", "fa-seedling"], ["title", "View Agent", 1, "detail-value", "clickable", 3, "click"], [1, "fa-solid", "fa-robot"], [1, "fa-solid", "fa-cog"], [1, "fa-solid", "fa-check-circle"]], template: function AIPromptRunFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
1380
1537
  i0.ɵɵelementStart(0, "div", 1);
1381
1538
  i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Template, 62, 27, "form", 2);
1382
1539
  i0.ɵɵelementEnd();
1383
1540
  } if (rf & 2) {
1384
1541
  i0.ɵɵadvance();
1385
1542
  i0.ɵɵconditional(ctx.record ? 1 : -1);
1386
- } }, dependencies: [i3.ɵNgNoValidate, i3.NgControlStatus, i3.NgControlStatusGroup, i3.NgModel, i3.NgForm, i4.PanelBarComponent, i4.PanelBarItemComponent, i4.PanelBarContentDirective, i4.PanelBarItemTitleDirective, i5.ButtonComponent, i6.FormToolbarComponent, i7.CodeEditorComponent, i8.DatePipe], styles: ["\n\n.prompt-run-header[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border-bottom: 2px solid #e9ecef;\n padding: 20px;\n margin-bottom: 0;\n}\n\n.header-content[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n margin-bottom: 16px;\n}\n\n.run-overview[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n flex: 1;\n}\n\n.run-icon-wrapper[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-icon-wrapper[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n}\n\n.run-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.run-title[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 1.5em;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.run-id[_ngcontent-%COMP%] {\n font-size: 0.8em;\n color: #6c757d;\n font-weight: 400;\n font-family: 'Courier New', monospace;\n}\n\n.run-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n color: white;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.status-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.9em;\n}\n\n.run-type-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #f1f3f5;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.prompt-name[_ngcontent-%COMP%], .model-name[_ngcontent-%COMP%], .vendor-name[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.85em;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.prompt-name[_ngcontent-%COMP%]:hover, .model-name[_ngcontent-%COMP%]:hover, .vendor-name[_ngcontent-%COMP%]:hover {\n background: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.run-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n\n\n.metrics-bar[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n padding-top: 16px;\n border-top: 1px solid #e9ecef;\n flex-wrap: wrap;\n}\n\n.metric-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.metric-item[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n font-size: 1.2em;\n color: #6c757d;\n width: 24px;\n text-align: center;\n}\n\n.metric-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.metric-label[_ngcontent-%COMP%] {\n font-size: 0.75em;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value[_ngcontent-%COMP%] {\n font-size: 1.1em;\n font-weight: 600;\n color: #2c3e50;\n}\n\n\n\n.form-content[_ngcontent-%COMP%] {\n padding: 16px;\n}\n\n.panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n.panel-badge[_ngcontent-%COMP%] {\n margin-left: auto;\n padding: 2px 8px;\n border-radius: 12px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n.panel-badge.error[_ngcontent-%COMP%] {\n background: #dc3545;\n color: white;\n}\n\n.panel-count[_ngcontent-%COMP%] {\n color: #6c757d;\n font-weight: 400;\n font-size: 0.9em;\n}\n\n.panel-content[_ngcontent-%COMP%] {\n padding: 20px;\n max-height: none !important;\n overflow: visible !important;\n}\n\n\n\n.json-editor-container[_ngcontent-%COMP%] {\n border: 1px solid #e9ecef;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.json-toolbar[_ngcontent-%COMP%] {\n background: #f8f9fa;\n padding: 8px 12px;\n border-bottom: 1px solid #e9ecef;\n display: flex;\n justify-content: flex-end;\n}\n\n\n\n.error-message[_ngcontent-%COMP%] {\n background: #dc354510;\n border: 1px solid #dc3545;\n border-radius: 6px;\n padding: 16px;\n display: flex;\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.error-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.5em;\n color: #dc3545;\n flex-shrink: 0;\n}\n\n.error-content[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 1em;\n}\n\n.error-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: #495057;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.3;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1em;\n}\n\n\n\n.metrics-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 24px;\n}\n\n.metric-card[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n}\n\n.metric-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.metric-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.2em;\n color: #6c757d;\n}\n\n.metric-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.9em;\n color: #6c757d;\n font-weight: 500;\n}\n\n.metric-value.large[_ngcontent-%COMP%] {\n font-size: 1.8em;\n font-weight: 700;\n color: #2c3e50;\n}\n\n.metric-rollup[_ngcontent-%COMP%] {\n margin-top: 8px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.metric-currency[_ngcontent-%COMP%] {\n margin-top: 4px;\n font-size: 0.85em;\n color: #6c757d;\n text-transform: uppercase;\n}\n\n\n\n.additional-metrics[_ngcontent-%COMP%] {\n border-top: 1px solid #e9ecef;\n padding-top: 16px;\n}\n\n.metric-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n border-bottom: 1px solid #f1f3f5;\n}\n\n.metric-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-label[_ngcontent-%COMP%] {\n font-weight: 500;\n color: #6c757d;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-value[_ngcontent-%COMP%] {\n font-weight: 400;\n color: #2c3e50;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-value.link[_ngcontent-%COMP%] {\n color: #007bff;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: color 0.2s;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-value.link[_ngcontent-%COMP%]:hover {\n color: #0056b3;\n}\n\n\n\n.parent-run-section[_ngcontent-%COMP%], \n.child-runs-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.parent-run-section[_ngcontent-%COMP%]:last-child, \n.child-runs-section[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.parent-run-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%], \n.child-runs-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 0.95em;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.runs-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.run-item[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.run-item[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n}\n\n.run-item.parent[_ngcontent-%COMP%] {\n background: #e3f2fd;\n border-color: #90caf9;\n}\n\n.run-item.parent[_ngcontent-%COMP%]:hover {\n background: #bbdefb;\n}\n\n.run-item-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-item-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.run-item-title[_ngcontent-%COMP%] {\n font-weight: 500;\n color: #2c3e50;\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.execution-order[_ngcontent-%COMP%] {\n background: #6c757d;\n color: white;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 0.75em;\n font-weight: 600;\n}\n\n.run-item-type[_ngcontent-%COMP%] {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 400;\n}\n\n.run-item-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.run-item-meta[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.status-indicator[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.run-item[_ngcontent-%COMP%] > i[_ngcontent-%COMP%]:last-child {\n color: #6c757d;\n font-size: 0.85em;\n}\n\n\n\n.detail-fields-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 24px;\n width: 100%;\n min-height: auto;\n overflow: visible;\n}\n\n.detail-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-field[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-value[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 1em;\n color: #2c3e50;\n padding: 10px 14px;\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n transition: all 0.2s;\n}\n\n.detail-value[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child {\n color: #6c757d;\n font-size: 1.1em;\n width: 20px;\n text-align: center;\n}\n\n.detail-value.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.detail-value.clickable[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.detail-value.clickable[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:last-child {\n margin-left: auto;\n font-size: 0.85em;\n opacity: 0.6;\n}\n\n.detail-value.clickable[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%]:last-child {\n opacity: 1;\n}\n\n.detail-value.null-value[_ngcontent-%COMP%] {\n color: #adb5bd;\n font-style: italic;\n}\n\n.detail-value.null-value[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child {\n opacity: 0.5;\n}\n\n\n\nkendo-panelbar[_ngcontent-%COMP%] {\n border: none !important;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n border: 1px solid #e9ecef !important;\n border-radius: 8px !important;\n overflow: hidden;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] .k-panelbar-header[_ngcontent-%COMP%] {\n background: #f8f9fa !important;\n border: none !important;\n padding: 12px 16px !important;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] .k-panelbar-header[_ngcontent-%COMP%]:hover {\n background: #e9ecef !important;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] .k-panelbar-content[_ngcontent-%COMP%] {\n border: none !important;\n padding: 0 !important;\n max-height: none !important;\n overflow: visible !important;\n}\n\n\n\n.validation-summary[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.summary-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.summary-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1em;\n color: #2c3e50;\n}\n\n.validation-status[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 16px;\n border-radius: 20px;\n font-weight: 500;\n font-size: 0.9em;\n}\n\n.validation-status.success[_ngcontent-%COMP%] {\n background: #28a74520;\n color: #28a745;\n}\n\n.validation-status.failed[_ngcontent-%COMP%] {\n background: #dc354520;\n color: #dc3545;\n}\n\n.validation-metrics[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.metric-card.small[_ngcontent-%COMP%] {\n padding: 16px;\n text-align: center;\n}\n\n.metric-card.small[_ngcontent-%COMP%] .metric-label[_ngcontent-%COMP%] {\n font-size: 0.8em;\n margin-bottom: 8px;\n font-weight: 600;\n}\n\n.metric-card.small[_ngcontent-%COMP%] .metric-value[_ngcontent-%COMP%] {\n font-size: 1.4em;\n font-weight: 700;\n}\n\n.validation-error[_ngcontent-%COMP%], \n.common-error[_ngcontent-%COMP%] {\n background: #dc354510;\n border: 1px solid #dc354530;\n border-radius: 8px;\n padding: 16px;\n margin-bottom: 16px;\n}\n\n.validation-error[_ngcontent-%COMP%] h5[_ngcontent-%COMP%], \n.common-error[_ngcontent-%COMP%] h5[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 0.95em;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.validation-error[_ngcontent-%COMP%] p[_ngcontent-%COMP%], \n.common-error[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: #495057;\n font-size: 0.9em;\n}\n\n.error-count[_ngcontent-%COMP%] {\n display: inline-block;\n margin-top: 8px;\n padding: 2px 8px;\n background: #dc3545;\n color: white;\n border-radius: 12px;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n\n\n.retry-timeline[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.retry-timeline[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.timeline-info[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n}\n\n.timeline-stat[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #6c757d;\n font-size: 0.9em;\n}\n\n.timeline-stat[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.1em;\n}\n\n\n\n.validation-attempts[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.validation-attempts[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.attempts-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.attempt-item[_ngcontent-%COMP%] {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n}\n\n.attempt-item.success[_ngcontent-%COMP%] {\n background: #28a74510;\n border-color: #28a74530;\n}\n\n.attempt-item.failed[_ngcontent-%COMP%] {\n background: #dc354510;\n border-color: #dc354530;\n}\n\n.attempt-number[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.attempt-item.success[_ngcontent-%COMP%] .attempt-number[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n.attempt-item.failed[_ngcontent-%COMP%] .attempt-number[_ngcontent-%COMP%] {\n color: #dc3545;\n}\n\n.attempt-details[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n font-size: 0.85em;\n}\n\n.attempt-time[_ngcontent-%COMP%] {\n color: #6c757d;\n}\n\n.attempt-error[_ngcontent-%COMP%] {\n color: #dc3545;\n flex: 1 0 100%;\n}\n\n.output-length[_ngcontent-%COMP%] {\n color: #6c757d;\n font-style: italic;\n}\n\n\n\n.validation-json[_ngcontent-%COMP%] {\n margin-top: 24px;\n}\n\n.validation-json[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.json-viewer-container[_ngcontent-%COMP%] {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n overflow: hidden;\n}\n\n\n\n.panel-badge.success[_ngcontent-%COMP%] {\n background: #28a745;\n color: white;\n}"] }); }
1543
+ } }, dependencies: [i3.ɵNgNoValidate, i3.NgControlStatus, i3.NgControlStatusGroup, i3.NgModel, i3.NgForm, i4.PanelBarComponent, i4.PanelBarItemComponent, i4.PanelBarContentDirective, i4.PanelBarItemTitleDirective, i4.ExpansionPanelComponent, i4.ExpansionPanelTitleDirective, i5.ButtonComponent, i6.FormToolbarComponent, i7.CodeEditorComponent, i8.ChatMessageViewerComponent, i9.DatePipe], styles: ["\n\n.prompt-run-header[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border-bottom: 2px solid #e9ecef;\n padding: 20px;\n margin-bottom: 0;\n}\n\n.header-content[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n margin-bottom: 16px;\n}\n\n.run-overview[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n flex: 1;\n}\n\n.run-icon-wrapper[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-icon-wrapper[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n}\n\n.run-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.run-title[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 1.5em;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.run-id[_ngcontent-%COMP%] {\n font-size: 0.8em;\n color: #6c757d;\n font-weight: 400;\n font-family: 'Courier New', monospace;\n}\n\n.run-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n color: white;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.status-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.9em;\n}\n\n.run-type-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #f1f3f5;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.prompt-name[_ngcontent-%COMP%], .model-name[_ngcontent-%COMP%], .vendor-name[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.85em;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.prompt-name[_ngcontent-%COMP%]:hover, .model-name[_ngcontent-%COMP%]:hover, .vendor-name[_ngcontent-%COMP%]:hover {\n background: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.run-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n\n\n.metrics-bar[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n padding-top: 16px;\n border-top: 1px solid #e9ecef;\n flex-wrap: wrap;\n}\n\n.metric-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.metric-item[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n font-size: 1.2em;\n color: #6c757d;\n width: 24px;\n text-align: center;\n}\n\n.metric-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.metric-label[_ngcontent-%COMP%] {\n font-size: 0.75em;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value[_ngcontent-%COMP%] {\n font-size: 1.1em;\n font-weight: 600;\n color: #2c3e50;\n}\n\n\n\n.form-content[_ngcontent-%COMP%] {\n padding: 16px;\n}\n\n.panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n\n\n.sub-panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n font-size: 0.95em;\n}\n\n.sub-panel-content[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] > .k-item[_ngcontent-%COMP%] {\n border: 1px solid #e5e7eb;\n margin-bottom: 8px;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] > .k-item[_ngcontent-%COMP%] > .k-link[_ngcontent-%COMP%] {\n background-color: #f9fafb;\n padding: 12px 16px;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] > .k-item.k-expanded[_ngcontent-%COMP%] > .k-link[_ngcontent-%COMP%] {\n background-color: #f3f4f6;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] .k-content[_ngcontent-%COMP%] {\n padding: 0;\n background: white;\n}\n\n\n\n.sub-panel-content[_ngcontent-%COMP%] mj-chat-message-viewer[_ngcontent-%COMP%] {\n display: block;\n min-height: 200px;\n max-height: 750px; \n\n height: auto;\n overflow: hidden;\n}\n\n\n\n.sub-expansion-panel[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-expander {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-expander:hover {\n background-color: #edf2f7;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-header {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-content {\n background-color: #ffffff;\n border-color: #e2e8f0;\n}\n\n.panel-badge[_ngcontent-%COMP%] {\n margin-left: auto;\n padding: 2px 8px;\n border-radius: 12px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n.panel-badge.error[_ngcontent-%COMP%] {\n background: #dc3545;\n color: white;\n}\n\n.panel-count[_ngcontent-%COMP%] {\n color: #6c757d;\n font-weight: 400;\n font-size: 0.9em;\n}\n\n.panel-content[_ngcontent-%COMP%] {\n padding: 20px;\n max-height: none !important;\n overflow: visible !important;\n}\n\n\n\n.json-editor-container[_ngcontent-%COMP%] {\n border: 1px solid #e9ecef;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.json-toolbar[_ngcontent-%COMP%] {\n background: #f8f9fa;\n padding: 8px 12px;\n border-bottom: 1px solid #e9ecef;\n display: flex;\n justify-content: flex-end;\n}\n\n\n\n.error-message[_ngcontent-%COMP%] {\n background: #dc354510;\n border: 1px solid #dc3545;\n border-radius: 6px;\n padding: 16px;\n display: flex;\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.error-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.5em;\n color: #dc3545;\n flex-shrink: 0;\n}\n\n.error-content[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 1em;\n}\n\n.error-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: #495057;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.3;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1em;\n}\n\n\n\n.loading-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.loading-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.6;\n color: #007bff;\n}\n\n.loading-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1em;\n}\n\n\n\n.metrics-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 24px;\n}\n\n.metric-card[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n}\n\n.metric-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.metric-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.2em;\n color: #6c757d;\n}\n\n.metric-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.9em;\n color: #6c757d;\n font-weight: 500;\n}\n\n.metric-value.large[_ngcontent-%COMP%] {\n font-size: 1.8em;\n font-weight: 700;\n color: #2c3e50;\n}\n\n.metric-rollup[_ngcontent-%COMP%] {\n margin-top: 8px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.metric-currency[_ngcontent-%COMP%] {\n margin-top: 4px;\n font-size: 0.85em;\n color: #6c757d;\n text-transform: uppercase;\n}\n\n\n\n.additional-metrics[_ngcontent-%COMP%] {\n border-top: 1px solid #e9ecef;\n padding-top: 16px;\n}\n\n.metric-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n border-bottom: 1px solid #f1f3f5;\n}\n\n.metric-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-label[_ngcontent-%COMP%] {\n font-weight: 500;\n color: #6c757d;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-value[_ngcontent-%COMP%] {\n font-weight: 400;\n color: #2c3e50;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-value.link[_ngcontent-%COMP%] {\n color: #007bff;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: color 0.2s;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-value.link[_ngcontent-%COMP%]:hover {\n color: #0056b3;\n}\n\n\n\n.parent-run-section[_ngcontent-%COMP%], \n.child-runs-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.parent-run-section[_ngcontent-%COMP%]:last-child, \n.child-runs-section[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.parent-run-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%], \n.child-runs-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 0.95em;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.runs-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.run-item[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.run-item[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n}\n\n.run-item.parent[_ngcontent-%COMP%] {\n background: #e3f2fd;\n border-color: #90caf9;\n}\n\n.run-item.parent[_ngcontent-%COMP%]:hover {\n background: #bbdefb;\n}\n\n.run-item-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-item-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.run-item-title[_ngcontent-%COMP%] {\n font-weight: 500;\n color: #2c3e50;\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.execution-order[_ngcontent-%COMP%] {\n background: #6c757d;\n color: white;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 0.75em;\n font-weight: 600;\n}\n\n.run-item-type[_ngcontent-%COMP%] {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 400;\n}\n\n.run-item-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.run-item-meta[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.status-indicator[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.run-item[_ngcontent-%COMP%] > i[_ngcontent-%COMP%]:last-child {\n color: #6c757d;\n font-size: 0.85em;\n}\n\n\n\n.detail-fields-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 24px;\n width: 100%;\n min-height: auto;\n overflow: visible;\n}\n\n.detail-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-field[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-value[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 1em;\n color: #2c3e50;\n padding: 10px 14px;\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n transition: all 0.2s;\n}\n\n.detail-value[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child {\n color: #6c757d;\n font-size: 1.1em;\n width: 20px;\n text-align: center;\n}\n\n.detail-value.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.detail-value.clickable[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.detail-value.clickable[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:last-child {\n margin-left: auto;\n font-size: 0.85em;\n opacity: 0.6;\n}\n\n.detail-value.clickable[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%]:last-child {\n opacity: 1;\n}\n\n.detail-value.null-value[_ngcontent-%COMP%] {\n color: #adb5bd;\n font-style: italic;\n}\n\n.detail-value.null-value[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child {\n opacity: 0.5;\n}\n\n\n\nkendo-panelbar[_ngcontent-%COMP%] {\n border: none !important;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n border: 1px solid #e9ecef !important;\n border-radius: 8px !important;\n overflow: hidden;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] .k-panelbar-header[_ngcontent-%COMP%] {\n background: #f8f9fa !important;\n border: none !important;\n padding: 12px 16px !important;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] .k-panelbar-header[_ngcontent-%COMP%]:hover {\n background: #e9ecef !important;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] .k-panelbar-content[_ngcontent-%COMP%] {\n border: none !important;\n padding: 0 !important;\n max-height: none !important;\n overflow: visible !important;\n}\n\n\n\n.validation-summary[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.summary-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.summary-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1em;\n color: #2c3e50;\n}\n\n.validation-status[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 16px;\n border-radius: 20px;\n font-weight: 500;\n font-size: 0.9em;\n}\n\n.validation-status.success[_ngcontent-%COMP%] {\n background: #28a74520;\n color: #28a745;\n}\n\n.validation-status.failed[_ngcontent-%COMP%] {\n background: #dc354520;\n color: #dc3545;\n}\n\n.validation-metrics[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.metric-card.small[_ngcontent-%COMP%] {\n padding: 16px;\n text-align: center;\n}\n\n.metric-card.small[_ngcontent-%COMP%] .metric-label[_ngcontent-%COMP%] {\n font-size: 0.8em;\n margin-bottom: 8px;\n font-weight: 600;\n}\n\n.metric-card.small[_ngcontent-%COMP%] .metric-value[_ngcontent-%COMP%] {\n font-size: 1.4em;\n font-weight: 700;\n}\n\n.validation-error[_ngcontent-%COMP%], \n.common-error[_ngcontent-%COMP%] {\n background: #dc354510;\n border: 1px solid #dc354530;\n border-radius: 8px;\n padding: 16px;\n margin-bottom: 16px;\n}\n\n.validation-error[_ngcontent-%COMP%] h5[_ngcontent-%COMP%], \n.common-error[_ngcontent-%COMP%] h5[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 0.95em;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.validation-error[_ngcontent-%COMP%] p[_ngcontent-%COMP%], \n.common-error[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: #495057;\n font-size: 0.9em;\n}\n\n.error-count[_ngcontent-%COMP%] {\n display: inline-block;\n margin-top: 8px;\n padding: 2px 8px;\n background: #dc3545;\n color: white;\n border-radius: 12px;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n\n\n.retry-timeline[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.retry-timeline[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.timeline-info[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n}\n\n.timeline-stat[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #6c757d;\n font-size: 0.9em;\n}\n\n.timeline-stat[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.1em;\n}\n\n\n\n.validation-attempts[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.validation-attempts[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.attempts-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.attempt-item[_ngcontent-%COMP%] {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n}\n\n.attempt-item.success[_ngcontent-%COMP%] {\n background: #28a74510;\n border-color: #28a74530;\n}\n\n.attempt-item.failed[_ngcontent-%COMP%] {\n background: #dc354510;\n border-color: #dc354530;\n}\n\n.attempt-number[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.attempt-item.success[_ngcontent-%COMP%] .attempt-number[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n.attempt-item.failed[_ngcontent-%COMP%] .attempt-number[_ngcontent-%COMP%] {\n color: #dc3545;\n}\n\n.attempt-details[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n font-size: 0.85em;\n}\n\n.attempt-time[_ngcontent-%COMP%] {\n color: #6c757d;\n}\n\n.attempt-error[_ngcontent-%COMP%] {\n color: #dc3545;\n flex: 1 0 100%;\n}\n\n.output-length[_ngcontent-%COMP%] {\n color: #6c757d;\n font-style: italic;\n}\n\n\n\n.validation-json[_ngcontent-%COMP%] {\n margin-top: 24px;\n}\n\n.validation-json[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.json-viewer-container[_ngcontent-%COMP%] {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n overflow: hidden;\n}\n\n\n\n.panel-badge.success[_ngcontent-%COMP%] {\n background: #28a745;\n color: white;\n}"] }); }
1387
1544
  };
1388
1545
  AIPromptRunFormComponentExtended = __decorate([
1389
1546
  RegisterClass(BaseFormComponent, 'MJ: AI Prompt Runs')
@@ -1391,7 +1548,7 @@ AIPromptRunFormComponentExtended = __decorate([
1391
1548
  export { AIPromptRunFormComponentExtended };
1392
1549
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AIPromptRunFormComponentExtended, [{
1393
1550
  type: Component,
1394
- args: [{ selector: 'mj-ai-prompt-run-form', template: "<div class=\"record-form-container\">\n @if (record) {\n <form class=\"record-form\" #form=\"ngForm\">\n <mj-form-toolbar [form]=\"this\"></mj-form-toolbar>\n\n <!-- Header Section -->\n <div class=\"prompt-run-header\">\n <div class=\"header-content\">\n <div class=\"run-overview\">\n <div class=\"run-icon-wrapper\" [style.background-color]=\"getStatusColor() + '20'\">\n <i [class]=\"'fa-solid ' + getStatusIcon()\" [style.color]=\"getStatusColor()\"></i>\n </div>\n <div class=\"run-info\">\n <h1 class=\"run-title\">\n Prompt Run\n @if (record.ID) {\n <span class=\"run-id\">#{{ record.ID.substring(0, 8) }}</span>\n }\n </h1>\n <div class=\"run-meta\">\n <span class=\"status-badge\" [style.background-color]=\"getStatusColor()\">\n <i [class]=\"'fa-solid ' + getStatusIcon()\"></i>\n {{ getStatusText() }}\n </span>\n @if (record.RunType) {\n <span class=\"run-type-badge\" [style.color]=\"getRunTypeColor(record.RunType)\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(record.RunType)\"></i>\n {{ record.RunType }}\n </span>\n }\n @if (prompt) {\n <span class=\"prompt-name\" (click)=\"navigateToEntity('AI Prompts', prompt.ID)\" title=\"View Prompt\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n {{ prompt.Name }}\n </span>\n }\n @if (model) {\n <span class=\"model-name\" (click)=\"navigateToEntity('AI Models', model.ID)\" title=\"View Model\">\n <i class=\"fa-solid fa-microchip\"></i>\n {{ model.Name }}\n </span>\n }\n @if (record.Vendor) {\n <span class=\"vendor-name\" (click)=\"navigateToEntity('MJ: AI Vendors', record.VendorID)\" title=\"View Vendor\">\n <i class=\"fa-solid fa-building\"></i>\n {{ record.Vendor }}\n </span>\n }\n </div>\n </div>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"run-actions\">\n <button kendoButton fillMode=\"outline\" size=\"small\" (click)=\"refreshData()\" title=\"Refresh data\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n \n <!-- Key Metrics Bar -->\n <div class=\"metrics-bar\">\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-clock\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Duration</div>\n <div class=\"metric-value\">{{ formatDuration(record.ExecutionTimeMS) }}</div>\n </div>\n </div>\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-coins\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Total Tokens</div>\n <div class=\"metric-value\">{{ formatTokens(record.TokensUsed) }}</div>\n </div>\n </div>\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-dollar-sign\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Cost</div>\n <div class=\"metric-value\">{{ formatCost(record.TotalCost || record.Cost) }}</div>\n </div>\n </div>\n @if (record.RunAt) {\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Started</div>\n <div class=\"metric-value\">{{ record.RunAt | date:'short' }}</div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Main Content with Expansion Panels -->\n <div class=\"form-content\">\n <kendo-panelbar>\n \n <!-- Input Messages Panel -->\n <kendo-panelbar-item [expanded]=\"messagesExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n Input Messages\n @if (record.Messages && record.Messages.trim() !== '') {\n <span class=\"panel-badge\">JSON</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n @if (record.Messages && record.Messages.trim() !== '') {\n <div class=\"json-editor-container\">\n <div class=\"json-toolbar\">\n <button kendoButton\n fillMode=\"flat\" \n size=\"small\"\n (click)=\"copyToClipboard(formattedMessages, 'Messages')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedMessages\"\n name=\"formattedMessages\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-comment-slash\"></i>\n <p>No input messages recorded</p>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Result Panel -->\n <kendo-panelbar-item [expanded]=\"resultExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-square-check\"></i>\n Result\n @if (record.Result && record.Result.trim() !== '') {\n <span class=\"panel-badge\">JSON</span>\n }\n @if (record.ErrorMessage) {\n <span class=\"panel-badge error\">Error</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n @if (record.ErrorMessage) {\n <div class=\"error-message\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <div class=\"error-content\">\n <h4>Error Message</h4>\n <p>{{ record.ErrorMessage }}</p>\n </div>\n </div>\n }\n \n @if (record.Result && record.Result.trim() !== '') {\n <div class=\"json-editor-container\">\n <div class=\"json-toolbar\">\n <button kendoButton\n fillMode=\"flat\" \n size=\"small\"\n (click)=\"copyToClipboard(formattedResult, 'Result')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedResult\"\n name=\"formattedResult\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </div>\n } @else if (!record.ErrorMessage) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No result data recorded</p>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Token Usage & Metrics Panel -->\n <kendo-panelbar-item [expanded]=\"metricsExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n Token Usage & Metrics\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <div class=\"metrics-grid\">\n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-message\"></i>\n <h4>Prompt Tokens</h4>\n </div>\n <div class=\"metric-value large\">{{ formatTokens(record.TokensPrompt) }}</div>\n @if (record.TokensPromptRollup && record.TokensPromptRollup !== record.TokensPrompt) {\n <div class=\"metric-rollup\">\n <span>Rollup: {{ formatTokens(record.TokensPromptRollup) }}</span>\n </div>\n }\n </div>\n \n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-reply\"></i>\n <h4>Completion Tokens</h4>\n </div>\n <div class=\"metric-value large\">{{ formatTokens(record.TokensCompletion) }}</div>\n @if (record.TokensCompletionRollup && record.TokensCompletionRollup !== record.TokensCompletion) {\n <div class=\"metric-rollup\">\n <span>Rollup: {{ formatTokens(record.TokensCompletionRollup) }}</span>\n </div>\n }\n </div>\n \n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-coins\"></i>\n <h4>Total Tokens</h4>\n </div>\n <div class=\"metric-value large\">{{ formatTokens(record.TokensUsed) }}</div>\n @if (record.TokensUsedRollup && record.TokensUsedRollup !== record.TokensUsed) {\n <div class=\"metric-rollup\">\n <span>Rollup: {{ formatTokens(record.TokensUsedRollup) }}</span>\n </div>\n }\n </div>\n \n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-dollar-sign\"></i>\n <h4>Cost</h4>\n </div>\n <div class=\"metric-value large\">{{ formatCost(record.Cost) }}</div>\n @if (record.TotalCost && record.TotalCost !== record.Cost) {\n <div class=\"metric-rollup\">\n <span>Total: {{ formatCost(record.TotalCost) }}</span>\n </div>\n }\n @if (record.CostCurrency) {\n <div class=\"metric-currency\">{{ record.CostCurrency }}</div>\n }\n </div>\n </div>\n \n <!-- Additional Metrics -->\n <div class=\"additional-metrics\">\n @if (record.ExecutionOrder !== null) {\n <div class=\"metric-row\">\n <span class=\"metric-label\">Execution Order:</span>\n <span class=\"metric-value\">{{ record.ExecutionOrder }}</span>\n </div>\n }\n @if (record.ConfigurationID) {\n <div class=\"metric-row\">\n <span class=\"metric-label\">Configuration:</span>\n <span class=\"metric-value\">{{ record.Configuration }}</span>\n </div>\n }\n @if (record.AgentID) {\n <div class=\"metric-row\">\n <span class=\"metric-label\">Agent:</span>\n <span class=\"metric-value link\" (click)=\"navigateToEntity('AI Agents', record.AgentID)\">\n {{ record.Agent }}\n <i class=\"fa-solid fa-external-link\"></i>\n </span>\n </div>\n }\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Validation & Retry Panel -->\n @if (record && ((record.ValidationAttemptCount && record.ValidationAttemptCount > 0) || record.ValidationBehavior)) {\n <kendo-panelbar-item [expanded]=\"validationExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-shield-check\"></i>\n Validation & Retries\n @if (record && record.ValidationAttemptCount && record.ValidationAttemptCount > 1) {\n <span class=\"panel-count\">({{ record.ValidationAttemptCount }} attempts)</span>\n }\n @if (record.FinalValidationPassed) {\n <span class=\"panel-badge success\">Passed</span>\n } @else if (record.FinalValidationPassed === false) {\n <span class=\"panel-badge error\">Failed</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <!-- Validation Summary -->\n <div class=\"validation-summary\">\n <div class=\"summary-header\">\n <h4>Validation Summary</h4>\n <div class=\"validation-status\" [class.success]=\"record.FinalValidationPassed\" [class.failed]=\"!record.FinalValidationPassed\">\n <i [class]=\"record.FinalValidationPassed ? 'fa-solid fa-check-circle' : 'fa-solid fa-times-circle'\"></i>\n {{ record.FinalValidationPassed ? 'Validation Passed' : 'Validation Failed' }}\n </div>\n </div>\n \n <div class=\"validation-metrics\">\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Total Attempts</div>\n <div class=\"metric-value\">{{ record.ValidationAttemptCount || 0 }}</div>\n </div>\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Successful</div>\n <div class=\"metric-value\">{{ record.SuccessfulValidationCount || 0 }}</div>\n </div>\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Behavior</div>\n <div class=\"metric-value\">{{ record.ValidationBehavior || 'Not set' }}</div>\n </div>\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Retry Strategy</div>\n <div class=\"metric-value\">{{ record.RetryStrategy || 'Not set' }}</div>\n </div>\n </div>\n \n @if (record.FinalValidationError) {\n <div class=\"validation-error\">\n <h5><i class=\"fa-solid fa-exclamation-triangle\"></i> Final Validation Error</h5>\n <p>{{ record.FinalValidationError }}</p>\n @if (record && record.ValidationErrorCount && record.ValidationErrorCount > 0) {\n <span class=\"error-count\">{{ record.ValidationErrorCount }} validation errors</span>\n }\n </div>\n }\n \n @if (record.CommonValidationError && record.CommonValidationError !== record.FinalValidationError) {\n <div class=\"common-error\">\n <h5><i class=\"fa-solid fa-repeat\"></i> Most Common Error</h5>\n <p>{{ record.CommonValidationError }}</p>\n </div>\n }\n </div>\n \n <!-- Retry Timeline -->\n @if (record && record.ValidationAttemptCount && record.ValidationAttemptCount > 1) {\n <div class=\"retry-timeline\">\n <h4>Retry Timeline</h4>\n <div class=\"timeline-info\">\n <div class=\"timeline-stat\">\n <i class=\"fa-solid fa-clock\"></i>\n <span>First Attempt: {{ record.FirstAttemptAt | date:'short' }}</span>\n </div>\n <div class=\"timeline-stat\">\n <i class=\"fa-solid fa-flag-checkered\"></i>\n <span>Last Attempt: {{ record.LastAttemptAt | date:'short' }}</span>\n </div>\n <div class=\"timeline-stat\">\n <i class=\"fa-solid fa-stopwatch\"></i>\n <span>Total Retry Duration: {{ formatDuration(record.TotalRetryDurationMS) }}</span>\n </div>\n </div>\n </div>\n }\n \n <!-- Validation Attempts Details -->\n @if (validationAttempts && validationAttempts.length > 0) {\n <div class=\"validation-attempts\">\n <h4>Validation Attempts</h4>\n <div class=\"attempts-list\">\n @for (attempt of validationAttempts; track attempt.attemptNumber) {\n <div class=\"attempt-item\" [class.success]=\"attempt.success\" [class.failed]=\"!attempt.success\">\n <div class=\"attempt-number\">\n <i [class]=\"attempt.success ? 'fa-solid fa-check' : 'fa-solid fa-times'\"></i>\n Attempt #{{ attempt.attemptNumber }}\n </div>\n <div class=\"attempt-details\">\n <span class=\"attempt-time\">{{ attempt.timestamp }}</span>\n @if (!attempt.success) {\n <span class=\"attempt-error\">{{ attempt.errorMessage || 'Unknown error' }}</span>\n @if (attempt.validationErrorCount > 0) {\n <span class=\"error-count\">({{ attempt.validationErrorCount }} errors)</span>\n }\n }\n @if (attempt.outputLength) {\n <span class=\"output-length\">Output: {{ attempt.outputLength }} chars</span>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Validation Summary JSON -->\n @if (validationSummary) {\n <div class=\"validation-json\">\n <h4>Validation Summary Details</h4>\n <div class=\"json-viewer-container\">\n <mj-code-editor \n [(ngModel)]=\"formattedValidationSummary\"\n name=\"formattedValidationSummary\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 200px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n }\n \n <!-- Validation Attempts JSON -->\n @if (record.ValidationAttempts) {\n <div class=\"validation-json\">\n <h4>Validation Attempts (Raw JSON)</h4>\n <div class=\"json-viewer-container\">\n <mj-code-editor \n [(ngModel)]=\"formattedValidationAttempts\"\n name=\"formattedValidationAttempts\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n }\n \n <!-- Hierarchy Panel (for parent/child relationships) -->\n @if (record.ParentID || childRuns.length > 0) {\n <kendo-panelbar-item [expanded]=\"hierarchyExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-sitemap\"></i>\n Run Hierarchy\n @if (childRuns.length > 0) {\n <span class=\"panel-count\">({{ childRuns.length }} children)</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n @if (parentRun) {\n <div class=\"parent-run-section\">\n <h4><i class=\"fa-solid fa-level-up-alt\"></i> Parent Run</h4>\n <div class=\"run-item parent\" (click)=\"navigateToEntity('MJ: AI Prompt Runs', parentRun.ID)\">\n <div class=\"run-item-icon\" [style.background-color]=\"getStatusColor() + '20'\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(parentRun.RunType)\"></i>\n </div>\n <div class=\"run-item-content\">\n <div class=\"run-item-title\">\n Parent Run #{{ parentRun.ID.substring(0, 8) }}\n <span class=\"run-item-type\">{{ parentRun.RunType }}</span>\n </div>\n <div class=\"run-item-meta\">\n <span><i class=\"fa-solid fa-clock\"></i> {{ formatDuration(parentRun.ExecutionTimeMS) }}</span>\n <span><i class=\"fa-solid fa-coins\"></i> {{ formatTokens(parentRun.TokensUsed) }}</span>\n <span><i class=\"fa-solid fa-calendar\"></i> {{ parentRun.RunAt | date:'short' }}</span>\n </div>\n </div>\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n </div>\n }\n \n @if (childRuns.length > 0) {\n <div class=\"child-runs-section\">\n <h4><i class=\"fa-solid fa-level-down-alt\"></i> Child Runs</h4>\n <div class=\"runs-list\">\n @for (childRun of childRuns; track childRun.ID) {\n <div class=\"run-item child\" (click)=\"navigateToEntity('MJ: AI Prompt Runs', childRun.ID)\">\n <div class=\"run-item-icon\" [style.background-color]=\"getStatusColor() + '20'\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(childRun.RunType)\"></i>\n </div>\n <div class=\"run-item-content\">\n <div class=\"run-item-title\">\n Child Run #{{ childRun.ID.substring(0, 8) }}\n @if (childRun.ExecutionOrder !== null) {\n <span class=\"execution-order\">#{{ childRun.ExecutionOrder }}</span>\n }\n <span class=\"run-item-type\">{{ childRun.RunType }}</span>\n </div>\n <div class=\"run-item-meta\">\n <span class=\"status-indicator\" [style.color]=\"getStatusColor()\">\n <i [class]=\"'fa-solid ' + getStatusIcon()\"></i>\n {{ childRun.Success ? 'Success' : childRun.ErrorMessage ? 'Failed' : 'Running' }}\n </span>\n <span><i class=\"fa-solid fa-clock\"></i> {{ formatDuration(childRun.ExecutionTimeMS) }}</span>\n <span><i class=\"fa-solid fa-coins\"></i> {{ formatTokens(childRun.TokensUsed) }}</span>\n </div>\n </div>\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n }\n \n <!-- Additional Details Panel -->\n <kendo-panelbar-item [expanded]=\"false\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Additional Details\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <div class=\"detail-fields-grid\">\n @if (record.AgentID) {\n <div class=\"detail-field\">\n <label>Agent</label>\n <div class=\"detail-value clickable\" (click)=\"navigateToEntity('AI Agents', record.AgentID)\" title=\"View Agent\">\n <i class=\"fa-solid fa-robot\"></i>\n {{ record.Agent || 'Unknown' }}\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n </div>\n }\n \n @if (record.ConfigurationID) {\n <div class=\"detail-field\">\n <label>Configuration</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-cog\"></i>\n {{ record.Configuration || 'Unknown' }}\n </div>\n </div>\n }\n \n @if (record.RunType) {\n <div class=\"detail-field\">\n <label>Run Type</label>\n <div class=\"detail-value\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(record.RunType)\"></i>\n {{ record.RunType }}\n </div>\n </div>\n }\n \n @if (record.ResponseFormat) {\n <div class=\"detail-field\">\n <label>Response Format</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-code\"></i>\n {{ record.ResponseFormat }}\n </div>\n </div>\n }\n \n <div class=\"detail-field\">\n <label>Temperature</label>\n <div class=\"detail-value\" [class.null-value]=\"record.Temperature === null || record.Temperature === undefined\">\n <i class=\"fa-solid fa-temperature-high\"></i>\n {{ record.Temperature !== null && record.Temperature !== undefined ? record.Temperature : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Top P</label>\n <div class=\"detail-value\" [class.null-value]=\"record.TopP === null || record.TopP === undefined\">\n <i class=\"fa-solid fa-percentage\"></i>\n {{ record.TopP !== null && record.TopP !== undefined ? record.TopP : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Top K</label>\n <div class=\"detail-value\" [class.null-value]=\"record.TopK === null || record.TopK === undefined\">\n <i class=\"fa-solid fa-list-ol\"></i>\n {{ record.TopK !== null && record.TopK !== undefined ? record.TopK : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Min P</label>\n <div class=\"detail-value\" [class.null-value]=\"record.MinP === null || record.MinP === undefined\">\n <i class=\"fa-solid fa-filter\"></i>\n {{ record.MinP !== null && record.MinP !== undefined ? record.MinP : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Frequency Penalty</label>\n <div class=\"detail-value\" [class.null-value]=\"record.FrequencyPenalty === null || record.FrequencyPenalty === undefined\">\n <i class=\"fa-solid fa-repeat\"></i>\n {{ record.FrequencyPenalty !== null && record.FrequencyPenalty !== undefined ? record.FrequencyPenalty : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Presence Penalty</label>\n <div class=\"detail-value\" [class.null-value]=\"record.PresencePenalty === null || record.PresencePenalty === undefined\">\n <i class=\"fa-solid fa-plus-circle\"></i>\n {{ record.PresencePenalty !== null && record.PresencePenalty !== undefined ? record.PresencePenalty : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Seed</label>\n <div class=\"detail-value\" [class.null-value]=\"record.Seed === null || record.Seed === undefined\">\n <i class=\"fa-solid fa-seedling\"></i>\n {{ record.Seed !== null && record.Seed !== undefined ? record.Seed : '\u2014' }}\n </div>\n </div>\n \n @if (record.RunAt) {\n <div class=\"detail-field\">\n <label>Started At</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ record.RunAt | date:'medium' }}\n </div>\n </div>\n }\n \n @if (record.CompletedAt) {\n <div class=\"detail-field\">\n <label>Completed At</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{ record.CompletedAt | date:'medium' }}\n </div>\n </div>\n }\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n </kendo-panelbar>\n </div>\n </form>\n }\n</div>", styles: ["/* Header Section */\n.prompt-run-header {\n background: #f8f9fa;\n border-bottom: 2px solid #e9ecef;\n padding: 20px;\n margin-bottom: 0;\n}\n\n.header-content {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n margin-bottom: 16px;\n}\n\n.run-overview {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n flex: 1;\n}\n\n.run-icon-wrapper {\n width: 56px;\n height: 56px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-icon-wrapper i {\n font-size: 24px;\n}\n\n.run-info {\n flex: 1;\n min-width: 0;\n}\n\n.run-title {\n margin: 0 0 8px 0;\n font-size: 1.5em;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.run-id {\n font-size: 0.8em;\n color: #6c757d;\n font-weight: 400;\n font-family: 'Courier New', monospace;\n}\n\n.run-meta {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n color: white;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.status-badge i {\n font-size: 0.9em;\n}\n\n.run-type-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #f1f3f5;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.prompt-name, .model-name, .vendor-name {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.85em;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.prompt-name:hover, .model-name:hover, .vendor-name:hover {\n background: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.run-actions {\n display: flex;\n gap: 8px;\n}\n\n/* Metrics Bar */\n.metrics-bar {\n display: flex;\n gap: 24px;\n padding-top: 16px;\n border-top: 1px solid #e9ecef;\n flex-wrap: wrap;\n}\n\n.metric-item {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.metric-item > i {\n font-size: 1.2em;\n color: #6c757d;\n width: 24px;\n text-align: center;\n}\n\n.metric-content {\n display: flex;\n flex-direction: column;\n}\n\n.metric-label {\n font-size: 0.75em;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value {\n font-size: 1.1em;\n font-weight: 600;\n color: #2c3e50;\n}\n\n/* Panels */\n.form-content {\n padding: 16px;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n.panel-badge {\n margin-left: auto;\n padding: 2px 8px;\n border-radius: 12px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n.panel-badge.error {\n background: #dc3545;\n color: white;\n}\n\n.panel-count {\n color: #6c757d;\n font-weight: 400;\n font-size: 0.9em;\n}\n\n.panel-content {\n padding: 20px;\n max-height: none !important;\n overflow: visible !important;\n}\n\n/* JSON Editor Container */\n.json-editor-container {\n border: 1px solid #e9ecef;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.json-toolbar {\n background: #f8f9fa;\n padding: 8px 12px;\n border-bottom: 1px solid #e9ecef;\n display: flex;\n justify-content: flex-end;\n}\n\n/* Error Message */\n.error-message {\n background: #dc354510;\n border: 1px solid #dc3545;\n border-radius: 6px;\n padding: 16px;\n display: flex;\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.error-message i {\n font-size: 1.5em;\n color: #dc3545;\n flex-shrink: 0;\n}\n\n.error-content h4 {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 1em;\n}\n\n.error-content p {\n margin: 0;\n color: #495057;\n}\n\n/* Empty State */\n.empty-state {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.empty-state i {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.3;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 1.1em;\n}\n\n/* Metrics Grid */\n.metrics-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 24px;\n}\n\n.metric-card {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n}\n\n.metric-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.metric-header i {\n font-size: 1.2em;\n color: #6c757d;\n}\n\n.metric-header h4 {\n margin: 0;\n font-size: 0.9em;\n color: #6c757d;\n font-weight: 500;\n}\n\n.metric-value.large {\n font-size: 1.8em;\n font-weight: 700;\n color: #2c3e50;\n}\n\n.metric-rollup {\n margin-top: 8px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.metric-currency {\n margin-top: 4px;\n font-size: 0.85em;\n color: #6c757d;\n text-transform: uppercase;\n}\n\n/* Additional Metrics */\n.additional-metrics {\n border-top: 1px solid #e9ecef;\n padding-top: 16px;\n}\n\n.metric-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n border-bottom: 1px solid #f1f3f5;\n}\n\n.metric-row:last-child {\n border-bottom: none;\n}\n\n.metric-row .metric-label {\n font-weight: 500;\n color: #6c757d;\n}\n\n.metric-row .metric-value {\n font-weight: 400;\n color: #2c3e50;\n}\n\n.metric-row .metric-value.link {\n color: #007bff;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: color 0.2s;\n}\n\n.metric-row .metric-value.link:hover {\n color: #0056b3;\n}\n\n/* Hierarchy Section */\n.parent-run-section,\n.child-runs-section {\n margin-bottom: 24px;\n}\n\n.parent-run-section:last-child,\n.child-runs-section:last-child {\n margin-bottom: 0;\n}\n\n.parent-run-section h4,\n.child-runs-section h4 {\n margin: 0 0 12px 0;\n font-size: 0.95em;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.runs-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.run-item {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.run-item:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n}\n\n.run-item.parent {\n background: #e3f2fd;\n border-color: #90caf9;\n}\n\n.run-item.parent:hover {\n background: #bbdefb;\n}\n\n.run-item-icon {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-item-content {\n flex: 1;\n min-width: 0;\n}\n\n.run-item-title {\n font-weight: 500;\n color: #2c3e50;\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.execution-order {\n background: #6c757d;\n color: white;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 0.75em;\n font-weight: 600;\n}\n\n.run-item-type {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 400;\n}\n\n.run-item-meta {\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.run-item-meta span {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.status-indicator {\n font-weight: 500;\n}\n\n.run-item > i:last-child {\n color: #6c757d;\n font-size: 0.85em;\n}\n\n/* Detail Fields Grid */\n.detail-fields-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 24px;\n width: 100%;\n min-height: auto;\n overflow: visible;\n}\n\n.detail-field {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-field label {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-value {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 1em;\n color: #2c3e50;\n padding: 10px 14px;\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n transition: all 0.2s;\n}\n\n.detail-value i:first-child {\n color: #6c757d;\n font-size: 1.1em;\n width: 20px;\n text-align: center;\n}\n\n.detail-value.clickable {\n cursor: pointer;\n}\n\n.detail-value.clickable:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.detail-value.clickable i:last-child {\n margin-left: auto;\n font-size: 0.85em;\n opacity: 0.6;\n}\n\n.detail-value.clickable:hover i:last-child {\n opacity: 1;\n}\n\n.detail-value.null-value {\n color: #adb5bd;\n font-style: italic;\n}\n\n.detail-value.null-value i:first-child {\n opacity: 0.5;\n}\n\n/* Kendo Overrides */\nkendo-panelbar {\n border: none !important;\n}\n\nkendo-panelbar-item {\n margin-bottom: 8px;\n border: 1px solid #e9ecef !important;\n border-radius: 8px !important;\n overflow: hidden;\n}\n\nkendo-panelbar-item .k-panelbar-header {\n background: #f8f9fa !important;\n border: none !important;\n padding: 12px 16px !important;\n}\n\nkendo-panelbar-item .k-panelbar-header:hover {\n background: #e9ecef !important;\n}\n\nkendo-panelbar-item .k-panelbar-content {\n border: none !important;\n padding: 0 !important;\n max-height: none !important;\n overflow: visible !important;\n}\n\n/* Validation Panel Styles */\n.validation-summary {\n margin-bottom: 24px;\n}\n\n.summary-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.summary-header h4 {\n margin: 0;\n font-size: 1.1em;\n color: #2c3e50;\n}\n\n.validation-status {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 16px;\n border-radius: 20px;\n font-weight: 500;\n font-size: 0.9em;\n}\n\n.validation-status.success {\n background: #28a74520;\n color: #28a745;\n}\n\n.validation-status.failed {\n background: #dc354520;\n color: #dc3545;\n}\n\n.validation-metrics {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.metric-card.small {\n padding: 16px;\n text-align: center;\n}\n\n.metric-card.small .metric-label {\n font-size: 0.8em;\n margin-bottom: 8px;\n font-weight: 600;\n}\n\n.metric-card.small .metric-value {\n font-size: 1.4em;\n font-weight: 700;\n}\n\n.validation-error,\n.common-error {\n background: #dc354510;\n border: 1px solid #dc354530;\n border-radius: 8px;\n padding: 16px;\n margin-bottom: 16px;\n}\n\n.validation-error h5,\n.common-error h5 {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 0.95em;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.validation-error p,\n.common-error p {\n margin: 0;\n color: #495057;\n font-size: 0.9em;\n}\n\n.error-count {\n display: inline-block;\n margin-top: 8px;\n padding: 2px 8px;\n background: #dc3545;\n color: white;\n border-radius: 12px;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n/* Retry Timeline */\n.retry-timeline {\n margin-bottom: 24px;\n}\n\n.retry-timeline h4 {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.timeline-info {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n}\n\n.timeline-stat {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #6c757d;\n font-size: 0.9em;\n}\n\n.timeline-stat i {\n font-size: 1.1em;\n}\n\n/* Validation Attempts */\n.validation-attempts {\n margin-bottom: 24px;\n}\n\n.validation-attempts h4 {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.attempts-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.attempt-item {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n}\n\n.attempt-item.success {\n background: #28a74510;\n border-color: #28a74530;\n}\n\n.attempt-item.failed {\n background: #dc354510;\n border-color: #dc354530;\n}\n\n.attempt-number {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.attempt-item.success .attempt-number {\n color: #28a745;\n}\n\n.attempt-item.failed .attempt-number {\n color: #dc3545;\n}\n\n.attempt-details {\n flex: 1;\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n font-size: 0.85em;\n}\n\n.attempt-time {\n color: #6c757d;\n}\n\n.attempt-error {\n color: #dc3545;\n flex: 1 0 100%;\n}\n\n.output-length {\n color: #6c757d;\n font-style: italic;\n}\n\n/* Validation JSON */\n.validation-json {\n margin-top: 24px;\n}\n\n.validation-json h4 {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.json-viewer-container {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n overflow: hidden;\n}\n\n/* Panel badge styles */\n.panel-badge.success {\n background: #28a745;\n color: white;\n}"] }]
1551
+ args: [{ selector: 'mj-ai-prompt-run-form', template: "<div class=\"record-form-container\">\n @if (record) {\n <form class=\"record-form\" #form=\"ngForm\">\n <mj-form-toolbar [form]=\"this\"></mj-form-toolbar>\n\n <!-- Header Section -->\n <div class=\"prompt-run-header\">\n <div class=\"header-content\">\n <div class=\"run-overview\">\n <div class=\"run-icon-wrapper\" [style.background-color]=\"getStatusColor() + '20'\">\n <i [class]=\"'fa-solid ' + getStatusIcon()\" [style.color]=\"getStatusColor()\"></i>\n </div>\n <div class=\"run-info\">\n <h1 class=\"run-title\">\n Prompt Run\n @if (record.ID) {\n <span class=\"run-id\">#{{ record.ID.substring(0, 8) }}</span>\n }\n </h1>\n <div class=\"run-meta\">\n <span class=\"status-badge\" [style.background-color]=\"getStatusColor()\">\n <i [class]=\"'fa-solid ' + getStatusIcon()\"></i>\n {{ getStatusText() }}\n </span>\n @if (record.RunType) {\n <span class=\"run-type-badge\" [style.color]=\"getRunTypeColor(record.RunType)\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(record.RunType)\"></i>\n {{ record.RunType }}\n </span>\n }\n @if (prompt) {\n <span class=\"prompt-name\" (click)=\"navigateToEntity('AI Prompts', prompt.ID)\" title=\"View Prompt\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n {{ prompt.Name }}\n </span>\n }\n @if (model) {\n <span class=\"model-name\" (click)=\"navigateToEntity('AI Models', model.ID)\" title=\"View Model\">\n <i class=\"fa-solid fa-microchip\"></i>\n {{ model.Name }}\n </span>\n }\n @if (record.Vendor) {\n <span class=\"vendor-name\" (click)=\"navigateToEntity('MJ: AI Vendors', record.VendorID)\" title=\"View Vendor\">\n <i class=\"fa-solid fa-building\"></i>\n {{ record.Vendor }}\n </span>\n }\n </div>\n </div>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"run-actions\">\n <button kendoButton fillMode=\"outline\" size=\"small\" (click)=\"refreshData()\" title=\"Refresh data\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n \n <!-- Key Metrics Bar -->\n <div class=\"metrics-bar\">\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-clock\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Duration</div>\n <div class=\"metric-value\">{{ formatDuration(record.ExecutionTimeMS) }}</div>\n </div>\n </div>\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-coins\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Total Tokens</div>\n <div class=\"metric-value\">{{ formatTokens(record.TokensUsed) }}</div>\n </div>\n </div>\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-dollar-sign\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Cost</div>\n <div class=\"metric-value\">{{ formatCost(record.TotalCost || record.Cost) }}</div>\n </div>\n </div>\n @if (record.RunAt) {\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Started</div>\n <div class=\"metric-value\">{{ record.RunAt | date:'short' }}</div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Main Content with Expansion Panels -->\n <div class=\"form-content\">\n <kendo-panelbar>\n \n <!-- Input Panel with nested sub-panels -->\n <kendo-panelbar-item [expanded]=\"inputExpanded\" (stateChange)=\"onInputPanelToggle()\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n Input\n @if (record.Messages && record.Messages.trim() !== '') {\n <span class=\"panel-badge\">JSON</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n @if (record.Messages && record.Messages.trim() !== '') {\n <!-- Nested expansion panels for sub-sections -->\n <div class=\"nested-panels\">\n <!-- Messages Sub-Panel -->\n <kendo-expansionpanel \n [expanded]=\"messagesExpanded\" \n class=\"sub-expansion-panel\"\n [animation]=\"false\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span class=\"sub-panel-title\">\n <i class=\"fa-solid fa-comments\"></i>\n Messages\n @if (chatMessages.length > 0) {\n <span class=\"panel-count\">({{ chatMessages.length }})</span>\n }\n </span>\n </ng-template>\n <div class=\"sub-panel-content\">\n @if (isParsingMessages || isLoadingRelatedData) {\n <div class=\"loading-state\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <p>Loading messages...</p>\n </div>\n } @else if (chatMessages.length > 0) {\n <mj-chat-message-viewer \n [messages]=\"chatMessages\">\n </mj-chat-message-viewer>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-comment-slash\"></i>\n <p>No chat messages found</p>\n </div>\n }\n </div>\n </kendo-expansionpanel>\n \n <!-- Data Sub-Panel -->\n <kendo-expansionpanel \n [expanded]=\"dataExpanded\" \n class=\"sub-expansion-panel\"\n [animation]=\"false\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span class=\"sub-panel-title\">\n <i class=\"fa-solid fa-database\"></i>\n Data\n @if (inputData) {\n <span class=\"panel-badge\">Object</span>\n }\n </span>\n </ng-template>\n <div class=\"sub-panel-content\">\n @if (inputData && formattedData) {\n <div class=\"json-editor-container\">\n <div class=\"json-toolbar\">\n <button kendoButton\n fillMode=\"flat\" \n size=\"small\"\n (click)=\"copyToClipboard(formattedData, 'Data')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedData\"\n name=\"formattedData\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-database\"></i>\n <p>No data object found</p>\n </div>\n }\n </div>\n </kendo-expansionpanel>\n \n <!-- Raw Sub-Panel -->\n <kendo-expansionpanel \n [expanded]=\"rawExpanded\" \n class=\"sub-expansion-panel\"\n [animation]=\"false\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span class=\"sub-panel-title\">\n <i class=\"fa-solid fa-code\"></i>\n Raw\n </span>\n </ng-template>\n <div class=\"sub-panel-content\">\n <div class=\"json-editor-container\">\n <div class=\"json-toolbar\">\n <button kendoButton\n fillMode=\"flat\" \n size=\"small\"\n (click)=\"copyToClipboard(formattedMessages, 'Messages')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedMessages\"\n name=\"formattedMessages\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n </kendo-expansionpanel>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-comment-slash\"></i>\n <p>No input messages recorded</p>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Result Panel -->\n <kendo-panelbar-item [expanded]=\"resultExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-square-check\"></i>\n Result\n @if (record.Result && record.Result.trim() !== '') {\n <span class=\"panel-badge\">JSON</span>\n }\n @if (record.ErrorMessage) {\n <span class=\"panel-badge error\">Error</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n @if (record.ErrorMessage) {\n <div class=\"error-message\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <div class=\"error-content\">\n <h4>Error Message</h4>\n <p>{{ record.ErrorMessage }}</p>\n </div>\n </div>\n }\n \n @if (record.Result && record.Result.trim() !== '') {\n <div class=\"json-editor-container\">\n <div class=\"json-toolbar\">\n <button kendoButton\n fillMode=\"flat\" \n size=\"small\"\n (click)=\"copyToClipboard(formattedResult, 'Result')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedResult\"\n name=\"formattedResult\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </div>\n } @else if (!record.ErrorMessage) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No result data recorded</p>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Token Usage & Metrics Panel -->\n <kendo-panelbar-item [expanded]=\"metricsExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n Token Usage & Metrics\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <div class=\"metrics-grid\">\n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-message\"></i>\n <h4>Prompt Tokens</h4>\n </div>\n <div class=\"metric-value large\">{{ formatTokens(record.TokensPrompt) }}</div>\n @if (record.TokensPromptRollup && record.TokensPromptRollup !== record.TokensPrompt) {\n <div class=\"metric-rollup\">\n <span>Rollup: {{ formatTokens(record.TokensPromptRollup) }}</span>\n </div>\n }\n </div>\n \n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-reply\"></i>\n <h4>Completion Tokens</h4>\n </div>\n <div class=\"metric-value large\">{{ formatTokens(record.TokensCompletion) }}</div>\n @if (record.TokensCompletionRollup && record.TokensCompletionRollup !== record.TokensCompletion) {\n <div class=\"metric-rollup\">\n <span>Rollup: {{ formatTokens(record.TokensCompletionRollup) }}</span>\n </div>\n }\n </div>\n \n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-coins\"></i>\n <h4>Total Tokens</h4>\n </div>\n <div class=\"metric-value large\">{{ formatTokens(record.TokensUsed) }}</div>\n @if (record.TokensUsedRollup && record.TokensUsedRollup !== record.TokensUsed) {\n <div class=\"metric-rollup\">\n <span>Rollup: {{ formatTokens(record.TokensUsedRollup) }}</span>\n </div>\n }\n </div>\n \n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-dollar-sign\"></i>\n <h4>Cost</h4>\n </div>\n <div class=\"metric-value large\">{{ formatCost(record.Cost) }}</div>\n @if (record.TotalCost && record.TotalCost !== record.Cost) {\n <div class=\"metric-rollup\">\n <span>Total: {{ formatCost(record.TotalCost) }}</span>\n </div>\n }\n @if (record.CostCurrency) {\n <div class=\"metric-currency\">{{ record.CostCurrency }}</div>\n }\n </div>\n </div>\n \n <!-- Additional Metrics -->\n <div class=\"additional-metrics\">\n @if (record.ExecutionOrder !== null) {\n <div class=\"metric-row\">\n <span class=\"metric-label\">Execution Order:</span>\n <span class=\"metric-value\">{{ record.ExecutionOrder }}</span>\n </div>\n }\n @if (record.ConfigurationID) {\n <div class=\"metric-row\">\n <span class=\"metric-label\">Configuration:</span>\n <span class=\"metric-value\">{{ record.Configuration }}</span>\n </div>\n }\n @if (record.AgentID) {\n <div class=\"metric-row\">\n <span class=\"metric-label\">Agent:</span>\n <span class=\"metric-value link\" (click)=\"navigateToEntity('AI Agents', record.AgentID)\">\n {{ record.Agent }}\n <i class=\"fa-solid fa-external-link\"></i>\n </span>\n </div>\n }\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Validation & Retry Panel -->\n @if (record && ((record.ValidationAttemptCount && record.ValidationAttemptCount > 0) || record.ValidationBehavior)) {\n <kendo-panelbar-item [expanded]=\"validationExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-shield-check\"></i>\n Validation & Retries\n @if (record && record.ValidationAttemptCount && record.ValidationAttemptCount > 1) {\n <span class=\"panel-count\">({{ record.ValidationAttemptCount }} attempts)</span>\n }\n @if (record.FinalValidationPassed) {\n <span class=\"panel-badge success\">Passed</span>\n } @else if (record.FinalValidationPassed === false) {\n <span class=\"panel-badge error\">Failed</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <!-- Validation Summary -->\n <div class=\"validation-summary\">\n <div class=\"summary-header\">\n <h4>Validation Summary</h4>\n <div class=\"validation-status\" [class.success]=\"record.FinalValidationPassed\" [class.failed]=\"!record.FinalValidationPassed\">\n <i [class]=\"record.FinalValidationPassed ? 'fa-solid fa-check-circle' : 'fa-solid fa-times-circle'\"></i>\n {{ record.FinalValidationPassed ? 'Validation Passed' : 'Validation Failed' }}\n </div>\n </div>\n \n <div class=\"validation-metrics\">\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Total Attempts</div>\n <div class=\"metric-value\">{{ record.ValidationAttemptCount || 0 }}</div>\n </div>\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Successful</div>\n <div class=\"metric-value\">{{ record.SuccessfulValidationCount || 0 }}</div>\n </div>\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Behavior</div>\n <div class=\"metric-value\">{{ record.ValidationBehavior || 'Not set' }}</div>\n </div>\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Retry Strategy</div>\n <div class=\"metric-value\">{{ record.RetryStrategy || 'Not set' }}</div>\n </div>\n </div>\n \n @if (record.FinalValidationError) {\n <div class=\"validation-error\">\n <h5><i class=\"fa-solid fa-exclamation-triangle\"></i> Final Validation Error</h5>\n <p>{{ record.FinalValidationError }}</p>\n @if (record && record.ValidationErrorCount && record.ValidationErrorCount > 0) {\n <span class=\"error-count\">{{ record.ValidationErrorCount }} validation errors</span>\n }\n </div>\n }\n \n @if (record.CommonValidationError && record.CommonValidationError !== record.FinalValidationError) {\n <div class=\"common-error\">\n <h5><i class=\"fa-solid fa-repeat\"></i> Most Common Error</h5>\n <p>{{ record.CommonValidationError }}</p>\n </div>\n }\n </div>\n \n <!-- Retry Timeline -->\n @if (record && record.ValidationAttemptCount && record.ValidationAttemptCount > 1) {\n <div class=\"retry-timeline\">\n <h4>Retry Timeline</h4>\n <div class=\"timeline-info\">\n <div class=\"timeline-stat\">\n <i class=\"fa-solid fa-clock\"></i>\n <span>First Attempt: {{ record.FirstAttemptAt | date:'short' }}</span>\n </div>\n <div class=\"timeline-stat\">\n <i class=\"fa-solid fa-flag-checkered\"></i>\n <span>Last Attempt: {{ record.LastAttemptAt | date:'short' }}</span>\n </div>\n <div class=\"timeline-stat\">\n <i class=\"fa-solid fa-stopwatch\"></i>\n <span>Total Retry Duration: {{ formatDuration(record.TotalRetryDurationMS) }}</span>\n </div>\n </div>\n </div>\n }\n \n <!-- Validation Attempts Details -->\n @if (validationAttempts && validationAttempts.length > 0) {\n <div class=\"validation-attempts\">\n <h4>Validation Attempts</h4>\n <div class=\"attempts-list\">\n @for (attempt of validationAttempts; track attempt.attemptNumber) {\n <div class=\"attempt-item\" [class.success]=\"attempt.success\" [class.failed]=\"!attempt.success\">\n <div class=\"attempt-number\">\n <i [class]=\"attempt.success ? 'fa-solid fa-check' : 'fa-solid fa-times'\"></i>\n Attempt #{{ attempt.attemptNumber }}\n </div>\n <div class=\"attempt-details\">\n <span class=\"attempt-time\">{{ attempt.timestamp }}</span>\n @if (!attempt.success) {\n <span class=\"attempt-error\">{{ attempt.errorMessage || 'Unknown error' }}</span>\n @if (attempt.validationErrorCount > 0) {\n <span class=\"error-count\">({{ attempt.validationErrorCount }} errors)</span>\n }\n }\n @if (attempt.outputLength) {\n <span class=\"output-length\">Output: {{ attempt.outputLength }} chars</span>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Validation Summary JSON -->\n @if (validationSummary) {\n <div class=\"validation-json\">\n <h4>Validation Summary Details</h4>\n <div class=\"json-viewer-container\">\n <mj-code-editor \n [(ngModel)]=\"formattedValidationSummary\"\n name=\"formattedValidationSummary\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 200px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n }\n \n <!-- Validation Attempts JSON -->\n @if (record.ValidationAttempts) {\n <div class=\"validation-json\">\n <h4>Validation Attempts (Raw JSON)</h4>\n <div class=\"json-viewer-container\">\n <mj-code-editor \n [(ngModel)]=\"formattedValidationAttempts\"\n name=\"formattedValidationAttempts\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n }\n \n <!-- Hierarchy Panel (for parent/child relationships) -->\n @if (record.ParentID || childRuns.length > 0) {\n <kendo-panelbar-item [expanded]=\"hierarchyExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-sitemap\"></i>\n Run Hierarchy\n @if (childRuns.length > 0) {\n <span class=\"panel-count\">({{ childRuns.length }} children)</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n @if (parentRun) {\n <div class=\"parent-run-section\">\n <h4><i class=\"fa-solid fa-level-up-alt\"></i> Parent Run</h4>\n <div class=\"run-item parent\" (click)=\"navigateToEntity('MJ: AI Prompt Runs', parentRun.ID)\">\n <div class=\"run-item-icon\" [style.background-color]=\"getStatusColor() + '20'\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(parentRun.RunType)\"></i>\n </div>\n <div class=\"run-item-content\">\n <div class=\"run-item-title\">\n Parent Run #{{ parentRun.ID.substring(0, 8) }}\n <span class=\"run-item-type\">{{ parentRun.RunType }}</span>\n </div>\n <div class=\"run-item-meta\">\n <span><i class=\"fa-solid fa-clock\"></i> {{ formatDuration(parentRun.ExecutionTimeMS) }}</span>\n <span><i class=\"fa-solid fa-coins\"></i> {{ formatTokens(parentRun.TokensUsed) }}</span>\n <span><i class=\"fa-solid fa-calendar\"></i> {{ parentRun.RunAt | date:'short' }}</span>\n </div>\n </div>\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n </div>\n }\n \n @if (childRuns.length > 0) {\n <div class=\"child-runs-section\">\n <h4><i class=\"fa-solid fa-level-down-alt\"></i> Child Runs</h4>\n <div class=\"runs-list\">\n @for (childRun of childRuns; track childRun.ID) {\n <div class=\"run-item child\" (click)=\"navigateToEntity('MJ: AI Prompt Runs', childRun.ID)\">\n <div class=\"run-item-icon\" [style.background-color]=\"getStatusColor() + '20'\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(childRun.RunType)\"></i>\n </div>\n <div class=\"run-item-content\">\n <div class=\"run-item-title\">\n Child Run #{{ childRun.ID.substring(0, 8) }}\n @if (childRun.ExecutionOrder !== null) {\n <span class=\"execution-order\">#{{ childRun.ExecutionOrder }}</span>\n }\n <span class=\"run-item-type\">{{ childRun.RunType }}</span>\n </div>\n <div class=\"run-item-meta\">\n <span class=\"status-indicator\" [style.color]=\"getStatusColor()\">\n <i [class]=\"'fa-solid ' + getStatusIcon()\"></i>\n {{ childRun.Success ? 'Success' : childRun.ErrorMessage ? 'Failed' : 'Running' }}\n </span>\n <span><i class=\"fa-solid fa-clock\"></i> {{ formatDuration(childRun.ExecutionTimeMS) }}</span>\n <span><i class=\"fa-solid fa-coins\"></i> {{ formatTokens(childRun.TokensUsed) }}</span>\n </div>\n </div>\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n }\n \n <!-- Additional Details Panel -->\n <kendo-panelbar-item [expanded]=\"false\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Additional Details\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <div class=\"detail-fields-grid\">\n @if (record.AgentID) {\n <div class=\"detail-field\">\n <label>Agent</label>\n <div class=\"detail-value clickable\" (click)=\"navigateToEntity('AI Agents', record.AgentID)\" title=\"View Agent\">\n <i class=\"fa-solid fa-robot\"></i>\n {{ record.Agent || 'Unknown' }}\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n </div>\n }\n \n @if (record.ConfigurationID) {\n <div class=\"detail-field\">\n <label>Configuration</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-cog\"></i>\n {{ record.Configuration || 'Unknown' }}\n </div>\n </div>\n }\n \n @if (record.RunType) {\n <div class=\"detail-field\">\n <label>Run Type</label>\n <div class=\"detail-value\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(record.RunType)\"></i>\n {{ record.RunType }}\n </div>\n </div>\n }\n \n @if (record.ResponseFormat) {\n <div class=\"detail-field\">\n <label>Response Format</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-code\"></i>\n {{ record.ResponseFormat }}\n </div>\n </div>\n }\n \n <div class=\"detail-field\">\n <label>Temperature</label>\n <div class=\"detail-value\" [class.null-value]=\"record.Temperature === null || record.Temperature === undefined\">\n <i class=\"fa-solid fa-temperature-high\"></i>\n {{ record.Temperature !== null && record.Temperature !== undefined ? record.Temperature : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Top P</label>\n <div class=\"detail-value\" [class.null-value]=\"record.TopP === null || record.TopP === undefined\">\n <i class=\"fa-solid fa-percentage\"></i>\n {{ record.TopP !== null && record.TopP !== undefined ? record.TopP : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Top K</label>\n <div class=\"detail-value\" [class.null-value]=\"record.TopK === null || record.TopK === undefined\">\n <i class=\"fa-solid fa-list-ol\"></i>\n {{ record.TopK !== null && record.TopK !== undefined ? record.TopK : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Min P</label>\n <div class=\"detail-value\" [class.null-value]=\"record.MinP === null || record.MinP === undefined\">\n <i class=\"fa-solid fa-filter\"></i>\n {{ record.MinP !== null && record.MinP !== undefined ? record.MinP : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Frequency Penalty</label>\n <div class=\"detail-value\" [class.null-value]=\"record.FrequencyPenalty === null || record.FrequencyPenalty === undefined\">\n <i class=\"fa-solid fa-repeat\"></i>\n {{ record.FrequencyPenalty !== null && record.FrequencyPenalty !== undefined ? record.FrequencyPenalty : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Presence Penalty</label>\n <div class=\"detail-value\" [class.null-value]=\"record.PresencePenalty === null || record.PresencePenalty === undefined\">\n <i class=\"fa-solid fa-plus-circle\"></i>\n {{ record.PresencePenalty !== null && record.PresencePenalty !== undefined ? record.PresencePenalty : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Seed</label>\n <div class=\"detail-value\" [class.null-value]=\"record.Seed === null || record.Seed === undefined\">\n <i class=\"fa-solid fa-seedling\"></i>\n {{ record.Seed !== null && record.Seed !== undefined ? record.Seed : '\u2014' }}\n </div>\n </div>\n \n @if (record.RunAt) {\n <div class=\"detail-field\">\n <label>Started At</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ record.RunAt | date:'medium' }}\n </div>\n </div>\n }\n \n @if (record.CompletedAt) {\n <div class=\"detail-field\">\n <label>Completed At</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{ record.CompletedAt | date:'medium' }}\n </div>\n </div>\n }\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n </kendo-panelbar>\n </div>\n </form>\n }\n</div>", styles: ["/* Header Section */\n.prompt-run-header {\n background: #f8f9fa;\n border-bottom: 2px solid #e9ecef;\n padding: 20px;\n margin-bottom: 0;\n}\n\n.header-content {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n margin-bottom: 16px;\n}\n\n.run-overview {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n flex: 1;\n}\n\n.run-icon-wrapper {\n width: 56px;\n height: 56px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-icon-wrapper i {\n font-size: 24px;\n}\n\n.run-info {\n flex: 1;\n min-width: 0;\n}\n\n.run-title {\n margin: 0 0 8px 0;\n font-size: 1.5em;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.run-id {\n font-size: 0.8em;\n color: #6c757d;\n font-weight: 400;\n font-family: 'Courier New', monospace;\n}\n\n.run-meta {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n color: white;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.status-badge i {\n font-size: 0.9em;\n}\n\n.run-type-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #f1f3f5;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.prompt-name, .model-name, .vendor-name {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.85em;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.prompt-name:hover, .model-name:hover, .vendor-name:hover {\n background: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.run-actions {\n display: flex;\n gap: 8px;\n}\n\n/* Metrics Bar */\n.metrics-bar {\n display: flex;\n gap: 24px;\n padding-top: 16px;\n border-top: 1px solid #e9ecef;\n flex-wrap: wrap;\n}\n\n.metric-item {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.metric-item > i {\n font-size: 1.2em;\n color: #6c757d;\n width: 24px;\n text-align: center;\n}\n\n.metric-content {\n display: flex;\n flex-direction: column;\n}\n\n.metric-label {\n font-size: 0.75em;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value {\n font-size: 1.1em;\n font-weight: 600;\n color: #2c3e50;\n}\n\n/* Panels */\n.form-content {\n padding: 16px;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n/* Nested Sub-Panel Styles */\n.sub-panel-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n font-size: 0.95em;\n}\n\n.sub-panel-content {\n padding: 0;\n}\n\n/* Nested kendo-panelbar styles */\n.k-panelbar .k-panelbar {\n border: none;\n background: transparent;\n}\n\n.k-panelbar .k-panelbar > .k-item {\n border: 1px solid #e5e7eb;\n margin-bottom: 8px;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.k-panelbar .k-panelbar > .k-item > .k-link {\n background-color: #f9fafb;\n padding: 12px 16px;\n}\n\n.k-panelbar .k-panelbar > .k-item.k-expanded > .k-link {\n background-color: #f3f4f6;\n}\n\n.k-panelbar .k-panelbar .k-content {\n padding: 0;\n background: white;\n}\n\n/* Ensure chat message viewer takes appropriate height */\n.sub-panel-content mj-chat-message-viewer {\n display: block;\n min-height: 200px;\n max-height: 750px; /* Increased by 50% from 500px */\n height: auto;\n overflow: hidden;\n}\n\n/* Different colors for sub-expansion panels */\n.sub-expansion-panel {\n margin-bottom: 8px;\n}\n\n.sub-expansion-panel::ng-deep .k-expander {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel::ng-deep .k-expander:hover {\n background-color: #edf2f7;\n}\n\n.sub-expansion-panel::ng-deep .k-header {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel::ng-deep .k-content {\n background-color: #ffffff;\n border-color: #e2e8f0;\n}\n\n.panel-badge {\n margin-left: auto;\n padding: 2px 8px;\n border-radius: 12px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n.panel-badge.error {\n background: #dc3545;\n color: white;\n}\n\n.panel-count {\n color: #6c757d;\n font-weight: 400;\n font-size: 0.9em;\n}\n\n.panel-content {\n padding: 20px;\n max-height: none !important;\n overflow: visible !important;\n}\n\n/* JSON Editor Container */\n.json-editor-container {\n border: 1px solid #e9ecef;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.json-toolbar {\n background: #f8f9fa;\n padding: 8px 12px;\n border-bottom: 1px solid #e9ecef;\n display: flex;\n justify-content: flex-end;\n}\n\n/* Error Message */\n.error-message {\n background: #dc354510;\n border: 1px solid #dc3545;\n border-radius: 6px;\n padding: 16px;\n display: flex;\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.error-message i {\n font-size: 1.5em;\n color: #dc3545;\n flex-shrink: 0;\n}\n\n.error-content h4 {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 1em;\n}\n\n.error-content p {\n margin: 0;\n color: #495057;\n}\n\n/* Empty State */\n.empty-state {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.empty-state i {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.3;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 1.1em;\n}\n\n/* Loading State */\n.loading-state {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.loading-state i {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.6;\n color: #007bff;\n}\n\n.loading-state p {\n margin: 0;\n font-size: 1.1em;\n}\n\n/* Metrics Grid */\n.metrics-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 24px;\n}\n\n.metric-card {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n}\n\n.metric-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.metric-header i {\n font-size: 1.2em;\n color: #6c757d;\n}\n\n.metric-header h4 {\n margin: 0;\n font-size: 0.9em;\n color: #6c757d;\n font-weight: 500;\n}\n\n.metric-value.large {\n font-size: 1.8em;\n font-weight: 700;\n color: #2c3e50;\n}\n\n.metric-rollup {\n margin-top: 8px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.metric-currency {\n margin-top: 4px;\n font-size: 0.85em;\n color: #6c757d;\n text-transform: uppercase;\n}\n\n/* Additional Metrics */\n.additional-metrics {\n border-top: 1px solid #e9ecef;\n padding-top: 16px;\n}\n\n.metric-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n border-bottom: 1px solid #f1f3f5;\n}\n\n.metric-row:last-child {\n border-bottom: none;\n}\n\n.metric-row .metric-label {\n font-weight: 500;\n color: #6c757d;\n}\n\n.metric-row .metric-value {\n font-weight: 400;\n color: #2c3e50;\n}\n\n.metric-row .metric-value.link {\n color: #007bff;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: color 0.2s;\n}\n\n.metric-row .metric-value.link:hover {\n color: #0056b3;\n}\n\n/* Hierarchy Section */\n.parent-run-section,\n.child-runs-section {\n margin-bottom: 24px;\n}\n\n.parent-run-section:last-child,\n.child-runs-section:last-child {\n margin-bottom: 0;\n}\n\n.parent-run-section h4,\n.child-runs-section h4 {\n margin: 0 0 12px 0;\n font-size: 0.95em;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.runs-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.run-item {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.run-item:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n}\n\n.run-item.parent {\n background: #e3f2fd;\n border-color: #90caf9;\n}\n\n.run-item.parent:hover {\n background: #bbdefb;\n}\n\n.run-item-icon {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-item-content {\n flex: 1;\n min-width: 0;\n}\n\n.run-item-title {\n font-weight: 500;\n color: #2c3e50;\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.execution-order {\n background: #6c757d;\n color: white;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 0.75em;\n font-weight: 600;\n}\n\n.run-item-type {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 400;\n}\n\n.run-item-meta {\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.run-item-meta span {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.status-indicator {\n font-weight: 500;\n}\n\n.run-item > i:last-child {\n color: #6c757d;\n font-size: 0.85em;\n}\n\n/* Detail Fields Grid */\n.detail-fields-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 24px;\n width: 100%;\n min-height: auto;\n overflow: visible;\n}\n\n.detail-field {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-field label {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-value {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 1em;\n color: #2c3e50;\n padding: 10px 14px;\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n transition: all 0.2s;\n}\n\n.detail-value i:first-child {\n color: #6c757d;\n font-size: 1.1em;\n width: 20px;\n text-align: center;\n}\n\n.detail-value.clickable {\n cursor: pointer;\n}\n\n.detail-value.clickable:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.detail-value.clickable i:last-child {\n margin-left: auto;\n font-size: 0.85em;\n opacity: 0.6;\n}\n\n.detail-value.clickable:hover i:last-child {\n opacity: 1;\n}\n\n.detail-value.null-value {\n color: #adb5bd;\n font-style: italic;\n}\n\n.detail-value.null-value i:first-child {\n opacity: 0.5;\n}\n\n/* Kendo Overrides */\nkendo-panelbar {\n border: none !important;\n}\n\nkendo-panelbar-item {\n margin-bottom: 8px;\n border: 1px solid #e9ecef !important;\n border-radius: 8px !important;\n overflow: hidden;\n}\n\nkendo-panelbar-item .k-panelbar-header {\n background: #f8f9fa !important;\n border: none !important;\n padding: 12px 16px !important;\n}\n\nkendo-panelbar-item .k-panelbar-header:hover {\n background: #e9ecef !important;\n}\n\nkendo-panelbar-item .k-panelbar-content {\n border: none !important;\n padding: 0 !important;\n max-height: none !important;\n overflow: visible !important;\n}\n\n/* Validation Panel Styles */\n.validation-summary {\n margin-bottom: 24px;\n}\n\n.summary-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.summary-header h4 {\n margin: 0;\n font-size: 1.1em;\n color: #2c3e50;\n}\n\n.validation-status {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 16px;\n border-radius: 20px;\n font-weight: 500;\n font-size: 0.9em;\n}\n\n.validation-status.success {\n background: #28a74520;\n color: #28a745;\n}\n\n.validation-status.failed {\n background: #dc354520;\n color: #dc3545;\n}\n\n.validation-metrics {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.metric-card.small {\n padding: 16px;\n text-align: center;\n}\n\n.metric-card.small .metric-label {\n font-size: 0.8em;\n margin-bottom: 8px;\n font-weight: 600;\n}\n\n.metric-card.small .metric-value {\n font-size: 1.4em;\n font-weight: 700;\n}\n\n.validation-error,\n.common-error {\n background: #dc354510;\n border: 1px solid #dc354530;\n border-radius: 8px;\n padding: 16px;\n margin-bottom: 16px;\n}\n\n.validation-error h5,\n.common-error h5 {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 0.95em;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.validation-error p,\n.common-error p {\n margin: 0;\n color: #495057;\n font-size: 0.9em;\n}\n\n.error-count {\n display: inline-block;\n margin-top: 8px;\n padding: 2px 8px;\n background: #dc3545;\n color: white;\n border-radius: 12px;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n/* Retry Timeline */\n.retry-timeline {\n margin-bottom: 24px;\n}\n\n.retry-timeline h4 {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.timeline-info {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n}\n\n.timeline-stat {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #6c757d;\n font-size: 0.9em;\n}\n\n.timeline-stat i {\n font-size: 1.1em;\n}\n\n/* Validation Attempts */\n.validation-attempts {\n margin-bottom: 24px;\n}\n\n.validation-attempts h4 {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.attempts-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.attempt-item {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n}\n\n.attempt-item.success {\n background: #28a74510;\n border-color: #28a74530;\n}\n\n.attempt-item.failed {\n background: #dc354510;\n border-color: #dc354530;\n}\n\n.attempt-number {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.attempt-item.success .attempt-number {\n color: #28a745;\n}\n\n.attempt-item.failed .attempt-number {\n color: #dc3545;\n}\n\n.attempt-details {\n flex: 1;\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n font-size: 0.85em;\n}\n\n.attempt-time {\n color: #6c757d;\n}\n\n.attempt-error {\n color: #dc3545;\n flex: 1 0 100%;\n}\n\n.output-length {\n color: #6c757d;\n font-style: italic;\n}\n\n/* Validation JSON */\n.validation-json {\n margin-top: 24px;\n}\n\n.validation-json h4 {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.json-viewer-container {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n overflow: hidden;\n}\n\n/* Panel badge styles */\n.panel-badge.success {\n background: #28a745;\n color: white;\n}"] }]
1395
1552
  }], () => [{ type: i0.ElementRef }, { type: i1.SharedService }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i0.ChangeDetectorRef }], null); })();
1396
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIPromptRunFormComponentExtended, { className: "AIPromptRunFormComponentExtended", filePath: "src/lib/custom/AIPromptRuns/ai-prompt-run-form.component.ts", lineNumber: 16 }); })();
1553
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIPromptRunFormComponentExtended, { className: "AIPromptRunFormComponentExtended", filePath: "src/lib/custom/AIPromptRuns/ai-prompt-run-form.component.ts", lineNumber: 17 }); })();
1397
1554
  //# sourceMappingURL=ai-prompt-run-form.component.js.map