@memberjunction/ng-core-entity-forms 2.80.1 → 2.82.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.
Files changed (87) hide show
  1. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts +2 -2
  2. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts.map +1 -1
  3. package/dist/lib/custom/AIAgents/add-action-dialog.component.js +4 -4
  4. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts +2 -2
  5. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts.map +1 -1
  6. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +4 -4
  7. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +51 -3
  8. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  9. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +722 -163
  10. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  11. package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts +3 -2
  12. package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts.map +1 -1
  13. package/dist/lib/custom/AIAgents/ai-agent-management.service.js +74 -46
  14. package/dist/lib/custom/AIAgents/ai-agent-management.service.js.map +1 -1
  15. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts +2 -2
  16. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts.map +1 -1
  17. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +4 -4
  18. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts +2 -2
  19. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts.map +1 -1
  20. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +39 -32
  21. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -1
  22. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts.map +1 -1
  23. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +2 -2
  24. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
  25. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts +2 -2
  26. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts.map +1 -1
  27. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +4 -4
  28. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +2 -2
  29. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -1
  30. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +29 -25
  31. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
  32. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +299 -283
  33. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  34. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +474 -456
  35. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  36. package/dist/lib/custom/Templates/templates-form.component.d.ts +5 -0
  37. package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
  38. package/dist/lib/custom/Templates/templates-form.component.js +21 -2
  39. package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
  40. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +6 -0
  41. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
  42. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +70 -16
  43. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
  44. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts +6 -5
  45. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
  46. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +8 -22
  47. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
  48. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +5 -4
  49. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
  50. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +30 -24
  51. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  52. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts +8 -4
  53. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts.map +1 -1
  54. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js +39 -18
  55. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js.map +1 -1
  56. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +20 -3
  57. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
  58. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +317 -140
  59. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  60. package/dist/lib/generated/Entities/AIAgent/sections/details.component.d.ts.map +1 -1
  61. package/dist/lib/generated/Entities/AIAgent/sections/details.component.js +13 -4
  62. package/dist/lib/generated/Entities/AIAgent/sections/details.component.js.map +1 -1
  63. package/dist/lib/generated/Entities/AIAgentRun/sections/details.component.d.ts.map +1 -1
  64. package/dist/lib/generated/Entities/AIAgentRun/sections/details.component.js +13 -4
  65. package/dist/lib/generated/Entities/AIAgentRun/sections/details.component.js.map +1 -1
  66. package/dist/lib/generated/Entities/AIPrompt/sections/details.component.d.ts.map +1 -1
  67. package/dist/lib/generated/Entities/AIPrompt/sections/details.component.js +13 -4
  68. package/dist/lib/generated/Entities/AIPrompt/sections/details.component.js.map +1 -1
  69. package/dist/lib/generated/Entities/AIPromptRun/sections/details.component.d.ts.map +1 -1
  70. package/dist/lib/generated/Entities/AIPromptRun/sections/details.component.js +13 -4
  71. package/dist/lib/generated/Entities/AIPromptRun/sections/details.component.js.map +1 -1
  72. package/dist/lib/generated/Entities/Entity/sections/details.component.d.ts.map +1 -1
  73. package/dist/lib/generated/Entities/Entity/sections/details.component.js +13 -4
  74. package/dist/lib/generated/Entities/Entity/sections/details.component.js.map +1 -1
  75. package/dist/lib/generated/Entities/Query/sections/details.component.d.ts.map +1 -1
  76. package/dist/lib/generated/Entities/Query/sections/details.component.js +40 -4
  77. package/dist/lib/generated/Entities/Query/sections/details.component.js.map +1 -1
  78. package/dist/lib/generated/Entities/QueryCategory/sections/details.component.d.ts.map +1 -1
  79. package/dist/lib/generated/Entities/QueryCategory/sections/details.component.js +40 -4
  80. package/dist/lib/generated/Entities/QueryCategory/sections/details.component.js.map +1 -1
  81. package/dist/lib/generated/Entities/User/user.form.component.js +6 -6
  82. package/dist/lib/generated/Entities/User/user.form.component.js.map +1 -1
  83. package/dist/lib/shared/components/template-editor.component.d.ts +5 -0
  84. package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
  85. package/dist/lib/shared/components/template-editor.component.js +21 -2
  86. package/dist/lib/shared/components/template-editor.component.js.map +1 -1
  87. package/package.json +17 -16
@@ -137,6 +137,20 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Condition
137
137
  i0.ɵɵelementStart(0, "div", 39);
138
138
  i0.ɵɵelement(1, "i", 51);
139
139
  i0.ɵɵelementStart(2, "div", 41)(3, "div", 42);
140
+ i0.ɵɵtext(4, "Effort Level");
141
+ i0.ɵɵelementEnd();
142
+ i0.ɵɵelementStart(5, "div", 43);
143
+ i0.ɵɵtext(6);
144
+ i0.ɵɵelementEnd()()();
145
+ } if (rf & 2) {
146
+ const ctx_r1 = i0.ɵɵnextContext(3);
147
+ i0.ɵɵadvance(6);
148
+ i0.ɵɵtextInterpolate(ctx_r1.record.EffortLevel);
149
+ } }
150
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Conditional_13_Template(rf, ctx) { if (rf & 1) {
151
+ i0.ɵɵelementStart(0, "div", 39);
152
+ i0.ɵɵelement(1, "i", 52);
153
+ i0.ɵɵelementStart(2, "div", 41)(3, "div", 42);
140
154
  i0.ɵɵtext(4, "Response Format");
141
155
  i0.ɵɵelementEnd();
142
156
  i0.ɵɵelementStart(5, "div", 43);
@@ -147,9 +161,9 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Condition
147
161
  i0.ɵɵadvance(6);
148
162
  i0.ɵɵtextInterpolate(ctx_r1.record.ResponseFormat);
149
163
  } }
150
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Conditional_35_Template(rf, ctx) { if (rf & 1) {
164
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Conditional_36_Template(rf, ctx) { if (rf & 1) {
151
165
  i0.ɵɵelementStart(0, "div", 39);
152
- i0.ɵɵelement(1, "i", 52);
166
+ i0.ɵɵelement(1, "i", 53);
153
167
  i0.ɵɵelementStart(2, "div", 41)(3, "div", 42);
154
168
  i0.ɵɵtext(4, "Started");
155
169
  i0.ɵɵelementEnd();
@@ -173,33 +187,33 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Template(
173
187
  i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Template_a_click_7_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.navigateToEntity("MJ: AI Configurations", ctx_r1.record.ConfigurationID)); });
174
188
  i0.ɵɵtext(8);
175
189
  i0.ɵɵelementEnd()()()();
176
- i0.ɵɵtemplate(9, AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Conditional_9_Template, 7, 1, "div", 39)(10, AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Conditional_10_Template, 7, 1, "div", 39)(11, AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Conditional_11_Template, 7, 1, "div", 39)(12, AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Conditional_12_Template, 7, 1, "div", 39);
190
+ i0.ɵɵtemplate(9, AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Conditional_9_Template, 7, 1, "div", 39)(10, AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Conditional_10_Template, 7, 1, "div", 39)(11, AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Conditional_11_Template, 7, 1, "div", 39)(12, AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Conditional_12_Template, 7, 1, "div", 39)(13, AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Conditional_13_Template, 7, 1, "div", 39);
177
191
  i0.ɵɵelementEnd();
178
- i0.ɵɵelementStart(13, "div", 23)(14, "div", 39);
179
- i0.ɵɵelement(15, "i", 45);
180
- i0.ɵɵelementStart(16, "div", 41)(17, "div", 42);
181
- i0.ɵɵtext(18, "Duration");
192
+ i0.ɵɵelementStart(14, "div", 23)(15, "div", 39);
193
+ i0.ɵɵelement(16, "i", 45);
194
+ i0.ɵɵelementStart(17, "div", 41)(18, "div", 42);
195
+ i0.ɵɵtext(19, "Duration");
182
196
  i0.ɵɵelementEnd();
183
- i0.ɵɵelementStart(19, "div", 43);
184
- i0.ɵɵtext(20);
197
+ i0.ɵɵelementStart(20, "div", 43);
198
+ i0.ɵɵtext(21);
185
199
  i0.ɵɵelementEnd()()();
186
- i0.ɵɵelementStart(21, "div", 39);
187
- i0.ɵɵelement(22, "i", 46);
188
- i0.ɵɵelementStart(23, "div", 41)(24, "div", 42);
189
- i0.ɵɵtext(25, "Total Tokens");
200
+ i0.ɵɵelementStart(22, "div", 39);
201
+ i0.ɵɵelement(23, "i", 46);
202
+ i0.ɵɵelementStart(24, "div", 41)(25, "div", 42);
203
+ i0.ɵɵtext(26, "Total Tokens");
190
204
  i0.ɵɵelementEnd();
191
- i0.ɵɵelementStart(26, "div", 43);
192
- i0.ɵɵtext(27);
205
+ i0.ɵɵelementStart(27, "div", 43);
206
+ i0.ɵɵtext(28);
193
207
  i0.ɵɵelementEnd()()();
194
- i0.ɵɵelementStart(28, "div", 39);
195
- i0.ɵɵelement(29, "i", 47);
196
- i0.ɵɵelementStart(30, "div", 41)(31, "div", 42);
197
- i0.ɵɵtext(32, "Cost");
208
+ i0.ɵɵelementStart(29, "div", 39);
209
+ i0.ɵɵelement(30, "i", 47);
210
+ i0.ɵɵelementStart(31, "div", 41)(32, "div", 42);
211
+ i0.ɵɵtext(33, "Cost");
198
212
  i0.ɵɵelementEnd();
199
- i0.ɵɵelementStart(33, "div", 43);
200
- i0.ɵɵtext(34);
213
+ i0.ɵɵelementStart(34, "div", 43);
214
+ i0.ɵɵtext(35);
201
215
  i0.ɵɵelementEnd()()();
202
- i0.ɵɵtemplate(35, AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Conditional_35_Template, 8, 4, "div", 39);
216
+ i0.ɵɵtemplate(36, AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Conditional_36_Template, 8, 4, "div", 39);
203
217
  i0.ɵɵelementEnd();
204
218
  } if (rf & 2) {
205
219
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -212,7 +226,9 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Template(
212
226
  i0.ɵɵadvance();
213
227
  i0.ɵɵconditional(ctx_r1.record.TopK !== null && ctx_r1.record.TopK !== undefined ? 11 : -1);
214
228
  i0.ɵɵadvance();
215
- i0.ɵɵconditional(ctx_r1.record.ResponseFormat ? 12 : -1);
229
+ i0.ɵɵconditional(ctx_r1.record.EffortLevel !== null && ctx_r1.record.EffortLevel !== undefined ? 12 : -1);
230
+ i0.ɵɵadvance();
231
+ i0.ɵɵconditional(ctx_r1.record.ResponseFormat ? 13 : -1);
216
232
  i0.ɵɵadvance(8);
217
233
  i0.ɵɵtextInterpolate(ctx_r1.formatDuration(ctx_r1.record.ExecutionTimeMS));
218
234
  i0.ɵɵadvance(7);
@@ -220,11 +236,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Template(
220
236
  i0.ɵɵadvance(7);
221
237
  i0.ɵɵtextInterpolate(ctx_r1.formatCost(ctx_r1.record.TotalCost || ctx_r1.record.Cost));
222
238
  i0.ɵɵadvance();
223
- i0.ɵɵconditional(ctx_r1.record.RunAt ? 35 : -1);
239
+ i0.ɵɵconditional(ctx_r1.record.RunAt ? 36 : -1);
224
240
  } }
225
241
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_28_Conditional_22_Template(rf, ctx) { if (rf & 1) {
226
242
  i0.ɵɵelementStart(0, "div", 39);
227
- i0.ɵɵelement(1, "i", 52);
243
+ i0.ɵɵelement(1, "i", 53);
228
244
  i0.ɵɵelementStart(2, "div", 41)(3, "div", 42);
229
245
  i0.ɵɵtext(4, "Started");
230
246
  i0.ɵɵelementEnd();
@@ -276,15 +292,15 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_28_Template(
276
292
  i0.ɵɵconditional(ctx_r1.record.RunAt ? 22 : -1);
277
293
  } }
278
294
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_32_Conditional_3_Template(rf, ctx) { if (rf & 1) {
279
- i0.ɵɵelementStart(0, "span", 54);
295
+ i0.ɵɵelementStart(0, "span", 55);
280
296
  i0.ɵɵtext(1, "JSON");
281
297
  i0.ɵɵelementEnd();
282
298
  } }
283
299
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_32_Template(rf, ctx) { if (rf & 1) {
284
- i0.ɵɵelementStart(0, "span", 53);
300
+ i0.ɵɵelementStart(0, "span", 54);
285
301
  i0.ɵɵelement(1, "i", 32);
286
302
  i0.ɵɵtext(2, " Input ");
287
- i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_32_Conditional_3_Template, 2, 0, "span", 54);
303
+ i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_32_Conditional_3_Template, 2, 0, "span", 55);
288
304
  i0.ɵɵelementEnd();
289
305
  } if (rf & 2) {
290
306
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -292,7 +308,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_32_Template(
292
308
  i0.ɵɵconditional(ctx_r1.record.Messages && ctx_r1.record.Messages.trim() !== "" ? 3 : -1);
293
309
  } }
294
310
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_ng_template_2_Conditional_3_Template(rf, ctx) { if (rf & 1) {
295
- i0.ɵɵelementStart(0, "span", 70);
311
+ i0.ɵɵelementStart(0, "span", 71);
296
312
  i0.ɵɵtext(1);
297
313
  i0.ɵɵelementEnd();
298
314
  } if (rf & 2) {
@@ -301,10 +317,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Condition
301
317
  i0.ɵɵtextInterpolate1("(", ctx_r1.chatMessages.length, ")");
302
318
  } }
303
319
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_ng_template_2_Template(rf, ctx) { if (rf & 1) {
304
- i0.ɵɵelementStart(0, "span", 68);
305
- i0.ɵɵelement(1, "i", 69);
320
+ i0.ɵɵelementStart(0, "span", 69);
321
+ i0.ɵɵelement(1, "i", 70);
306
322
  i0.ɵɵtext(2, " Messages ");
307
- i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_ng_template_2_Conditional_3_Template, 2, 1, "span", 70);
323
+ i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_ng_template_2_Conditional_3_Template, 2, 1, "span", 71);
308
324
  i0.ɵɵelementEnd();
309
325
  } if (rf & 2) {
310
326
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -312,35 +328,35 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Condition
312
328
  i0.ɵɵconditional(ctx_r1.chatMessages.length > 0 ? 3 : -1);
313
329
  } }
314
330
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
315
- i0.ɵɵelementStart(0, "div", 61);
316
- i0.ɵɵelement(1, "i", 71);
331
+ i0.ɵɵelementStart(0, "div", 62);
332
+ i0.ɵɵelement(1, "i", 72);
317
333
  i0.ɵɵelementStart(2, "p");
318
334
  i0.ɵɵtext(3, "Loading messages...");
319
335
  i0.ɵɵelementEnd()();
320
336
  } }
321
337
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
322
- i0.ɵɵelement(0, "mj-chat-message-viewer", 62);
338
+ i0.ɵɵelement(0, "mj-chat-message-viewer", 63);
323
339
  } if (rf & 2) {
324
340
  const ctx_r1 = i0.ɵɵnextContext(4);
325
341
  i0.ɵɵproperty("messages", ctx_r1.chatMessages);
326
342
  } }
327
343
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
328
- i0.ɵɵelementStart(0, "div", 57);
329
- i0.ɵɵelement(1, "i", 72);
344
+ i0.ɵɵelementStart(0, "div", 58);
345
+ i0.ɵɵelement(1, "i", 73);
330
346
  i0.ɵɵelementStart(2, "p");
331
347
  i0.ɵɵtext(3, "No chat messages found");
332
348
  i0.ɵɵelementEnd()();
333
349
  } }
334
350
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_ng_template_8_Conditional_3_Template(rf, ctx) { if (rf & 1) {
335
- i0.ɵɵelementStart(0, "span", 54);
351
+ i0.ɵɵelementStart(0, "span", 55);
336
352
  i0.ɵɵtext(1, "Object");
337
353
  i0.ɵɵelementEnd();
338
354
  } }
339
355
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_ng_template_8_Template(rf, ctx) { if (rf & 1) {
340
- i0.ɵɵelementStart(0, "span", 68);
341
- i0.ɵɵelement(1, "i", 73);
356
+ i0.ɵɵelementStart(0, "span", 69);
357
+ i0.ɵɵelement(1, "i", 74);
342
358
  i0.ɵɵtext(2, " Data ");
343
- i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_ng_template_8_Conditional_3_Template, 2, 0, "span", 54);
359
+ i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_ng_template_8_Conditional_3_Template, 2, 0, "span", 55);
344
360
  i0.ɵɵelementEnd();
345
361
  } if (rf & 2) {
346
362
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -349,12 +365,12 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Condition
349
365
  } }
350
366
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Conditional_10_Template(rf, ctx) { if (rf & 1) {
351
367
  const _r9 = i0.ɵɵgetCurrentView();
352
- i0.ɵɵelementStart(0, "div", 63)(1, "div", 64)(2, "button", 65);
368
+ i0.ɵɵelementStart(0, "div", 64)(1, "div", 65)(2, "button", 66);
353
369
  i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Conditional_10_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.copyToClipboard(ctx_r1.formattedData, "Data")); });
354
- i0.ɵɵelement(3, "i", 66);
370
+ i0.ɵɵelement(3, "i", 67);
355
371
  i0.ɵɵtext(4, " Copy ");
356
372
  i0.ɵɵelementEnd()();
357
- i0.ɵɵelementStart(5, "mj-code-editor", 74);
373
+ i0.ɵɵelementStart(5, "mj-code-editor", 75);
358
374
  i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Conditional_10_Template_mj_code_editor_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedData, $event) || (ctx_r1.formattedData = $event); return i0.ɵɵresetView($event); });
359
375
  i0.ɵɵelementEnd()();
360
376
  } if (rf & 2) {
@@ -364,38 +380,38 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Condition
364
380
  i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
365
381
  } }
366
382
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Conditional_11_Template(rf, ctx) { if (rf & 1) {
367
- i0.ɵɵelementStart(0, "div", 57);
368
- i0.ɵɵelement(1, "i", 73);
383
+ i0.ɵɵelementStart(0, "div", 58);
384
+ i0.ɵɵelement(1, "i", 74);
369
385
  i0.ɵɵelementStart(2, "p");
370
386
  i0.ɵɵtext(3, "No data object found");
371
387
  i0.ɵɵelementEnd()();
372
388
  } }
373
389
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_ng_template_13_Template(rf, ctx) { if (rf & 1) {
374
- i0.ɵɵelementStart(0, "span", 68);
375
- i0.ɵɵelement(1, "i", 51);
390
+ i0.ɵɵelementStart(0, "span", 69);
391
+ i0.ɵɵelement(1, "i", 52);
376
392
  i0.ɵɵtext(2, " Raw ");
377
393
  i0.ɵɵelementEnd();
378
394
  } }
379
395
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Template(rf, ctx) { if (rf & 1) {
380
396
  const _r8 = i0.ɵɵgetCurrentView();
381
- i0.ɵɵelementStart(0, "div", 56)(1, "kendo-expansionpanel", 58);
382
- i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_ng_template_2_Template, 4, 1, "ng-template", 59);
383
- i0.ɵɵelementStart(3, "div", 60);
384
- i0.ɵɵtemplate(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Conditional_4_Template, 4, 0, "div", 61)(5, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Conditional_5_Template, 1, 1, "mj-chat-message-viewer", 62)(6, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Conditional_6_Template, 4, 0, "div", 57);
385
- i0.ɵɵelementEnd()();
386
- i0.ɵɵelementStart(7, "kendo-expansionpanel", 58);
387
- i0.ɵɵtemplate(8, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_ng_template_8_Template, 4, 1, "ng-template", 59);
388
- i0.ɵɵelementStart(9, "div", 60);
389
- i0.ɵɵtemplate(10, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Conditional_10_Template, 6, 4, "div", 63)(11, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Conditional_11_Template, 4, 0, "div", 57);
390
- i0.ɵɵelementEnd()();
391
- i0.ɵɵelementStart(12, "kendo-expansionpanel", 58);
392
- i0.ɵɵtemplate(13, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_ng_template_13_Template, 3, 0, "ng-template", 59);
393
- i0.ɵɵelementStart(14, "div", 60)(15, "div", 63)(16, "div", 64)(17, "button", 65);
397
+ i0.ɵɵelementStart(0, "div", 57)(1, "kendo-expansionpanel", 59);
398
+ i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_ng_template_2_Template, 4, 1, "ng-template", 60);
399
+ i0.ɵɵelementStart(3, "div", 61);
400
+ i0.ɵɵtemplate(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Conditional_4_Template, 4, 0, "div", 62)(5, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Conditional_5_Template, 1, 1, "mj-chat-message-viewer", 63)(6, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Conditional_6_Template, 4, 0, "div", 58);
401
+ i0.ɵɵelementEnd()();
402
+ i0.ɵɵelementStart(7, "kendo-expansionpanel", 59);
403
+ i0.ɵɵtemplate(8, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_ng_template_8_Template, 4, 1, "ng-template", 60);
404
+ i0.ɵɵelementStart(9, "div", 61);
405
+ i0.ɵɵtemplate(10, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Conditional_10_Template, 6, 4, "div", 64)(11, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Conditional_11_Template, 4, 0, "div", 58);
406
+ i0.ɵɵelementEnd()();
407
+ i0.ɵɵelementStart(12, "kendo-expansionpanel", 59);
408
+ i0.ɵɵtemplate(13, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_ng_template_13_Template, 3, 0, "ng-template", 60);
409
+ i0.ɵɵelementStart(14, "div", 61)(15, "div", 64)(16, "div", 65)(17, "button", 66);
394
410
  i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.copyToClipboard(ctx_r1.formattedMessages, "Messages")); });
395
- i0.ɵɵelement(18, "i", 66);
411
+ i0.ɵɵelement(18, "i", 67);
396
412
  i0.ɵɵtext(19, " Copy ");
397
413
  i0.ɵɵelementEnd()();
398
- i0.ɵɵelementStart(20, "mj-code-editor", 67);
414
+ i0.ɵɵelementStart(20, "mj-code-editor", 68);
399
415
  i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Template_mj_code_editor_ngModelChange_20_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedMessages, $event) || (ctx_r1.formattedMessages = $event); return i0.ɵɵresetView($event); });
400
416
  i0.ɵɵelementEnd()()()()();
401
417
  } if (rf & 2) {
@@ -415,15 +431,15 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Condition
415
431
  i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
416
432
  } }
417
433
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_2_Template(rf, ctx) { if (rf & 1) {
418
- i0.ɵɵelementStart(0, "div", 57);
419
- i0.ɵɵelement(1, "i", 72);
434
+ i0.ɵɵelementStart(0, "div", 58);
435
+ i0.ɵɵelement(1, "i", 73);
420
436
  i0.ɵɵelementStart(2, "p");
421
437
  i0.ɵɵtext(3, "No input messages recorded");
422
438
  i0.ɵɵelementEnd()();
423
439
  } }
424
440
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Template(rf, ctx) { if (rf & 1) {
425
- i0.ɵɵelementStart(0, "div", 55);
426
- i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Template, 21, 12, "div", 56)(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_2_Template, 4, 0, "div", 57);
441
+ i0.ɵɵelementStart(0, "div", 56);
442
+ i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_1_Template, 21, 12, "div", 57)(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Conditional_2_Template, 4, 0, "div", 58);
427
443
  i0.ɵɵelementEnd();
428
444
  } if (rf & 2) {
429
445
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -431,20 +447,20 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_33_Template(
431
447
  i0.ɵɵconditional(ctx_r1.record.Messages && ctx_r1.record.Messages.trim() !== "" ? 1 : 2);
432
448
  } }
433
449
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_35_Conditional_3_Template(rf, ctx) { if (rf & 1) {
434
- i0.ɵɵelementStart(0, "span", 54);
450
+ i0.ɵɵelementStart(0, "span", 55);
435
451
  i0.ɵɵtext(1, "JSON");
436
452
  i0.ɵɵelementEnd();
437
453
  } }
438
454
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_35_Conditional_4_Template(rf, ctx) { if (rf & 1) {
439
- i0.ɵɵelementStart(0, "span", 76);
455
+ i0.ɵɵelementStart(0, "span", 77);
440
456
  i0.ɵɵtext(1, "Error");
441
457
  i0.ɵɵelementEnd();
442
458
  } }
443
459
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_35_Template(rf, ctx) { if (rf & 1) {
444
- i0.ɵɵelementStart(0, "span", 53);
445
- i0.ɵɵelement(1, "i", 75);
460
+ i0.ɵɵelementStart(0, "span", 54);
461
+ i0.ɵɵelement(1, "i", 76);
446
462
  i0.ɵɵtext(2, " Result ");
447
- i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_35_Conditional_3_Template, 2, 0, "span", 54)(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_35_Conditional_4_Template, 2, 0, "span", 76);
463
+ i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_35_Conditional_3_Template, 2, 0, "span", 55)(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_35_Conditional_4_Template, 2, 0, "span", 77);
448
464
  i0.ɵɵelementEnd();
449
465
  } if (rf & 2) {
450
466
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -454,9 +470,9 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_35_Template(
454
470
  i0.ɵɵconditional(ctx_r1.record.ErrorMessage ? 4 : -1);
455
471
  } }
456
472
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_1_Template(rf, ctx) { if (rf & 1) {
457
- i0.ɵɵelementStart(0, "div", 77);
458
- i0.ɵɵelement(1, "i", 78);
459
- i0.ɵɵelementStart(2, "div", 79)(3, "h4");
473
+ i0.ɵɵelementStart(0, "div", 78);
474
+ i0.ɵɵelement(1, "i", 79);
475
+ i0.ɵɵelementStart(2, "div", 80)(3, "h4");
460
476
  i0.ɵɵtext(4, "Error Message");
461
477
  i0.ɵɵelementEnd();
462
478
  i0.ɵɵelementStart(5, "p");
@@ -469,12 +485,12 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Condition
469
485
  } }
470
486
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_2_Template(rf, ctx) { if (rf & 1) {
471
487
  const _r10 = i0.ɵɵgetCurrentView();
472
- i0.ɵɵelementStart(0, "div", 63)(1, "div", 64)(2, "button", 65);
488
+ i0.ɵɵelementStart(0, "div", 64)(1, "div", 65)(2, "button", 66);
473
489
  i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_2_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.copyToClipboard(ctx_r1.formattedResult, "Result")); });
474
- i0.ɵɵelement(3, "i", 66);
490
+ i0.ɵɵelement(3, "i", 67);
475
491
  i0.ɵɵtext(4, " Copy ");
476
492
  i0.ɵɵelementEnd()();
477
- i0.ɵɵelementStart(5, "mj-code-editor", 80);
493
+ i0.ɵɵelementStart(5, "mj-code-editor", 81);
478
494
  i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_2_Template_mj_code_editor_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedResult, $event) || (ctx_r1.formattedResult = $event); return i0.ɵɵresetView($event); });
479
495
  i0.ɵɵelementEnd()();
480
496
  } if (rf & 2) {
@@ -484,7 +500,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Condition
484
500
  i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
485
501
  } }
486
502
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_3_Conditional_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
487
- i0.ɵɵelementStart(0, "p", 83)(1, "strong");
503
+ i0.ɵɵelementStart(0, "p", 84)(1, "strong");
488
504
  i0.ɵɵtext(2, "Status:");
489
505
  i0.ɵɵelementEnd();
490
506
  i0.ɵɵtext(3);
@@ -495,10 +511,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Condition
495
511
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Status, " ");
496
512
  } }
497
513
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_3_Conditional_4_Conditional_2_Template(rf, ctx) { if (rf & 1) {
498
- i0.ɵɵelementStart(0, "div", 84)(1, "h4");
514
+ i0.ɵɵelementStart(0, "div", 85)(1, "h4");
499
515
  i0.ɵɵtext(2, "Error Details");
500
516
  i0.ɵɵelementEnd();
501
- i0.ɵɵelement(3, "mj-code-editor", 86);
517
+ i0.ɵɵelement(3, "mj-code-editor", 87);
502
518
  i0.ɵɵelementEnd();
503
519
  } if (rf & 2) {
504
520
  const ctx_r1 = i0.ɵɵnextContext(5);
@@ -506,13 +522,13 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Condition
506
522
  i0.ɵɵproperty("ngModel", ctx_r1.formattedErrorDetails)("disabled", true)("language", "json")("lineWrapping", true);
507
523
  } }
508
524
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_3_Conditional_4_Conditional_3_Template(rf, ctx) { if (rf & 1) {
509
- i0.ɵɵelementStart(0, "p", 85);
525
+ i0.ɵɵelementStart(0, "p", 86);
510
526
  i0.ɵɵtext(1, " The prompt execution failed but no additional error information is available. ");
511
527
  i0.ɵɵelementEnd();
512
528
  } }
513
529
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_3_Conditional_4_Template(rf, ctx) { if (rf & 1) {
514
- i0.ɵɵelementStart(0, "div", 82);
515
- i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_3_Conditional_4_Conditional_1_Template, 4, 1, "p", 83)(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_3_Conditional_4_Conditional_2_Template, 4, 4, "div", 84)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_3_Conditional_4_Conditional_3_Template, 2, 0, "p", 85);
530
+ i0.ɵɵelementStart(0, "div", 83);
531
+ i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_3_Conditional_4_Conditional_1_Template, 4, 1, "p", 84)(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_3_Conditional_4_Conditional_2_Template, 4, 4, "div", 85)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_3_Conditional_4_Conditional_3_Template, 2, 0, "p", 86);
516
532
  i0.ɵɵelementEnd();
517
533
  } if (rf & 2) {
518
534
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -524,12 +540,12 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Condition
524
540
  i0.ɵɵconditional(!ctx_r1.formattedErrorDetails ? 3 : -1);
525
541
  } }
526
542
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_3_Template(rf, ctx) { if (rf & 1) {
527
- i0.ɵɵelementStart(0, "div", 57);
528
- i0.ɵɵelement(1, "i", 81);
543
+ i0.ɵɵelementStart(0, "div", 58);
544
+ i0.ɵɵelement(1, "i", 82);
529
545
  i0.ɵɵelementStart(2, "p");
530
546
  i0.ɵɵtext(3, "No result data recorded");
531
547
  i0.ɵɵelementEnd();
532
- i0.ɵɵtemplate(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_3_Conditional_4_Template, 4, 3, "div", 82);
548
+ i0.ɵɵtemplate(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_3_Conditional_4_Template, 4, 3, "div", 83);
533
549
  i0.ɵɵelementEnd();
534
550
  } if (rf & 2) {
535
551
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -537,8 +553,8 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Condition
537
553
  i0.ɵɵconditional(ctx_r1.record.Status === "Failed" || ctx_r1.record.Success === false ? 4 : -1);
538
554
  } }
539
555
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Template(rf, ctx) { if (rf & 1) {
540
- i0.ɵɵelementStart(0, "div", 55);
541
- i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_1_Template, 7, 1, "div", 77)(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_2_Template, 6, 4, "div", 63)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_3_Template, 5, 1, "div", 57);
556
+ i0.ɵɵelementStart(0, "div", 56);
557
+ i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_1_Template, 7, 1, "div", 78)(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_2_Template, 6, 4, "div", 64)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Conditional_3_Template, 5, 1, "div", 58);
542
558
  i0.ɵɵelementEnd();
543
559
  } if (rf & 2) {
544
560
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -548,13 +564,13 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_36_Template(
548
564
  i0.ɵɵconditional(ctx_r1.record.Result && ctx_r1.record.Result.trim() !== "" ? 2 : !ctx_r1.record.ErrorMessage ? 3 : -1);
549
565
  } }
550
566
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_38_Template(rf, ctx) { if (rf & 1) {
551
- i0.ɵɵelementStart(0, "span", 53);
552
- i0.ɵɵelement(1, "i", 87);
567
+ i0.ɵɵelementStart(0, "span", 54);
568
+ i0.ɵɵelement(1, "i", 88);
553
569
  i0.ɵɵtext(2, " Token Usage & Metrics ");
554
570
  i0.ɵɵelementEnd();
555
571
  } }
556
572
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_9_Template(rf, ctx) { if (rf & 1) {
557
- i0.ɵɵelementStart(0, "div", 93)(1, "span");
573
+ i0.ɵɵelementStart(0, "div", 94)(1, "span");
558
574
  i0.ɵɵtext(2);
559
575
  i0.ɵɵelementEnd()();
560
576
  } if (rf & 2) {
@@ -563,7 +579,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Condition
563
579
  i0.ɵɵtextInterpolate1("Rollup: ", ctx_r1.formatTokens(ctx_r1.record.TokensPromptRollup), "");
564
580
  } }
565
581
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_17_Template(rf, ctx) { if (rf & 1) {
566
- i0.ɵɵelementStart(0, "div", 93)(1, "span");
582
+ i0.ɵɵelementStart(0, "div", 94)(1, "span");
567
583
  i0.ɵɵtext(2);
568
584
  i0.ɵɵelementEnd()();
569
585
  } if (rf & 2) {
@@ -572,7 +588,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Condition
572
588
  i0.ɵɵtextInterpolate1("Rollup: ", ctx_r1.formatTokens(ctx_r1.record.TokensCompletionRollup), "");
573
589
  } }
574
590
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_25_Template(rf, ctx) { if (rf & 1) {
575
- i0.ɵɵelementStart(0, "div", 93)(1, "span");
591
+ i0.ɵɵelementStart(0, "div", 94)(1, "span");
576
592
  i0.ɵɵtext(2);
577
593
  i0.ɵɵelementEnd()();
578
594
  } if (rf & 2) {
@@ -581,7 +597,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Condition
581
597
  i0.ɵɵtextInterpolate1("Rollup: ", ctx_r1.formatTokens(ctx_r1.record.TokensUsedRollup), "");
582
598
  } }
583
599
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_33_Template(rf, ctx) { if (rf & 1) {
584
- i0.ɵɵelementStart(0, "div", 93)(1, "span");
600
+ i0.ɵɵelementStart(0, "div", 94)(1, "span");
585
601
  i0.ɵɵtext(2);
586
602
  i0.ɵɵelementEnd()();
587
603
  } if (rf & 2) {
@@ -590,7 +606,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Condition
590
606
  i0.ɵɵtextInterpolate1("Total: ", ctx_r1.formatCost(ctx_r1.record.TotalCost), "");
591
607
  } }
592
608
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_34_Template(rf, ctx) { if (rf & 1) {
593
- i0.ɵɵelementStart(0, "div", 95);
609
+ i0.ɵɵelementStart(0, "div", 96);
594
610
  i0.ɵɵtext(1);
595
611
  i0.ɵɵelementEnd();
596
612
  } if (rf & 2) {
@@ -599,12 +615,12 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Condition
599
615
  i0.ɵɵtextInterpolate(ctx_r1.record.CostCurrency);
600
616
  } }
601
617
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_35_Template(rf, ctx) { if (rf & 1) {
602
- i0.ɵɵelementStart(0, "div", 89)(1, "div", 90);
603
- i0.ɵɵelement(2, "i", 98);
618
+ i0.ɵɵelementStart(0, "div", 90)(1, "div", 91);
619
+ i0.ɵɵelement(2, "i", 99);
604
620
  i0.ɵɵelementStart(3, "h4");
605
621
  i0.ɵɵtext(4, "Queue Time");
606
622
  i0.ɵɵelementEnd()();
607
- i0.ɵɵelementStart(5, "div", 92);
623
+ i0.ɵɵelementStart(5, "div", 93);
608
624
  i0.ɵɵtext(6);
609
625
  i0.ɵɵelementEnd()();
610
626
  } if (rf & 2) {
@@ -613,12 +629,12 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Condition
613
629
  i0.ɵɵtextInterpolate(ctx_r1.formatDuration(ctx_r1.record.QueueTime));
614
630
  } }
615
631
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_36_Template(rf, ctx) { if (rf & 1) {
616
- i0.ɵɵelementStart(0, "div", 89)(1, "div", 90);
617
- i0.ɵɵelement(2, "i", 99);
632
+ i0.ɵɵelementStart(0, "div", 90)(1, "div", 91);
633
+ i0.ɵɵelement(2, "i", 100);
618
634
  i0.ɵɵelementStart(3, "h4");
619
635
  i0.ɵɵtext(4, "Prompt Time");
620
636
  i0.ɵɵelementEnd()();
621
- i0.ɵɵelementStart(5, "div", 92);
637
+ i0.ɵɵelementStart(5, "div", 93);
622
638
  i0.ɵɵtext(6);
623
639
  i0.ɵɵelementEnd()();
624
640
  } if (rf & 2) {
@@ -627,12 +643,12 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Condition
627
643
  i0.ɵɵtextInterpolate(ctx_r1.formatDuration(ctx_r1.record.PromptTime));
628
644
  } }
629
645
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_37_Template(rf, ctx) { if (rf & 1) {
630
- i0.ɵɵelementStart(0, "div", 89)(1, "div", 90);
631
- i0.ɵɵelement(2, "i", 100);
646
+ i0.ɵɵelementStart(0, "div", 90)(1, "div", 91);
647
+ i0.ɵɵelement(2, "i", 101);
632
648
  i0.ɵɵelementStart(3, "h4");
633
649
  i0.ɵɵtext(4, "Completion Time");
634
650
  i0.ɵɵelementEnd()();
635
- i0.ɵɵelementStart(5, "div", 92);
651
+ i0.ɵɵelementStart(5, "div", 93);
636
652
  i0.ɵɵtext(6);
637
653
  i0.ɵɵelementEnd()();
638
654
  } if (rf & 2) {
@@ -641,7 +657,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Condition
641
657
  i0.ɵɵtextInterpolate(ctx_r1.formatDuration(ctx_r1.record.CompletionTime));
642
658
  } }
643
659
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_39_Template(rf, ctx) { if (rf & 1) {
644
- i0.ɵɵelementStart(0, "div", 97)(1, "span", 42);
660
+ i0.ɵɵelementStart(0, "div", 98)(1, "span", 42);
645
661
  i0.ɵɵtext(2, "Execution Order:");
646
662
  i0.ɵɵelementEnd();
647
663
  i0.ɵɵelementStart(3, "span", 43);
@@ -654,13 +670,13 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Condition
654
670
  } }
655
671
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_40_Template(rf, ctx) { if (rf & 1) {
656
672
  const _r11 = i0.ɵɵgetCurrentView();
657
- i0.ɵɵelementStart(0, "div", 97)(1, "span", 42);
673
+ i0.ɵɵelementStart(0, "div", 98)(1, "span", 42);
658
674
  i0.ɵɵtext(2, "Agent:");
659
675
  i0.ɵɵelementEnd();
660
- i0.ɵɵelementStart(3, "span", 101);
676
+ i0.ɵɵelementStart(3, "span", 102);
661
677
  i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_40_Template_span_click_3_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.navigateToEntity("AI Agents", ctx_r1.record.AgentID)); });
662
678
  i0.ɵɵtext(4);
663
- i0.ɵɵelement(5, "i", 102);
679
+ i0.ɵɵelement(5, "i", 103);
664
680
  i0.ɵɵelementEnd()();
665
681
  } if (rf & 2) {
666
682
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -668,50 +684,50 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Condition
668
684
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Agent, " ");
669
685
  } }
670
686
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Template(rf, ctx) { if (rf & 1) {
671
- i0.ɵɵelementStart(0, "div", 55)(1, "div", 88)(2, "div", 89)(3, "div", 90);
672
- i0.ɵɵelement(4, "i", 91);
687
+ i0.ɵɵelementStart(0, "div", 56)(1, "div", 89)(2, "div", 90)(3, "div", 91);
688
+ i0.ɵɵelement(4, "i", 92);
673
689
  i0.ɵɵelementStart(5, "h4");
674
690
  i0.ɵɵtext(6, "Prompt Tokens");
675
691
  i0.ɵɵelementEnd()();
676
- i0.ɵɵelementStart(7, "div", 92);
692
+ i0.ɵɵelementStart(7, "div", 93);
677
693
  i0.ɵɵtext(8);
678
694
  i0.ɵɵelementEnd();
679
- i0.ɵɵtemplate(9, AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_9_Template, 3, 1, "div", 93);
695
+ i0.ɵɵtemplate(9, AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_9_Template, 3, 1, "div", 94);
680
696
  i0.ɵɵelementEnd();
681
- i0.ɵɵelementStart(10, "div", 89)(11, "div", 90);
682
- i0.ɵɵelement(12, "i", 94);
697
+ i0.ɵɵelementStart(10, "div", 90)(11, "div", 91);
698
+ i0.ɵɵelement(12, "i", 95);
683
699
  i0.ɵɵelementStart(13, "h4");
684
700
  i0.ɵɵtext(14, "Completion Tokens");
685
701
  i0.ɵɵelementEnd()();
686
- i0.ɵɵelementStart(15, "div", 92);
702
+ i0.ɵɵelementStart(15, "div", 93);
687
703
  i0.ɵɵtext(16);
688
704
  i0.ɵɵelementEnd();
689
- i0.ɵɵtemplate(17, AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_17_Template, 3, 1, "div", 93);
705
+ i0.ɵɵtemplate(17, AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_17_Template, 3, 1, "div", 94);
690
706
  i0.ɵɵelementEnd();
691
- i0.ɵɵelementStart(18, "div", 89)(19, "div", 90);
707
+ i0.ɵɵelementStart(18, "div", 90)(19, "div", 91);
692
708
  i0.ɵɵelement(20, "i", 46);
693
709
  i0.ɵɵelementStart(21, "h4");
694
710
  i0.ɵɵtext(22, "Total Tokens");
695
711
  i0.ɵɵelementEnd()();
696
- i0.ɵɵelementStart(23, "div", 92);
712
+ i0.ɵɵelementStart(23, "div", 93);
697
713
  i0.ɵɵtext(24);
698
714
  i0.ɵɵelementEnd();
699
- i0.ɵɵtemplate(25, AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_25_Template, 3, 1, "div", 93);
715
+ i0.ɵɵtemplate(25, AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_25_Template, 3, 1, "div", 94);
700
716
  i0.ɵɵelementEnd();
701
- i0.ɵɵelementStart(26, "div", 89)(27, "div", 90);
717
+ i0.ɵɵelementStart(26, "div", 90)(27, "div", 91);
702
718
  i0.ɵɵelement(28, "i", 47);
703
719
  i0.ɵɵelementStart(29, "h4");
704
720
  i0.ɵɵtext(30, "Cost");
705
721
  i0.ɵɵelementEnd()();
706
- i0.ɵɵelementStart(31, "div", 92);
722
+ i0.ɵɵelementStart(31, "div", 93);
707
723
  i0.ɵɵtext(32);
708
724
  i0.ɵɵelementEnd();
709
- i0.ɵɵtemplate(33, AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_33_Template, 3, 1, "div", 93)(34, AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_34_Template, 2, 1, "div", 95);
725
+ i0.ɵɵtemplate(33, AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_33_Template, 3, 1, "div", 94)(34, AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_34_Template, 2, 1, "div", 96);
710
726
  i0.ɵɵelementEnd();
711
- i0.ɵɵtemplate(35, AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_35_Template, 7, 1, "div", 89)(36, AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_36_Template, 7, 1, "div", 89)(37, AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_37_Template, 7, 1, "div", 89);
727
+ i0.ɵɵtemplate(35, AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_35_Template, 7, 1, "div", 90)(36, AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_36_Template, 7, 1, "div", 90)(37, AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_37_Template, 7, 1, "div", 90);
712
728
  i0.ɵɵelementEnd();
713
- i0.ɵɵelementStart(38, "div", 96);
714
- i0.ɵɵtemplate(39, AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_39_Template, 5, 1, "div", 97)(40, AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_40_Template, 6, 1, "div", 97);
729
+ i0.ɵɵelementStart(38, "div", 97);
730
+ i0.ɵɵtemplate(39, AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_39_Template, 5, 1, "div", 98)(40, AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Conditional_40_Template, 6, 1, "div", 98);
715
731
  i0.ɵɵelementEnd()();
716
732
  } if (rf & 2) {
717
733
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -745,7 +761,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_39_Template(
745
761
  i0.ɵɵconditional(ctx_r1.record.AgentID ? 40 : -1);
746
762
  } }
747
763
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
748
- i0.ɵɵelementStart(0, "span", 70);
764
+ i0.ɵɵelementStart(0, "span", 71);
749
765
  i0.ɵɵtext(1);
750
766
  i0.ɵɵelementEnd();
751
767
  } if (rf & 2) {
@@ -754,20 +770,20 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_templa
754
770
  i0.ɵɵtextInterpolate1("(", ctx_r1.record.ValidationAttemptCount, " attempts)");
755
771
  } }
756
772
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
757
- i0.ɵɵelementStart(0, "span", 104);
773
+ i0.ɵɵelementStart(0, "span", 105);
758
774
  i0.ɵɵtext(1, "Passed");
759
775
  i0.ɵɵelementEnd();
760
776
  } }
761
777
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
762
- i0.ɵɵelementStart(0, "span", 76);
778
+ i0.ɵɵelementStart(0, "span", 77);
763
779
  i0.ɵɵtext(1, "Failed");
764
780
  i0.ɵɵelementEnd();
765
781
  } }
766
782
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_1_Template(rf, ctx) { if (rf & 1) {
767
- i0.ɵɵelementStart(0, "span", 53);
768
- i0.ɵɵelement(1, "i", 103);
783
+ i0.ɵɵelementStart(0, "span", 54);
784
+ i0.ɵɵelement(1, "i", 104);
769
785
  i0.ɵɵtext(2, " Validation & Retries ");
770
- i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_1_Conditional_3_Template, 2, 1, "span", 70)(4, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_1_Conditional_4_Template, 2, 0, "span", 104)(5, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_1_Conditional_5_Template, 2, 0, "span", 76);
786
+ i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_1_Conditional_3_Template, 2, 1, "span", 71)(4, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_1_Conditional_4_Template, 2, 0, "span", 105)(5, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_1_Conditional_5_Template, 2, 0, "span", 77);
771
787
  i0.ɵɵelementEnd();
772
788
  } if (rf & 2) {
773
789
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -777,7 +793,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_templa
777
793
  i0.ɵɵconditional(ctx_r1.record.FinalValidationPassed ? 4 : ctx_r1.record.FinalValidationPassed === false ? 5 : -1);
778
794
  } }
779
795
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_29_Conditional_6_Template(rf, ctx) { if (rf & 1) {
780
- i0.ɵɵelementStart(0, "span", 115);
796
+ i0.ɵɵelementStart(0, "span", 116);
781
797
  i0.ɵɵtext(1);
782
798
  i0.ɵɵelementEnd();
783
799
  } if (rf & 2) {
@@ -786,14 +802,14 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_templa
786
802
  i0.ɵɵtextInterpolate1("", ctx_r1.record.ValidationErrorCount, " validation errors");
787
803
  } }
788
804
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_29_Template(rf, ctx) { if (rf & 1) {
789
- i0.ɵɵelementStart(0, "div", 110)(1, "h5");
790
- i0.ɵɵelement(2, "i", 78);
805
+ i0.ɵɵelementStart(0, "div", 111)(1, "h5");
806
+ i0.ɵɵelement(2, "i", 79);
791
807
  i0.ɵɵtext(3, " Final Validation Error");
792
808
  i0.ɵɵelementEnd();
793
809
  i0.ɵɵelementStart(4, "p");
794
810
  i0.ɵɵtext(5);
795
811
  i0.ɵɵelementEnd();
796
- i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_29_Conditional_6_Template, 2, 1, "span", 115);
812
+ i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_29_Conditional_6_Template, 2, 1, "span", 116);
797
813
  i0.ɵɵelementEnd();
798
814
  } if (rf & 2) {
799
815
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -803,8 +819,8 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_templa
803
819
  i0.ɵɵconditional(ctx_r1.record && ctx_r1.record.ValidationErrorCount && ctx_r1.record.ValidationErrorCount > 0 ? 6 : -1);
804
820
  } }
805
821
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_30_Template(rf, ctx) { if (rf & 1) {
806
- i0.ɵɵelementStart(0, "div", 111)(1, "h5");
807
- i0.ɵɵelement(2, "i", 116);
822
+ i0.ɵɵelementStart(0, "div", 112)(1, "h5");
823
+ i0.ɵɵelement(2, "i", 117);
808
824
  i0.ɵɵtext(3, " Most Common Error");
809
825
  i0.ɵɵelementEnd();
810
826
  i0.ɵɵelementStart(4, "p");
@@ -816,23 +832,23 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_templa
816
832
  i0.ɵɵtextInterpolate(ctx_r1.record.CommonValidationError);
817
833
  } }
818
834
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_31_Template(rf, ctx) { if (rf & 1) {
819
- i0.ɵɵelementStart(0, "div", 112)(1, "h4");
835
+ i0.ɵɵelementStart(0, "div", 113)(1, "h4");
820
836
  i0.ɵɵtext(2, "Retry Timeline");
821
837
  i0.ɵɵelementEnd();
822
- i0.ɵɵelementStart(3, "div", 117)(4, "div", 118);
838
+ i0.ɵɵelementStart(3, "div", 118)(4, "div", 119);
823
839
  i0.ɵɵelement(5, "i", 45);
824
840
  i0.ɵɵelementStart(6, "span");
825
841
  i0.ɵɵtext(7);
826
842
  i0.ɵɵpipe(8, "date");
827
843
  i0.ɵɵelementEnd()();
828
- i0.ɵɵelementStart(9, "div", 118);
829
- i0.ɵɵelement(10, "i", 100);
844
+ i0.ɵɵelementStart(9, "div", 119);
845
+ i0.ɵɵelement(10, "i", 101);
830
846
  i0.ɵɵelementStart(11, "span");
831
847
  i0.ɵɵtext(12);
832
848
  i0.ɵɵpipe(13, "date");
833
849
  i0.ɵɵelementEnd()();
834
- i0.ɵɵelementStart(14, "div", 118);
835
- i0.ɵɵelement(15, "i", 119);
850
+ i0.ɵɵelementStart(14, "div", 119);
851
+ i0.ɵɵelement(15, "i", 120);
836
852
  i0.ɵɵelementStart(16, "span");
837
853
  i0.ɵɵtext(17);
838
854
  i0.ɵɵelementEnd()()()();
@@ -846,7 +862,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_templa
846
862
  i0.ɵɵtextInterpolate1("Total Retry Duration: ", ctx_r1.formatDuration(ctx_r1.record.TotalRetryDurationMS), "");
847
863
  } }
848
864
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_32_For_5_Conditional_7_Conditional_2_Template(rf, ctx) { if (rf & 1) {
849
- i0.ɵɵelementStart(0, "span", 115);
865
+ i0.ɵɵelementStart(0, "span", 116);
850
866
  i0.ɵɵtext(1);
851
867
  i0.ɵɵelementEnd();
852
868
  } if (rf & 2) {
@@ -855,10 +871,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_templa
855
871
  i0.ɵɵtextInterpolate1("(", attempt_r13.validationErrorCount, " errors)");
856
872
  } }
857
873
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_32_For_5_Conditional_7_Template(rf, ctx) { if (rf & 1) {
858
- i0.ɵɵelementStart(0, "span", 127);
874
+ i0.ɵɵelementStart(0, "span", 128);
859
875
  i0.ɵɵtext(1);
860
876
  i0.ɵɵelementEnd();
861
- i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_32_For_5_Conditional_7_Conditional_2_Template, 2, 1, "span", 115);
877
+ i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_32_For_5_Conditional_7_Conditional_2_Template, 2, 1, "span", 116);
862
878
  } if (rf & 2) {
863
879
  const attempt_r13 = i0.ɵɵnextContext().$implicit;
864
880
  i0.ɵɵadvance();
@@ -867,7 +883,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_templa
867
883
  i0.ɵɵconditional(attempt_r13.validationErrorCount > 0 ? 2 : -1);
868
884
  } }
869
885
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_32_For_5_Conditional_8_Template(rf, ctx) { if (rf & 1) {
870
- i0.ɵɵelementStart(0, "span", 126);
886
+ i0.ɵɵelementStart(0, "span", 127);
871
887
  i0.ɵɵtext(1);
872
888
  i0.ɵɵelementEnd();
873
889
  } if (rf & 2) {
@@ -876,14 +892,14 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_templa
876
892
  i0.ɵɵtextInterpolate1("Output: ", attempt_r13.outputLength, " chars");
877
893
  } }
878
894
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_32_For_5_Template(rf, ctx) { if (rf & 1) {
879
- i0.ɵɵelementStart(0, "div", 122)(1, "div", 123);
895
+ i0.ɵɵelementStart(0, "div", 123)(1, "div", 124);
880
896
  i0.ɵɵelement(2, "i");
881
897
  i0.ɵɵtext(3);
882
898
  i0.ɵɵelementEnd();
883
- i0.ɵɵelementStart(4, "div", 124)(5, "span", 125);
899
+ i0.ɵɵelementStart(4, "div", 125)(5, "span", 126);
884
900
  i0.ɵɵtext(6);
885
901
  i0.ɵɵelementEnd();
886
- i0.ɵɵtemplate(7, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_32_For_5_Conditional_7_Template, 3, 2)(8, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_32_For_5_Conditional_8_Template, 2, 1, "span", 126);
902
+ i0.ɵɵtemplate(7, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_32_For_5_Conditional_7_Template, 3, 2)(8, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_32_For_5_Conditional_8_Template, 2, 1, "span", 127);
887
903
  i0.ɵɵelementEnd()();
888
904
  } if (rf & 2) {
889
905
  const attempt_r13 = ctx.$implicit;
@@ -900,11 +916,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_templa
900
916
  i0.ɵɵconditional(attempt_r13.outputLength ? 8 : -1);
901
917
  } }
902
918
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_32_Template(rf, ctx) { if (rf & 1) {
903
- i0.ɵɵelementStart(0, "div", 113)(1, "h4");
919
+ i0.ɵɵelementStart(0, "div", 114)(1, "h4");
904
920
  i0.ɵɵtext(2, "Validation Attempts");
905
921
  i0.ɵɵelementEnd();
906
- i0.ɵɵelementStart(3, "div", 120);
907
- i0.ɵɵrepeaterCreate(4, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_32_For_5_Template, 9, 10, "div", 121, _forTrack0);
922
+ i0.ɵɵelementStart(3, "div", 121);
923
+ i0.ɵɵrepeaterCreate(4, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_32_For_5_Template, 9, 10, "div", 122, _forTrack0);
908
924
  i0.ɵɵelementEnd()();
909
925
  } if (rf & 2) {
910
926
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -913,10 +929,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_templa
913
929
  } }
914
930
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_33_Template(rf, ctx) { if (rf & 1) {
915
931
  const _r14 = i0.ɵɵgetCurrentView();
916
- i0.ɵɵelementStart(0, "div", 114)(1, "h4");
932
+ i0.ɵɵelementStart(0, "div", 115)(1, "h4");
917
933
  i0.ɵɵtext(2, "Validation Summary Details");
918
934
  i0.ɵɵelementEnd();
919
- i0.ɵɵelementStart(3, "div", 128)(4, "mj-code-editor", 129);
935
+ i0.ɵɵelementStart(3, "div", 129)(4, "mj-code-editor", 130);
920
936
  i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_33_Template_mj_code_editor_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedValidationSummary, $event) || (ctx_r1.formattedValidationSummary = $event); return i0.ɵɵresetView($event); });
921
937
  i0.ɵɵelementEnd()()();
922
938
  } if (rf & 2) {
@@ -927,10 +943,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_templa
927
943
  } }
928
944
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_34_Template(rf, ctx) { if (rf & 1) {
929
945
  const _r15 = i0.ɵɵgetCurrentView();
930
- i0.ɵɵelementStart(0, "div", 114)(1, "h4");
946
+ i0.ɵɵelementStart(0, "div", 115)(1, "h4");
931
947
  i0.ɵɵtext(2, "Validation Attempts (Raw JSON)");
932
948
  i0.ɵɵelementEnd();
933
- i0.ɵɵelementStart(3, "div", 128)(4, "mj-code-editor", 130);
949
+ i0.ɵɵelementStart(3, "div", 129)(4, "mj-code-editor", 131);
934
950
  i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_34_Template_mj_code_editor_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedValidationAttempts, $event) || (ctx_r1.formattedValidationAttempts = $event); return i0.ɵɵresetView($event); });
935
951
  i0.ɵɵelementEnd()()();
936
952
  } if (rf & 2) {
@@ -940,40 +956,40 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_templa
940
956
  i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
941
957
  } }
942
958
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Template(rf, ctx) { if (rf & 1) {
943
- i0.ɵɵelementStart(0, "div", 55)(1, "div", 105)(2, "div", 106)(3, "h4");
959
+ i0.ɵɵelementStart(0, "div", 56)(1, "div", 106)(2, "div", 107)(3, "h4");
944
960
  i0.ɵɵtext(4, "Validation Summary");
945
961
  i0.ɵɵelementEnd();
946
- i0.ɵɵelementStart(5, "div", 107);
962
+ i0.ɵɵelementStart(5, "div", 108);
947
963
  i0.ɵɵelement(6, "i");
948
964
  i0.ɵɵtext(7);
949
965
  i0.ɵɵelementEnd()();
950
- i0.ɵɵelementStart(8, "div", 108)(9, "div", 109)(10, "div", 42);
966
+ i0.ɵɵelementStart(8, "div", 109)(9, "div", 110)(10, "div", 42);
951
967
  i0.ɵɵtext(11, "Total Attempts");
952
968
  i0.ɵɵelementEnd();
953
969
  i0.ɵɵelementStart(12, "div", 43);
954
970
  i0.ɵɵtext(13);
955
971
  i0.ɵɵelementEnd()();
956
- i0.ɵɵelementStart(14, "div", 109)(15, "div", 42);
972
+ i0.ɵɵelementStart(14, "div", 110)(15, "div", 42);
957
973
  i0.ɵɵtext(16, "Successful");
958
974
  i0.ɵɵelementEnd();
959
975
  i0.ɵɵelementStart(17, "div", 43);
960
976
  i0.ɵɵtext(18);
961
977
  i0.ɵɵelementEnd()();
962
- i0.ɵɵelementStart(19, "div", 109)(20, "div", 42);
978
+ i0.ɵɵelementStart(19, "div", 110)(20, "div", 42);
963
979
  i0.ɵɵtext(21, "Behavior");
964
980
  i0.ɵɵelementEnd();
965
981
  i0.ɵɵelementStart(22, "div", 43);
966
982
  i0.ɵɵtext(23);
967
983
  i0.ɵɵelementEnd()();
968
- i0.ɵɵelementStart(24, "div", 109)(25, "div", 42);
984
+ i0.ɵɵelementStart(24, "div", 110)(25, "div", 42);
969
985
  i0.ɵɵtext(26, "Retry Strategy");
970
986
  i0.ɵɵelementEnd();
971
987
  i0.ɵɵelementStart(27, "div", 43);
972
988
  i0.ɵɵtext(28);
973
989
  i0.ɵɵelementEnd()()();
974
- i0.ɵɵtemplate(29, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_29_Template, 7, 2, "div", 110)(30, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_30_Template, 6, 1, "div", 111);
990
+ i0.ɵɵtemplate(29, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_29_Template, 7, 2, "div", 111)(30, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_30_Template, 6, 1, "div", 112);
975
991
  i0.ɵɵelementEnd();
976
- i0.ɵɵtemplate(31, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_31_Template, 18, 9, "div", 112)(32, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_32_Template, 6, 0, "div", 113)(33, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_33_Template, 5, 4, "div", 114)(34, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_34_Template, 5, 4, "div", 114);
992
+ i0.ɵɵtemplate(31, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_31_Template, 18, 9, "div", 113)(32, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_32_Template, 6, 0, "div", 114)(33, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_33_Template, 5, 4, "div", 115)(34, AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_ng_template_2_Conditional_34_Template, 5, 4, "div", 115);
977
993
  i0.ɵɵelementEnd();
978
994
  } if (rf & 2) {
979
995
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -1015,7 +1031,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_40_Template(
1015
1031
  i0.ɵɵproperty("expanded", ctx_r1.validationExpanded);
1016
1032
  } }
1017
1033
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_template_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1018
- i0.ɵɵelementStart(0, "span", 70);
1034
+ i0.ɵɵelementStart(0, "span", 71);
1019
1035
  i0.ɵɵtext(1);
1020
1036
  i0.ɵɵelementEnd();
1021
1037
  } if (rf & 2) {
@@ -1024,10 +1040,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_templa
1024
1040
  i0.ɵɵtextInterpolate1("(", ctx_r1.childRuns.length, " children)");
1025
1041
  } }
1026
1042
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_template_1_Template(rf, ctx) { if (rf & 1) {
1027
- i0.ɵɵelementStart(0, "span", 53);
1028
- i0.ɵɵelement(1, "i", 131);
1043
+ i0.ɵɵelementStart(0, "span", 54);
1044
+ i0.ɵɵelement(1, "i", 132);
1029
1045
  i0.ɵɵtext(2, " Run Hierarchy ");
1030
- i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_template_1_Conditional_3_Template, 2, 1, "span", 70);
1046
+ i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_template_1_Conditional_3_Template, 2, 1, "span", 71);
1031
1047
  i0.ɵɵelementEnd();
1032
1048
  } if (rf & 2) {
1033
1049
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -1036,21 +1052,21 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_templa
1036
1052
  } }
1037
1053
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_template_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
1038
1054
  const _r16 = i0.ɵɵgetCurrentView();
1039
- i0.ɵɵelementStart(0, "div", 132)(1, "h4");
1055
+ i0.ɵɵelementStart(0, "div", 133)(1, "h4");
1040
1056
  i0.ɵɵelement(2, "i", 37);
1041
1057
  i0.ɵɵtext(3, " Parent Run");
1042
1058
  i0.ɵɵelementEnd();
1043
- i0.ɵɵelementStart(4, "div", 134);
1059
+ i0.ɵɵelementStart(4, "div", 135);
1044
1060
  i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_template_2_Conditional_1_Template_div_click_4_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.navigateToEntity("MJ: AI Prompt Runs", ctx_r1.parentRun.ID)); });
1045
- i0.ɵɵelementStart(5, "div", 135);
1061
+ i0.ɵɵelementStart(5, "div", 136);
1046
1062
  i0.ɵɵelement(6, "i");
1047
1063
  i0.ɵɵelementEnd();
1048
- i0.ɵɵelementStart(7, "div", 136)(8, "div", 137);
1064
+ i0.ɵɵelementStart(7, "div", 137)(8, "div", 138);
1049
1065
  i0.ɵɵtext(9);
1050
- i0.ɵɵelementStart(10, "span", 138);
1066
+ i0.ɵɵelementStart(10, "span", 139);
1051
1067
  i0.ɵɵtext(11);
1052
1068
  i0.ɵɵelementEnd()();
1053
- i0.ɵɵelementStart(12, "div", 139)(13, "span");
1069
+ i0.ɵɵelementStart(12, "div", 140)(13, "span");
1054
1070
  i0.ɵɵelement(14, "i", 45);
1055
1071
  i0.ɵɵtext(15);
1056
1072
  i0.ɵɵelementEnd();
@@ -1059,11 +1075,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_templa
1059
1075
  i0.ɵɵtext(18);
1060
1076
  i0.ɵɵelementEnd();
1061
1077
  i0.ɵɵelementStart(19, "span");
1062
- i0.ɵɵelement(20, "i", 52);
1078
+ i0.ɵɵelement(20, "i", 53);
1063
1079
  i0.ɵɵtext(21);
1064
1080
  i0.ɵɵpipe(22, "date");
1065
1081
  i0.ɵɵelementEnd()()();
1066
- i0.ɵɵelement(23, "i", 102);
1082
+ i0.ɵɵelement(23, "i", 103);
1067
1083
  i0.ɵɵelementEnd()();
1068
1084
  } if (rf & 2) {
1069
1085
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -1083,7 +1099,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_templa
1083
1099
  i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(22, 9, ctx_r1.parentRun.RunAt, "short"), "");
1084
1100
  } }
1085
1101
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_template_2_Conditional_2_For_6_Conditional_6_Template(rf, ctx) { if (rf & 1) {
1086
- i0.ɵɵelementStart(0, "span", 144);
1102
+ i0.ɵɵelementStart(0, "span", 145);
1087
1103
  i0.ɵɵtext(1);
1088
1104
  i0.ɵɵelementEnd();
1089
1105
  } if (rf & 2) {
@@ -1093,18 +1109,18 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_templa
1093
1109
  } }
1094
1110
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_template_2_Conditional_2_For_6_Template(rf, ctx) { if (rf & 1) {
1095
1111
  const _r17 = i0.ɵɵgetCurrentView();
1096
- i0.ɵɵelementStart(0, "div", 143);
1112
+ i0.ɵɵelementStart(0, "div", 144);
1097
1113
  i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_template_2_Conditional_2_For_6_Template_div_click_0_listener() { const childRun_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.navigateToEntity("MJ: AI Prompt Runs", childRun_r18.ID)); });
1098
- i0.ɵɵelementStart(1, "div", 135);
1114
+ i0.ɵɵelementStart(1, "div", 136);
1099
1115
  i0.ɵɵelement(2, "i");
1100
1116
  i0.ɵɵelementEnd();
1101
- i0.ɵɵelementStart(3, "div", 136)(4, "div", 137);
1117
+ i0.ɵɵelementStart(3, "div", 137)(4, "div", 138);
1102
1118
  i0.ɵɵtext(5);
1103
- i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_template_2_Conditional_2_For_6_Conditional_6_Template, 2, 1, "span", 144);
1104
- i0.ɵɵelementStart(7, "span", 138);
1119
+ i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_template_2_Conditional_2_For_6_Conditional_6_Template, 2, 1, "span", 145);
1120
+ i0.ɵɵelementStart(7, "span", 139);
1105
1121
  i0.ɵɵtext(8);
1106
1122
  i0.ɵɵelementEnd()();
1107
- i0.ɵɵelementStart(9, "div", 139)(10, "span", 145);
1123
+ i0.ɵɵelementStart(9, "div", 140)(10, "span", 146);
1108
1124
  i0.ɵɵelement(11, "i");
1109
1125
  i0.ɵɵtext(12);
1110
1126
  i0.ɵɵelementEnd();
@@ -1116,7 +1132,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_templa
1116
1132
  i0.ɵɵelement(17, "i", 46);
1117
1133
  i0.ɵɵtext(18);
1118
1134
  i0.ɵɵelementEnd()()();
1119
- i0.ɵɵelement(19, "i", 102);
1135
+ i0.ɵɵelement(19, "i", 103);
1120
1136
  i0.ɵɵelementEnd();
1121
1137
  } if (rf & 2) {
1122
1138
  const childRun_r18 = ctx.$implicit;
@@ -1143,12 +1159,12 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_templa
1143
1159
  i0.ɵɵtextInterpolate1(" ", ctx_r1.formatTokens(childRun_r18.TokensUsed), "");
1144
1160
  } }
1145
1161
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_template_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
1146
- i0.ɵɵelementStart(0, "div", 133)(1, "h4");
1147
- i0.ɵɵelement(2, "i", 140);
1162
+ i0.ɵɵelementStart(0, "div", 134)(1, "h4");
1163
+ i0.ɵɵelement(2, "i", 141);
1148
1164
  i0.ɵɵtext(3, " Child Runs");
1149
1165
  i0.ɵɵelementEnd();
1150
- i0.ɵɵelementStart(4, "div", 141);
1151
- i0.ɵɵrepeaterCreate(5, AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_template_2_Conditional_2_For_6_Template, 20, 14, "div", 142, _forTrack1);
1166
+ i0.ɵɵelementStart(4, "div", 142);
1167
+ i0.ɵɵrepeaterCreate(5, AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_template_2_Conditional_2_For_6_Template, 20, 14, "div", 143, _forTrack1);
1152
1168
  i0.ɵɵelementEnd()();
1153
1169
  } if (rf & 2) {
1154
1170
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -1156,8 +1172,8 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_templa
1156
1172
  i0.ɵɵrepeater(ctx_r1.childRuns);
1157
1173
  } }
1158
1174
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_template_2_Template(rf, ctx) { if (rf & 1) {
1159
- i0.ɵɵelementStart(0, "div", 55);
1160
- i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_template_2_Conditional_1_Template, 24, 12, "div", 132)(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_template_2_Conditional_2_Template, 7, 0, "div", 133);
1175
+ i0.ɵɵelementStart(0, "div", 56);
1176
+ i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_template_2_Conditional_1_Template, 24, 12, "div", 133)(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_ng_template_2_Conditional_2_Template, 7, 0, "div", 134);
1161
1177
  i0.ɵɵelementEnd();
1162
1178
  } if (rf & 2) {
1163
1179
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -1175,21 +1191,21 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_41_Template(
1175
1191
  i0.ɵɵproperty("expanded", ctx_r1.hierarchyExpanded);
1176
1192
  } }
1177
1193
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_43_Template(rf, ctx) { if (rf & 1) {
1178
- i0.ɵɵelementStart(0, "span", 53);
1179
- i0.ɵɵelement(1, "i", 146);
1194
+ i0.ɵɵelementStart(0, "span", 54);
1195
+ i0.ɵɵelement(1, "i", 147);
1180
1196
  i0.ɵɵtext(2, " Additional Details ");
1181
1197
  i0.ɵɵelementEnd();
1182
1198
  } }
1183
1199
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Conditional_2_Template(rf, ctx) { if (rf & 1) {
1184
1200
  const _r19 = i0.ɵɵgetCurrentView();
1185
- i0.ɵɵelementStart(0, "div", 148)(1, "label");
1201
+ i0.ɵɵelementStart(0, "div", 149)(1, "label");
1186
1202
  i0.ɵɵtext(2, "Agent");
1187
1203
  i0.ɵɵelementEnd();
1188
- i0.ɵɵelementStart(3, "div", 153);
1204
+ i0.ɵɵelementStart(3, "div", 154);
1189
1205
  i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Conditional_2_Template_div_click_3_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.navigateToEntity("AI Agents", ctx_r1.record.AgentID)); });
1190
- i0.ɵɵelement(4, "i", 154);
1206
+ i0.ɵɵelement(4, "i", 155);
1191
1207
  i0.ɵɵtext(5);
1192
- i0.ɵɵelement(6, "i", 102);
1208
+ i0.ɵɵelement(6, "i", 103);
1193
1209
  i0.ɵɵelementEnd()();
1194
1210
  } if (rf & 2) {
1195
1211
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -1197,10 +1213,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Condition
1197
1213
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Agent || "Unknown", " ");
1198
1214
  } }
1199
1215
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1200
- i0.ɵɵelementStart(0, "div", 148)(1, "label");
1216
+ i0.ɵɵelementStart(0, "div", 149)(1, "label");
1201
1217
  i0.ɵɵtext(2, "Run Type");
1202
1218
  i0.ɵɵelementEnd();
1203
- i0.ɵɵelementStart(3, "div", 149);
1219
+ i0.ɵɵelementStart(3, "div", 150);
1204
1220
  i0.ɵɵelement(4, "i");
1205
1221
  i0.ɵɵtext(5);
1206
1222
  i0.ɵɵelementEnd()();
@@ -1212,11 +1228,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Condition
1212
1228
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.RunType, " ");
1213
1229
  } }
1214
1230
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Conditional_4_Template(rf, ctx) { if (rf & 1) {
1215
- i0.ɵɵelementStart(0, "div", 148)(1, "label");
1231
+ i0.ɵɵelementStart(0, "div", 149)(1, "label");
1216
1232
  i0.ɵɵtext(2, "Response Format");
1217
1233
  i0.ɵɵelementEnd();
1218
- i0.ɵɵelementStart(3, "div", 149);
1219
- i0.ɵɵelement(4, "i", 51);
1234
+ i0.ɵɵelementStart(3, "div", 150);
1235
+ i0.ɵɵelement(4, "i", 52);
1220
1236
  i0.ɵɵtext(5);
1221
1237
  i0.ɵɵelementEnd()();
1222
1238
  } if (rf & 2) {
@@ -1225,10 +1241,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Condition
1225
1241
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.ResponseFormat, " ");
1226
1242
  } }
1227
1243
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Conditional_47_Template(rf, ctx) { if (rf & 1) {
1228
- i0.ɵɵelementStart(0, "div", 148)(1, "label");
1244
+ i0.ɵɵelementStart(0, "div", 149)(1, "label");
1229
1245
  i0.ɵɵtext(2, "Started At");
1230
1246
  i0.ɵɵelementEnd();
1231
- i0.ɵɵelementStart(3, "div", 149);
1247
+ i0.ɵɵelementStart(3, "div", 150);
1232
1248
  i0.ɵɵelement(4, "i", 45);
1233
1249
  i0.ɵɵtext(5);
1234
1250
  i0.ɵɵpipe(6, "date");
@@ -1239,11 +1255,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Condition
1239
1255
  i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(6, 1, ctx_r1.record.RunAt, "medium"), " ");
1240
1256
  } }
1241
1257
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Conditional_48_Template(rf, ctx) { if (rf & 1) {
1242
- i0.ɵɵelementStart(0, "div", 148)(1, "label");
1258
+ i0.ɵɵelementStart(0, "div", 149)(1, "label");
1243
1259
  i0.ɵɵtext(2, "Completed At");
1244
1260
  i0.ɵɵelementEnd();
1245
- i0.ɵɵelementStart(3, "div", 149);
1246
- i0.ɵɵelement(4, "i", 155);
1261
+ i0.ɵɵelementStart(3, "div", 150);
1262
+ i0.ɵɵelement(4, "i", 156);
1247
1263
  i0.ɵɵtext(5);
1248
1264
  i0.ɵɵpipe(6, "date");
1249
1265
  i0.ɵɵelementEnd()();
@@ -1253,58 +1269,58 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Condition
1253
1269
  i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(6, 1, ctx_r1.record.CompletedAt, "medium"), " ");
1254
1270
  } }
1255
1271
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Template(rf, ctx) { if (rf & 1) {
1256
- i0.ɵɵelementStart(0, "div", 55)(1, "div", 147);
1257
- i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Conditional_2_Template, 7, 1, "div", 148)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Conditional_3_Template, 6, 3, "div", 148)(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Conditional_4_Template, 6, 1, "div", 148);
1258
- i0.ɵɵelementStart(5, "div", 148)(6, "label");
1272
+ i0.ɵɵelementStart(0, "div", 56)(1, "div", 148);
1273
+ i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Conditional_2_Template, 7, 1, "div", 149)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Conditional_3_Template, 6, 3, "div", 149)(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Conditional_4_Template, 6, 1, "div", 149);
1274
+ i0.ɵɵelementStart(5, "div", 149)(6, "label");
1259
1275
  i0.ɵɵtext(7, "Temperature");
1260
1276
  i0.ɵɵelementEnd();
1261
- i0.ɵɵelementStart(8, "div", 149);
1277
+ i0.ɵɵelementStart(8, "div", 150);
1262
1278
  i0.ɵɵelement(9, "i", 48);
1263
1279
  i0.ɵɵtext(10);
1264
1280
  i0.ɵɵelementEnd()();
1265
- i0.ɵɵelementStart(11, "div", 148)(12, "label");
1281
+ i0.ɵɵelementStart(11, "div", 149)(12, "label");
1266
1282
  i0.ɵɵtext(13, "Top P");
1267
1283
  i0.ɵɵelementEnd();
1268
- i0.ɵɵelementStart(14, "div", 149);
1284
+ i0.ɵɵelementStart(14, "div", 150);
1269
1285
  i0.ɵɵelement(15, "i", 49);
1270
1286
  i0.ɵɵtext(16);
1271
1287
  i0.ɵɵelementEnd()();
1272
- i0.ɵɵelementStart(17, "div", 148)(18, "label");
1288
+ i0.ɵɵelementStart(17, "div", 149)(18, "label");
1273
1289
  i0.ɵɵtext(19, "Top K");
1274
1290
  i0.ɵɵelementEnd();
1275
- i0.ɵɵelementStart(20, "div", 149);
1291
+ i0.ɵɵelementStart(20, "div", 150);
1276
1292
  i0.ɵɵelement(21, "i", 50);
1277
1293
  i0.ɵɵtext(22);
1278
1294
  i0.ɵɵelementEnd()();
1279
- i0.ɵɵelementStart(23, "div", 148)(24, "label");
1295
+ i0.ɵɵelementStart(23, "div", 149)(24, "label");
1280
1296
  i0.ɵɵtext(25, "Min P");
1281
1297
  i0.ɵɵelementEnd();
1282
- i0.ɵɵelementStart(26, "div", 149);
1283
- i0.ɵɵelement(27, "i", 150);
1298
+ i0.ɵɵelementStart(26, "div", 150);
1299
+ i0.ɵɵelement(27, "i", 151);
1284
1300
  i0.ɵɵtext(28);
1285
1301
  i0.ɵɵelementEnd()();
1286
- i0.ɵɵelementStart(29, "div", 148)(30, "label");
1302
+ i0.ɵɵelementStart(29, "div", 149)(30, "label");
1287
1303
  i0.ɵɵtext(31, "Frequency Penalty");
1288
1304
  i0.ɵɵelementEnd();
1289
- i0.ɵɵelementStart(32, "div", 149);
1290
- i0.ɵɵelement(33, "i", 116);
1305
+ i0.ɵɵelementStart(32, "div", 150);
1306
+ i0.ɵɵelement(33, "i", 117);
1291
1307
  i0.ɵɵtext(34);
1292
1308
  i0.ɵɵelementEnd()();
1293
- i0.ɵɵelementStart(35, "div", 148)(36, "label");
1309
+ i0.ɵɵelementStart(35, "div", 149)(36, "label");
1294
1310
  i0.ɵɵtext(37, "Presence Penalty");
1295
1311
  i0.ɵɵelementEnd();
1296
- i0.ɵɵelementStart(38, "div", 149);
1297
- i0.ɵɵelement(39, "i", 151);
1312
+ i0.ɵɵelementStart(38, "div", 150);
1313
+ i0.ɵɵelement(39, "i", 152);
1298
1314
  i0.ɵɵtext(40);
1299
1315
  i0.ɵɵelementEnd()();
1300
- i0.ɵɵelementStart(41, "div", 148)(42, "label");
1316
+ i0.ɵɵelementStart(41, "div", 149)(42, "label");
1301
1317
  i0.ɵɵtext(43, "Seed");
1302
1318
  i0.ɵɵelementEnd();
1303
- i0.ɵɵelementStart(44, "div", 149);
1304
- i0.ɵɵelement(45, "i", 152);
1319
+ i0.ɵɵelementStart(44, "div", 150);
1320
+ i0.ɵɵelement(45, "i", 153);
1305
1321
  i0.ɵɵtext(46);
1306
1322
  i0.ɵɵelementEnd()();
1307
- i0.ɵɵtemplate(47, AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Conditional_47_Template, 7, 4, "div", 148)(48, AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Conditional_48_Template, 7, 4, "div", 148);
1323
+ i0.ɵɵtemplate(47, AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Conditional_47_Template, 7, 4, "div", 149)(48, AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Conditional_48_Template, 7, 4, "div", 149);
1308
1324
  i0.ɵɵelementEnd()();
1309
1325
  } if (rf & 2) {
1310
1326
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -1348,21 +1364,21 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_44_Template(
1348
1364
  i0.ɵɵconditional(ctx_r1.record.CompletedAt ? 48 : -1);
1349
1365
  } }
1350
1366
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_45_ng_template_1_Template(rf, ctx) { if (rf & 1) {
1351
- i0.ɵɵelementStart(0, "span", 53);
1367
+ i0.ɵɵelementStart(0, "span", 54);
1352
1368
  i0.ɵɵelement(1, "i", 34);
1353
1369
  i0.ɵɵtext(2, " Model Specific Response Details ");
1354
- i0.ɵɵelementStart(3, "span", 54);
1370
+ i0.ɵɵelementStart(3, "span", 55);
1355
1371
  i0.ɵɵtext(4, "JSON");
1356
1372
  i0.ɵɵelementEnd()();
1357
1373
  } }
1358
1374
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_45_ng_template_2_Template(rf, ctx) { if (rf & 1) {
1359
1375
  const _r21 = i0.ɵɵgetCurrentView();
1360
- i0.ɵɵelementStart(0, "div", 55)(1, "div", 63)(2, "div", 64)(3, "button", 65);
1376
+ i0.ɵɵelementStart(0, "div", 56)(1, "div", 64)(2, "div", 65)(3, "button", 66);
1361
1377
  i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_45_ng_template_2_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.copyToClipboard(ctx_r1.formattedModelSpecificResponseDetails, "Model Specific Response Details")); });
1362
- i0.ɵɵelement(4, "i", 66);
1378
+ i0.ɵɵelement(4, "i", 67);
1363
1379
  i0.ɵɵtext(5, " Copy ");
1364
1380
  i0.ɵɵelementEnd()();
1365
- i0.ɵɵelementStart(6, "mj-code-editor", 156);
1381
+ i0.ɵɵelementStart(6, "mj-code-editor", 157);
1366
1382
  i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_45_ng_template_2_Template_mj_code_editor_ngModelChange_6_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedModelSpecificResponseDetails, $event) || (ctx_r1.formattedModelSpecificResponseDetails = $event); return i0.ɵɵresetView($event); });
1367
1383
  i0.ɵɵelementEnd()()();
1368
1384
  } if (rf & 2) {
@@ -1382,20 +1398,20 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_45_Template(
1382
1398
  i0.ɵɵproperty("expanded", ctx_r1.modelSpecificExpanded);
1383
1399
  } }
1384
1400
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_47_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1385
- i0.ɵɵelementStart(0, "span", 104);
1401
+ i0.ɵɵelementStart(0, "span", 105);
1386
1402
  i0.ɵɵtext(1, "Cached");
1387
1403
  i0.ɵɵelementEnd();
1388
1404
  } }
1389
1405
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_47_Conditional_4_Template(rf, ctx) { if (rf & 1) {
1390
- i0.ɵɵelementStart(0, "span", 104);
1406
+ i0.ɵɵelementStart(0, "span", 105);
1391
1407
  i0.ɵɵtext(1, "Selected");
1392
1408
  i0.ɵɵelementEnd();
1393
1409
  } }
1394
1410
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_47_Template(rf, ctx) { if (rf & 1) {
1395
- i0.ɵɵelementStart(0, "span", 53);
1411
+ i0.ɵɵelementStart(0, "span", 54);
1396
1412
  i0.ɵɵelement(1, "i", 34);
1397
1413
  i0.ɵɵtext(2, " Model Selection & Performance ");
1398
- i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_47_Conditional_3_Template, 2, 0, "span", 104)(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_47_Conditional_4_Template, 2, 0, "span", 104);
1414
+ i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_47_Conditional_3_Template, 2, 0, "span", 105)(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_47_Conditional_4_Template, 2, 0, "span", 105);
1399
1415
  i0.ɵɵelementEnd();
1400
1416
  } if (rf & 2) {
1401
1417
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -1405,11 +1421,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_47_Template(
1405
1421
  i0.ɵɵconditional(ctx_r1.record.WasSelectedResult ? 4 : -1);
1406
1422
  } }
1407
1423
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_26_Template(rf, ctx) { if (rf & 1) {
1408
- i0.ɵɵelementStart(0, "div", 159)(1, "label");
1424
+ i0.ɵɵelementStart(0, "div", 160)(1, "label");
1409
1425
  i0.ɵɵtext(2, "Cache Key");
1410
1426
  i0.ɵɵelementEnd();
1411
- i0.ɵɵelementStart(3, "div", 149);
1412
- i0.ɵɵelement(4, "i", 162);
1427
+ i0.ɵɵelementStart(3, "div", 150);
1428
+ i0.ɵɵelement(4, "i", 163);
1413
1429
  i0.ɵɵelementStart(5, "code");
1414
1430
  i0.ɵɵtext(6);
1415
1431
  i0.ɵɵelementEnd()()();
@@ -1420,14 +1436,14 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Condition
1420
1436
  } }
1421
1437
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_27_Template(rf, ctx) { if (rf & 1) {
1422
1438
  const _r22 = i0.ɵɵgetCurrentView();
1423
- i0.ɵɵelementStart(0, "div", 148)(1, "label");
1439
+ i0.ɵɵelementStart(0, "div", 149)(1, "label");
1424
1440
  i0.ɵɵtext(2, "Judge Prompt");
1425
1441
  i0.ɵɵelementEnd();
1426
- i0.ɵɵelementStart(3, "div", 163);
1442
+ i0.ɵɵelementStart(3, "div", 164);
1427
1443
  i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_27_Template_div_click_3_listener() { i0.ɵɵrestoreView(_r22); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.navigateToEntity("AI Prompts", ctx_r1.record.JudgeID)); });
1428
- i0.ɵɵelement(4, "i", 164);
1444
+ i0.ɵɵelement(4, "i", 165);
1429
1445
  i0.ɵɵtext(5);
1430
- i0.ɵɵelement(6, "i", 102);
1446
+ i0.ɵɵelement(6, "i", 103);
1431
1447
  i0.ɵɵelementEnd()();
1432
1448
  } if (rf & 2) {
1433
1449
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -1435,11 +1451,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Condition
1435
1451
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Judge || "Unknown", " ");
1436
1452
  } }
1437
1453
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_28_Template(rf, ctx) { if (rf & 1) {
1438
- i0.ɵɵelementStart(0, "div", 148)(1, "label");
1454
+ i0.ɵɵelementStart(0, "div", 149)(1, "label");
1439
1455
  i0.ɵɵtext(2, "Judge Score");
1440
1456
  i0.ɵɵelementEnd();
1441
- i0.ɵɵelementStart(3, "div", 149);
1442
- i0.ɵɵelement(4, "i", 165);
1457
+ i0.ɵɵelementStart(3, "div", 150);
1458
+ i0.ɵɵelement(4, "i", 166);
1443
1459
  i0.ɵɵtext(5);
1444
1460
  i0.ɵɵelementEnd()();
1445
1461
  } if (rf & 2) {
@@ -1448,11 +1464,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Condition
1448
1464
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.JudgeScore, " ");
1449
1465
  } }
1450
1466
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_41_Template(rf, ctx) { if (rf & 1) {
1451
- i0.ɵɵelementStart(0, "div", 148)(1, "label");
1467
+ i0.ɵɵelementStart(0, "div", 149)(1, "label");
1452
1468
  i0.ɵɵtext(2, "First Token Time");
1453
1469
  i0.ɵɵelementEnd();
1454
- i0.ɵɵelementStart(3, "div", 149);
1455
- i0.ɵɵelement(4, "i", 166);
1470
+ i0.ɵɵelementStart(3, "div", 150);
1471
+ i0.ɵɵelement(4, "i", 167);
1456
1472
  i0.ɵɵtext(5);
1457
1473
  i0.ɵɵelementEnd()();
1458
1474
  } if (rf & 2) {
@@ -1461,11 +1477,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Condition
1461
1477
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.FirstTokenTime, " ms ");
1462
1478
  } }
1463
1479
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_42_Conditional_6_Template(rf, ctx) { if (rf & 1) {
1464
- i0.ɵɵelementStart(0, "div", 159)(1, "label");
1480
+ i0.ɵɵelementStart(0, "div", 160)(1, "label");
1465
1481
  i0.ɵɵtext(2, "Cancellation Reason");
1466
1482
  i0.ɵɵelementEnd();
1467
- i0.ɵɵelementStart(3, "div", 149);
1468
- i0.ɵɵelement(4, "i", 169);
1483
+ i0.ɵɵelementStart(3, "div", 150);
1484
+ i0.ɵɵelement(4, "i", 170);
1469
1485
  i0.ɵɵtext(5);
1470
1486
  i0.ɵɵelementEnd()();
1471
1487
  } if (rf & 2) {
@@ -1474,14 +1490,14 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Condition
1474
1490
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.CancellationReason, " ");
1475
1491
  } }
1476
1492
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_42_Template(rf, ctx) { if (rf & 1) {
1477
- i0.ɵɵelementStart(0, "div", 148)(1, "label");
1493
+ i0.ɵɵelementStart(0, "div", 149)(1, "label");
1478
1494
  i0.ɵɵtext(2, "Cancelled");
1479
1495
  i0.ɵɵelementEnd();
1480
- i0.ɵɵelementStart(3, "div", 167);
1481
- i0.ɵɵelement(4, "i", 168);
1496
+ i0.ɵɵelementStart(3, "div", 168);
1497
+ i0.ɵɵelement(4, "i", 169);
1482
1498
  i0.ɵɵtext(5, " Yes ");
1483
1499
  i0.ɵɵelementEnd()();
1484
- i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_42_Conditional_6_Template, 6, 1, "div", 159);
1500
+ i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_42_Conditional_6_Template, 6, 1, "div", 160);
1485
1501
  } if (rf & 2) {
1486
1502
  const ctx_r1 = i0.ɵɵnextContext(3);
1487
1503
  i0.ɵɵadvance(6);
@@ -1489,10 +1505,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Condition
1489
1505
  } }
1490
1506
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_43_Template(rf, ctx) { if (rf & 1) {
1491
1507
  const _r23 = i0.ɵɵgetCurrentView();
1492
- i0.ɵɵelementStart(0, "div", 160)(1, "h4");
1508
+ i0.ɵɵelementStart(0, "div", 161)(1, "h4");
1493
1509
  i0.ɵɵtext(2, "Model Selection Details");
1494
1510
  i0.ɵɵelementEnd();
1495
- i0.ɵɵelementStart(3, "div", 128)(4, "mj-code-editor", 170);
1511
+ i0.ɵɵelementStart(3, "div", 129)(4, "mj-code-editor", 171);
1496
1512
  i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_43_Template_mj_code_editor_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedModelSelection, $event) || (ctx_r1.formattedModelSelection = $event); return i0.ɵɵresetView($event); });
1497
1513
  i0.ɵɵelementEnd()()();
1498
1514
  } if (rf & 2) {
@@ -1503,10 +1519,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Condition
1503
1519
  } }
1504
1520
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_44_Template(rf, ctx) { if (rf & 1) {
1505
1521
  const _r24 = i0.ɵɵgetCurrentView();
1506
- i0.ɵɵelementStart(0, "div", 161)(1, "h4");
1522
+ i0.ɵɵelementStart(0, "div", 162)(1, "h4");
1507
1523
  i0.ɵɵtext(2, "Error Details");
1508
1524
  i0.ɵɵelementEnd();
1509
- i0.ɵɵelementStart(3, "div", 128)(4, "mj-code-editor", 171);
1525
+ i0.ɵɵelementStart(3, "div", 129)(4, "mj-code-editor", 172);
1510
1526
  i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_44_Template_mj_code_editor_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedErrorDetails, $event) || (ctx_r1.formattedErrorDetails = $event); return i0.ɵɵresetView($event); });
1511
1527
  i0.ɵɵelementEnd()()();
1512
1528
  } if (rf & 2) {
@@ -1516,52 +1532,52 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Condition
1516
1532
  i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
1517
1533
  } }
1518
1534
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Template(rf, ctx) { if (rf & 1) {
1519
- i0.ɵɵelementStart(0, "div", 55)(1, "div", 147)(2, "div", 148)(3, "label");
1535
+ i0.ɵɵelementStart(0, "div", 56)(1, "div", 148)(2, "div", 149)(3, "label");
1520
1536
  i0.ɵɵtext(4, "Status");
1521
1537
  i0.ɵɵelementEnd();
1522
- i0.ɵɵelementStart(5, "div", 149);
1523
- i0.ɵɵelement(6, "i", 146);
1538
+ i0.ɵɵelementStart(5, "div", 150);
1539
+ i0.ɵɵelement(6, "i", 147);
1524
1540
  i0.ɵɵtext(7);
1525
1541
  i0.ɵɵelementEnd()();
1526
- i0.ɵɵelementStart(8, "div", 148)(9, "label");
1542
+ i0.ɵɵelementStart(8, "div", 149)(9, "label");
1527
1543
  i0.ɵɵtext(10, "Selection Strategy");
1528
1544
  i0.ɵɵelementEnd();
1529
- i0.ɵɵelementStart(11, "div", 149);
1530
- i0.ɵɵelement(12, "i", 157);
1545
+ i0.ɵɵelementStart(11, "div", 150);
1546
+ i0.ɵɵelement(12, "i", 158);
1531
1547
  i0.ɵɵtext(13);
1532
1548
  i0.ɵɵelementEnd()();
1533
- i0.ɵɵelementStart(14, "div", 148)(15, "label");
1549
+ i0.ɵɵelementStart(14, "div", 149)(15, "label");
1534
1550
  i0.ɵɵtext(16, "Model Power Rank");
1535
1551
  i0.ɵɵelementEnd();
1536
- i0.ɵɵelementStart(17, "div", 149);
1537
- i0.ɵɵelement(18, "i", 158);
1552
+ i0.ɵɵelementStart(17, "div", 150);
1553
+ i0.ɵɵelement(18, "i", 159);
1538
1554
  i0.ɵɵtext(19);
1539
1555
  i0.ɵɵelementEnd()();
1540
- i0.ɵɵelementStart(20, "div", 148)(21, "label");
1556
+ i0.ɵɵelementStart(20, "div", 149)(21, "label");
1541
1557
  i0.ɵɵtext(22, "Cache Hit");
1542
1558
  i0.ɵɵelementEnd();
1543
- i0.ɵɵelementStart(23, "div", 149);
1559
+ i0.ɵɵelementStart(23, "div", 150);
1544
1560
  i0.ɵɵelement(24, "i");
1545
1561
  i0.ɵɵtext(25);
1546
1562
  i0.ɵɵelementEnd()();
1547
- i0.ɵɵtemplate(26, AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_26_Template, 7, 1, "div", 159)(27, AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_27_Template, 7, 1, "div", 148)(28, AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_28_Template, 6, 1, "div", 148);
1548
- i0.ɵɵelementStart(29, "div", 148)(30, "label");
1563
+ i0.ɵɵtemplate(26, AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_26_Template, 7, 1, "div", 160)(27, AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_27_Template, 7, 1, "div", 149)(28, AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_28_Template, 6, 1, "div", 149);
1564
+ i0.ɵɵelementStart(29, "div", 149)(30, "label");
1549
1565
  i0.ɵɵtext(31, "Was Selected Result");
1550
1566
  i0.ɵɵelementEnd();
1551
- i0.ɵɵelementStart(32, "div", 149);
1567
+ i0.ɵɵelementStart(32, "div", 150);
1552
1568
  i0.ɵɵelement(33, "i");
1553
1569
  i0.ɵɵtext(34);
1554
1570
  i0.ɵɵelementEnd()();
1555
- i0.ɵɵelementStart(35, "div", 148)(36, "label");
1571
+ i0.ɵɵelementStart(35, "div", 149)(36, "label");
1556
1572
  i0.ɵɵtext(37, "Streaming Enabled");
1557
1573
  i0.ɵɵelementEnd();
1558
- i0.ɵɵelementStart(38, "div", 149);
1574
+ i0.ɵɵelementStart(38, "div", 150);
1559
1575
  i0.ɵɵelement(39, "i");
1560
1576
  i0.ɵɵtext(40);
1561
1577
  i0.ɵɵelementEnd()();
1562
- i0.ɵɵtemplate(41, AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_41_Template, 6, 1, "div", 148)(42, AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_42_Template, 7, 1);
1578
+ i0.ɵɵtemplate(41, AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_41_Template, 6, 1, "div", 149)(42, AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_42_Template, 7, 1);
1563
1579
  i0.ɵɵelementEnd();
1564
- i0.ɵɵtemplate(43, AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_43_Template, 5, 4, "div", 160)(44, AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_44_Template, 5, 4, "div", 161);
1580
+ i0.ɵɵtemplate(43, AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_43_Template, 5, 4, "div", 161)(44, AIPromptRunFormComponentExtended_Conditional_1_ng_template_48_Conditional_44_Template, 5, 4, "div", 162);
1565
1581
  i0.ɵɵelementEnd();
1566
1582
  } if (rf & 2) {
1567
1583
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -1626,7 +1642,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Template(rf, ctx) { if (
1626
1642
  i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Template_button_click_25_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.refreshData()); });
1627
1643
  i0.ɵɵelement(26, "i", 22);
1628
1644
  i0.ɵɵelementEnd()()();
1629
- i0.ɵɵtemplate(27, AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Template, 36, 9)(28, AIPromptRunFormComponentExtended_Conditional_1_Conditional_28_Template, 23, 4, "div", 23);
1645
+ i0.ɵɵtemplate(27, AIPromptRunFormComponentExtended_Conditional_1_Conditional_27_Template, 37, 10)(28, AIPromptRunFormComponentExtended_Conditional_1_Conditional_28_Template, 23, 4, "div", 23);
1630
1646
  i0.ɵɵelementEnd();
1631
1647
  i0.ɵɵelementStart(29, "div", 24)(30, "kendo-panelbar", 25)(31, "kendo-panelbar-item", 26);
1632
1648
  i0.ɵɵlistener("stateChange", function AIPromptRunFormComponentExtended_Conditional_1_Template_kendo_panelbar_item_stateChange_31_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onInputPanelToggle($event)); });
@@ -2161,7 +2177,7 @@ let AIPromptRunFormComponentExtended = class AIPromptRunFormComponentExtended ex
2161
2177
  // Don't auto-expand validation panel anymore - let user expand when needed
2162
2178
  }
2163
2179
  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), i0.ɵɵdirectiveInject(i3.TestHarnessWindowService), i0.ɵɵdirectiveInject(i0.ViewContainerRef)); }; }
2164
- 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"], ["title", "View Original Run", 1, "original-run"], [1, "run-actions"], ["kendoButton", "", "fillMode", "outline", "size", "small", "title", "Re-run this prompt", 3, "click"], [1, "fa-solid", "fa-play-circle"], ["kendoButton", "", "fillMode", "outline", "size", "small", "title", "Refresh data", 3, "click"], [1, "fa-solid", "fa-refresh"], [1, "metrics-bar"], [1, "form-content"], [3, "keepItemContent"], [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-level-up-alt"], [1, "original-link", 3, "click"], [1, "metric-item"], [1, "fa-solid", "fa-cog"], [1, "metric-content"], [1, "metric-label"], [1, "metric-value"], ["href", "javascript:void(0)", 1, "config-link", 3, "click"], [1, "fa-solid", "fa-clock"], [1, "fa-solid", "fa-coins"], [1, "fa-solid", "fa-dollar-sign"], [1, "fa-solid", "fa-temperature-high"], [1, "fa-solid", "fa-percentage"], [1, "fa-solid", "fa-list-ol"], [1, "fa-solid", "fa-code"], [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-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, "error-info"], [1, "finish-reason"], [1, "error-details"], [1, "error-hint"], [2, "height", "200px", "width", "100%", 3, "ngModel", "disabled", "language", "lineWrapping"], [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, "fa-solid", "fa-hourglass-start"], [1, "fa-solid", "fa-brain"], [1, "fa-solid", "fa-flag-checkered"], [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-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, "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-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-check-circle"], ["name", "formattedModelSpecificResponseDetails", 2, "height", "400px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-strategy"], [1, "fa-solid", "fa-ranking-star"], [1, "detail-field", "full-width"], [1, "model-selection-json"], [1, "error-details-json"], [1, "fa-solid", "fa-key"], ["title", "View Judge Prompt", 1, "detail-value", "clickable", 3, "click"], [1, "fa-solid", "fa-gavel"], [1, "fa-solid", "fa-star"], [1, "fa-solid", "fa-bolt"], [1, "detail-value", "error"], [1, "fa-solid", "fa-ban"], [1, "fa-solid", "fa-exclamation-circle"], ["name", "formattedModelSelection", 2, "height", "300px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], ["name", "formattedErrorDetails", 2, "height", "200px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"]], template: function AIPromptRunFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
2180
+ 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"], ["title", "View Original Run", 1, "original-run"], [1, "run-actions"], ["kendoButton", "", "fillMode", "outline", "size", "small", "title", "Re-run this prompt", 3, "click"], [1, "fa-solid", "fa-play-circle"], ["kendoButton", "", "fillMode", "outline", "size", "small", "title", "Refresh data", 3, "click"], [1, "fa-solid", "fa-refresh"], [1, "metrics-bar"], [1, "form-content"], [3, "keepItemContent"], [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-level-up-alt"], [1, "original-link", 3, "click"], [1, "metric-item"], [1, "fa-solid", "fa-cog"], [1, "metric-content"], [1, "metric-label"], [1, "metric-value"], ["href", "javascript:void(0)", 1, "config-link", 3, "click"], [1, "fa-solid", "fa-clock"], [1, "fa-solid", "fa-coins"], [1, "fa-solid", "fa-dollar-sign"], [1, "fa-solid", "fa-temperature-high"], [1, "fa-solid", "fa-percentage"], [1, "fa-solid", "fa-list-ol"], [1, "fa-solid", "fa-tachometer-alt"], [1, "fa-solid", "fa-code"], [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-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, "error-info"], [1, "finish-reason"], [1, "error-details"], [1, "error-hint"], [2, "height", "200px", "width", "100%", 3, "ngModel", "disabled", "language", "lineWrapping"], [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, "fa-solid", "fa-hourglass-start"], [1, "fa-solid", "fa-brain"], [1, "fa-solid", "fa-flag-checkered"], [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-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, "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-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-check-circle"], ["name", "formattedModelSpecificResponseDetails", 2, "height", "400px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-strategy"], [1, "fa-solid", "fa-ranking-star"], [1, "detail-field", "full-width"], [1, "model-selection-json"], [1, "error-details-json"], [1, "fa-solid", "fa-key"], ["title", "View Judge Prompt", 1, "detail-value", "clickable", 3, "click"], [1, "fa-solid", "fa-gavel"], [1, "fa-solid", "fa-star"], [1, "fa-solid", "fa-bolt"], [1, "detail-value", "error"], [1, "fa-solid", "fa-ban"], [1, "fa-solid", "fa-exclamation-circle"], ["name", "formattedModelSelection", 2, "height", "300px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], ["name", "formattedErrorDetails", 2, "height", "200px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"]], template: function AIPromptRunFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
2165
2181
  i0.ɵɵelementStart(0, "div", 1);
2166
2182
  i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Template, 49, 28, "form", 2);
2167
2183
  i0.ɵɵelementEnd();
@@ -2176,7 +2192,7 @@ AIPromptRunFormComponentExtended = __decorate([
2176
2192
  export { AIPromptRunFormComponentExtended };
2177
2193
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AIPromptRunFormComponentExtended, [{
2178
2194
  type: Component,
2179
- args: [{ selector: 'mj-ai-prompt-run-form', changeDetection: ChangeDetectionStrategy.OnPush, 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 @if (record.RerunFromPromptRunID) {\n <span class=\"original-run\" title=\"View Original Run\">\n <i class=\"fa-solid fa-level-up-alt\"></i>\n <a (click)=\"navigateToOriginalRun()\" class=\"original-link\">Original Run</a>\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)=\"reRunPrompt()\" title=\"Re-run this prompt\">\n <i class=\"fa-solid fa-play-circle\"></i>\n Re-Run\n </button>\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 @if (record.ConfigurationID) {\n <!-- Configuration Bar -->\n <div class=\"metrics-bar\">\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-cog\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Configuration</div>\n <div class=\"metric-value\">\n <a href=\"javascript:void(0)\" class=\"config-link\" (click)=\"navigateToEntity('MJ: AI Configurations', record.ConfigurationID)\">\n {{ record.Configuration || 'Unknown' }}\n </a>\n </div>\n </div>\n </div>\n @if (record.Temperature !== null && record.Temperature !== undefined) {\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-temperature-high\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Temperature</div>\n <div class=\"metric-value\">{{ record.Temperature }}</div>\n </div>\n </div>\n }\n @if (record.TopP !== null && record.TopP !== undefined) {\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-percentage\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Top P</div>\n <div class=\"metric-value\">{{ record.TopP }}</div>\n </div>\n </div>\n }\n @if (record.TopK !== null && record.TopK !== undefined) {\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-list-ol\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Top K</div>\n <div class=\"metric-value\">{{ record.TopK }}</div>\n </div>\n </div>\n }\n @if (record.ResponseFormat) {\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-code\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Response Format</div>\n <div class=\"metric-value\">{{ record.ResponseFormat }}</div>\n </div>\n </div>\n }\n </div>\n \n <!-- Execution Metrics Bar (always show when configuration exists) -->\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 } @else {\n <!-- Execution Metrics Bar (original behavior when no configuration) -->\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 }\n </div>\n\n <!-- Main Content with Expansion Panels -->\n <div class=\"form-content\">\n <kendo-panelbar [keepItemContent]=\"true\">\n \n <!-- Input Panel with nested sub-panels -->\n <kendo-panelbar-item [expanded]=\"inputExpanded\" (stateChange)=\"onInputPanelToggle($event)\">\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\" (stateChange)=\"onResultPanelToggle($event)\">\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 @if (record.Status === 'Failed' || record.Success === false) {\n <div class=\"error-info\">\n @if (record.Status) {\n <p class=\"finish-reason\">\n <strong>Status:</strong> {{ record.Status }}\n </p>\n }\n @if (formattedErrorDetails) {\n <div class=\"error-details\">\n <h4>Error Details</h4>\n <mj-code-editor\n [ngModel]=\"formattedErrorDetails\"\n [disabled]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 200px; width: 100%;\">\n </mj-code-editor>\n </div>\n }\n @if (!formattedErrorDetails) {\n <p class=\"error-hint\">\n The prompt execution failed but no additional error information is available.\n </p>\n }\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Token Usage & Metrics Panel -->\n <kendo-panelbar-item [expanded]=\"metricsExpanded\" (stateChange)=\"onMetricsPanelToggle($event)\">\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 \n <!-- Timing Metrics -->\n @if (record.QueueTime != null) {\n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-hourglass-start\"></i>\n <h4>Queue Time</h4>\n </div>\n <div class=\"metric-value large\">{{ formatDuration(record.QueueTime) }}</div>\n </div>\n }\n \n @if (record.PromptTime != null) {\n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-brain\"></i>\n <h4>Prompt Time</h4>\n </div>\n <div class=\"metric-value large\">{{ formatDuration(record.PromptTime) }}</div>\n </div>\n }\n \n @if (record.CompletionTime != null) {\n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-flag-checkered\"></i>\n <h4>Completion Time</h4>\n </div>\n <div class=\"metric-value large\">{{ formatDuration(record.CompletionTime) }}</div>\n </div>\n }\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.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\" (stateChange)=\"onValidationPanelToggle($event)\">\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 \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 <!-- Model Specific Response Details Panel -->\n @if (record.ModelSpecificResponseDetails) {\n <kendo-panelbar-item [expanded]=\"modelSpecificExpanded\" (stateChange)=\"onModelSpecificPanelToggle($event)\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-microchip\"></i>\n Model Specific Response Details\n <span class=\"panel-badge\">JSON</span>\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"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(formattedModelSpecificResponseDetails, 'Model Specific Response Details')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedModelSpecificResponseDetails\"\n name=\"formattedModelSpecificResponseDetails\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n }\n \n <!-- Model Selection & Performance Panel (v2.78 fields) -->\n <kendo-panelbar-item [expanded]=\"false\" (stateChange)=\"onModelSelectionPanelToggle($event)\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-microchip\"></i>\n Model Selection & Performance\n @if (record.CacheHit) {\n <span class=\"panel-badge success\">Cached</span>\n }\n @if (record.WasSelectedResult) {\n <span class=\"panel-badge success\">Selected</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <div class=\"detail-fields-grid\">\n <!-- Model Selection Details -->\n <div class=\"detail-field\">\n <label>Status</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{ record.Status || 'Unknown' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Selection Strategy</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-strategy\"></i>\n {{ record.SelectionStrategy || '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Model Power Rank</label>\n <div class=\"detail-value\" [class.null-value]=\"record.ModelPowerRank === null\">\n <i class=\"fa-solid fa-ranking-star\"></i>\n {{ record.ModelPowerRank !== null ? record.ModelPowerRank : '\u2014' }}\n </div>\n </div>\n \n <!-- Cache Information -->\n <div class=\"detail-field\">\n <label>Cache Hit</label>\n <div class=\"detail-value\">\n <i [class]=\"record.CacheHit ? 'fa-solid fa-check-circle' : 'fa-solid fa-times-circle'\"></i>\n {{ record.CacheHit ? 'Yes' : 'No' }}\n </div>\n </div>\n \n @if (record.CacheKey) {\n <div class=\"detail-field full-width\">\n <label>Cache Key</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-key\"></i>\n <code>{{ record.CacheKey }}</code>\n </div>\n </div>\n }\n \n <!-- Judge Information -->\n @if (record.JudgeID) {\n <div class=\"detail-field\">\n <label>Judge Prompt</label>\n <div class=\"detail-value clickable\" (click)=\"navigateToEntity('AI Prompts', record.JudgeID)\" title=\"View Judge Prompt\">\n <i class=\"fa-solid fa-gavel\"></i>\n {{ record.Judge || 'Unknown' }}\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n </div>\n }\n \n @if (record.JudgeScore !== null) {\n <div class=\"detail-field\">\n <label>Judge Score</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-star\"></i>\n {{ record.JudgeScore }}\n </div>\n </div>\n }\n \n <div class=\"detail-field\">\n <label>Was Selected Result</label>\n <div class=\"detail-value\">\n <i [class]=\"record.WasSelectedResult ? 'fa-solid fa-trophy' : 'fa-solid fa-times'\"></i>\n {{ record.WasSelectedResult ? 'Yes' : 'No' }}\n </div>\n </div>\n \n <!-- Performance Metrics -->\n <div class=\"detail-field\">\n <label>Streaming Enabled</label>\n <div class=\"detail-value\">\n <i [class]=\"record.StreamingEnabled ? 'fa-solid fa-stream' : 'fa-solid fa-ban'\"></i>\n {{ record.StreamingEnabled ? 'Yes' : 'No' }}\n </div>\n </div>\n \n @if (record.FirstTokenTime !== null) {\n <div class=\"detail-field\">\n <label>First Token Time</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-bolt\"></i>\n {{ record.FirstTokenTime }} ms\n </div>\n </div>\n }\n \n @if (record.Cancelled) {\n <div class=\"detail-field\">\n <label>Cancelled</label>\n <div class=\"detail-value error\">\n <i class=\"fa-solid fa-ban\"></i>\n Yes\n </div>\n </div>\n \n @if (record.CancellationReason) {\n <div class=\"detail-field full-width\">\n <label>Cancellation Reason</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n {{ record.CancellationReason }}\n </div>\n </div>\n }\n }\n </div>\n \n <!-- Model Selection JSON -->\n @if (record.ModelSelection) {\n <div class=\"model-selection-json\">\n <h4>Model Selection Details</h4>\n <div class=\"json-viewer-container\">\n <mj-code-editor \n [(ngModel)]=\"formattedModelSelection\"\n name=\"formattedModelSelection\"\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 \n <!-- Error Details JSON -->\n @if (record.ErrorDetails) {\n <div class=\"error-details-json\">\n <h4>Error Details</h4>\n <div class=\"json-viewer-container\">\n <mj-code-editor \n [(ngModel)]=\"formattedErrorDetails\"\n name=\"formattedErrorDetails\"\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 </div>\n </ng-template>\n </kendo-panelbar-item>\n \n </kendo-panelbar>\n </div>\n </form>\n }\n</div>", styles: ["/* Error Info Styles */\n.error-info {\n margin-top: 16px;\n padding: 16px;\n background-color: #fef3f3;\n border: 1px solid #fecaca;\n border-radius: 8px;\n}\n\n.finish-reason {\n margin: 0 0 12px 0;\n color: #dc2626;\n font-size: 14px;\n}\n\n.error-details {\n margin-top: 12px;\n}\n\n.error-details h4 {\n margin: 0 0 8px 0;\n color: #991b1b;\n font-size: 14px;\n font-weight: 600;\n}\n\n.error-hint {\n margin: 0;\n color: #7f1d1d;\n font-size: 14px;\n font-style: italic;\n}\n\n/* 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.original-run {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #fff3cd;\n font-size: 0.85em;\n}\n\n.original-link {\n color: #ff6358;\n text-decoration: none;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.original-link:hover {\n color: #ff4444;\n text-decoration: underline;\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.config-link {\n color: #007bff;\n text-decoration: none;\n cursor: pointer;\n transition: color 0.2s;\n}\n\n.config-link:hover {\n color: #0056b3;\n text-decoration: underline;\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 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}"] }]
2195
+ args: [{ selector: 'mj-ai-prompt-run-form', changeDetection: ChangeDetectionStrategy.OnPush, 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 @if (record.RerunFromPromptRunID) {\n <span class=\"original-run\" title=\"View Original Run\">\n <i class=\"fa-solid fa-level-up-alt\"></i>\n <a (click)=\"navigateToOriginalRun()\" class=\"original-link\">Original Run</a>\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)=\"reRunPrompt()\" title=\"Re-run this prompt\">\n <i class=\"fa-solid fa-play-circle\"></i>\n Re-Run\n </button>\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 @if (record.ConfigurationID) {\n <!-- Configuration Bar -->\n <div class=\"metrics-bar\">\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-cog\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Configuration</div>\n <div class=\"metric-value\">\n <a href=\"javascript:void(0)\" class=\"config-link\" (click)=\"navigateToEntity('MJ: AI Configurations', record.ConfigurationID)\">\n {{ record.Configuration || 'Unknown' }}\n </a>\n </div>\n </div>\n </div>\n @if (record.Temperature !== null && record.Temperature !== undefined) {\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-temperature-high\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Temperature</div>\n <div class=\"metric-value\">{{ record.Temperature }}</div>\n </div>\n </div>\n }\n @if (record.TopP !== null && record.TopP !== undefined) {\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-percentage\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Top P</div>\n <div class=\"metric-value\">{{ record.TopP }}</div>\n </div>\n </div>\n }\n @if (record.TopK !== null && record.TopK !== undefined) {\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-list-ol\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Top K</div>\n <div class=\"metric-value\">{{ record.TopK }}</div>\n </div>\n </div>\n }\n @if (record.EffortLevel !== null && record.EffortLevel !== undefined) {\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-tachometer-alt\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Effort Level</div>\n <div class=\"metric-value\">{{ record.EffortLevel }}</div>\n </div>\n </div>\n }\n @if (record.ResponseFormat) {\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-code\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Response Format</div>\n <div class=\"metric-value\">{{ record.ResponseFormat }}</div>\n </div>\n </div>\n }\n </div>\n \n <!-- Execution Metrics Bar (always show when configuration exists) -->\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 } @else {\n <!-- Execution Metrics Bar (original behavior when no configuration) -->\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 }\n </div>\n\n <!-- Main Content with Expansion Panels -->\n <div class=\"form-content\">\n <kendo-panelbar [keepItemContent]=\"true\">\n \n <!-- Input Panel with nested sub-panels -->\n <kendo-panelbar-item [expanded]=\"inputExpanded\" (stateChange)=\"onInputPanelToggle($event)\">\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\" (stateChange)=\"onResultPanelToggle($event)\">\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 @if (record.Status === 'Failed' || record.Success === false) {\n <div class=\"error-info\">\n @if (record.Status) {\n <p class=\"finish-reason\">\n <strong>Status:</strong> {{ record.Status }}\n </p>\n }\n @if (formattedErrorDetails) {\n <div class=\"error-details\">\n <h4>Error Details</h4>\n <mj-code-editor\n [ngModel]=\"formattedErrorDetails\"\n [disabled]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 200px; width: 100%;\">\n </mj-code-editor>\n </div>\n }\n @if (!formattedErrorDetails) {\n <p class=\"error-hint\">\n The prompt execution failed but no additional error information is available.\n </p>\n }\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Token Usage & Metrics Panel -->\n <kendo-panelbar-item [expanded]=\"metricsExpanded\" (stateChange)=\"onMetricsPanelToggle($event)\">\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 \n <!-- Timing Metrics -->\n @if (record.QueueTime != null) {\n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-hourglass-start\"></i>\n <h4>Queue Time</h4>\n </div>\n <div class=\"metric-value large\">{{ formatDuration(record.QueueTime) }}</div>\n </div>\n }\n \n @if (record.PromptTime != null) {\n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-brain\"></i>\n <h4>Prompt Time</h4>\n </div>\n <div class=\"metric-value large\">{{ formatDuration(record.PromptTime) }}</div>\n </div>\n }\n \n @if (record.CompletionTime != null) {\n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-flag-checkered\"></i>\n <h4>Completion Time</h4>\n </div>\n <div class=\"metric-value large\">{{ formatDuration(record.CompletionTime) }}</div>\n </div>\n }\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.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\" (stateChange)=\"onValidationPanelToggle($event)\">\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 \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 <!-- Model Specific Response Details Panel -->\n @if (record.ModelSpecificResponseDetails) {\n <kendo-panelbar-item [expanded]=\"modelSpecificExpanded\" (stateChange)=\"onModelSpecificPanelToggle($event)\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-microchip\"></i>\n Model Specific Response Details\n <span class=\"panel-badge\">JSON</span>\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"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(formattedModelSpecificResponseDetails, 'Model Specific Response Details')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedModelSpecificResponseDetails\"\n name=\"formattedModelSpecificResponseDetails\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n }\n \n <!-- Model Selection & Performance Panel (v2.78 fields) -->\n <kendo-panelbar-item [expanded]=\"false\" (stateChange)=\"onModelSelectionPanelToggle($event)\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-microchip\"></i>\n Model Selection & Performance\n @if (record.CacheHit) {\n <span class=\"panel-badge success\">Cached</span>\n }\n @if (record.WasSelectedResult) {\n <span class=\"panel-badge success\">Selected</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <div class=\"detail-fields-grid\">\n <!-- Model Selection Details -->\n <div class=\"detail-field\">\n <label>Status</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{ record.Status || 'Unknown' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Selection Strategy</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-strategy\"></i>\n {{ record.SelectionStrategy || '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Model Power Rank</label>\n <div class=\"detail-value\" [class.null-value]=\"record.ModelPowerRank === null\">\n <i class=\"fa-solid fa-ranking-star\"></i>\n {{ record.ModelPowerRank !== null ? record.ModelPowerRank : '\u2014' }}\n </div>\n </div>\n \n <!-- Cache Information -->\n <div class=\"detail-field\">\n <label>Cache Hit</label>\n <div class=\"detail-value\">\n <i [class]=\"record.CacheHit ? 'fa-solid fa-check-circle' : 'fa-solid fa-times-circle'\"></i>\n {{ record.CacheHit ? 'Yes' : 'No' }}\n </div>\n </div>\n \n @if (record.CacheKey) {\n <div class=\"detail-field full-width\">\n <label>Cache Key</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-key\"></i>\n <code>{{ record.CacheKey }}</code>\n </div>\n </div>\n }\n \n <!-- Judge Information -->\n @if (record.JudgeID) {\n <div class=\"detail-field\">\n <label>Judge Prompt</label>\n <div class=\"detail-value clickable\" (click)=\"navigateToEntity('AI Prompts', record.JudgeID)\" title=\"View Judge Prompt\">\n <i class=\"fa-solid fa-gavel\"></i>\n {{ record.Judge || 'Unknown' }}\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n </div>\n }\n \n @if (record.JudgeScore !== null) {\n <div class=\"detail-field\">\n <label>Judge Score</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-star\"></i>\n {{ record.JudgeScore }}\n </div>\n </div>\n }\n \n <div class=\"detail-field\">\n <label>Was Selected Result</label>\n <div class=\"detail-value\">\n <i [class]=\"record.WasSelectedResult ? 'fa-solid fa-trophy' : 'fa-solid fa-times'\"></i>\n {{ record.WasSelectedResult ? 'Yes' : 'No' }}\n </div>\n </div>\n \n <!-- Performance Metrics -->\n <div class=\"detail-field\">\n <label>Streaming Enabled</label>\n <div class=\"detail-value\">\n <i [class]=\"record.StreamingEnabled ? 'fa-solid fa-stream' : 'fa-solid fa-ban'\"></i>\n {{ record.StreamingEnabled ? 'Yes' : 'No' }}\n </div>\n </div>\n \n @if (record.FirstTokenTime !== null) {\n <div class=\"detail-field\">\n <label>First Token Time</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-bolt\"></i>\n {{ record.FirstTokenTime }} ms\n </div>\n </div>\n }\n \n @if (record.Cancelled) {\n <div class=\"detail-field\">\n <label>Cancelled</label>\n <div class=\"detail-value error\">\n <i class=\"fa-solid fa-ban\"></i>\n Yes\n </div>\n </div>\n \n @if (record.CancellationReason) {\n <div class=\"detail-field full-width\">\n <label>Cancellation Reason</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n {{ record.CancellationReason }}\n </div>\n </div>\n }\n }\n </div>\n \n <!-- Model Selection JSON -->\n @if (record.ModelSelection) {\n <div class=\"model-selection-json\">\n <h4>Model Selection Details</h4>\n <div class=\"json-viewer-container\">\n <mj-code-editor \n [(ngModel)]=\"formattedModelSelection\"\n name=\"formattedModelSelection\"\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 \n <!-- Error Details JSON -->\n @if (record.ErrorDetails) {\n <div class=\"error-details-json\">\n <h4>Error Details</h4>\n <div class=\"json-viewer-container\">\n <mj-code-editor \n [(ngModel)]=\"formattedErrorDetails\"\n name=\"formattedErrorDetails\"\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 </div>\n </ng-template>\n </kendo-panelbar-item>\n \n </kendo-panelbar>\n </div>\n </form>\n }\n</div>", styles: ["/* Error Info Styles */\n.error-info {\n margin-top: 16px;\n padding: 16px;\n background-color: #fef3f3;\n border: 1px solid #fecaca;\n border-radius: 8px;\n}\n\n.finish-reason {\n margin: 0 0 12px 0;\n color: #dc2626;\n font-size: 14px;\n}\n\n.error-details {\n margin-top: 12px;\n}\n\n.error-details h4 {\n margin: 0 0 8px 0;\n color: #991b1b;\n font-size: 14px;\n font-weight: 600;\n}\n\n.error-hint {\n margin: 0;\n color: #7f1d1d;\n font-size: 14px;\n font-style: italic;\n}\n\n/* 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.original-run {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #fff3cd;\n font-size: 0.85em;\n}\n\n.original-link {\n color: #ff6358;\n text-decoration: none;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.original-link:hover {\n color: #ff4444;\n text-decoration: underline;\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.config-link {\n color: #007bff;\n text-decoration: none;\n cursor: pointer;\n transition: color 0.2s;\n}\n\n.config-link:hover {\n color: #0056b3;\n text-decoration: underline;\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 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}"] }]
2180
2196
  }], () => [{ type: i0.ElementRef }, { type: i1.SharedService }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i3.TestHarnessWindowService }, { type: i0.ViewContainerRef }], null); })();
2181
2197
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIPromptRunFormComponentExtended, { className: "AIPromptRunFormComponentExtended", filePath: "src/lib/custom/AIPromptRuns/ai-prompt-run-form.component.ts", lineNumber: 20 }); })();
2182
2198
  //# sourceMappingURL=ai-prompt-run-form.component.js.map