@memberjunction/ng-core-entity-forms 2.78.0 → 2.79.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 (42) hide show
  1. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +6 -2
  2. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
  3. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +542 -141
  4. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  5. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +19 -0
  6. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
  7. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +69 -17
  8. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
  9. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts +28 -0
  10. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
  11. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +81 -5
  12. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
  13. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +11 -3
  14. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
  15. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +76 -31
  16. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  17. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts +7 -1
  18. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts.map +1 -1
  19. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js +84 -18
  20. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js.map +1 -1
  21. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +5 -0
  22. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
  23. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +205 -60
  24. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  25. package/dist/lib/generated/Entities/AIAgentRun/aiagentrun.form.component.js +6 -6
  26. package/dist/lib/generated/Entities/AIAgentRun/aiagentrun.form.component.js.map +1 -1
  27. package/dist/lib/generated/Entities/AIAgentRun/sections/details.component.d.ts.map +1 -1
  28. package/dist/lib/generated/Entities/AIAgentRun/sections/details.component.js +82 -4
  29. package/dist/lib/generated/Entities/AIAgentRun/sections/details.component.js.map +1 -1
  30. package/dist/lib/generated/Entities/AIConfiguration/aiconfiguration.form.component.js +19 -9
  31. package/dist/lib/generated/Entities/AIConfiguration/aiconfiguration.form.component.js.map +1 -1
  32. package/dist/lib/generated/Entities/AIModel/aimodel.form.component.js +13 -3
  33. package/dist/lib/generated/Entities/AIModel/aimodel.form.component.js.map +1 -1
  34. package/dist/lib/generated/Entities/AIPrompt/aiprompt.form.component.js +6 -6
  35. package/dist/lib/generated/Entities/AIPromptRun/sections/details.component.d.ts.map +1 -1
  36. package/dist/lib/generated/Entities/AIPromptRun/sections/details.component.js +60 -4
  37. package/dist/lib/generated/Entities/AIPromptRun/sections/details.component.js.map +1 -1
  38. package/dist/lib/generated/Entities/AIVendor/aivendor.form.component.js +13 -3
  39. package/dist/lib/generated/Entities/AIVendor/aivendor.form.component.js.map +1 -1
  40. package/dist/lib/generated/Entities/User/user.form.component.js +6 -6
  41. package/dist/lib/generated/Entities/User/user.form.component.js.map +1 -1
  42. package/package.json +16 -16
@@ -4,7 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { Component } from '@angular/core';
7
+ import { Component, ChangeDetectionStrategy } from '@angular/core';
8
8
  import { RegisterClass } from '@memberjunction/global';
9
9
  import { BaseFormComponent } from '@memberjunction/ng-base-forms';
10
10
  import { Metadata, RunView, CompositeKey } from '@memberjunction/core';
@@ -314,16 +314,62 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Condition
314
314
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formattedResult);
315
315
  i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
316
316
  } }
317
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Conditional_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
318
+ i0.ɵɵelementStart(0, "p", 78)(1, "strong");
319
+ i0.ɵɵtext(2, "Status:");
320
+ i0.ɵɵelementEnd();
321
+ i0.ɵɵtext(3);
322
+ i0.ɵɵelementEnd();
323
+ } if (rf & 2) {
324
+ const ctx_r1 = i0.ɵɵnextContext(5);
325
+ i0.ɵɵadvance(3);
326
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Status, " ");
327
+ } }
328
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Conditional_4_Conditional_2_Template(rf, ctx) { if (rf & 1) {
329
+ i0.ɵɵelementStart(0, "div", 79)(1, "h4");
330
+ i0.ɵɵtext(2, "Error Details");
331
+ i0.ɵɵelementEnd();
332
+ i0.ɵɵelement(3, "mj-code-editor", 81);
333
+ i0.ɵɵelementEnd();
334
+ } if (rf & 2) {
335
+ const ctx_r1 = i0.ɵɵnextContext(5);
336
+ i0.ɵɵadvance(3);
337
+ i0.ɵɵproperty("ngModel", ctx_r1.formattedErrorDetails)("disabled", true)("language", "json")("lineWrapping", true);
338
+ } }
339
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Conditional_4_Conditional_3_Template(rf, ctx) { if (rf & 1) {
340
+ i0.ɵɵelementStart(0, "p", 80);
341
+ i0.ɵɵtext(1, " The prompt execution failed but no additional error information is available. ");
342
+ i0.ɵɵelementEnd();
343
+ } }
344
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Conditional_4_Template(rf, ctx) { if (rf & 1) {
345
+ i0.ɵɵelementStart(0, "div", 77);
346
+ i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Conditional_4_Conditional_1_Template, 4, 1, "p", 78)(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Conditional_4_Conditional_2_Template, 4, 4, "div", 79)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Conditional_4_Conditional_3_Template, 2, 0, "p", 80);
347
+ i0.ɵɵelementEnd();
348
+ } if (rf & 2) {
349
+ const ctx_r1 = i0.ɵɵnextContext(4);
350
+ i0.ɵɵadvance();
351
+ i0.ɵɵconditional(ctx_r1.record.Status ? 1 : -1);
352
+ i0.ɵɵadvance();
353
+ i0.ɵɵconditional(ctx_r1.formattedErrorDetails ? 2 : -1);
354
+ i0.ɵɵadvance();
355
+ i0.ɵɵconditional(!ctx_r1.formattedErrorDetails ? 3 : -1);
356
+ } }
317
357
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Template(rf, ctx) { if (rf & 1) {
318
358
  i0.ɵɵelementStart(0, "div", 51);
319
359
  i0.ɵɵelement(1, "i", 76);
320
360
  i0.ɵɵelementStart(2, "p");
321
361
  i0.ɵɵtext(3, "No result data recorded");
322
- i0.ɵɵelementEnd()();
362
+ i0.ɵɵelementEnd();
363
+ i0.ɵɵtemplate(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Conditional_4_Template, 4, 3, "div", 77);
364
+ i0.ɵɵelementEnd();
365
+ } if (rf & 2) {
366
+ const ctx_r1 = i0.ɵɵnextContext(3);
367
+ i0.ɵɵadvance(4);
368
+ i0.ɵɵconditional(ctx_r1.record.Status === "Failed" || ctx_r1.record.Success === false ? 4 : -1);
323
369
  } }
324
370
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Template(rf, ctx) { if (rf & 1) {
325
371
  i0.ɵɵelementStart(0, "div", 49);
326
- i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_1_Template, 7, 1, "div", 72)(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_2_Template, 6, 4, "div", 57)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Template, 4, 0, "div", 51);
372
+ i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_1_Template, 7, 1, "div", 72)(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_2_Template, 6, 4, "div", 57)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Template, 5, 1, "div", 51);
327
373
  i0.ɵɵelementEnd();
328
374
  } if (rf & 2) {
329
375
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -334,12 +380,12 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Template(
334
380
  } }
335
381
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_59_Template(rf, ctx) { if (rf & 1) {
336
382
  i0.ɵɵelementStart(0, "span", 47);
337
- i0.ɵɵelement(1, "i", 77);
383
+ i0.ɵɵelement(1, "i", 82);
338
384
  i0.ɵɵtext(2, " Token Usage & Metrics ");
339
385
  i0.ɵɵelementEnd();
340
386
  } }
341
387
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_9_Template(rf, ctx) { if (rf & 1) {
342
- i0.ɵɵelementStart(0, "div", 83)(1, "span");
388
+ i0.ɵɵelementStart(0, "div", 88)(1, "span");
343
389
  i0.ɵɵtext(2);
344
390
  i0.ɵɵelementEnd()();
345
391
  } if (rf & 2) {
@@ -348,7 +394,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Condition
348
394
  i0.ɵɵtextInterpolate1("Rollup: ", ctx_r1.formatTokens(ctx_r1.record.TokensPromptRollup), "");
349
395
  } }
350
396
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_17_Template(rf, ctx) { if (rf & 1) {
351
- i0.ɵɵelementStart(0, "div", 83)(1, "span");
397
+ i0.ɵɵelementStart(0, "div", 88)(1, "span");
352
398
  i0.ɵɵtext(2);
353
399
  i0.ɵɵelementEnd()();
354
400
  } if (rf & 2) {
@@ -357,7 +403,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Condition
357
403
  i0.ɵɵtextInterpolate1("Rollup: ", ctx_r1.formatTokens(ctx_r1.record.TokensCompletionRollup), "");
358
404
  } }
359
405
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_25_Template(rf, ctx) { if (rf & 1) {
360
- i0.ɵɵelementStart(0, "div", 83)(1, "span");
406
+ i0.ɵɵelementStart(0, "div", 88)(1, "span");
361
407
  i0.ɵɵtext(2);
362
408
  i0.ɵɵelementEnd()();
363
409
  } if (rf & 2) {
@@ -366,7 +412,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Condition
366
412
  i0.ɵɵtextInterpolate1("Rollup: ", ctx_r1.formatTokens(ctx_r1.record.TokensUsedRollup), "");
367
413
  } }
368
414
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_33_Template(rf, ctx) { if (rf & 1) {
369
- i0.ɵɵelementStart(0, "div", 83)(1, "span");
415
+ i0.ɵɵelementStart(0, "div", 88)(1, "span");
370
416
  i0.ɵɵtext(2);
371
417
  i0.ɵɵelementEnd()();
372
418
  } if (rf & 2) {
@@ -375,7 +421,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Condition
375
421
  i0.ɵɵtextInterpolate1("Total: ", ctx_r1.formatCost(ctx_r1.record.TotalCost), "");
376
422
  } }
377
423
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_34_Template(rf, ctx) { if (rf & 1) {
378
- i0.ɵɵelementStart(0, "div", 85);
424
+ i0.ɵɵelementStart(0, "div", 90);
379
425
  i0.ɵɵtext(1);
380
426
  i0.ɵɵelementEnd();
381
427
  } if (rf & 2) {
@@ -383,8 +429,50 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Condition
383
429
  i0.ɵɵadvance();
384
430
  i0.ɵɵtextInterpolate(ctx_r1.record.CostCurrency);
385
431
  } }
432
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_35_Template(rf, ctx) { if (rf & 1) {
433
+ i0.ɵɵelementStart(0, "div", 84)(1, "div", 85);
434
+ i0.ɵɵelement(2, "i", 93);
435
+ i0.ɵɵelementStart(3, "h4");
436
+ i0.ɵɵtext(4, "Queue Time");
437
+ i0.ɵɵelementEnd()();
438
+ i0.ɵɵelementStart(5, "div", 87);
439
+ i0.ɵɵtext(6);
440
+ i0.ɵɵelementEnd()();
441
+ } if (rf & 2) {
442
+ const ctx_r1 = i0.ɵɵnextContext(3);
443
+ i0.ɵɵadvance(6);
444
+ i0.ɵɵtextInterpolate(ctx_r1.formatDuration(ctx_r1.record.QueueTime));
445
+ } }
386
446
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_36_Template(rf, ctx) { if (rf & 1) {
387
- i0.ɵɵelementStart(0, "div", 87)(1, "span", 27);
447
+ i0.ɵɵelementStart(0, "div", 84)(1, "div", 85);
448
+ i0.ɵɵelement(2, "i", 94);
449
+ i0.ɵɵelementStart(3, "h4");
450
+ i0.ɵɵtext(4, "Prompt Time");
451
+ i0.ɵɵelementEnd()();
452
+ i0.ɵɵelementStart(5, "div", 87);
453
+ i0.ɵɵtext(6);
454
+ i0.ɵɵelementEnd()();
455
+ } if (rf & 2) {
456
+ const ctx_r1 = i0.ɵɵnextContext(3);
457
+ i0.ɵɵadvance(6);
458
+ i0.ɵɵtextInterpolate(ctx_r1.formatDuration(ctx_r1.record.PromptTime));
459
+ } }
460
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_37_Template(rf, ctx) { if (rf & 1) {
461
+ i0.ɵɵelementStart(0, "div", 84)(1, "div", 85);
462
+ i0.ɵɵelement(2, "i", 95);
463
+ i0.ɵɵelementStart(3, "h4");
464
+ i0.ɵɵtext(4, "Completion Time");
465
+ i0.ɵɵelementEnd()();
466
+ i0.ɵɵelementStart(5, "div", 87);
467
+ i0.ɵɵtext(6);
468
+ i0.ɵɵelementEnd()();
469
+ } if (rf & 2) {
470
+ const ctx_r1 = i0.ɵɵnextContext(3);
471
+ i0.ɵɵadvance(6);
472
+ i0.ɵɵtextInterpolate(ctx_r1.formatDuration(ctx_r1.record.CompletionTime));
473
+ } }
474
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_39_Template(rf, ctx) { if (rf & 1) {
475
+ i0.ɵɵelementStart(0, "div", 92)(1, "span", 27);
388
476
  i0.ɵɵtext(2, "Execution Order:");
389
477
  i0.ɵɵelementEnd();
390
478
  i0.ɵɵelementStart(3, "span", 28);
@@ -395,8 +483,8 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Condition
395
483
  i0.ɵɵadvance(4);
396
484
  i0.ɵɵtextInterpolate(ctx_r1.record.ExecutionOrder);
397
485
  } }
398
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_37_Template(rf, ctx) { if (rf & 1) {
399
- i0.ɵɵelementStart(0, "div", 87)(1, "span", 27);
486
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_40_Template(rf, ctx) { if (rf & 1) {
487
+ i0.ɵɵelementStart(0, "div", 92)(1, "span", 27);
400
488
  i0.ɵɵtext(2, "Configuration:");
401
489
  i0.ɵɵelementEnd();
402
490
  i0.ɵɵelementStart(3, "span", 28);
@@ -407,15 +495,15 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Condition
407
495
  i0.ɵɵadvance(4);
408
496
  i0.ɵɵtextInterpolate(ctx_r1.record.Configuration);
409
497
  } }
410
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_38_Template(rf, ctx) { if (rf & 1) {
498
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_41_Template(rf, ctx) { if (rf & 1) {
411
499
  const _r10 = i0.ɵɵgetCurrentView();
412
- i0.ɵɵelementStart(0, "div", 87)(1, "span", 27);
500
+ i0.ɵɵelementStart(0, "div", 92)(1, "span", 27);
413
501
  i0.ɵɵtext(2, "Agent:");
414
502
  i0.ɵɵelementEnd();
415
- i0.ɵɵelementStart(3, "span", 88);
416
- i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_38_Template_span_click_3_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.navigateToEntity("AI Agents", ctx_r1.record.AgentID)); });
503
+ i0.ɵɵelementStart(3, "span", 96);
504
+ i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_41_Template_span_click_3_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.navigateToEntity("AI Agents", ctx_r1.record.AgentID)); });
417
505
  i0.ɵɵtext(4);
418
- i0.ɵɵelement(5, "i", 89);
506
+ i0.ɵɵelement(5, "i", 97);
419
507
  i0.ɵɵelementEnd()();
420
508
  } if (rf & 2) {
421
509
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -423,48 +511,50 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Condition
423
511
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Agent, " ");
424
512
  } }
425
513
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Template(rf, ctx) { if (rf & 1) {
426
- i0.ɵɵelementStart(0, "div", 49)(1, "div", 78)(2, "div", 79)(3, "div", 80);
427
- i0.ɵɵelement(4, "i", 81);
514
+ i0.ɵɵelementStart(0, "div", 49)(1, "div", 83)(2, "div", 84)(3, "div", 85);
515
+ i0.ɵɵelement(4, "i", 86);
428
516
  i0.ɵɵelementStart(5, "h4");
429
517
  i0.ɵɵtext(6, "Prompt Tokens");
430
518
  i0.ɵɵelementEnd()();
431
- i0.ɵɵelementStart(7, "div", 82);
519
+ i0.ɵɵelementStart(7, "div", 87);
432
520
  i0.ɵɵtext(8);
433
521
  i0.ɵɵelementEnd();
434
- i0.ɵɵtemplate(9, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_9_Template, 3, 1, "div", 83);
522
+ i0.ɵɵtemplate(9, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_9_Template, 3, 1, "div", 88);
435
523
  i0.ɵɵelementEnd();
436
- i0.ɵɵelementStart(10, "div", 79)(11, "div", 80);
437
- i0.ɵɵelement(12, "i", 84);
524
+ i0.ɵɵelementStart(10, "div", 84)(11, "div", 85);
525
+ i0.ɵɵelement(12, "i", 89);
438
526
  i0.ɵɵelementStart(13, "h4");
439
527
  i0.ɵɵtext(14, "Completion Tokens");
440
528
  i0.ɵɵelementEnd()();
441
- i0.ɵɵelementStart(15, "div", 82);
529
+ i0.ɵɵelementStart(15, "div", 87);
442
530
  i0.ɵɵtext(16);
443
531
  i0.ɵɵelementEnd();
444
- i0.ɵɵtemplate(17, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_17_Template, 3, 1, "div", 83);
532
+ i0.ɵɵtemplate(17, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_17_Template, 3, 1, "div", 88);
445
533
  i0.ɵɵelementEnd();
446
- i0.ɵɵelementStart(18, "div", 79)(19, "div", 80);
534
+ i0.ɵɵelementStart(18, "div", 84)(19, "div", 85);
447
535
  i0.ɵɵelement(20, "i", 29);
448
536
  i0.ɵɵelementStart(21, "h4");
449
537
  i0.ɵɵtext(22, "Total Tokens");
450
538
  i0.ɵɵelementEnd()();
451
- i0.ɵɵelementStart(23, "div", 82);
539
+ i0.ɵɵelementStart(23, "div", 87);
452
540
  i0.ɵɵtext(24);
453
541
  i0.ɵɵelementEnd();
454
- i0.ɵɵtemplate(25, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_25_Template, 3, 1, "div", 83);
542
+ i0.ɵɵtemplate(25, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_25_Template, 3, 1, "div", 88);
455
543
  i0.ɵɵelementEnd();
456
- i0.ɵɵelementStart(26, "div", 79)(27, "div", 80);
544
+ i0.ɵɵelementStart(26, "div", 84)(27, "div", 85);
457
545
  i0.ɵɵelement(28, "i", 30);
458
546
  i0.ɵɵelementStart(29, "h4");
459
547
  i0.ɵɵtext(30, "Cost");
460
548
  i0.ɵɵelementEnd()();
461
- i0.ɵɵelementStart(31, "div", 82);
549
+ i0.ɵɵelementStart(31, "div", 87);
462
550
  i0.ɵɵtext(32);
463
551
  i0.ɵɵelementEnd();
464
- i0.ɵɵtemplate(33, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_33_Template, 3, 1, "div", 83)(34, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_34_Template, 2, 1, "div", 85);
465
- i0.ɵɵelementEnd()();
466
- i0.ɵɵelementStart(35, "div", 86);
467
- i0.ɵɵtemplate(36, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_36_Template, 5, 1, "div", 87)(37, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_37_Template, 5, 1, "div", 87)(38, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_38_Template, 6, 1, "div", 87);
552
+ i0.ɵɵtemplate(33, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_33_Template, 3, 1, "div", 88)(34, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_34_Template, 2, 1, "div", 90);
553
+ i0.ɵɵelementEnd();
554
+ i0.ɵɵtemplate(35, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_35_Template, 7, 1, "div", 84)(36, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_36_Template, 7, 1, "div", 84)(37, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_37_Template, 7, 1, "div", 84);
555
+ i0.ɵɵelementEnd();
556
+ i0.ɵɵelementStart(38, "div", 91);
557
+ i0.ɵɵtemplate(39, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_39_Template, 5, 1, "div", 92)(40, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_40_Template, 5, 1, "div", 92)(41, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_41_Template, 6, 1, "div", 92);
468
558
  i0.ɵɵelementEnd()();
469
559
  } if (rf & 2) {
470
560
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -486,12 +576,18 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Template(
486
576
  i0.ɵɵconditional(ctx_r1.record.TotalCost && ctx_r1.record.TotalCost !== ctx_r1.record.Cost ? 33 : -1);
487
577
  i0.ɵɵadvance();
488
578
  i0.ɵɵconditional(ctx_r1.record.CostCurrency ? 34 : -1);
579
+ i0.ɵɵadvance();
580
+ i0.ɵɵconditional(ctx_r1.record.QueueTime != null ? 35 : -1);
581
+ i0.ɵɵadvance();
582
+ i0.ɵɵconditional(ctx_r1.record.PromptTime != null ? 36 : -1);
583
+ i0.ɵɵadvance();
584
+ i0.ɵɵconditional(ctx_r1.record.CompletionTime != null ? 37 : -1);
489
585
  i0.ɵɵadvance(2);
490
- i0.ɵɵconditional(ctx_r1.record.ExecutionOrder !== null ? 36 : -1);
586
+ i0.ɵɵconditional(ctx_r1.record.ExecutionOrder !== null ? 39 : -1);
491
587
  i0.ɵɵadvance();
492
- i0.ɵɵconditional(ctx_r1.record.ConfigurationID ? 37 : -1);
588
+ i0.ɵɵconditional(ctx_r1.record.ConfigurationID ? 40 : -1);
493
589
  i0.ɵɵadvance();
494
- i0.ɵɵconditional(ctx_r1.record.AgentID ? 38 : -1);
590
+ i0.ɵɵconditional(ctx_r1.record.AgentID ? 41 : -1);
495
591
  } }
496
592
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
497
593
  i0.ɵɵelementStart(0, "span", 64);
@@ -503,7 +599,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
503
599
  i0.ɵɵtextInterpolate1("(", ctx_r1.record.ValidationAttemptCount, " attempts)");
504
600
  } }
505
601
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
506
- i0.ɵɵelementStart(0, "span", 91);
602
+ i0.ɵɵelementStart(0, "span", 99);
507
603
  i0.ɵɵtext(1, "Passed");
508
604
  i0.ɵɵelementEnd();
509
605
  } }
@@ -514,9 +610,9 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
514
610
  } }
515
611
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Template(rf, ctx) { if (rf & 1) {
516
612
  i0.ɵɵelementStart(0, "span", 47);
517
- i0.ɵɵelement(1, "i", 90);
613
+ i0.ɵɵelement(1, "i", 98);
518
614
  i0.ɵɵtext(2, " Validation & Retries ");
519
- i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Conditional_3_Template, 2, 1, "span", 64)(4, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Conditional_4_Template, 2, 0, "span", 91)(5, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Conditional_5_Template, 2, 0, "span", 71);
615
+ i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Conditional_3_Template, 2, 1, "span", 64)(4, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Conditional_4_Template, 2, 0, "span", 99)(5, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Conditional_5_Template, 2, 0, "span", 71);
520
616
  i0.ɵɵelementEnd();
521
617
  } if (rf & 2) {
522
618
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -526,7 +622,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
526
622
  i0.ɵɵconditional(ctx_r1.record.FinalValidationPassed ? 4 : ctx_r1.record.FinalValidationPassed === false ? 5 : -1);
527
623
  } }
528
624
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_29_Conditional_6_Template(rf, ctx) { if (rf & 1) {
529
- i0.ɵɵelementStart(0, "span", 102);
625
+ i0.ɵɵelementStart(0, "span", 110);
530
626
  i0.ɵɵtext(1);
531
627
  i0.ɵɵelementEnd();
532
628
  } if (rf & 2) {
@@ -535,14 +631,14 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
535
631
  i0.ɵɵtextInterpolate1("", ctx_r1.record.ValidationErrorCount, " validation errors");
536
632
  } }
537
633
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_29_Template(rf, ctx) { if (rf & 1) {
538
- i0.ɵɵelementStart(0, "div", 97)(1, "h5");
634
+ i0.ɵɵelementStart(0, "div", 105)(1, "h5");
539
635
  i0.ɵɵelement(2, "i", 73);
540
636
  i0.ɵɵtext(3, " Final Validation Error");
541
637
  i0.ɵɵelementEnd();
542
638
  i0.ɵɵelementStart(4, "p");
543
639
  i0.ɵɵtext(5);
544
640
  i0.ɵɵelementEnd();
545
- i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_29_Conditional_6_Template, 2, 1, "span", 102);
641
+ i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_29_Conditional_6_Template, 2, 1, "span", 110);
546
642
  i0.ɵɵelementEnd();
547
643
  } if (rf & 2) {
548
644
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -552,8 +648,8 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
552
648
  i0.ɵɵconditional(ctx_r1.record && ctx_r1.record.ValidationErrorCount && ctx_r1.record.ValidationErrorCount > 0 ? 6 : -1);
553
649
  } }
554
650
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_30_Template(rf, ctx) { if (rf & 1) {
555
- i0.ɵɵelementStart(0, "div", 98)(1, "h5");
556
- i0.ɵɵelement(2, "i", 103);
651
+ i0.ɵɵelementStart(0, "div", 106)(1, "h5");
652
+ i0.ɵɵelement(2, "i", 111);
557
653
  i0.ɵɵtext(3, " Most Common Error");
558
654
  i0.ɵɵelementEnd();
559
655
  i0.ɵɵelementStart(4, "p");
@@ -565,23 +661,23 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
565
661
  i0.ɵɵtextInterpolate(ctx_r1.record.CommonValidationError);
566
662
  } }
567
663
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_31_Template(rf, ctx) { if (rf & 1) {
568
- i0.ɵɵelementStart(0, "div", 99)(1, "h4");
664
+ i0.ɵɵelementStart(0, "div", 107)(1, "h4");
569
665
  i0.ɵɵtext(2, "Retry Timeline");
570
666
  i0.ɵɵelementEnd();
571
- i0.ɵɵelementStart(3, "div", 104)(4, "div", 105);
667
+ i0.ɵɵelementStart(3, "div", 112)(4, "div", 113);
572
668
  i0.ɵɵelement(5, "i", 25);
573
669
  i0.ɵɵelementStart(6, "span");
574
670
  i0.ɵɵtext(7);
575
671
  i0.ɵɵpipe(8, "date");
576
672
  i0.ɵɵelementEnd()();
577
- i0.ɵɵelementStart(9, "div", 105);
578
- i0.ɵɵelement(10, "i", 106);
673
+ i0.ɵɵelementStart(9, "div", 113);
674
+ i0.ɵɵelement(10, "i", 95);
579
675
  i0.ɵɵelementStart(11, "span");
580
676
  i0.ɵɵtext(12);
581
677
  i0.ɵɵpipe(13, "date");
582
678
  i0.ɵɵelementEnd()();
583
- i0.ɵɵelementStart(14, "div", 105);
584
- i0.ɵɵelement(15, "i", 107);
679
+ i0.ɵɵelementStart(14, "div", 113);
680
+ i0.ɵɵelement(15, "i", 114);
585
681
  i0.ɵɵelementStart(16, "span");
586
682
  i0.ɵɵtext(17);
587
683
  i0.ɵɵelementEnd()()()();
@@ -595,7 +691,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
595
691
  i0.ɵɵtextInterpolate1("Total Retry Duration: ", ctx_r1.formatDuration(ctx_r1.record.TotalRetryDurationMS), "");
596
692
  } }
597
693
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Conditional_7_Conditional_2_Template(rf, ctx) { if (rf & 1) {
598
- i0.ɵɵelementStart(0, "span", 102);
694
+ i0.ɵɵelementStart(0, "span", 110);
599
695
  i0.ɵɵtext(1);
600
696
  i0.ɵɵelementEnd();
601
697
  } if (rf & 2) {
@@ -604,10 +700,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
604
700
  i0.ɵɵtextInterpolate1("(", attempt_r11.validationErrorCount, " errors)");
605
701
  } }
606
702
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Conditional_7_Template(rf, ctx) { if (rf & 1) {
607
- i0.ɵɵelementStart(0, "span", 115);
703
+ i0.ɵɵelementStart(0, "span", 122);
608
704
  i0.ɵɵtext(1);
609
705
  i0.ɵɵelementEnd();
610
- i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Conditional_7_Conditional_2_Template, 2, 1, "span", 102);
706
+ i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Conditional_7_Conditional_2_Template, 2, 1, "span", 110);
611
707
  } if (rf & 2) {
612
708
  const attempt_r11 = i0.ɵɵnextContext().$implicit;
613
709
  i0.ɵɵadvance();
@@ -616,7 +712,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
616
712
  i0.ɵɵconditional(attempt_r11.validationErrorCount > 0 ? 2 : -1);
617
713
  } }
618
714
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Conditional_8_Template(rf, ctx) { if (rf & 1) {
619
- i0.ɵɵelementStart(0, "span", 114);
715
+ i0.ɵɵelementStart(0, "span", 121);
620
716
  i0.ɵɵtext(1);
621
717
  i0.ɵɵelementEnd();
622
718
  } if (rf & 2) {
@@ -625,14 +721,14 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
625
721
  i0.ɵɵtextInterpolate1("Output: ", attempt_r11.outputLength, " chars");
626
722
  } }
627
723
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Template(rf, ctx) { if (rf & 1) {
628
- i0.ɵɵelementStart(0, "div", 110)(1, "div", 111);
724
+ i0.ɵɵelementStart(0, "div", 117)(1, "div", 118);
629
725
  i0.ɵɵelement(2, "i");
630
726
  i0.ɵɵtext(3);
631
727
  i0.ɵɵelementEnd();
632
- i0.ɵɵelementStart(4, "div", 112)(5, "span", 113);
728
+ i0.ɵɵelementStart(4, "div", 119)(5, "span", 120);
633
729
  i0.ɵɵtext(6);
634
730
  i0.ɵɵelementEnd();
635
- i0.ɵɵtemplate(7, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Conditional_7_Template, 3, 2)(8, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Conditional_8_Template, 2, 1, "span", 114);
731
+ i0.ɵɵtemplate(7, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Conditional_7_Template, 3, 2)(8, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Conditional_8_Template, 2, 1, "span", 121);
636
732
  i0.ɵɵelementEnd()();
637
733
  } if (rf & 2) {
638
734
  const attempt_r11 = ctx.$implicit;
@@ -649,11 +745,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
649
745
  i0.ɵɵconditional(attempt_r11.outputLength ? 8 : -1);
650
746
  } }
651
747
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_Template(rf, ctx) { if (rf & 1) {
652
- i0.ɵɵelementStart(0, "div", 100)(1, "h4");
748
+ i0.ɵɵelementStart(0, "div", 108)(1, "h4");
653
749
  i0.ɵɵtext(2, "Validation Attempts");
654
750
  i0.ɵɵelementEnd();
655
- i0.ɵɵelementStart(3, "div", 108);
656
- i0.ɵɵrepeaterCreate(4, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Template, 9, 10, "div", 109, _forTrack0);
751
+ i0.ɵɵelementStart(3, "div", 115);
752
+ i0.ɵɵrepeaterCreate(4, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Template, 9, 10, "div", 116, _forTrack0);
657
753
  i0.ɵɵelementEnd()();
658
754
  } if (rf & 2) {
659
755
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -662,10 +758,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
662
758
  } }
663
759
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_33_Template(rf, ctx) { if (rf & 1) {
664
760
  const _r12 = i0.ɵɵgetCurrentView();
665
- i0.ɵɵelementStart(0, "div", 101)(1, "h4");
761
+ i0.ɵɵelementStart(0, "div", 109)(1, "h4");
666
762
  i0.ɵɵtext(2, "Validation Summary Details");
667
763
  i0.ɵɵelementEnd();
668
- i0.ɵɵelementStart(3, "div", 116)(4, "mj-code-editor", 117);
764
+ i0.ɵɵelementStart(3, "div", 123)(4, "mj-code-editor", 124);
669
765
  i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_33_Template_mj_code_editor_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedValidationSummary, $event) || (ctx_r1.formattedValidationSummary = $event); return i0.ɵɵresetView($event); });
670
766
  i0.ɵɵelementEnd()()();
671
767
  } if (rf & 2) {
@@ -676,10 +772,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
676
772
  } }
677
773
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_34_Template(rf, ctx) { if (rf & 1) {
678
774
  const _r13 = i0.ɵɵgetCurrentView();
679
- i0.ɵɵelementStart(0, "div", 101)(1, "h4");
775
+ i0.ɵɵelementStart(0, "div", 109)(1, "h4");
680
776
  i0.ɵɵtext(2, "Validation Attempts (Raw JSON)");
681
777
  i0.ɵɵelementEnd();
682
- i0.ɵɵelementStart(3, "div", 116)(4, "mj-code-editor", 118);
778
+ i0.ɵɵelementStart(3, "div", 123)(4, "mj-code-editor", 125);
683
779
  i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_34_Template_mj_code_editor_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedValidationAttempts, $event) || (ctx_r1.formattedValidationAttempts = $event); return i0.ɵɵresetView($event); });
684
780
  i0.ɵɵelementEnd()()();
685
781
  } if (rf & 2) {
@@ -689,40 +785,40 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
689
785
  i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
690
786
  } }
691
787
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Template(rf, ctx) { if (rf & 1) {
692
- i0.ɵɵelementStart(0, "div", 49)(1, "div", 92)(2, "div", 93)(3, "h4");
788
+ i0.ɵɵelementStart(0, "div", 49)(1, "div", 100)(2, "div", 101)(3, "h4");
693
789
  i0.ɵɵtext(4, "Validation Summary");
694
790
  i0.ɵɵelementEnd();
695
- i0.ɵɵelementStart(5, "div", 94);
791
+ i0.ɵɵelementStart(5, "div", 102);
696
792
  i0.ɵɵelement(6, "i");
697
793
  i0.ɵɵtext(7);
698
794
  i0.ɵɵelementEnd()();
699
- i0.ɵɵelementStart(8, "div", 95)(9, "div", 96)(10, "div", 27);
795
+ i0.ɵɵelementStart(8, "div", 103)(9, "div", 104)(10, "div", 27);
700
796
  i0.ɵɵtext(11, "Total Attempts");
701
797
  i0.ɵɵelementEnd();
702
798
  i0.ɵɵelementStart(12, "div", 28);
703
799
  i0.ɵɵtext(13);
704
800
  i0.ɵɵelementEnd()();
705
- i0.ɵɵelementStart(14, "div", 96)(15, "div", 27);
801
+ i0.ɵɵelementStart(14, "div", 104)(15, "div", 27);
706
802
  i0.ɵɵtext(16, "Successful");
707
803
  i0.ɵɵelementEnd();
708
804
  i0.ɵɵelementStart(17, "div", 28);
709
805
  i0.ɵɵtext(18);
710
806
  i0.ɵɵelementEnd()();
711
- i0.ɵɵelementStart(19, "div", 96)(20, "div", 27);
807
+ i0.ɵɵelementStart(19, "div", 104)(20, "div", 27);
712
808
  i0.ɵɵtext(21, "Behavior");
713
809
  i0.ɵɵelementEnd();
714
810
  i0.ɵɵelementStart(22, "div", 28);
715
811
  i0.ɵɵtext(23);
716
812
  i0.ɵɵelementEnd()();
717
- i0.ɵɵelementStart(24, "div", 96)(25, "div", 27);
813
+ i0.ɵɵelementStart(24, "div", 104)(25, "div", 27);
718
814
  i0.ɵɵtext(26, "Retry Strategy");
719
815
  i0.ɵɵelementEnd();
720
816
  i0.ɵɵelementStart(27, "div", 28);
721
817
  i0.ɵɵtext(28);
722
818
  i0.ɵɵelementEnd()()();
723
- i0.ɵɵtemplate(29, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_29_Template, 7, 2, "div", 97)(30, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_30_Template, 6, 1, "div", 98);
819
+ i0.ɵɵtemplate(29, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_29_Template, 7, 2, "div", 105)(30, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_30_Template, 6, 1, "div", 106);
724
820
  i0.ɵɵelementEnd();
725
- i0.ɵɵtemplate(31, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_31_Template, 18, 9, "div", 99)(32, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_Template, 6, 0, "div", 100)(33, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_33_Template, 5, 4, "div", 101)(34, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_34_Template, 5, 4, "div", 101);
821
+ i0.ɵɵtemplate(31, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_31_Template, 18, 9, "div", 107)(32, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_Template, 6, 0, "div", 108)(33, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_33_Template, 5, 4, "div", 109)(34, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_34_Template, 5, 4, "div", 109);
726
822
  i0.ɵɵelementEnd();
727
823
  } if (rf & 2) {
728
824
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -772,7 +868,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_templa
772
868
  } }
773
869
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_1_Template(rf, ctx) { if (rf & 1) {
774
870
  i0.ɵɵelementStart(0, "span", 47);
775
- i0.ɵɵelement(1, "i", 119);
871
+ i0.ɵɵelement(1, "i", 126);
776
872
  i0.ɵɵtext(2, " Run Hierarchy ");
777
873
  i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_1_Conditional_3_Template, 2, 1, "span", 64);
778
874
  i0.ɵɵelementEnd();
@@ -783,21 +879,21 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_templa
783
879
  } }
784
880
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
785
881
  const _r14 = i0.ɵɵgetCurrentView();
786
- i0.ɵɵelementStart(0, "div", 120)(1, "h4");
882
+ i0.ɵɵelementStart(0, "div", 127)(1, "h4");
787
883
  i0.ɵɵelement(2, "i", 44);
788
884
  i0.ɵɵtext(3, " Parent Run");
789
885
  i0.ɵɵelementEnd();
790
- i0.ɵɵelementStart(4, "div", 122);
886
+ i0.ɵɵelementStart(4, "div", 129);
791
887
  i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_1_Template_div_click_4_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.navigateToEntity("MJ: AI Prompt Runs", ctx_r1.parentRun.ID)); });
792
- i0.ɵɵelementStart(5, "div", 123);
888
+ i0.ɵɵelementStart(5, "div", 130);
793
889
  i0.ɵɵelement(6, "i");
794
890
  i0.ɵɵelementEnd();
795
- i0.ɵɵelementStart(7, "div", 124)(8, "div", 125);
891
+ i0.ɵɵelementStart(7, "div", 131)(8, "div", 132);
796
892
  i0.ɵɵtext(9);
797
- i0.ɵɵelementStart(10, "span", 126);
893
+ i0.ɵɵelementStart(10, "span", 133);
798
894
  i0.ɵɵtext(11);
799
895
  i0.ɵɵelementEnd()();
800
- i0.ɵɵelementStart(12, "div", 127)(13, "span");
896
+ i0.ɵɵelementStart(12, "div", 134)(13, "span");
801
897
  i0.ɵɵelement(14, "i", 25);
802
898
  i0.ɵɵtext(15);
803
899
  i0.ɵɵelementEnd();
@@ -810,7 +906,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_templa
810
906
  i0.ɵɵtext(21);
811
907
  i0.ɵɵpipe(22, "date");
812
908
  i0.ɵɵelementEnd()()();
813
- i0.ɵɵelement(23, "i", 89);
909
+ i0.ɵɵelement(23, "i", 97);
814
910
  i0.ɵɵelementEnd()();
815
911
  } if (rf & 2) {
816
912
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -830,7 +926,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_templa
830
926
  i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(22, 9, ctx_r1.parentRun.RunAt, "short"), "");
831
927
  } }
832
928
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_For_6_Conditional_6_Template(rf, ctx) { if (rf & 1) {
833
- i0.ɵɵelementStart(0, "span", 132);
929
+ i0.ɵɵelementStart(0, "span", 139);
834
930
  i0.ɵɵtext(1);
835
931
  i0.ɵɵelementEnd();
836
932
  } if (rf & 2) {
@@ -840,18 +936,18 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_templa
840
936
  } }
841
937
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_For_6_Template(rf, ctx) { if (rf & 1) {
842
938
  const _r15 = i0.ɵɵgetCurrentView();
843
- i0.ɵɵelementStart(0, "div", 131);
939
+ i0.ɵɵelementStart(0, "div", 138);
844
940
  i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_For_6_Template_div_click_0_listener() { const childRun_r16 = i0.ɵɵrestoreView(_r15).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.navigateToEntity("MJ: AI Prompt Runs", childRun_r16.ID)); });
845
- i0.ɵɵelementStart(1, "div", 123);
941
+ i0.ɵɵelementStart(1, "div", 130);
846
942
  i0.ɵɵelement(2, "i");
847
943
  i0.ɵɵelementEnd();
848
- i0.ɵɵelementStart(3, "div", 124)(4, "div", 125);
944
+ i0.ɵɵelementStart(3, "div", 131)(4, "div", 132);
849
945
  i0.ɵɵtext(5);
850
- i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_For_6_Conditional_6_Template, 2, 1, "span", 132);
851
- i0.ɵɵelementStart(7, "span", 126);
946
+ i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_For_6_Conditional_6_Template, 2, 1, "span", 139);
947
+ i0.ɵɵelementStart(7, "span", 133);
852
948
  i0.ɵɵtext(8);
853
949
  i0.ɵɵelementEnd()();
854
- i0.ɵɵelementStart(9, "div", 127)(10, "span", 133);
950
+ i0.ɵɵelementStart(9, "div", 134)(10, "span", 140);
855
951
  i0.ɵɵelement(11, "i");
856
952
  i0.ɵɵtext(12);
857
953
  i0.ɵɵelementEnd();
@@ -863,7 +959,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_templa
863
959
  i0.ɵɵelement(17, "i", 29);
864
960
  i0.ɵɵtext(18);
865
961
  i0.ɵɵelementEnd()()();
866
- i0.ɵɵelement(19, "i", 89);
962
+ i0.ɵɵelement(19, "i", 97);
867
963
  i0.ɵɵelementEnd();
868
964
  } if (rf & 2) {
869
965
  const childRun_r16 = ctx.$implicit;
@@ -890,12 +986,12 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_templa
890
986
  i0.ɵɵtextInterpolate1(" ", ctx_r1.formatTokens(childRun_r16.TokensUsed), "");
891
987
  } }
892
988
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
893
- i0.ɵɵelementStart(0, "div", 121)(1, "h4");
894
- i0.ɵɵelement(2, "i", 128);
989
+ i0.ɵɵelementStart(0, "div", 128)(1, "h4");
990
+ i0.ɵɵelement(2, "i", 135);
895
991
  i0.ɵɵtext(3, " Child Runs");
896
992
  i0.ɵɵelementEnd();
897
- i0.ɵɵelementStart(4, "div", 129);
898
- i0.ɵɵrepeaterCreate(5, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_For_6_Template, 20, 14, "div", 130, _forTrack1);
993
+ i0.ɵɵelementStart(4, "div", 136);
994
+ i0.ɵɵrepeaterCreate(5, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_For_6_Template, 20, 14, "div", 137, _forTrack1);
899
995
  i0.ɵɵelementEnd()();
900
996
  } if (rf & 2) {
901
997
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -904,7 +1000,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_templa
904
1000
  } }
905
1001
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Template(rf, ctx) { if (rf & 1) {
906
1002
  i0.ɵɵelementStart(0, "div", 49);
907
- i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_1_Template, 24, 12, "div", 120)(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_Template, 7, 0, "div", 121);
1003
+ i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_1_Template, 24, 12, "div", 127)(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_Template, 7, 0, "div", 128);
908
1004
  i0.ɵɵelementEnd();
909
1005
  } if (rf & 2) {
910
1006
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -923,20 +1019,20 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_Template(
923
1019
  } }
924
1020
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_64_Template(rf, ctx) { if (rf & 1) {
925
1021
  i0.ɵɵelementStart(0, "span", 47);
926
- i0.ɵɵelement(1, "i", 134);
1022
+ i0.ɵɵelement(1, "i", 141);
927
1023
  i0.ɵɵtext(2, " Additional Details ");
928
1024
  i0.ɵɵelementEnd();
929
1025
  } }
930
1026
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_2_Template(rf, ctx) { if (rf & 1) {
931
1027
  const _r17 = i0.ɵɵgetCurrentView();
932
- i0.ɵɵelementStart(0, "div", 136)(1, "label");
1028
+ i0.ɵɵelementStart(0, "div", 143)(1, "label");
933
1029
  i0.ɵɵtext(2, "Agent");
934
1030
  i0.ɵɵelementEnd();
935
- i0.ɵɵelementStart(3, "div", 144);
1031
+ i0.ɵɵelementStart(3, "div", 151);
936
1032
  i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_2_Template_div_click_3_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.navigateToEntity("AI Agents", ctx_r1.record.AgentID)); });
937
- i0.ɵɵelement(4, "i", 145);
1033
+ i0.ɵɵelement(4, "i", 152);
938
1034
  i0.ɵɵtext(5);
939
- i0.ɵɵelement(6, "i", 89);
1035
+ i0.ɵɵelement(6, "i", 97);
940
1036
  i0.ɵɵelementEnd()();
941
1037
  } if (rf & 2) {
942
1038
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -944,11 +1040,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Condition
944
1040
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Agent || "Unknown", " ");
945
1041
  } }
946
1042
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_3_Template(rf, ctx) { if (rf & 1) {
947
- i0.ɵɵelementStart(0, "div", 136)(1, "label");
1043
+ i0.ɵɵelementStart(0, "div", 143)(1, "label");
948
1044
  i0.ɵɵtext(2, "Configuration");
949
1045
  i0.ɵɵelementEnd();
950
- i0.ɵɵelementStart(3, "div", 137);
951
- i0.ɵɵelement(4, "i", 146);
1046
+ i0.ɵɵelementStart(3, "div", 144);
1047
+ i0.ɵɵelement(4, "i", 153);
952
1048
  i0.ɵɵtext(5);
953
1049
  i0.ɵɵelementEnd()();
954
1050
  } if (rf & 2) {
@@ -957,10 +1053,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Condition
957
1053
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Configuration || "Unknown", " ");
958
1054
  } }
959
1055
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_4_Template(rf, ctx) { if (rf & 1) {
960
- i0.ɵɵelementStart(0, "div", 136)(1, "label");
1056
+ i0.ɵɵelementStart(0, "div", 143)(1, "label");
961
1057
  i0.ɵɵtext(2, "Run Type");
962
1058
  i0.ɵɵelementEnd();
963
- i0.ɵɵelementStart(3, "div", 137);
1059
+ i0.ɵɵelementStart(3, "div", 144);
964
1060
  i0.ɵɵelement(4, "i");
965
1061
  i0.ɵɵtext(5);
966
1062
  i0.ɵɵelementEnd()();
@@ -972,10 +1068,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Condition
972
1068
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.RunType, " ");
973
1069
  } }
974
1070
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_5_Template(rf, ctx) { if (rf & 1) {
975
- i0.ɵɵelementStart(0, "div", 136)(1, "label");
1071
+ i0.ɵɵelementStart(0, "div", 143)(1, "label");
976
1072
  i0.ɵɵtext(2, "Response Format");
977
1073
  i0.ɵɵelementEnd();
978
- i0.ɵɵelementStart(3, "div", 137);
1074
+ i0.ɵɵelementStart(3, "div", 144);
979
1075
  i0.ɵɵelement(4, "i", 69);
980
1076
  i0.ɵɵtext(5);
981
1077
  i0.ɵɵelementEnd()();
@@ -985,10 +1081,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Condition
985
1081
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.ResponseFormat, " ");
986
1082
  } }
987
1083
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_48_Template(rf, ctx) { if (rf & 1) {
988
- i0.ɵɵelementStart(0, "div", 136)(1, "label");
1084
+ i0.ɵɵelementStart(0, "div", 143)(1, "label");
989
1085
  i0.ɵɵtext(2, "Started At");
990
1086
  i0.ɵɵelementEnd();
991
- i0.ɵɵelementStart(3, "div", 137);
1087
+ i0.ɵɵelementStart(3, "div", 144);
992
1088
  i0.ɵɵelement(4, "i", 25);
993
1089
  i0.ɵɵtext(5);
994
1090
  i0.ɵɵpipe(6, "date");
@@ -999,11 +1095,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Condition
999
1095
  i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(6, 1, ctx_r1.record.RunAt, "medium"), " ");
1000
1096
  } }
1001
1097
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_49_Template(rf, ctx) { if (rf & 1) {
1002
- i0.ɵɵelementStart(0, "div", 136)(1, "label");
1098
+ i0.ɵɵelementStart(0, "div", 143)(1, "label");
1003
1099
  i0.ɵɵtext(2, "Completed At");
1004
1100
  i0.ɵɵelementEnd();
1005
- i0.ɵɵelementStart(3, "div", 137);
1006
- i0.ɵɵelement(4, "i", 147);
1101
+ i0.ɵɵelementStart(3, "div", 144);
1102
+ i0.ɵɵelement(4, "i", 154);
1007
1103
  i0.ɵɵtext(5);
1008
1104
  i0.ɵɵpipe(6, "date");
1009
1105
  i0.ɵɵelementEnd()();
@@ -1013,58 +1109,58 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Condition
1013
1109
  i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(6, 1, ctx_r1.record.CompletedAt, "medium"), " ");
1014
1110
  } }
1015
1111
  function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Template(rf, ctx) { if (rf & 1) {
1016
- i0.ɵɵelementStart(0, "div", 49)(1, "div", 135);
1017
- i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_2_Template, 7, 1, "div", 136)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_3_Template, 6, 1, "div", 136)(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_4_Template, 6, 3, "div", 136)(5, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_5_Template, 6, 1, "div", 136);
1018
- i0.ɵɵelementStart(6, "div", 136)(7, "label");
1112
+ i0.ɵɵelementStart(0, "div", 49)(1, "div", 142);
1113
+ i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_2_Template, 7, 1, "div", 143)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_3_Template, 6, 1, "div", 143)(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_4_Template, 6, 3, "div", 143)(5, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_5_Template, 6, 1, "div", 143);
1114
+ i0.ɵɵelementStart(6, "div", 143)(7, "label");
1019
1115
  i0.ɵɵtext(8, "Temperature");
1020
1116
  i0.ɵɵelementEnd();
1021
- i0.ɵɵelementStart(9, "div", 137);
1022
- i0.ɵɵelement(10, "i", 138);
1117
+ i0.ɵɵelementStart(9, "div", 144);
1118
+ i0.ɵɵelement(10, "i", 145);
1023
1119
  i0.ɵɵtext(11);
1024
1120
  i0.ɵɵelementEnd()();
1025
- i0.ɵɵelementStart(12, "div", 136)(13, "label");
1121
+ i0.ɵɵelementStart(12, "div", 143)(13, "label");
1026
1122
  i0.ɵɵtext(14, "Top P");
1027
1123
  i0.ɵɵelementEnd();
1028
- i0.ɵɵelementStart(15, "div", 137);
1029
- i0.ɵɵelement(16, "i", 139);
1124
+ i0.ɵɵelementStart(15, "div", 144);
1125
+ i0.ɵɵelement(16, "i", 146);
1030
1126
  i0.ɵɵtext(17);
1031
1127
  i0.ɵɵelementEnd()();
1032
- i0.ɵɵelementStart(18, "div", 136)(19, "label");
1128
+ i0.ɵɵelementStart(18, "div", 143)(19, "label");
1033
1129
  i0.ɵɵtext(20, "Top K");
1034
1130
  i0.ɵɵelementEnd();
1035
- i0.ɵɵelementStart(21, "div", 137);
1036
- i0.ɵɵelement(22, "i", 140);
1131
+ i0.ɵɵelementStart(21, "div", 144);
1132
+ i0.ɵɵelement(22, "i", 147);
1037
1133
  i0.ɵɵtext(23);
1038
1134
  i0.ɵɵelementEnd()();
1039
- i0.ɵɵelementStart(24, "div", 136)(25, "label");
1135
+ i0.ɵɵelementStart(24, "div", 143)(25, "label");
1040
1136
  i0.ɵɵtext(26, "Min P");
1041
1137
  i0.ɵɵelementEnd();
1042
- i0.ɵɵelementStart(27, "div", 137);
1043
- i0.ɵɵelement(28, "i", 141);
1138
+ i0.ɵɵelementStart(27, "div", 144);
1139
+ i0.ɵɵelement(28, "i", 148);
1044
1140
  i0.ɵɵtext(29);
1045
1141
  i0.ɵɵelementEnd()();
1046
- i0.ɵɵelementStart(30, "div", 136)(31, "label");
1142
+ i0.ɵɵelementStart(30, "div", 143)(31, "label");
1047
1143
  i0.ɵɵtext(32, "Frequency Penalty");
1048
1144
  i0.ɵɵelementEnd();
1049
- i0.ɵɵelementStart(33, "div", 137);
1050
- i0.ɵɵelement(34, "i", 103);
1145
+ i0.ɵɵelementStart(33, "div", 144);
1146
+ i0.ɵɵelement(34, "i", 111);
1051
1147
  i0.ɵɵtext(35);
1052
1148
  i0.ɵɵelementEnd()();
1053
- i0.ɵɵelementStart(36, "div", 136)(37, "label");
1149
+ i0.ɵɵelementStart(36, "div", 143)(37, "label");
1054
1150
  i0.ɵɵtext(38, "Presence Penalty");
1055
1151
  i0.ɵɵelementEnd();
1056
- i0.ɵɵelementStart(39, "div", 137);
1057
- i0.ɵɵelement(40, "i", 142);
1152
+ i0.ɵɵelementStart(39, "div", 144);
1153
+ i0.ɵɵelement(40, "i", 149);
1058
1154
  i0.ɵɵtext(41);
1059
1155
  i0.ɵɵelementEnd()();
1060
- i0.ɵɵelementStart(42, "div", 136)(43, "label");
1156
+ i0.ɵɵelementStart(42, "div", 143)(43, "label");
1061
1157
  i0.ɵɵtext(44, "Seed");
1062
1158
  i0.ɵɵelementEnd();
1063
- i0.ɵɵelementStart(45, "div", 137);
1064
- i0.ɵɵelement(46, "i", 143);
1159
+ i0.ɵɵelementStart(45, "div", 144);
1160
+ i0.ɵɵelement(46, "i", 150);
1065
1161
  i0.ɵɵtext(47);
1066
1162
  i0.ɵɵelementEnd()();
1067
- i0.ɵɵtemplate(48, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_48_Template, 7, 4, "div", 136)(49, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_49_Template, 7, 4, "div", 136);
1163
+ i0.ɵɵtemplate(48, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_48_Template, 7, 4, "div", 143)(49, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_49_Template, 7, 4, "div", 143);
1068
1164
  i0.ɵɵelementEnd()();
1069
1165
  } if (rf & 2) {
1070
1166
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -1109,6 +1205,256 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Template(
1109
1205
  i0.ɵɵadvance();
1110
1206
  i0.ɵɵconditional(ctx_r1.record.CompletedAt ? 49 : -1);
1111
1207
  } }
1208
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_66_ng_template_1_Template(rf, ctx) { if (rf & 1) {
1209
+ i0.ɵɵelementStart(0, "span", 47);
1210
+ i0.ɵɵelement(1, "i", 41);
1211
+ i0.ɵɵtext(2, " Model Specific Response Details ");
1212
+ i0.ɵɵelementStart(3, "span", 48);
1213
+ i0.ɵɵtext(4, "JSON");
1214
+ i0.ɵɵelementEnd()();
1215
+ } }
1216
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_66_ng_template_2_Template(rf, ctx) { if (rf & 1) {
1217
+ const _r18 = i0.ɵɵgetCurrentView();
1218
+ i0.ɵɵelementStart(0, "div", 49)(1, "div", 57)(2, "div", 58)(3, "button", 59);
1219
+ i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_66_ng_template_2_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.copyToClipboard(ctx_r1.formattedModelSpecificResponseDetails, "Model Specific Response Details")); });
1220
+ i0.ɵɵelement(4, "i", 60);
1221
+ i0.ɵɵtext(5, " Copy ");
1222
+ i0.ɵɵelementEnd()();
1223
+ i0.ɵɵelementStart(6, "mj-code-editor", 155);
1224
+ i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_66_ng_template_2_Template_mj_code_editor_ngModelChange_6_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedModelSpecificResponseDetails, $event) || (ctx_r1.formattedModelSpecificResponseDetails = $event); return i0.ɵɵresetView($event); });
1225
+ i0.ɵɵelementEnd()()();
1226
+ } if (rf & 2) {
1227
+ const ctx_r1 = i0.ɵɵnextContext(3);
1228
+ i0.ɵɵadvance(6);
1229
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formattedModelSpecificResponseDetails);
1230
+ i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
1231
+ } }
1232
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_66_Template(rf, ctx) { if (rf & 1) {
1233
+ i0.ɵɵelementStart(0, "kendo-panelbar-item", 36);
1234
+ i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Conditional_66_ng_template_1_Template, 5, 0, "ng-template", 34)(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_66_ng_template_2_Template, 7, 4, "ng-template", 35);
1235
+ i0.ɵɵelementEnd();
1236
+ } if (rf & 2) {
1237
+ i0.ɵɵproperty("expanded", false);
1238
+ } }
1239
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_68_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1240
+ i0.ɵɵelementStart(0, "span", 99);
1241
+ i0.ɵɵtext(1, "Cached");
1242
+ i0.ɵɵelementEnd();
1243
+ } }
1244
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_68_Conditional_4_Template(rf, ctx) { if (rf & 1) {
1245
+ i0.ɵɵelementStart(0, "span", 99);
1246
+ i0.ɵɵtext(1, "Selected");
1247
+ i0.ɵɵelementEnd();
1248
+ } }
1249
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_68_Template(rf, ctx) { if (rf & 1) {
1250
+ i0.ɵɵelementStart(0, "span", 47);
1251
+ i0.ɵɵelement(1, "i", 41);
1252
+ i0.ɵɵtext(2, " Model Selection & Performance ");
1253
+ i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_68_Conditional_3_Template, 2, 0, "span", 99)(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_68_Conditional_4_Template, 2, 0, "span", 99);
1254
+ i0.ɵɵelementEnd();
1255
+ } if (rf & 2) {
1256
+ const ctx_r1 = i0.ɵɵnextContext(2);
1257
+ i0.ɵɵadvance(3);
1258
+ i0.ɵɵconditional(ctx_r1.record.CacheHit ? 3 : -1);
1259
+ i0.ɵɵadvance();
1260
+ i0.ɵɵconditional(ctx_r1.record.WasSelectedResult ? 4 : -1);
1261
+ } }
1262
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_26_Template(rf, ctx) { if (rf & 1) {
1263
+ i0.ɵɵelementStart(0, "div", 158)(1, "label");
1264
+ i0.ɵɵtext(2, "Cache Key");
1265
+ i0.ɵɵelementEnd();
1266
+ i0.ɵɵelementStart(3, "div", 144);
1267
+ i0.ɵɵelement(4, "i", 161);
1268
+ i0.ɵɵelementStart(5, "code");
1269
+ i0.ɵɵtext(6);
1270
+ i0.ɵɵelementEnd()()();
1271
+ } if (rf & 2) {
1272
+ const ctx_r1 = i0.ɵɵnextContext(3);
1273
+ i0.ɵɵadvance(6);
1274
+ i0.ɵɵtextInterpolate(ctx_r1.record.CacheKey);
1275
+ } }
1276
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_27_Template(rf, ctx) { if (rf & 1) {
1277
+ const _r19 = i0.ɵɵgetCurrentView();
1278
+ i0.ɵɵelementStart(0, "div", 143)(1, "label");
1279
+ i0.ɵɵtext(2, "Judge Prompt");
1280
+ i0.ɵɵelementEnd();
1281
+ i0.ɵɵelementStart(3, "div", 162);
1282
+ i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_27_Template_div_click_3_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.navigateToEntity("AI Prompts", ctx_r1.record.JudgeID)); });
1283
+ i0.ɵɵelement(4, "i", 163);
1284
+ i0.ɵɵtext(5);
1285
+ i0.ɵɵelement(6, "i", 97);
1286
+ i0.ɵɵelementEnd()();
1287
+ } if (rf & 2) {
1288
+ const ctx_r1 = i0.ɵɵnextContext(3);
1289
+ i0.ɵɵadvance(5);
1290
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Judge || "Unknown", " ");
1291
+ } }
1292
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_28_Template(rf, ctx) { if (rf & 1) {
1293
+ i0.ɵɵelementStart(0, "div", 143)(1, "label");
1294
+ i0.ɵɵtext(2, "Judge Score");
1295
+ i0.ɵɵelementEnd();
1296
+ i0.ɵɵelementStart(3, "div", 144);
1297
+ i0.ɵɵelement(4, "i", 164);
1298
+ i0.ɵɵtext(5);
1299
+ i0.ɵɵelementEnd()();
1300
+ } if (rf & 2) {
1301
+ const ctx_r1 = i0.ɵɵnextContext(3);
1302
+ i0.ɵɵadvance(5);
1303
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.record.JudgeScore, " ");
1304
+ } }
1305
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_41_Template(rf, ctx) { if (rf & 1) {
1306
+ i0.ɵɵelementStart(0, "div", 143)(1, "label");
1307
+ i0.ɵɵtext(2, "First Token Time");
1308
+ i0.ɵɵelementEnd();
1309
+ i0.ɵɵelementStart(3, "div", 144);
1310
+ i0.ɵɵelement(4, "i", 165);
1311
+ i0.ɵɵtext(5);
1312
+ i0.ɵɵelementEnd()();
1313
+ } if (rf & 2) {
1314
+ const ctx_r1 = i0.ɵɵnextContext(3);
1315
+ i0.ɵɵadvance(5);
1316
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.record.FirstTokenTime, " ms ");
1317
+ } }
1318
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_42_Conditional_6_Template(rf, ctx) { if (rf & 1) {
1319
+ i0.ɵɵelementStart(0, "div", 158)(1, "label");
1320
+ i0.ɵɵtext(2, "Cancellation Reason");
1321
+ i0.ɵɵelementEnd();
1322
+ i0.ɵɵelementStart(3, "div", 144);
1323
+ i0.ɵɵelement(4, "i", 168);
1324
+ i0.ɵɵtext(5);
1325
+ i0.ɵɵelementEnd()();
1326
+ } if (rf & 2) {
1327
+ const ctx_r1 = i0.ɵɵnextContext(4);
1328
+ i0.ɵɵadvance(5);
1329
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.record.CancellationReason, " ");
1330
+ } }
1331
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_42_Template(rf, ctx) { if (rf & 1) {
1332
+ i0.ɵɵelementStart(0, "div", 143)(1, "label");
1333
+ i0.ɵɵtext(2, "Cancelled");
1334
+ i0.ɵɵelementEnd();
1335
+ i0.ɵɵelementStart(3, "div", 166);
1336
+ i0.ɵɵelement(4, "i", 167);
1337
+ i0.ɵɵtext(5, " Yes ");
1338
+ i0.ɵɵelementEnd()();
1339
+ i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_42_Conditional_6_Template, 6, 1, "div", 158);
1340
+ } if (rf & 2) {
1341
+ const ctx_r1 = i0.ɵɵnextContext(3);
1342
+ i0.ɵɵadvance(6);
1343
+ i0.ɵɵconditional(ctx_r1.record.CancellationReason ? 6 : -1);
1344
+ } }
1345
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_43_Template(rf, ctx) { if (rf & 1) {
1346
+ const _r20 = i0.ɵɵgetCurrentView();
1347
+ i0.ɵɵelementStart(0, "div", 159)(1, "h4");
1348
+ i0.ɵɵtext(2, "Model Selection Details");
1349
+ i0.ɵɵelementEnd();
1350
+ i0.ɵɵelementStart(3, "div", 123)(4, "mj-code-editor", 169);
1351
+ i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_43_Template_mj_code_editor_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedModelSelection, $event) || (ctx_r1.formattedModelSelection = $event); return i0.ɵɵresetView($event); });
1352
+ i0.ɵɵelementEnd()()();
1353
+ } if (rf & 2) {
1354
+ const ctx_r1 = i0.ɵɵnextContext(3);
1355
+ i0.ɵɵadvance(4);
1356
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formattedModelSelection);
1357
+ i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
1358
+ } }
1359
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_44_Template(rf, ctx) { if (rf & 1) {
1360
+ const _r21 = i0.ɵɵgetCurrentView();
1361
+ i0.ɵɵelementStart(0, "div", 160)(1, "h4");
1362
+ i0.ɵɵtext(2, "Error Details");
1363
+ i0.ɵɵelementEnd();
1364
+ i0.ɵɵelementStart(3, "div", 123)(4, "mj-code-editor", 170);
1365
+ i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_44_Template_mj_code_editor_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedErrorDetails, $event) || (ctx_r1.formattedErrorDetails = $event); return i0.ɵɵresetView($event); });
1366
+ i0.ɵɵelementEnd()()();
1367
+ } if (rf & 2) {
1368
+ const ctx_r1 = i0.ɵɵnextContext(3);
1369
+ i0.ɵɵadvance(4);
1370
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formattedErrorDetails);
1371
+ i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
1372
+ } }
1373
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Template(rf, ctx) { if (rf & 1) {
1374
+ i0.ɵɵelementStart(0, "div", 49)(1, "div", 142)(2, "div", 143)(3, "label");
1375
+ i0.ɵɵtext(4, "Status");
1376
+ i0.ɵɵelementEnd();
1377
+ i0.ɵɵelementStart(5, "div", 144);
1378
+ i0.ɵɵelement(6, "i", 141);
1379
+ i0.ɵɵtext(7);
1380
+ i0.ɵɵelementEnd()();
1381
+ i0.ɵɵelementStart(8, "div", 143)(9, "label");
1382
+ i0.ɵɵtext(10, "Selection Strategy");
1383
+ i0.ɵɵelementEnd();
1384
+ i0.ɵɵelementStart(11, "div", 144);
1385
+ i0.ɵɵelement(12, "i", 156);
1386
+ i0.ɵɵtext(13);
1387
+ i0.ɵɵelementEnd()();
1388
+ i0.ɵɵelementStart(14, "div", 143)(15, "label");
1389
+ i0.ɵɵtext(16, "Model Power Rank");
1390
+ i0.ɵɵelementEnd();
1391
+ i0.ɵɵelementStart(17, "div", 144);
1392
+ i0.ɵɵelement(18, "i", 157);
1393
+ i0.ɵɵtext(19);
1394
+ i0.ɵɵelementEnd()();
1395
+ i0.ɵɵelementStart(20, "div", 143)(21, "label");
1396
+ i0.ɵɵtext(22, "Cache Hit");
1397
+ i0.ɵɵelementEnd();
1398
+ i0.ɵɵelementStart(23, "div", 144);
1399
+ i0.ɵɵelement(24, "i");
1400
+ i0.ɵɵtext(25);
1401
+ i0.ɵɵelementEnd()();
1402
+ i0.ɵɵtemplate(26, AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_26_Template, 7, 1, "div", 158)(27, AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_27_Template, 7, 1, "div", 143)(28, AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_28_Template, 6, 1, "div", 143);
1403
+ i0.ɵɵelementStart(29, "div", 143)(30, "label");
1404
+ i0.ɵɵtext(31, "Was Selected Result");
1405
+ i0.ɵɵelementEnd();
1406
+ i0.ɵɵelementStart(32, "div", 144);
1407
+ i0.ɵɵelement(33, "i");
1408
+ i0.ɵɵtext(34);
1409
+ i0.ɵɵelementEnd()();
1410
+ i0.ɵɵelementStart(35, "div", 143)(36, "label");
1411
+ i0.ɵɵtext(37, "Streaming Enabled");
1412
+ i0.ɵɵelementEnd();
1413
+ i0.ɵɵelementStart(38, "div", 144);
1414
+ i0.ɵɵelement(39, "i");
1415
+ i0.ɵɵtext(40);
1416
+ i0.ɵɵelementEnd()();
1417
+ i0.ɵɵtemplate(41, AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_41_Template, 6, 1, "div", 143)(42, AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_42_Template, 7, 1);
1418
+ i0.ɵɵelementEnd();
1419
+ i0.ɵɵtemplate(43, AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_43_Template, 5, 4, "div", 159)(44, AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_44_Template, 5, 4, "div", 160);
1420
+ i0.ɵɵelementEnd();
1421
+ } if (rf & 2) {
1422
+ const ctx_r1 = i0.ɵɵnextContext(2);
1423
+ i0.ɵɵadvance(7);
1424
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Status || "Unknown", " ");
1425
+ i0.ɵɵadvance(6);
1426
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.record.SelectionStrategy || "\u2014", " ");
1427
+ i0.ɵɵadvance(4);
1428
+ i0.ɵɵclassProp("null-value", ctx_r1.record.ModelPowerRank === null);
1429
+ i0.ɵɵadvance(2);
1430
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.record.ModelPowerRank !== null ? ctx_r1.record.ModelPowerRank : "\u2014", " ");
1431
+ i0.ɵɵadvance(5);
1432
+ i0.ɵɵclassMap(ctx_r1.record.CacheHit ? "fa-solid fa-check-circle" : "fa-solid fa-times-circle");
1433
+ i0.ɵɵadvance();
1434
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.record.CacheHit ? "Yes" : "No", " ");
1435
+ i0.ɵɵadvance();
1436
+ i0.ɵɵconditional(ctx_r1.record.CacheKey ? 26 : -1);
1437
+ i0.ɵɵadvance();
1438
+ i0.ɵɵconditional(ctx_r1.record.JudgeID ? 27 : -1);
1439
+ i0.ɵɵadvance();
1440
+ i0.ɵɵconditional(ctx_r1.record.JudgeScore !== null ? 28 : -1);
1441
+ i0.ɵɵadvance(5);
1442
+ i0.ɵɵclassMap(ctx_r1.record.WasSelectedResult ? "fa-solid fa-trophy" : "fa-solid fa-times");
1443
+ i0.ɵɵadvance();
1444
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.record.WasSelectedResult ? "Yes" : "No", " ");
1445
+ i0.ɵɵadvance(5);
1446
+ i0.ɵɵclassMap(ctx_r1.record.StreamingEnabled ? "fa-solid fa-stream" : "fa-solid fa-ban");
1447
+ i0.ɵɵadvance();
1448
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.record.StreamingEnabled ? "Yes" : "No", " ");
1449
+ i0.ɵɵadvance();
1450
+ i0.ɵɵconditional(ctx_r1.record.FirstTokenTime !== null ? 41 : -1);
1451
+ i0.ɵɵadvance();
1452
+ i0.ɵɵconditional(ctx_r1.record.Cancelled ? 42 : -1);
1453
+ i0.ɵɵadvance();
1454
+ i0.ɵɵconditional(ctx_r1.record.ModelSelection ? 43 : -1);
1455
+ i0.ɵɵadvance();
1456
+ i0.ɵɵconditional(ctx_r1.record.ErrorDetails ? 44 : -1);
1457
+ } }
1112
1458
  function AIPromptRunFormComponentExtended_Conditional_1_Template(rf, ctx) { if (rf & 1) {
1113
1459
  const _r1 = i0.ɵɵgetCurrentView();
1114
1460
  i0.ɵɵelementStart(0, "form", 2, 0);
@@ -1169,11 +1515,15 @@ function AIPromptRunFormComponentExtended_Conditional_1_Template(rf, ctx) { if (
1169
1515
  i0.ɵɵtemplate(56, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Template, 5, 2, "ng-template", 34)(57, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Template, 4, 2, "ng-template", 35);
1170
1516
  i0.ɵɵelementEnd();
1171
1517
  i0.ɵɵelementStart(58, "kendo-panelbar-item", 36);
1172
- i0.ɵɵtemplate(59, AIPromptRunFormComponentExtended_Conditional_1_ng_template_59_Template, 3, 0, "ng-template", 34)(60, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Template, 39, 12, "ng-template", 35);
1518
+ i0.ɵɵtemplate(59, AIPromptRunFormComponentExtended_Conditional_1_ng_template_59_Template, 3, 0, "ng-template", 34)(60, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Template, 42, 15, "ng-template", 35);
1173
1519
  i0.ɵɵelementEnd();
1174
1520
  i0.ɵɵtemplate(61, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_Template, 3, 1, "kendo-panelbar-item", 36)(62, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_Template, 3, 1, "kendo-panelbar-item", 36);
1175
1521
  i0.ɵɵelementStart(63, "kendo-panelbar-item", 36);
1176
1522
  i0.ɵɵtemplate(64, AIPromptRunFormComponentExtended_Conditional_1_ng_template_64_Template, 3, 0, "ng-template", 34)(65, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Template, 50, 27, "ng-template", 35);
1523
+ i0.ɵɵelementEnd();
1524
+ i0.ɵɵtemplate(66, AIPromptRunFormComponentExtended_Conditional_1_Conditional_66_Template, 3, 1, "kendo-panelbar-item", 36);
1525
+ i0.ɵɵelementStart(67, "kendo-panelbar-item", 36);
1526
+ i0.ɵɵtemplate(68, AIPromptRunFormComponentExtended_Conditional_1_ng_template_68_Template, 5, 2, "ng-template", 34)(69, AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Template, 45, 21, "ng-template", 35);
1177
1527
  i0.ɵɵelementEnd()()()();
1178
1528
  } if (rf & 2) {
1179
1529
  const ctx_r1 = i0.ɵɵnextContext();
@@ -1224,6 +1574,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_Template(rf, ctx) { if (
1224
1574
  i0.ɵɵconditional(ctx_r1.record.ParentID || ctx_r1.childRuns.length > 0 ? 62 : -1);
1225
1575
  i0.ɵɵadvance();
1226
1576
  i0.ɵɵproperty("expanded", false);
1577
+ i0.ɵɵadvance(3);
1578
+ i0.ɵɵconditional(ctx_r1.record.ModelSpecificResponseDetails ? 66 : -1);
1579
+ i0.ɵɵadvance();
1580
+ i0.ɵɵproperty("expanded", false);
1227
1581
  } }
1228
1582
  let AIPromptRunFormComponentExtended = class AIPromptRunFormComponentExtended extends AIPromptRunFormComponent {
1229
1583
  constructor(elementRef, sharedService, router, route, cdr, testHarnessWindowService, viewContainerRef) {
@@ -1253,6 +1607,9 @@ let AIPromptRunFormComponentExtended = class AIPromptRunFormComponentExtended ex
1253
1607
  this.formattedValidationSummary = '';
1254
1608
  this.formattedValidationAttempts = '';
1255
1609
  this.formattedData = '';
1610
+ this.formattedModelSelection = '';
1611
+ this.formattedErrorDetails = '';
1612
+ this.formattedModelSpecificResponseDetails = '';
1256
1613
  // Parsed input data
1257
1614
  this.chatMessages = [];
1258
1615
  this.inputData = null;
@@ -1274,6 +1631,11 @@ let AIPromptRunFormComponentExtended = class AIPromptRunFormComponentExtended ex
1274
1631
  this.cdr.detectChanges();
1275
1632
  }, 0);
1276
1633
  }
1634
+ ngOnDestroy() {
1635
+ // Clean up any resources
1636
+ // Currently no subscriptions or timers to clean up
1637
+ // This is here for future use and to complete the lifecycle
1638
+ }
1277
1639
  onInputPanelToggle() {
1278
1640
  // Force change detection when parent panel is toggled
1279
1641
  // This helps ensure nested expansion panels render correctly
@@ -1341,6 +1703,45 @@ let AIPromptRunFormComponentExtended = class AIPromptRunFormComponentExtended ex
1341
1703
  this.isParsingMessages = false; // Done parsing
1342
1704
  // Format result using extended entity method
1343
1705
  this.formattedResult = this.record.GetFormattedResult();
1706
+ // Format v2.78 JSON fields
1707
+ const parseOptions = {
1708
+ extractInlineJson: true,
1709
+ maxDepth: 100,
1710
+ debug: false
1711
+ };
1712
+ // Format ModelSelection
1713
+ if (this.record.ModelSelection) {
1714
+ try {
1715
+ const modelSelection = JSON.parse(this.record.ModelSelection);
1716
+ const parsed = ParseJSONRecursive(modelSelection, parseOptions);
1717
+ this.formattedModelSelection = JSON.stringify(parsed, null, 2);
1718
+ }
1719
+ catch (error) {
1720
+ this.formattedModelSelection = this.record.ModelSelection;
1721
+ }
1722
+ }
1723
+ // Format ErrorDetails
1724
+ if (this.record.ErrorDetails) {
1725
+ try {
1726
+ const errorDetails = JSON.parse(this.record.ErrorDetails);
1727
+ const parsed = ParseJSONRecursive(errorDetails, parseOptions);
1728
+ this.formattedErrorDetails = JSON.stringify(parsed, null, 2);
1729
+ }
1730
+ catch (error) {
1731
+ this.formattedErrorDetails = this.record.ErrorDetails;
1732
+ }
1733
+ }
1734
+ // Format ModelSpecificResponseDetails
1735
+ if (this.record.ModelSpecificResponseDetails) {
1736
+ try {
1737
+ const modelDetails = JSON.parse(this.record.ModelSpecificResponseDetails);
1738
+ const parsed = ParseJSONRecursive(modelDetails, parseOptions);
1739
+ this.formattedModelSpecificResponseDetails = JSON.stringify(parsed, null, 2);
1740
+ }
1741
+ catch (error) {
1742
+ this.formattedModelSpecificResponseDetails = this.record.ModelSpecificResponseDetails;
1743
+ }
1744
+ }
1344
1745
  }
1345
1746
  getStatusColor() {
1346
1747
  if (!this.record)
@@ -1544,14 +1945,14 @@ let AIPromptRunFormComponentExtended = class AIPromptRunFormComponentExtended ex
1544
1945
  this.validationExpanded = (this.record.ValidationAttemptCount || 0) > 1;
1545
1946
  }
1546
1947
  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)); }; }
1547
- 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, "metric-item"], [1, "fa-solid", "fa-clock"], [1, "metric-content"], [1, "metric-label"], [1, "metric-value"], [1, "fa-solid", "fa-coins"], [1, "fa-solid", "fa-dollar-sign"], [1, "form-content"], [3, "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, "fa-solid", "fa-calendar"], [1, "panel-title"], [1, "panel-badge"], [1, "panel-content"], [1, "nested-panels"], [1, "empty-state"], [1, "sub-expansion-panel", 3, "expanded", "animation"], ["kendoExpansionPanelTitleDirective", ""], [1, "sub-panel-content"], [1, "loading-state"], [3, "messages"], [1, "json-editor-container"], [1, "json-toolbar"], ["kendoButton", "", "fillMode", "flat", "size", "small", "title", "Copy JSON", 3, "click"], [1, "fa-solid", "fa-copy"], ["name", "formattedMessages", 2, "height", "400px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "sub-panel-title"], [1, "fa-solid", "fa-comments"], [1, "panel-count"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-comment-slash"], [1, "fa-solid", "fa-database"], ["name", "formattedData", 2, "height", "300px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-code"], [1, "fa-solid", "fa-square-check"], [1, "panel-badge", "error"], [1, "error-message"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "error-content"], ["name", "formattedResult", 2, "height", "400px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-inbox"], [1, "fa-solid", "fa-chart-line"], [1, "metrics-grid"], [1, "metric-card"], [1, "metric-header"], [1, "fa-solid", "fa-message"], [1, "metric-value", "large"], [1, "metric-rollup"], [1, "fa-solid", "fa-reply"], [1, "metric-currency"], [1, "additional-metrics"], [1, "metric-row"], [1, "metric-value", "link", 3, "click"], [1, "fa-solid", "fa-external-link"], [1, "fa-solid", "fa-shield-check"], [1, "panel-badge", "success"], [1, "validation-summary"], [1, "summary-header"], [1, "validation-status"], [1, "validation-metrics"], [1, "metric-card", "small"], [1, "validation-error"], [1, "common-error"], [1, "retry-timeline"], [1, "validation-attempts"], [1, "validation-json"], [1, "error-count"], [1, "fa-solid", "fa-repeat"], [1, "timeline-info"], [1, "timeline-stat"], [1, "fa-solid", "fa-flag-checkered"], [1, "fa-solid", "fa-stopwatch"], [1, "attempts-list"], [1, "attempt-item", 3, "success", "failed"], [1, "attempt-item"], [1, "attempt-number"], [1, "attempt-details"], [1, "attempt-time"], [1, "output-length"], [1, "attempt-error"], [1, "json-viewer-container"], ["name", "formattedValidationSummary", 2, "height", "200px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], ["name", "formattedValidationAttempts", 2, "height", "300px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-sitemap"], [1, "parent-run-section"], [1, "child-runs-section"], [1, "run-item", "parent", 3, "click"], [1, "run-item-icon"], [1, "run-item-content"], [1, "run-item-title"], [1, "run-item-type"], [1, "run-item-meta"], [1, "fa-solid", "fa-level-down-alt"], [1, "runs-list"], [1, "run-item", "child"], [1, "run-item", "child", 3, "click"], [1, "execution-order"], [1, "status-indicator"], [1, "fa-solid", "fa-info-circle"], [1, "detail-fields-grid"], [1, "detail-field"], [1, "detail-value"], [1, "fa-solid", "fa-temperature-high"], [1, "fa-solid", "fa-percentage"], [1, "fa-solid", "fa-list-ol"], [1, "fa-solid", "fa-filter"], [1, "fa-solid", "fa-plus-circle"], [1, "fa-solid", "fa-seedling"], ["title", "View Agent", 1, "detail-value", "clickable", 3, "click"], [1, "fa-solid", "fa-robot"], [1, "fa-solid", "fa-cog"], [1, "fa-solid", "fa-check-circle"]], template: function AIPromptRunFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
1948
+ 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, "metric-item"], [1, "fa-solid", "fa-clock"], [1, "metric-content"], [1, "metric-label"], [1, "metric-value"], [1, "fa-solid", "fa-coins"], [1, "fa-solid", "fa-dollar-sign"], [1, "form-content"], [3, "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, "fa-solid", "fa-calendar"], [1, "panel-title"], [1, "panel-badge"], [1, "panel-content"], [1, "nested-panels"], [1, "empty-state"], [1, "sub-expansion-panel", 3, "expanded", "animation"], ["kendoExpansionPanelTitleDirective", ""], [1, "sub-panel-content"], [1, "loading-state"], [3, "messages"], [1, "json-editor-container"], [1, "json-toolbar"], ["kendoButton", "", "fillMode", "flat", "size", "small", "title", "Copy JSON", 3, "click"], [1, "fa-solid", "fa-copy"], ["name", "formattedMessages", 2, "height", "400px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "sub-panel-title"], [1, "fa-solid", "fa-comments"], [1, "panel-count"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-comment-slash"], [1, "fa-solid", "fa-database"], ["name", "formattedData", 2, "height", "300px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-code"], [1, "fa-solid", "fa-square-check"], [1, "panel-badge", "error"], [1, "error-message"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "error-content"], ["name", "formattedResult", 2, "height", "400px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-inbox"], [1, "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-temperature-high"], [1, "fa-solid", "fa-percentage"], [1, "fa-solid", "fa-list-ol"], [1, "fa-solid", "fa-filter"], [1, "fa-solid", "fa-plus-circle"], [1, "fa-solid", "fa-seedling"], ["title", "View Agent", 1, "detail-value", "clickable", 3, "click"], [1, "fa-solid", "fa-robot"], [1, "fa-solid", "fa-cog"], [1, "fa-solid", "fa-check-circle"], ["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) {
1548
1949
  i0.ɵɵelementStart(0, "div", 1);
1549
- i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Template, 66, 29, "form", 2);
1950
+ i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Template, 70, 31, "form", 2);
1550
1951
  i0.ɵɵelementEnd();
1551
1952
  } if (rf & 2) {
1552
1953
  i0.ɵɵadvance();
1553
1954
  i0.ɵɵconditional(ctx.record ? 1 : -1);
1554
- } }, dependencies: [i4.ɵNgNoValidate, i4.NgControlStatus, i4.NgControlStatusGroup, i4.NgModel, i4.NgForm, i5.PanelBarComponent, i5.PanelBarItemComponent, i5.PanelBarContentDirective, i5.PanelBarItemTitleDirective, i5.ExpansionPanelComponent, i5.ExpansionPanelTitleDirective, i6.ButtonComponent, i7.FormToolbarComponent, i8.CodeEditorComponent, i9.ChatMessageViewerComponent, i10.DatePipe], styles: ["\n\n.prompt-run-header[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border-bottom: 2px solid #e9ecef;\n padding: 20px;\n margin-bottom: 0;\n}\n\n.header-content[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n margin-bottom: 16px;\n}\n\n.run-overview[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n flex: 1;\n}\n\n.run-icon-wrapper[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-icon-wrapper[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n}\n\n.run-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.run-title[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 1.5em;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.run-id[_ngcontent-%COMP%] {\n font-size: 0.8em;\n color: #6c757d;\n font-weight: 400;\n font-family: 'Courier New', monospace;\n}\n\n.run-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n color: white;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.status-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.9em;\n}\n\n.run-type-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #f1f3f5;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.prompt-name[_ngcontent-%COMP%], .model-name[_ngcontent-%COMP%], .vendor-name[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.85em;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.prompt-name[_ngcontent-%COMP%]:hover, .model-name[_ngcontent-%COMP%]:hover, .vendor-name[_ngcontent-%COMP%]:hover {\n background: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.original-run[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n color: #ff6358;\n text-decoration: none;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.original-link[_ngcontent-%COMP%]:hover {\n color: #ff4444;\n text-decoration: underline;\n}\n\n.run-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n\n\n.metrics-bar[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n padding-top: 16px;\n border-top: 1px solid #e9ecef;\n flex-wrap: wrap;\n}\n\n.metric-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.metric-item[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n font-size: 1.2em;\n color: #6c757d;\n width: 24px;\n text-align: center;\n}\n\n.metric-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.metric-label[_ngcontent-%COMP%] {\n font-size: 0.75em;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value[_ngcontent-%COMP%] {\n font-size: 1.1em;\n font-weight: 600;\n color: #2c3e50;\n}\n\n\n\n.form-content[_ngcontent-%COMP%] {\n padding: 16px;\n}\n\n.panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n\n\n.sub-panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n font-size: 0.95em;\n}\n\n.sub-panel-content[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] > .k-item[_ngcontent-%COMP%] {\n border: 1px solid #e5e7eb;\n margin-bottom: 8px;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] > .k-item[_ngcontent-%COMP%] > .k-link[_ngcontent-%COMP%] {\n background-color: #f9fafb;\n padding: 12px 16px;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] > .k-item.k-expanded[_ngcontent-%COMP%] > .k-link[_ngcontent-%COMP%] {\n background-color: #f3f4f6;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] .k-content[_ngcontent-%COMP%] {\n padding: 0;\n background: white;\n}\n\n\n\n.sub-panel-content[_ngcontent-%COMP%] mj-chat-message-viewer[_ngcontent-%COMP%] {\n display: block;\n min-height: 200px;\n max-height: 750px; \n\n height: auto;\n overflow: hidden;\n}\n\n\n\n.sub-expansion-panel[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-expander {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-expander:hover {\n background-color: #edf2f7;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-header {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-content {\n background-color: #ffffff;\n border-color: #e2e8f0;\n}\n\n.panel-badge[_ngcontent-%COMP%] {\n margin-left: auto;\n padding: 2px 8px;\n border-radius: 12px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n.panel-badge.error[_ngcontent-%COMP%] {\n background: #dc3545;\n color: white;\n}\n\n.panel-count[_ngcontent-%COMP%] {\n color: #6c757d;\n font-weight: 400;\n font-size: 0.9em;\n}\n\n.panel-content[_ngcontent-%COMP%] {\n padding: 20px;\n max-height: none !important;\n overflow: visible !important;\n}\n\n\n\n.json-editor-container[_ngcontent-%COMP%] {\n border: 1px solid #e9ecef;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.json-toolbar[_ngcontent-%COMP%] {\n background: #f8f9fa;\n padding: 8px 12px;\n border-bottom: 1px solid #e9ecef;\n display: flex;\n justify-content: flex-end;\n}\n\n\n\n.error-message[_ngcontent-%COMP%] {\n background: #dc354510;\n border: 1px solid #dc3545;\n border-radius: 6px;\n padding: 16px;\n display: flex;\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.error-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.5em;\n color: #dc3545;\n flex-shrink: 0;\n}\n\n.error-content[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 1em;\n}\n\n.error-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: #495057;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.3;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1em;\n}\n\n\n\n.loading-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.loading-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.6;\n color: #007bff;\n}\n\n.loading-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1em;\n}\n\n\n\n.metrics-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 24px;\n}\n\n.metric-card[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n}\n\n.metric-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.metric-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.2em;\n color: #6c757d;\n}\n\n.metric-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.9em;\n color: #6c757d;\n font-weight: 500;\n}\n\n.metric-value.large[_ngcontent-%COMP%] {\n font-size: 1.8em;\n font-weight: 700;\n color: #2c3e50;\n}\n\n.metric-rollup[_ngcontent-%COMP%] {\n margin-top: 8px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.metric-currency[_ngcontent-%COMP%] {\n margin-top: 4px;\n font-size: 0.85em;\n color: #6c757d;\n text-transform: uppercase;\n}\n\n\n\n.additional-metrics[_ngcontent-%COMP%] {\n border-top: 1px solid #e9ecef;\n padding-top: 16px;\n}\n\n.metric-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n border-bottom: 1px solid #f1f3f5;\n}\n\n.metric-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-label[_ngcontent-%COMP%] {\n font-weight: 500;\n color: #6c757d;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-value[_ngcontent-%COMP%] {\n font-weight: 400;\n color: #2c3e50;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-value.link[_ngcontent-%COMP%] {\n color: #007bff;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: color 0.2s;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-value.link[_ngcontent-%COMP%]:hover {\n color: #0056b3;\n}\n\n\n\n.parent-run-section[_ngcontent-%COMP%], \n.child-runs-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.parent-run-section[_ngcontent-%COMP%]:last-child, \n.child-runs-section[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.parent-run-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%], \n.child-runs-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 0.95em;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.runs-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.run-item[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.run-item[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n}\n\n.run-item.parent[_ngcontent-%COMP%] {\n background: #e3f2fd;\n border-color: #90caf9;\n}\n\n.run-item.parent[_ngcontent-%COMP%]:hover {\n background: #bbdefb;\n}\n\n.run-item-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-item-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.run-item-title[_ngcontent-%COMP%] {\n font-weight: 500;\n color: #2c3e50;\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.execution-order[_ngcontent-%COMP%] {\n background: #6c757d;\n color: white;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 0.75em;\n font-weight: 600;\n}\n\n.run-item-type[_ngcontent-%COMP%] {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 400;\n}\n\n.run-item-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.run-item-meta[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.status-indicator[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.run-item[_ngcontent-%COMP%] > i[_ngcontent-%COMP%]:last-child {\n color: #6c757d;\n font-size: 0.85em;\n}\n\n\n\n.detail-fields-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 24px;\n width: 100%;\n min-height: auto;\n overflow: visible;\n}\n\n.detail-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-field[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-value[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 1em;\n color: #2c3e50;\n padding: 10px 14px;\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n transition: all 0.2s;\n}\n\n.detail-value[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child {\n color: #6c757d;\n font-size: 1.1em;\n width: 20px;\n text-align: center;\n}\n\n.detail-value.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.detail-value.clickable[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.detail-value.clickable[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:last-child {\n margin-left: auto;\n font-size: 0.85em;\n opacity: 0.6;\n}\n\n.detail-value.clickable[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%]:last-child {\n opacity: 1;\n}\n\n.detail-value.null-value[_ngcontent-%COMP%] {\n color: #adb5bd;\n font-style: italic;\n}\n\n.detail-value.null-value[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child {\n opacity: 0.5;\n}\n\n\n\nkendo-panelbar[_ngcontent-%COMP%] {\n border: none !important;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n border: 1px solid #e9ecef !important;\n border-radius: 8px !important;\n overflow: hidden;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] .k-panelbar-header[_ngcontent-%COMP%] {\n background: #f8f9fa !important;\n border: none !important;\n padding: 12px 16px !important;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] .k-panelbar-header[_ngcontent-%COMP%]:hover {\n background: #e9ecef !important;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] .k-panelbar-content[_ngcontent-%COMP%] {\n border: none !important;\n padding: 0 !important;\n max-height: none !important;\n overflow: visible !important;\n}\n\n\n\n.validation-summary[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.summary-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.summary-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1em;\n color: #2c3e50;\n}\n\n.validation-status[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 16px;\n border-radius: 20px;\n font-weight: 500;\n font-size: 0.9em;\n}\n\n.validation-status.success[_ngcontent-%COMP%] {\n background: #28a74520;\n color: #28a745;\n}\n\n.validation-status.failed[_ngcontent-%COMP%] {\n background: #dc354520;\n color: #dc3545;\n}\n\n.validation-metrics[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.metric-card.small[_ngcontent-%COMP%] {\n padding: 16px;\n text-align: center;\n}\n\n.metric-card.small[_ngcontent-%COMP%] .metric-label[_ngcontent-%COMP%] {\n font-size: 0.8em;\n margin-bottom: 8px;\n font-weight: 600;\n}\n\n.metric-card.small[_ngcontent-%COMP%] .metric-value[_ngcontent-%COMP%] {\n font-size: 1.4em;\n font-weight: 700;\n}\n\n.validation-error[_ngcontent-%COMP%], \n.common-error[_ngcontent-%COMP%] {\n background: #dc354510;\n border: 1px solid #dc354530;\n border-radius: 8px;\n padding: 16px;\n margin-bottom: 16px;\n}\n\n.validation-error[_ngcontent-%COMP%] h5[_ngcontent-%COMP%], \n.common-error[_ngcontent-%COMP%] h5[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 0.95em;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.validation-error[_ngcontent-%COMP%] p[_ngcontent-%COMP%], \n.common-error[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: #495057;\n font-size: 0.9em;\n}\n\n.error-count[_ngcontent-%COMP%] {\n display: inline-block;\n margin-top: 8px;\n padding: 2px 8px;\n background: #dc3545;\n color: white;\n border-radius: 12px;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n\n\n.retry-timeline[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.retry-timeline[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.timeline-info[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n}\n\n.timeline-stat[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #6c757d;\n font-size: 0.9em;\n}\n\n.timeline-stat[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.1em;\n}\n\n\n\n.validation-attempts[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.validation-attempts[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.attempts-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.attempt-item[_ngcontent-%COMP%] {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n}\n\n.attempt-item.success[_ngcontent-%COMP%] {\n background: #28a74510;\n border-color: #28a74530;\n}\n\n.attempt-item.failed[_ngcontent-%COMP%] {\n background: #dc354510;\n border-color: #dc354530;\n}\n\n.attempt-number[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.attempt-item.success[_ngcontent-%COMP%] .attempt-number[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n.attempt-item.failed[_ngcontent-%COMP%] .attempt-number[_ngcontent-%COMP%] {\n color: #dc3545;\n}\n\n.attempt-details[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n font-size: 0.85em;\n}\n\n.attempt-time[_ngcontent-%COMP%] {\n color: #6c757d;\n}\n\n.attempt-error[_ngcontent-%COMP%] {\n color: #dc3545;\n flex: 1 0 100%;\n}\n\n.output-length[_ngcontent-%COMP%] {\n color: #6c757d;\n font-style: italic;\n}\n\n\n\n.validation-json[_ngcontent-%COMP%] {\n margin-top: 24px;\n}\n\n.validation-json[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.json-viewer-container[_ngcontent-%COMP%] {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n overflow: hidden;\n}\n\n\n\n.panel-badge.success[_ngcontent-%COMP%] {\n background: #28a745;\n color: white;\n}"] }); }
1955
+ } }, dependencies: [i4.ɵNgNoValidate, i4.NgControlStatus, i4.NgControlStatusGroup, i4.NgModel, i4.NgForm, i5.PanelBarComponent, i5.PanelBarItemComponent, i5.PanelBarContentDirective, i5.PanelBarItemTitleDirective, i5.ExpansionPanelComponent, i5.ExpansionPanelTitleDirective, i6.ButtonComponent, i7.FormToolbarComponent, i8.CodeEditorComponent, i9.ChatMessageViewerComponent, i10.DatePipe], styles: ["\n\n.error-info[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n color: #dc2626;\n font-size: 14px;\n}\n\n.error-details[_ngcontent-%COMP%] {\n margin-top: 12px;\n}\n\n.error-details[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: #991b1b;\n font-size: 14px;\n font-weight: 600;\n}\n\n.error-hint[_ngcontent-%COMP%] {\n margin: 0;\n color: #7f1d1d;\n font-size: 14px;\n font-style: italic;\n}\n\n\n\n.prompt-run-header[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border-bottom: 2px solid #e9ecef;\n padding: 20px;\n margin-bottom: 0;\n}\n\n.header-content[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n margin-bottom: 16px;\n}\n\n.run-overview[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n flex: 1;\n}\n\n.run-icon-wrapper[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-icon-wrapper[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n}\n\n.run-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.run-title[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 1.5em;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.run-id[_ngcontent-%COMP%] {\n font-size: 0.8em;\n color: #6c757d;\n font-weight: 400;\n font-family: 'Courier New', monospace;\n}\n\n.run-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n color: white;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.status-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.9em;\n}\n\n.run-type-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #f1f3f5;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.prompt-name[_ngcontent-%COMP%], .model-name[_ngcontent-%COMP%], .vendor-name[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.85em;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.prompt-name[_ngcontent-%COMP%]:hover, .model-name[_ngcontent-%COMP%]:hover, .vendor-name[_ngcontent-%COMP%]:hover {\n background: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.original-run[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n color: #ff6358;\n text-decoration: none;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.original-link[_ngcontent-%COMP%]:hover {\n color: #ff4444;\n text-decoration: underline;\n}\n\n.run-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n\n\n.metrics-bar[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n padding-top: 16px;\n border-top: 1px solid #e9ecef;\n flex-wrap: wrap;\n}\n\n.metric-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.metric-item[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n font-size: 1.2em;\n color: #6c757d;\n width: 24px;\n text-align: center;\n}\n\n.metric-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.metric-label[_ngcontent-%COMP%] {\n font-size: 0.75em;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value[_ngcontent-%COMP%] {\n font-size: 1.1em;\n font-weight: 600;\n color: #2c3e50;\n}\n\n\n\n.form-content[_ngcontent-%COMP%] {\n padding: 16px;\n}\n\n.panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n\n\n.sub-panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n font-size: 0.95em;\n}\n\n.sub-panel-content[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] > .k-item[_ngcontent-%COMP%] {\n border: 1px solid #e5e7eb;\n margin-bottom: 8px;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] > .k-item[_ngcontent-%COMP%] > .k-link[_ngcontent-%COMP%] {\n background-color: #f9fafb;\n padding: 12px 16px;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] > .k-item.k-expanded[_ngcontent-%COMP%] > .k-link[_ngcontent-%COMP%] {\n background-color: #f3f4f6;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] .k-content[_ngcontent-%COMP%] {\n padding: 0;\n background: white;\n}\n\n\n\n.sub-panel-content[_ngcontent-%COMP%] mj-chat-message-viewer[_ngcontent-%COMP%] {\n display: block;\n min-height: 200px;\n max-height: 750px; \n\n height: auto;\n overflow: hidden;\n}\n\n\n\n.sub-expansion-panel[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-expander {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-expander:hover {\n background-color: #edf2f7;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-header {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-content {\n background-color: #ffffff;\n border-color: #e2e8f0;\n}\n\n.panel-badge[_ngcontent-%COMP%] {\n margin-left: auto;\n padding: 2px 8px;\n border-radius: 12px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n.panel-badge.error[_ngcontent-%COMP%] {\n background: #dc3545;\n color: white;\n}\n\n.panel-count[_ngcontent-%COMP%] {\n color: #6c757d;\n font-weight: 400;\n font-size: 0.9em;\n}\n\n.panel-content[_ngcontent-%COMP%] {\n padding: 20px;\n max-height: none !important;\n overflow: visible !important;\n}\n\n\n\n.json-editor-container[_ngcontent-%COMP%] {\n border: 1px solid #e9ecef;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.json-toolbar[_ngcontent-%COMP%] {\n background: #f8f9fa;\n padding: 8px 12px;\n border-bottom: 1px solid #e9ecef;\n display: flex;\n justify-content: flex-end;\n}\n\n\n\n.error-message[_ngcontent-%COMP%] {\n background: #dc354510;\n border: 1px solid #dc3545;\n border-radius: 6px;\n padding: 16px;\n display: flex;\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.error-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.5em;\n color: #dc3545;\n flex-shrink: 0;\n}\n\n.error-content[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 1em;\n}\n\n.error-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: #495057;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.3;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1em;\n}\n\n\n\n.loading-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.loading-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.6;\n color: #007bff;\n}\n\n.loading-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1em;\n}\n\n\n\n.metrics-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 24px;\n}\n\n.metric-card[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n}\n\n.metric-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.metric-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.2em;\n color: #6c757d;\n}\n\n.metric-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.9em;\n color: #6c757d;\n font-weight: 500;\n}\n\n.metric-value.large[_ngcontent-%COMP%] {\n font-size: 1.8em;\n font-weight: 700;\n color: #2c3e50;\n}\n\n.metric-rollup[_ngcontent-%COMP%] {\n margin-top: 8px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.metric-currency[_ngcontent-%COMP%] {\n margin-top: 4px;\n font-size: 0.85em;\n color: #6c757d;\n text-transform: uppercase;\n}\n\n\n\n.additional-metrics[_ngcontent-%COMP%] {\n border-top: 1px solid #e9ecef;\n padding-top: 16px;\n}\n\n.metric-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n border-bottom: 1px solid #f1f3f5;\n}\n\n.metric-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-label[_ngcontent-%COMP%] {\n font-weight: 500;\n color: #6c757d;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-value[_ngcontent-%COMP%] {\n font-weight: 400;\n color: #2c3e50;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-value.link[_ngcontent-%COMP%] {\n color: #007bff;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: color 0.2s;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-value.link[_ngcontent-%COMP%]:hover {\n color: #0056b3;\n}\n\n\n\n.parent-run-section[_ngcontent-%COMP%], \n.child-runs-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.parent-run-section[_ngcontent-%COMP%]:last-child, \n.child-runs-section[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.parent-run-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%], \n.child-runs-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 0.95em;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.runs-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.run-item[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.run-item[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n}\n\n.run-item.parent[_ngcontent-%COMP%] {\n background: #e3f2fd;\n border-color: #90caf9;\n}\n\n.run-item.parent[_ngcontent-%COMP%]:hover {\n background: #bbdefb;\n}\n\n.run-item-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-item-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.run-item-title[_ngcontent-%COMP%] {\n font-weight: 500;\n color: #2c3e50;\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.execution-order[_ngcontent-%COMP%] {\n background: #6c757d;\n color: white;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 0.75em;\n font-weight: 600;\n}\n\n.run-item-type[_ngcontent-%COMP%] {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 400;\n}\n\n.run-item-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.run-item-meta[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.status-indicator[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.run-item[_ngcontent-%COMP%] > i[_ngcontent-%COMP%]:last-child {\n color: #6c757d;\n font-size: 0.85em;\n}\n\n\n\n.detail-fields-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 24px;\n width: 100%;\n min-height: auto;\n overflow: visible;\n}\n\n.detail-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-field[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-value[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 1em;\n color: #2c3e50;\n padding: 10px 14px;\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n transition: all 0.2s;\n}\n\n.detail-value[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child {\n color: #6c757d;\n font-size: 1.1em;\n width: 20px;\n text-align: center;\n}\n\n.detail-value.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.detail-value.clickable[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.detail-value.clickable[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:last-child {\n margin-left: auto;\n font-size: 0.85em;\n opacity: 0.6;\n}\n\n.detail-value.clickable[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%]:last-child {\n opacity: 1;\n}\n\n.detail-value.null-value[_ngcontent-%COMP%] {\n color: #adb5bd;\n font-style: italic;\n}\n\n.detail-value.null-value[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child {\n opacity: 0.5;\n}\n\n\n\nkendo-panelbar[_ngcontent-%COMP%] {\n border: none !important;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n border: 1px solid #e9ecef !important;\n border-radius: 8px !important;\n overflow: hidden;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] .k-panelbar-header[_ngcontent-%COMP%] {\n background: #f8f9fa !important;\n border: none !important;\n padding: 12px 16px !important;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] .k-panelbar-header[_ngcontent-%COMP%]:hover {\n background: #e9ecef !important;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] .k-panelbar-content[_ngcontent-%COMP%] {\n border: none !important;\n padding: 0 !important;\n max-height: none !important;\n overflow: visible !important;\n}\n\n\n\n.validation-summary[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.summary-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.summary-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1em;\n color: #2c3e50;\n}\n\n.validation-status[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 16px;\n border-radius: 20px;\n font-weight: 500;\n font-size: 0.9em;\n}\n\n.validation-status.success[_ngcontent-%COMP%] {\n background: #28a74520;\n color: #28a745;\n}\n\n.validation-status.failed[_ngcontent-%COMP%] {\n background: #dc354520;\n color: #dc3545;\n}\n\n.validation-metrics[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.metric-card.small[_ngcontent-%COMP%] {\n padding: 16px;\n text-align: center;\n}\n\n.metric-card.small[_ngcontent-%COMP%] .metric-label[_ngcontent-%COMP%] {\n font-size: 0.8em;\n margin-bottom: 8px;\n font-weight: 600;\n}\n\n.metric-card.small[_ngcontent-%COMP%] .metric-value[_ngcontent-%COMP%] {\n font-size: 1.4em;\n font-weight: 700;\n}\n\n.validation-error[_ngcontent-%COMP%], \n.common-error[_ngcontent-%COMP%] {\n background: #dc354510;\n border: 1px solid #dc354530;\n border-radius: 8px;\n padding: 16px;\n margin-bottom: 16px;\n}\n\n.validation-error[_ngcontent-%COMP%] h5[_ngcontent-%COMP%], \n.common-error[_ngcontent-%COMP%] h5[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 0.95em;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.validation-error[_ngcontent-%COMP%] p[_ngcontent-%COMP%], \n.common-error[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: #495057;\n font-size: 0.9em;\n}\n\n.error-count[_ngcontent-%COMP%] {\n display: inline-block;\n margin-top: 8px;\n padding: 2px 8px;\n background: #dc3545;\n color: white;\n border-radius: 12px;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n\n\n.retry-timeline[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.retry-timeline[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.timeline-info[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n}\n\n.timeline-stat[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #6c757d;\n font-size: 0.9em;\n}\n\n.timeline-stat[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.1em;\n}\n\n\n\n.validation-attempts[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.validation-attempts[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.attempts-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.attempt-item[_ngcontent-%COMP%] {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n}\n\n.attempt-item.success[_ngcontent-%COMP%] {\n background: #28a74510;\n border-color: #28a74530;\n}\n\n.attempt-item.failed[_ngcontent-%COMP%] {\n background: #dc354510;\n border-color: #dc354530;\n}\n\n.attempt-number[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.attempt-item.success[_ngcontent-%COMP%] .attempt-number[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n.attempt-item.failed[_ngcontent-%COMP%] .attempt-number[_ngcontent-%COMP%] {\n color: #dc3545;\n}\n\n.attempt-details[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n font-size: 0.85em;\n}\n\n.attempt-time[_ngcontent-%COMP%] {\n color: #6c757d;\n}\n\n.attempt-error[_ngcontent-%COMP%] {\n color: #dc3545;\n flex: 1 0 100%;\n}\n\n.output-length[_ngcontent-%COMP%] {\n color: #6c757d;\n font-style: italic;\n}\n\n\n\n.validation-json[_ngcontent-%COMP%] {\n margin-top: 24px;\n}\n\n.validation-json[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.json-viewer-container[_ngcontent-%COMP%] {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n overflow: hidden;\n}\n\n\n\n.panel-badge.success[_ngcontent-%COMP%] {\n background: #28a745;\n color: white;\n}"], changeDetection: 0 }); }
1555
1956
  };
1556
1957
  AIPromptRunFormComponentExtended = __decorate([
1557
1958
  RegisterClass(BaseFormComponent, 'MJ: AI Prompt Runs')
@@ -1559,7 +1960,7 @@ AIPromptRunFormComponentExtended = __decorate([
1559
1960
  export { AIPromptRunFormComponentExtended };
1560
1961
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AIPromptRunFormComponentExtended, [{
1561
1962
  type: Component,
1562
- args: [{ selector: 'mj-ai-prompt-run-form', template: "<div class=\"record-form-container\">\n @if (record) {\n <form class=\"record-form\" #form=\"ngForm\">\n <mj-form-toolbar [form]=\"this\"></mj-form-toolbar>\n\n <!-- Header Section -->\n <div class=\"prompt-run-header\">\n <div class=\"header-content\">\n <div class=\"run-overview\">\n <div class=\"run-icon-wrapper\" [style.background-color]=\"getStatusColor() + '20'\">\n <i [class]=\"'fa-solid ' + getStatusIcon()\" [style.color]=\"getStatusColor()\"></i>\n </div>\n <div class=\"run-info\">\n <h1 class=\"run-title\">\n Prompt Run\n @if (record.ID) {\n <span class=\"run-id\">#{{ record.ID.substring(0, 8) }}</span>\n }\n </h1>\n <div class=\"run-meta\">\n <span class=\"status-badge\" [style.background-color]=\"getStatusColor()\">\n <i [class]=\"'fa-solid ' + getStatusIcon()\"></i>\n {{ getStatusText() }}\n </span>\n @if (record.RunType) {\n <span class=\"run-type-badge\" [style.color]=\"getRunTypeColor(record.RunType)\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(record.RunType)\"></i>\n {{ record.RunType }}\n </span>\n }\n @if (prompt) {\n <span class=\"prompt-name\" (click)=\"navigateToEntity('AI Prompts', prompt.ID)\" title=\"View Prompt\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n {{ prompt.Name }}\n </span>\n }\n @if (model) {\n <span class=\"model-name\" (click)=\"navigateToEntity('AI Models', model.ID)\" title=\"View Model\">\n <i class=\"fa-solid fa-microchip\"></i>\n {{ model.Name }}\n </span>\n }\n @if (record.Vendor) {\n <span class=\"vendor-name\" (click)=\"navigateToEntity('MJ: AI Vendors', record.VendorID)\" title=\"View Vendor\">\n <i class=\"fa-solid fa-building\"></i>\n {{ record.Vendor }}\n </span>\n }\n @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 <div class=\"metrics-bar\">\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-clock\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Duration</div>\n <div class=\"metric-value\">{{ formatDuration(record.ExecutionTimeMS) }}</div>\n </div>\n </div>\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-coins\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Total Tokens</div>\n <div class=\"metric-value\">{{ formatTokens(record.TokensUsed) }}</div>\n </div>\n </div>\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-dollar-sign\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Cost</div>\n <div class=\"metric-value\">{{ formatCost(record.TotalCost || record.Cost) }}</div>\n </div>\n </div>\n @if (record.RunAt) {\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Started</div>\n <div class=\"metric-value\">{{ record.RunAt | date:'short' }}</div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Main Content with Expansion Panels -->\n <div class=\"form-content\">\n <kendo-panelbar [keepItemContent]=\"true\">\n \n <!-- Input Panel with nested sub-panels -->\n <kendo-panelbar-item [expanded]=\"inputExpanded\" (stateChange)=\"onInputPanelToggle()\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n Input\n @if (record.Messages && record.Messages.trim() !== '') {\n <span class=\"panel-badge\">JSON</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n @if (record.Messages && record.Messages.trim() !== '') {\n <!-- Nested expansion panels for sub-sections -->\n <div class=\"nested-panels\">\n <!-- Messages Sub-Panel -->\n <kendo-expansionpanel \n [expanded]=\"messagesExpanded\" \n class=\"sub-expansion-panel\"\n [animation]=\"false\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span class=\"sub-panel-title\">\n <i class=\"fa-solid fa-comments\"></i>\n Messages\n @if (chatMessages.length > 0) {\n <span class=\"panel-count\">({{ chatMessages.length }})</span>\n }\n </span>\n </ng-template>\n <div class=\"sub-panel-content\">\n @if (isParsingMessages || isLoadingRelatedData) {\n <div class=\"loading-state\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <p>Loading messages...</p>\n </div>\n } @else if (chatMessages.length > 0) {\n <mj-chat-message-viewer \n [messages]=\"chatMessages\">\n </mj-chat-message-viewer>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-comment-slash\"></i>\n <p>No chat messages found</p>\n </div>\n }\n </div>\n </kendo-expansionpanel>\n \n <!-- Data Sub-Panel -->\n <kendo-expansionpanel \n [expanded]=\"dataExpanded\" \n class=\"sub-expansion-panel\"\n [animation]=\"false\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span class=\"sub-panel-title\">\n <i class=\"fa-solid fa-database\"></i>\n Data\n @if (inputData) {\n <span class=\"panel-badge\">Object</span>\n }\n </span>\n </ng-template>\n <div class=\"sub-panel-content\">\n @if (inputData && formattedData) {\n <div class=\"json-editor-container\">\n <div class=\"json-toolbar\">\n <button kendoButton\n fillMode=\"flat\" \n size=\"small\"\n (click)=\"copyToClipboard(formattedData, 'Data')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedData\"\n name=\"formattedData\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-database\"></i>\n <p>No data object found</p>\n </div>\n }\n </div>\n </kendo-expansionpanel>\n \n <!-- Raw Sub-Panel -->\n <kendo-expansionpanel \n [expanded]=\"rawExpanded\" \n class=\"sub-expansion-panel\"\n [animation]=\"false\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span class=\"sub-panel-title\">\n <i class=\"fa-solid fa-code\"></i>\n Raw\n </span>\n </ng-template>\n <div class=\"sub-panel-content\">\n <div class=\"json-editor-container\">\n <div class=\"json-toolbar\">\n <button kendoButton\n fillMode=\"flat\" \n size=\"small\"\n (click)=\"copyToClipboard(formattedMessages, 'Messages')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedMessages\"\n name=\"formattedMessages\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n </kendo-expansionpanel>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-comment-slash\"></i>\n <p>No input messages recorded</p>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Result Panel -->\n <kendo-panelbar-item [expanded]=\"resultExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-square-check\"></i>\n Result\n @if (record.Result && record.Result.trim() !== '') {\n <span class=\"panel-badge\">JSON</span>\n }\n @if (record.ErrorMessage) {\n <span class=\"panel-badge error\">Error</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n @if (record.ErrorMessage) {\n <div class=\"error-message\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <div class=\"error-content\">\n <h4>Error Message</h4>\n <p>{{ record.ErrorMessage }}</p>\n </div>\n </div>\n }\n \n @if (record.Result && record.Result.trim() !== '') {\n <div class=\"json-editor-container\">\n <div class=\"json-toolbar\">\n <button kendoButton\n fillMode=\"flat\" \n size=\"small\"\n (click)=\"copyToClipboard(formattedResult, 'Result')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedResult\"\n name=\"formattedResult\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </div>\n } @else if (!record.ErrorMessage) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No result data recorded</p>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Token Usage & Metrics Panel -->\n <kendo-panelbar-item [expanded]=\"metricsExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n Token Usage & Metrics\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <div class=\"metrics-grid\">\n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-message\"></i>\n <h4>Prompt Tokens</h4>\n </div>\n <div class=\"metric-value large\">{{ formatTokens(record.TokensPrompt) }}</div>\n @if (record.TokensPromptRollup && record.TokensPromptRollup !== record.TokensPrompt) {\n <div class=\"metric-rollup\">\n <span>Rollup: {{ formatTokens(record.TokensPromptRollup) }}</span>\n </div>\n }\n </div>\n \n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-reply\"></i>\n <h4>Completion Tokens</h4>\n </div>\n <div class=\"metric-value large\">{{ formatTokens(record.TokensCompletion) }}</div>\n @if (record.TokensCompletionRollup && record.TokensCompletionRollup !== record.TokensCompletion) {\n <div class=\"metric-rollup\">\n <span>Rollup: {{ formatTokens(record.TokensCompletionRollup) }}</span>\n </div>\n }\n </div>\n \n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-coins\"></i>\n <h4>Total Tokens</h4>\n </div>\n <div class=\"metric-value large\">{{ formatTokens(record.TokensUsed) }}</div>\n @if (record.TokensUsedRollup && record.TokensUsedRollup !== record.TokensUsed) {\n <div class=\"metric-rollup\">\n <span>Rollup: {{ formatTokens(record.TokensUsedRollup) }}</span>\n </div>\n }\n </div>\n \n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-dollar-sign\"></i>\n <h4>Cost</h4>\n </div>\n <div class=\"metric-value large\">{{ formatCost(record.Cost) }}</div>\n @if (record.TotalCost && record.TotalCost !== record.Cost) {\n <div class=\"metric-rollup\">\n <span>Total: {{ formatCost(record.TotalCost) }}</span>\n </div>\n }\n @if (record.CostCurrency) {\n <div class=\"metric-currency\">{{ record.CostCurrency }}</div>\n }\n </div>\n </div>\n \n <!-- Additional Metrics -->\n <div class=\"additional-metrics\">\n @if (record.ExecutionOrder !== null) {\n <div class=\"metric-row\">\n <span class=\"metric-label\">Execution Order:</span>\n <span class=\"metric-value\">{{ record.ExecutionOrder }}</span>\n </div>\n }\n @if (record.ConfigurationID) {\n <div class=\"metric-row\">\n <span class=\"metric-label\">Configuration:</span>\n <span class=\"metric-value\">{{ record.Configuration }}</span>\n </div>\n }\n @if (record.AgentID) {\n <div class=\"metric-row\">\n <span class=\"metric-label\">Agent:</span>\n <span class=\"metric-value link\" (click)=\"navigateToEntity('AI Agents', record.AgentID)\">\n {{ record.Agent }}\n <i class=\"fa-solid fa-external-link\"></i>\n </span>\n </div>\n }\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Validation & Retry Panel -->\n @if (record && ((record.ValidationAttemptCount && record.ValidationAttemptCount > 0) || record.ValidationBehavior)) {\n <kendo-panelbar-item [expanded]=\"validationExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-shield-check\"></i>\n Validation & Retries\n @if (record && record.ValidationAttemptCount && record.ValidationAttemptCount > 1) {\n <span class=\"panel-count\">({{ record.ValidationAttemptCount }} attempts)</span>\n }\n @if (record.FinalValidationPassed) {\n <span class=\"panel-badge success\">Passed</span>\n } @else if (record.FinalValidationPassed === false) {\n <span class=\"panel-badge error\">Failed</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <!-- Validation Summary -->\n <div class=\"validation-summary\">\n <div class=\"summary-header\">\n <h4>Validation Summary</h4>\n <div class=\"validation-status\" [class.success]=\"record.FinalValidationPassed\" [class.failed]=\"!record.FinalValidationPassed\">\n <i [class]=\"record.FinalValidationPassed ? 'fa-solid fa-check-circle' : 'fa-solid fa-times-circle'\"></i>\n {{ record.FinalValidationPassed ? 'Validation Passed' : 'Validation Failed' }}\n </div>\n </div>\n \n <div class=\"validation-metrics\">\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Total Attempts</div>\n <div class=\"metric-value\">{{ record.ValidationAttemptCount || 0 }}</div>\n </div>\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Successful</div>\n <div class=\"metric-value\">{{ record.SuccessfulValidationCount || 0 }}</div>\n </div>\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Behavior</div>\n <div class=\"metric-value\">{{ record.ValidationBehavior || 'Not set' }}</div>\n </div>\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Retry Strategy</div>\n <div class=\"metric-value\">{{ record.RetryStrategy || 'Not set' }}</div>\n </div>\n </div>\n \n @if (record.FinalValidationError) {\n <div class=\"validation-error\">\n <h5><i class=\"fa-solid fa-exclamation-triangle\"></i> Final Validation Error</h5>\n <p>{{ record.FinalValidationError }}</p>\n @if (record && record.ValidationErrorCount && record.ValidationErrorCount > 0) {\n <span class=\"error-count\">{{ record.ValidationErrorCount }} validation errors</span>\n }\n </div>\n }\n \n @if (record.CommonValidationError && record.CommonValidationError !== record.FinalValidationError) {\n <div class=\"common-error\">\n <h5><i class=\"fa-solid fa-repeat\"></i> Most Common Error</h5>\n <p>{{ record.CommonValidationError }}</p>\n </div>\n }\n </div>\n \n <!-- Retry Timeline -->\n @if (record && record.ValidationAttemptCount && record.ValidationAttemptCount > 1) {\n <div class=\"retry-timeline\">\n <h4>Retry Timeline</h4>\n <div class=\"timeline-info\">\n <div class=\"timeline-stat\">\n <i class=\"fa-solid fa-clock\"></i>\n <span>First Attempt: {{ record.FirstAttemptAt | date:'short' }}</span>\n </div>\n <div class=\"timeline-stat\">\n <i class=\"fa-solid fa-flag-checkered\"></i>\n <span>Last Attempt: {{ record.LastAttemptAt | date:'short' }}</span>\n </div>\n <div class=\"timeline-stat\">\n <i class=\"fa-solid fa-stopwatch\"></i>\n <span>Total Retry Duration: {{ formatDuration(record.TotalRetryDurationMS) }}</span>\n </div>\n </div>\n </div>\n }\n \n <!-- Validation Attempts Details -->\n @if (validationAttempts && validationAttempts.length > 0) {\n <div class=\"validation-attempts\">\n <h4>Validation Attempts</h4>\n <div class=\"attempts-list\">\n @for (attempt of validationAttempts; track attempt.attemptNumber) {\n <div class=\"attempt-item\" [class.success]=\"attempt.success\" [class.failed]=\"!attempt.success\">\n <div class=\"attempt-number\">\n <i [class]=\"attempt.success ? 'fa-solid fa-check' : 'fa-solid fa-times'\"></i>\n Attempt #{{ attempt.attemptNumber }}\n </div>\n <div class=\"attempt-details\">\n <span class=\"attempt-time\">{{ attempt.timestamp }}</span>\n @if (!attempt.success) {\n <span class=\"attempt-error\">{{ attempt.errorMessage || 'Unknown error' }}</span>\n @if (attempt.validationErrorCount > 0) {\n <span class=\"error-count\">({{ attempt.validationErrorCount }} errors)</span>\n }\n }\n @if (attempt.outputLength) {\n <span class=\"output-length\">Output: {{ attempt.outputLength }} chars</span>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Validation Summary JSON -->\n @if (validationSummary) {\n <div class=\"validation-json\">\n <h4>Validation Summary Details</h4>\n <div class=\"json-viewer-container\">\n <mj-code-editor \n [(ngModel)]=\"formattedValidationSummary\"\n name=\"formattedValidationSummary\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 200px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n }\n \n <!-- Validation Attempts JSON -->\n @if (record.ValidationAttempts) {\n <div class=\"validation-json\">\n <h4>Validation Attempts (Raw JSON)</h4>\n <div class=\"json-viewer-container\">\n <mj-code-editor \n [(ngModel)]=\"formattedValidationAttempts\"\n name=\"formattedValidationAttempts\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n }\n \n <!-- Hierarchy Panel (for parent/child relationships) -->\n @if (record.ParentID || childRuns.length > 0) {\n <kendo-panelbar-item [expanded]=\"hierarchyExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-sitemap\"></i>\n Run Hierarchy\n @if (childRuns.length > 0) {\n <span class=\"panel-count\">({{ childRuns.length }} children)</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n @if (parentRun) {\n <div class=\"parent-run-section\">\n <h4><i class=\"fa-solid fa-level-up-alt\"></i> Parent Run</h4>\n <div class=\"run-item parent\" (click)=\"navigateToEntity('MJ: AI Prompt Runs', parentRun.ID)\">\n <div class=\"run-item-icon\" [style.background-color]=\"getStatusColor() + '20'\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(parentRun.RunType)\"></i>\n </div>\n <div class=\"run-item-content\">\n <div class=\"run-item-title\">\n Parent Run #{{ parentRun.ID.substring(0, 8) }}\n <span class=\"run-item-type\">{{ parentRun.RunType }}</span>\n </div>\n <div class=\"run-item-meta\">\n <span><i class=\"fa-solid fa-clock\"></i> {{ formatDuration(parentRun.ExecutionTimeMS) }}</span>\n <span><i class=\"fa-solid fa-coins\"></i> {{ formatTokens(parentRun.TokensUsed) }}</span>\n <span><i class=\"fa-solid fa-calendar\"></i> {{ parentRun.RunAt | date:'short' }}</span>\n </div>\n </div>\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n </div>\n }\n \n @if (childRuns.length > 0) {\n <div class=\"child-runs-section\">\n <h4><i class=\"fa-solid fa-level-down-alt\"></i> Child Runs</h4>\n <div class=\"runs-list\">\n @for (childRun of childRuns; track childRun.ID) {\n <div class=\"run-item child\" (click)=\"navigateToEntity('MJ: AI Prompt Runs', childRun.ID)\">\n <div class=\"run-item-icon\" [style.background-color]=\"getStatusColor() + '20'\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(childRun.RunType)\"></i>\n </div>\n <div class=\"run-item-content\">\n <div class=\"run-item-title\">\n Child Run #{{ childRun.ID.substring(0, 8) }}\n @if (childRun.ExecutionOrder !== null) {\n <span class=\"execution-order\">#{{ childRun.ExecutionOrder }}</span>\n }\n <span class=\"run-item-type\">{{ childRun.RunType }}</span>\n </div>\n <div class=\"run-item-meta\">\n <span class=\"status-indicator\" [style.color]=\"getStatusColor()\">\n <i [class]=\"'fa-solid ' + getStatusIcon()\"></i>\n {{ childRun.Success ? 'Success' : childRun.ErrorMessage ? 'Failed' : 'Running' }}\n </span>\n <span><i class=\"fa-solid fa-clock\"></i> {{ formatDuration(childRun.ExecutionTimeMS) }}</span>\n <span><i class=\"fa-solid fa-coins\"></i> {{ formatTokens(childRun.TokensUsed) }}</span>\n </div>\n </div>\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n }\n \n <!-- Additional Details Panel -->\n <kendo-panelbar-item [expanded]=\"false\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Additional Details\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <div class=\"detail-fields-grid\">\n @if (record.AgentID) {\n <div class=\"detail-field\">\n <label>Agent</label>\n <div class=\"detail-value clickable\" (click)=\"navigateToEntity('AI Agents', record.AgentID)\" title=\"View Agent\">\n <i class=\"fa-solid fa-robot\"></i>\n {{ record.Agent || 'Unknown' }}\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n </div>\n }\n \n @if (record.ConfigurationID) {\n <div class=\"detail-field\">\n <label>Configuration</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-cog\"></i>\n {{ record.Configuration || 'Unknown' }}\n </div>\n </div>\n }\n \n @if (record.RunType) {\n <div class=\"detail-field\">\n <label>Run Type</label>\n <div class=\"detail-value\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(record.RunType)\"></i>\n {{ record.RunType }}\n </div>\n </div>\n }\n \n @if (record.ResponseFormat) {\n <div class=\"detail-field\">\n <label>Response Format</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-code\"></i>\n {{ record.ResponseFormat }}\n </div>\n </div>\n }\n \n <div class=\"detail-field\">\n <label>Temperature</label>\n <div class=\"detail-value\" [class.null-value]=\"record.Temperature === null || record.Temperature === undefined\">\n <i class=\"fa-solid fa-temperature-high\"></i>\n {{ record.Temperature !== null && record.Temperature !== undefined ? record.Temperature : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Top P</label>\n <div class=\"detail-value\" [class.null-value]=\"record.TopP === null || record.TopP === undefined\">\n <i class=\"fa-solid fa-percentage\"></i>\n {{ record.TopP !== null && record.TopP !== undefined ? record.TopP : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Top K</label>\n <div class=\"detail-value\" [class.null-value]=\"record.TopK === null || record.TopK === undefined\">\n <i class=\"fa-solid fa-list-ol\"></i>\n {{ record.TopK !== null && record.TopK !== undefined ? record.TopK : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Min P</label>\n <div class=\"detail-value\" [class.null-value]=\"record.MinP === null || record.MinP === undefined\">\n <i class=\"fa-solid fa-filter\"></i>\n {{ record.MinP !== null && record.MinP !== undefined ? record.MinP : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Frequency Penalty</label>\n <div class=\"detail-value\" [class.null-value]=\"record.FrequencyPenalty === null || record.FrequencyPenalty === undefined\">\n <i class=\"fa-solid fa-repeat\"></i>\n {{ record.FrequencyPenalty !== null && record.FrequencyPenalty !== undefined ? record.FrequencyPenalty : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Presence Penalty</label>\n <div class=\"detail-value\" [class.null-value]=\"record.PresencePenalty === null || record.PresencePenalty === undefined\">\n <i class=\"fa-solid fa-plus-circle\"></i>\n {{ record.PresencePenalty !== null && record.PresencePenalty !== undefined ? record.PresencePenalty : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Seed</label>\n <div class=\"detail-value\" [class.null-value]=\"record.Seed === null || record.Seed === undefined\">\n <i class=\"fa-solid fa-seedling\"></i>\n {{ record.Seed !== null && record.Seed !== undefined ? record.Seed : '\u2014' }}\n </div>\n </div>\n \n @if (record.RunAt) {\n <div class=\"detail-field\">\n <label>Started At</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ record.RunAt | date:'medium' }}\n </div>\n </div>\n }\n \n @if (record.CompletedAt) {\n <div class=\"detail-field\">\n <label>Completed At</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{ record.CompletedAt | date:'medium' }}\n </div>\n </div>\n }\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n </kendo-panelbar>\n </div>\n </form>\n }\n</div>", styles: ["/* Header Section */\n.prompt-run-header {\n background: #f8f9fa;\n border-bottom: 2px solid #e9ecef;\n padding: 20px;\n margin-bottom: 0;\n}\n\n.header-content {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n margin-bottom: 16px;\n}\n\n.run-overview {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n flex: 1;\n}\n\n.run-icon-wrapper {\n width: 56px;\n height: 56px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-icon-wrapper i {\n font-size: 24px;\n}\n\n.run-info {\n flex: 1;\n min-width: 0;\n}\n\n.run-title {\n margin: 0 0 8px 0;\n font-size: 1.5em;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.run-id {\n font-size: 0.8em;\n color: #6c757d;\n font-weight: 400;\n font-family: 'Courier New', monospace;\n}\n\n.run-meta {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n color: white;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.status-badge i {\n font-size: 0.9em;\n}\n\n.run-type-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #f1f3f5;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.prompt-name, .model-name, .vendor-name {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.85em;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.prompt-name:hover, .model-name:hover, .vendor-name:hover {\n background: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.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/* Panels */\n.form-content {\n padding: 16px;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n/* Nested Sub-Panel Styles */\n.sub-panel-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n font-size: 0.95em;\n}\n\n.sub-panel-content {\n padding: 0;\n}\n\n/* Nested kendo-panelbar styles */\n.k-panelbar .k-panelbar {\n border: none;\n background: transparent;\n}\n\n.k-panelbar .k-panelbar > .k-item {\n border: 1px solid #e5e7eb;\n margin-bottom: 8px;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.k-panelbar .k-panelbar > .k-item > .k-link {\n background-color: #f9fafb;\n padding: 12px 16px;\n}\n\n.k-panelbar .k-panelbar > .k-item.k-expanded > .k-link {\n background-color: #f3f4f6;\n}\n\n.k-panelbar .k-panelbar .k-content {\n padding: 0;\n background: white;\n}\n\n/* Ensure chat message viewer takes appropriate height */\n.sub-panel-content mj-chat-message-viewer {\n display: block;\n min-height: 200px;\n max-height: 750px; /* Increased by 50% from 500px */\n height: auto;\n overflow: hidden;\n}\n\n/* Different colors for sub-expansion panels */\n.sub-expansion-panel {\n margin-bottom: 8px;\n}\n\n.sub-expansion-panel::ng-deep .k-expander {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel::ng-deep .k-expander:hover {\n background-color: #edf2f7;\n}\n\n.sub-expansion-panel::ng-deep .k-header {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel::ng-deep .k-content {\n background-color: #ffffff;\n border-color: #e2e8f0;\n}\n\n.panel-badge {\n margin-left: auto;\n padding: 2px 8px;\n border-radius: 12px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n.panel-badge.error {\n background: #dc3545;\n color: white;\n}\n\n.panel-count {\n color: #6c757d;\n font-weight: 400;\n font-size: 0.9em;\n}\n\n.panel-content {\n padding: 20px;\n max-height: none !important;\n overflow: visible !important;\n}\n\n/* JSON Editor Container */\n.json-editor-container {\n border: 1px solid #e9ecef;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.json-toolbar {\n background: #f8f9fa;\n padding: 8px 12px;\n border-bottom: 1px solid #e9ecef;\n display: flex;\n justify-content: flex-end;\n}\n\n/* Error Message */\n.error-message {\n background: #dc354510;\n border: 1px solid #dc3545;\n border-radius: 6px;\n padding: 16px;\n display: flex;\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.error-message i {\n font-size: 1.5em;\n color: #dc3545;\n flex-shrink: 0;\n}\n\n.error-content h4 {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 1em;\n}\n\n.error-content p {\n margin: 0;\n color: #495057;\n}\n\n/* Empty State */\n.empty-state {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.empty-state i {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.3;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 1.1em;\n}\n\n/* Loading State */\n.loading-state {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.loading-state i {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.6;\n color: #007bff;\n}\n\n.loading-state p {\n margin: 0;\n font-size: 1.1em;\n}\n\n/* Metrics Grid */\n.metrics-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 24px;\n}\n\n.metric-card {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n}\n\n.metric-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.metric-header i {\n font-size: 1.2em;\n color: #6c757d;\n}\n\n.metric-header h4 {\n margin: 0;\n font-size: 0.9em;\n color: #6c757d;\n font-weight: 500;\n}\n\n.metric-value.large {\n font-size: 1.8em;\n font-weight: 700;\n color: #2c3e50;\n}\n\n.metric-rollup {\n margin-top: 8px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.metric-currency {\n margin-top: 4px;\n font-size: 0.85em;\n color: #6c757d;\n text-transform: uppercase;\n}\n\n/* Additional Metrics */\n.additional-metrics {\n border-top: 1px solid #e9ecef;\n padding-top: 16px;\n}\n\n.metric-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n border-bottom: 1px solid #f1f3f5;\n}\n\n.metric-row:last-child {\n border-bottom: none;\n}\n\n.metric-row .metric-label {\n font-weight: 500;\n color: #6c757d;\n}\n\n.metric-row .metric-value {\n font-weight: 400;\n color: #2c3e50;\n}\n\n.metric-row .metric-value.link {\n color: #007bff;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: color 0.2s;\n}\n\n.metric-row .metric-value.link:hover {\n color: #0056b3;\n}\n\n/* Hierarchy Section */\n.parent-run-section,\n.child-runs-section {\n margin-bottom: 24px;\n}\n\n.parent-run-section:last-child,\n.child-runs-section:last-child {\n margin-bottom: 0;\n}\n\n.parent-run-section h4,\n.child-runs-section h4 {\n margin: 0 0 12px 0;\n font-size: 0.95em;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.runs-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.run-item {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.run-item:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n}\n\n.run-item.parent {\n background: #e3f2fd;\n border-color: #90caf9;\n}\n\n.run-item.parent:hover {\n background: #bbdefb;\n}\n\n.run-item-icon {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-item-content {\n flex: 1;\n min-width: 0;\n}\n\n.run-item-title {\n font-weight: 500;\n color: #2c3e50;\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.execution-order {\n background: #6c757d;\n color: white;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 0.75em;\n font-weight: 600;\n}\n\n.run-item-type {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 400;\n}\n\n.run-item-meta {\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.run-item-meta span {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.status-indicator {\n font-weight: 500;\n}\n\n.run-item > i:last-child {\n color: #6c757d;\n font-size: 0.85em;\n}\n\n/* Detail Fields Grid */\n.detail-fields-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 24px;\n width: 100%;\n min-height: auto;\n overflow: visible;\n}\n\n.detail-field {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-field label {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-value {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 1em;\n color: #2c3e50;\n padding: 10px 14px;\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n transition: all 0.2s;\n}\n\n.detail-value i:first-child {\n color: #6c757d;\n font-size: 1.1em;\n width: 20px;\n text-align: center;\n}\n\n.detail-value.clickable {\n cursor: pointer;\n}\n\n.detail-value.clickable:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.detail-value.clickable i:last-child {\n margin-left: auto;\n font-size: 0.85em;\n opacity: 0.6;\n}\n\n.detail-value.clickable:hover i:last-child {\n opacity: 1;\n}\n\n.detail-value.null-value {\n color: #adb5bd;\n font-style: italic;\n}\n\n.detail-value.null-value i:first-child {\n opacity: 0.5;\n}\n\n/* Kendo Overrides */\nkendo-panelbar {\n border: none !important;\n}\n\nkendo-panelbar-item {\n margin-bottom: 8px;\n border: 1px solid #e9ecef !important;\n border-radius: 8px !important;\n overflow: hidden;\n}\n\nkendo-panelbar-item .k-panelbar-header {\n background: #f8f9fa !important;\n border: none !important;\n padding: 12px 16px !important;\n}\n\nkendo-panelbar-item .k-panelbar-header:hover {\n background: #e9ecef !important;\n}\n\nkendo-panelbar-item .k-panelbar-content {\n border: none !important;\n padding: 0 !important;\n max-height: none !important;\n overflow: visible !important;\n}\n\n/* Validation Panel Styles */\n.validation-summary {\n margin-bottom: 24px;\n}\n\n.summary-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.summary-header h4 {\n margin: 0;\n font-size: 1.1em;\n color: #2c3e50;\n}\n\n.validation-status {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 16px;\n border-radius: 20px;\n font-weight: 500;\n font-size: 0.9em;\n}\n\n.validation-status.success {\n background: #28a74520;\n color: #28a745;\n}\n\n.validation-status.failed {\n background: #dc354520;\n color: #dc3545;\n}\n\n.validation-metrics {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.metric-card.small {\n padding: 16px;\n text-align: center;\n}\n\n.metric-card.small .metric-label {\n font-size: 0.8em;\n margin-bottom: 8px;\n font-weight: 600;\n}\n\n.metric-card.small .metric-value {\n font-size: 1.4em;\n font-weight: 700;\n}\n\n.validation-error,\n.common-error {\n background: #dc354510;\n border: 1px solid #dc354530;\n border-radius: 8px;\n padding: 16px;\n margin-bottom: 16px;\n}\n\n.validation-error h5,\n.common-error h5 {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 0.95em;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.validation-error p,\n.common-error p {\n margin: 0;\n color: #495057;\n font-size: 0.9em;\n}\n\n.error-count {\n display: inline-block;\n margin-top: 8px;\n padding: 2px 8px;\n background: #dc3545;\n color: white;\n border-radius: 12px;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n/* Retry Timeline */\n.retry-timeline {\n margin-bottom: 24px;\n}\n\n.retry-timeline h4 {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.timeline-info {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n}\n\n.timeline-stat {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #6c757d;\n font-size: 0.9em;\n}\n\n.timeline-stat i {\n font-size: 1.1em;\n}\n\n/* Validation Attempts */\n.validation-attempts {\n margin-bottom: 24px;\n}\n\n.validation-attempts h4 {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.attempts-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.attempt-item {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n}\n\n.attempt-item.success {\n background: #28a74510;\n border-color: #28a74530;\n}\n\n.attempt-item.failed {\n background: #dc354510;\n border-color: #dc354530;\n}\n\n.attempt-number {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.attempt-item.success .attempt-number {\n color: #28a745;\n}\n\n.attempt-item.failed .attempt-number {\n color: #dc3545;\n}\n\n.attempt-details {\n flex: 1;\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n font-size: 0.85em;\n}\n\n.attempt-time {\n color: #6c757d;\n}\n\n.attempt-error {\n color: #dc3545;\n flex: 1 0 100%;\n}\n\n.output-length {\n color: #6c757d;\n font-style: italic;\n}\n\n/* Validation JSON */\n.validation-json {\n margin-top: 24px;\n}\n\n.validation-json h4 {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.json-viewer-container {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n overflow: hidden;\n}\n\n/* Panel badge styles */\n.panel-badge.success {\n background: #28a745;\n color: white;\n}"] }]
1963
+ 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 <div class=\"metrics-bar\">\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-clock\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Duration</div>\n <div class=\"metric-value\">{{ formatDuration(record.ExecutionTimeMS) }}</div>\n </div>\n </div>\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-coins\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Total Tokens</div>\n <div class=\"metric-value\">{{ formatTokens(record.TokensUsed) }}</div>\n </div>\n </div>\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-dollar-sign\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Cost</div>\n <div class=\"metric-value\">{{ formatCost(record.TotalCost || record.Cost) }}</div>\n </div>\n </div>\n @if (record.RunAt) {\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Started</div>\n <div class=\"metric-value\">{{ record.RunAt | date:'short' }}</div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Main Content with Expansion Panels -->\n <div class=\"form-content\">\n <kendo-panelbar [keepItemContent]=\"true\">\n \n <!-- Input Panel with nested sub-panels -->\n <kendo-panelbar-item [expanded]=\"inputExpanded\" (stateChange)=\"onInputPanelToggle()\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n Input\n @if (record.Messages && record.Messages.trim() !== '') {\n <span class=\"panel-badge\">JSON</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n @if (record.Messages && record.Messages.trim() !== '') {\n <!-- Nested expansion panels for sub-sections -->\n <div class=\"nested-panels\">\n <!-- Messages Sub-Panel -->\n <kendo-expansionpanel \n [expanded]=\"messagesExpanded\" \n class=\"sub-expansion-panel\"\n [animation]=\"false\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span class=\"sub-panel-title\">\n <i class=\"fa-solid fa-comments\"></i>\n Messages\n @if (chatMessages.length > 0) {\n <span class=\"panel-count\">({{ chatMessages.length }})</span>\n }\n </span>\n </ng-template>\n <div class=\"sub-panel-content\">\n @if (isParsingMessages || isLoadingRelatedData) {\n <div class=\"loading-state\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <p>Loading messages...</p>\n </div>\n } @else if (chatMessages.length > 0) {\n <mj-chat-message-viewer \n [messages]=\"chatMessages\">\n </mj-chat-message-viewer>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-comment-slash\"></i>\n <p>No chat messages found</p>\n </div>\n }\n </div>\n </kendo-expansionpanel>\n \n <!-- Data Sub-Panel -->\n <kendo-expansionpanel \n [expanded]=\"dataExpanded\" \n class=\"sub-expansion-panel\"\n [animation]=\"false\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span class=\"sub-panel-title\">\n <i class=\"fa-solid fa-database\"></i>\n Data\n @if (inputData) {\n <span class=\"panel-badge\">Object</span>\n }\n </span>\n </ng-template>\n <div class=\"sub-panel-content\">\n @if (inputData && formattedData) {\n <div class=\"json-editor-container\">\n <div class=\"json-toolbar\">\n <button kendoButton\n fillMode=\"flat\" \n size=\"small\"\n (click)=\"copyToClipboard(formattedData, 'Data')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedData\"\n name=\"formattedData\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-database\"></i>\n <p>No data object found</p>\n </div>\n }\n </div>\n </kendo-expansionpanel>\n \n <!-- Raw Sub-Panel -->\n <kendo-expansionpanel \n [expanded]=\"rawExpanded\" \n class=\"sub-expansion-panel\"\n [animation]=\"false\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span class=\"sub-panel-title\">\n <i class=\"fa-solid fa-code\"></i>\n Raw\n </span>\n </ng-template>\n <div class=\"sub-panel-content\">\n <div class=\"json-editor-container\">\n <div class=\"json-toolbar\">\n <button kendoButton\n fillMode=\"flat\" \n size=\"small\"\n (click)=\"copyToClipboard(formattedMessages, 'Messages')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedMessages\"\n name=\"formattedMessages\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n </kendo-expansionpanel>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-comment-slash\"></i>\n <p>No input messages recorded</p>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Result Panel -->\n <kendo-panelbar-item [expanded]=\"resultExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-square-check\"></i>\n Result\n @if (record.Result && record.Result.trim() !== '') {\n <span class=\"panel-badge\">JSON</span>\n }\n @if (record.ErrorMessage) {\n <span class=\"panel-badge error\">Error</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n @if (record.ErrorMessage) {\n <div class=\"error-message\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <div class=\"error-content\">\n <h4>Error Message</h4>\n <p>{{ record.ErrorMessage }}</p>\n </div>\n </div>\n }\n \n @if (record.Result && record.Result.trim() !== '') {\n <div class=\"json-editor-container\">\n <div class=\"json-toolbar\">\n <button kendoButton\n fillMode=\"flat\" \n size=\"small\"\n (click)=\"copyToClipboard(formattedResult, 'Result')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedResult\"\n name=\"formattedResult\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </div>\n } @else if (!record.ErrorMessage) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No result data recorded</p>\n @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\">\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.ConfigurationID) {\n <div class=\"metric-row\">\n <span class=\"metric-label\">Configuration:</span>\n <span class=\"metric-value\">{{ record.Configuration }}</span>\n </div>\n }\n @if (record.AgentID) {\n <div class=\"metric-row\">\n <span class=\"metric-label\">Agent:</span>\n <span class=\"metric-value link\" (click)=\"navigateToEntity('AI Agents', record.AgentID)\">\n {{ record.Agent }}\n <i class=\"fa-solid fa-external-link\"></i>\n </span>\n </div>\n }\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Validation & Retry Panel -->\n @if (record && ((record.ValidationAttemptCount && record.ValidationAttemptCount > 0) || record.ValidationBehavior)) {\n <kendo-panelbar-item [expanded]=\"validationExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-shield-check\"></i>\n Validation & Retries\n @if (record && record.ValidationAttemptCount && record.ValidationAttemptCount > 1) {\n <span class=\"panel-count\">({{ record.ValidationAttemptCount }} attempts)</span>\n }\n @if (record.FinalValidationPassed) {\n <span class=\"panel-badge success\">Passed</span>\n } @else if (record.FinalValidationPassed === false) {\n <span class=\"panel-badge error\">Failed</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <!-- Validation Summary -->\n <div class=\"validation-summary\">\n <div class=\"summary-header\">\n <h4>Validation Summary</h4>\n <div class=\"validation-status\" [class.success]=\"record.FinalValidationPassed\" [class.failed]=\"!record.FinalValidationPassed\">\n <i [class]=\"record.FinalValidationPassed ? 'fa-solid fa-check-circle' : 'fa-solid fa-times-circle'\"></i>\n {{ record.FinalValidationPassed ? 'Validation Passed' : 'Validation Failed' }}\n </div>\n </div>\n \n <div class=\"validation-metrics\">\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Total Attempts</div>\n <div class=\"metric-value\">{{ record.ValidationAttemptCount || 0 }}</div>\n </div>\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Successful</div>\n <div class=\"metric-value\">{{ record.SuccessfulValidationCount || 0 }}</div>\n </div>\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Behavior</div>\n <div class=\"metric-value\">{{ record.ValidationBehavior || 'Not set' }}</div>\n </div>\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Retry Strategy</div>\n <div class=\"metric-value\">{{ record.RetryStrategy || 'Not set' }}</div>\n </div>\n </div>\n \n @if (record.FinalValidationError) {\n <div class=\"validation-error\">\n <h5><i class=\"fa-solid fa-exclamation-triangle\"></i> Final Validation Error</h5>\n <p>{{ record.FinalValidationError }}</p>\n @if (record && record.ValidationErrorCount && record.ValidationErrorCount > 0) {\n <span class=\"error-count\">{{ record.ValidationErrorCount }} validation errors</span>\n }\n </div>\n }\n \n @if (record.CommonValidationError && record.CommonValidationError !== record.FinalValidationError) {\n <div class=\"common-error\">\n <h5><i class=\"fa-solid fa-repeat\"></i> Most Common Error</h5>\n <p>{{ record.CommonValidationError }}</p>\n </div>\n }\n </div>\n \n <!-- Retry Timeline -->\n @if (record && record.ValidationAttemptCount && record.ValidationAttemptCount > 1) {\n <div class=\"retry-timeline\">\n <h4>Retry Timeline</h4>\n <div class=\"timeline-info\">\n <div class=\"timeline-stat\">\n <i class=\"fa-solid fa-clock\"></i>\n <span>First Attempt: {{ record.FirstAttemptAt | date:'short' }}</span>\n </div>\n <div class=\"timeline-stat\">\n <i class=\"fa-solid fa-flag-checkered\"></i>\n <span>Last Attempt: {{ record.LastAttemptAt | date:'short' }}</span>\n </div>\n <div class=\"timeline-stat\">\n <i class=\"fa-solid fa-stopwatch\"></i>\n <span>Total Retry Duration: {{ formatDuration(record.TotalRetryDurationMS) }}</span>\n </div>\n </div>\n </div>\n }\n \n <!-- Validation Attempts Details -->\n @if (validationAttempts && validationAttempts.length > 0) {\n <div class=\"validation-attempts\">\n <h4>Validation Attempts</h4>\n <div class=\"attempts-list\">\n @for (attempt of validationAttempts; track attempt.attemptNumber) {\n <div class=\"attempt-item\" [class.success]=\"attempt.success\" [class.failed]=\"!attempt.success\">\n <div class=\"attempt-number\">\n <i [class]=\"attempt.success ? 'fa-solid fa-check' : 'fa-solid fa-times'\"></i>\n Attempt #{{ attempt.attemptNumber }}\n </div>\n <div class=\"attempt-details\">\n <span class=\"attempt-time\">{{ attempt.timestamp }}</span>\n @if (!attempt.success) {\n <span class=\"attempt-error\">{{ attempt.errorMessage || 'Unknown error' }}</span>\n @if (attempt.validationErrorCount > 0) {\n <span class=\"error-count\">({{ attempt.validationErrorCount }} errors)</span>\n }\n }\n @if (attempt.outputLength) {\n <span class=\"output-length\">Output: {{ attempt.outputLength }} chars</span>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Validation Summary JSON -->\n @if (validationSummary) {\n <div class=\"validation-json\">\n <h4>Validation Summary Details</h4>\n <div class=\"json-viewer-container\">\n <mj-code-editor \n [(ngModel)]=\"formattedValidationSummary\"\n name=\"formattedValidationSummary\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 200px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n }\n \n <!-- Validation Attempts JSON -->\n @if (record.ValidationAttempts) {\n <div class=\"validation-json\">\n <h4>Validation Attempts (Raw JSON)</h4>\n <div class=\"json-viewer-container\">\n <mj-code-editor \n [(ngModel)]=\"formattedValidationAttempts\"\n name=\"formattedValidationAttempts\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n }\n \n <!-- Hierarchy Panel (for parent/child relationships) -->\n @if (record.ParentID || childRuns.length > 0) {\n <kendo-panelbar-item [expanded]=\"hierarchyExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-sitemap\"></i>\n Run Hierarchy\n @if (childRuns.length > 0) {\n <span class=\"panel-count\">({{ childRuns.length }} children)</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n @if (parentRun) {\n <div class=\"parent-run-section\">\n <h4><i class=\"fa-solid fa-level-up-alt\"></i> Parent Run</h4>\n <div class=\"run-item parent\" (click)=\"navigateToEntity('MJ: AI Prompt Runs', parentRun.ID)\">\n <div class=\"run-item-icon\" [style.background-color]=\"getStatusColor() + '20'\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(parentRun.RunType)\"></i>\n </div>\n <div class=\"run-item-content\">\n <div class=\"run-item-title\">\n Parent Run #{{ parentRun.ID.substring(0, 8) }}\n <span class=\"run-item-type\">{{ parentRun.RunType }}</span>\n </div>\n <div class=\"run-item-meta\">\n <span><i class=\"fa-solid fa-clock\"></i> {{ formatDuration(parentRun.ExecutionTimeMS) }}</span>\n <span><i class=\"fa-solid fa-coins\"></i> {{ formatTokens(parentRun.TokensUsed) }}</span>\n <span><i class=\"fa-solid fa-calendar\"></i> {{ parentRun.RunAt | date:'short' }}</span>\n </div>\n </div>\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n </div>\n }\n \n @if (childRuns.length > 0) {\n <div class=\"child-runs-section\">\n <h4><i class=\"fa-solid fa-level-down-alt\"></i> Child Runs</h4>\n <div class=\"runs-list\">\n @for (childRun of childRuns; track childRun.ID) {\n <div class=\"run-item child\" (click)=\"navigateToEntity('MJ: AI Prompt Runs', childRun.ID)\">\n <div class=\"run-item-icon\" [style.background-color]=\"getStatusColor() + '20'\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(childRun.RunType)\"></i>\n </div>\n <div class=\"run-item-content\">\n <div class=\"run-item-title\">\n Child Run #{{ childRun.ID.substring(0, 8) }}\n @if (childRun.ExecutionOrder !== null) {\n <span class=\"execution-order\">#{{ childRun.ExecutionOrder }}</span>\n }\n <span class=\"run-item-type\">{{ childRun.RunType }}</span>\n </div>\n <div class=\"run-item-meta\">\n <span class=\"status-indicator\" [style.color]=\"getStatusColor()\">\n <i [class]=\"'fa-solid ' + getStatusIcon()\"></i>\n {{ childRun.Success ? 'Success' : childRun.ErrorMessage ? 'Failed' : 'Running' }}\n </span>\n <span><i class=\"fa-solid fa-clock\"></i> {{ formatDuration(childRun.ExecutionTimeMS) }}</span>\n <span><i class=\"fa-solid fa-coins\"></i> {{ formatTokens(childRun.TokensUsed) }}</span>\n </div>\n </div>\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n }\n \n <!-- Additional Details Panel -->\n <kendo-panelbar-item [expanded]=\"false\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Additional Details\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <div class=\"detail-fields-grid\">\n @if (record.AgentID) {\n <div class=\"detail-field\">\n <label>Agent</label>\n <div class=\"detail-value clickable\" (click)=\"navigateToEntity('AI Agents', record.AgentID)\" title=\"View Agent\">\n <i class=\"fa-solid fa-robot\"></i>\n {{ record.Agent || 'Unknown' }}\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n </div>\n }\n \n @if (record.ConfigurationID) {\n <div class=\"detail-field\">\n <label>Configuration</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-cog\"></i>\n {{ record.Configuration || 'Unknown' }}\n </div>\n </div>\n }\n \n @if (record.RunType) {\n <div class=\"detail-field\">\n <label>Run Type</label>\n <div class=\"detail-value\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(record.RunType)\"></i>\n {{ record.RunType }}\n </div>\n </div>\n }\n \n @if (record.ResponseFormat) {\n <div class=\"detail-field\">\n <label>Response Format</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-code\"></i>\n {{ record.ResponseFormat }}\n </div>\n </div>\n }\n \n <div class=\"detail-field\">\n <label>Temperature</label>\n <div class=\"detail-value\" [class.null-value]=\"record.Temperature === null || record.Temperature === undefined\">\n <i class=\"fa-solid fa-temperature-high\"></i>\n {{ record.Temperature !== null && record.Temperature !== undefined ? record.Temperature : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Top P</label>\n <div class=\"detail-value\" [class.null-value]=\"record.TopP === null || record.TopP === undefined\">\n <i class=\"fa-solid fa-percentage\"></i>\n {{ record.TopP !== null && record.TopP !== undefined ? record.TopP : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Top K</label>\n <div class=\"detail-value\" [class.null-value]=\"record.TopK === null || record.TopK === undefined\">\n <i class=\"fa-solid fa-list-ol\"></i>\n {{ record.TopK !== null && record.TopK !== undefined ? record.TopK : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Min P</label>\n <div class=\"detail-value\" [class.null-value]=\"record.MinP === null || record.MinP === undefined\">\n <i class=\"fa-solid fa-filter\"></i>\n {{ record.MinP !== null && record.MinP !== undefined ? record.MinP : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Frequency Penalty</label>\n <div class=\"detail-value\" [class.null-value]=\"record.FrequencyPenalty === null || record.FrequencyPenalty === undefined\">\n <i class=\"fa-solid fa-repeat\"></i>\n {{ record.FrequencyPenalty !== null && record.FrequencyPenalty !== undefined ? record.FrequencyPenalty : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Presence Penalty</label>\n <div class=\"detail-value\" [class.null-value]=\"record.PresencePenalty === null || record.PresencePenalty === undefined\">\n <i class=\"fa-solid fa-plus-circle\"></i>\n {{ record.PresencePenalty !== null && record.PresencePenalty !== undefined ? record.PresencePenalty : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Seed</label>\n <div class=\"detail-value\" [class.null-value]=\"record.Seed === null || record.Seed === undefined\">\n <i class=\"fa-solid fa-seedling\"></i>\n {{ record.Seed !== null && record.Seed !== undefined ? record.Seed : '\u2014' }}\n </div>\n </div>\n \n @if (record.RunAt) {\n <div class=\"detail-field\">\n <label>Started At</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ record.RunAt | date:'medium' }}\n </div>\n </div>\n }\n \n @if (record.CompletedAt) {\n <div class=\"detail-field\">\n <label>Completed At</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{ record.CompletedAt | date:'medium' }}\n </div>\n </div>\n }\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Model Specific Response Details Panel -->\n @if (record.ModelSpecificResponseDetails) {\n <kendo-panelbar-item [expanded]=\"false\">\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\">\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/* Panels */\n.form-content {\n padding: 16px;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n/* Nested Sub-Panel Styles */\n.sub-panel-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n font-size: 0.95em;\n}\n\n.sub-panel-content {\n padding: 0;\n}\n\n/* Nested kendo-panelbar styles */\n.k-panelbar .k-panelbar {\n border: none;\n background: transparent;\n}\n\n.k-panelbar .k-panelbar > .k-item {\n border: 1px solid #e5e7eb;\n margin-bottom: 8px;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.k-panelbar .k-panelbar > .k-item > .k-link {\n background-color: #f9fafb;\n padding: 12px 16px;\n}\n\n.k-panelbar .k-panelbar > .k-item.k-expanded > .k-link {\n background-color: #f3f4f6;\n}\n\n.k-panelbar .k-panelbar .k-content {\n padding: 0;\n background: white;\n}\n\n/* Ensure chat message viewer takes appropriate height */\n.sub-panel-content mj-chat-message-viewer {\n display: block;\n min-height: 200px;\n max-height: 750px; /* Increased by 50% from 500px */\n height: auto;\n overflow: hidden;\n}\n\n/* Different colors for sub-expansion panels */\n.sub-expansion-panel {\n margin-bottom: 8px;\n}\n\n.sub-expansion-panel::ng-deep .k-expander {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel::ng-deep .k-expander:hover {\n background-color: #edf2f7;\n}\n\n.sub-expansion-panel::ng-deep .k-header {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel::ng-deep .k-content {\n background-color: #ffffff;\n border-color: #e2e8f0;\n}\n\n.panel-badge {\n margin-left: auto;\n padding: 2px 8px;\n border-radius: 12px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n.panel-badge.error {\n background: #dc3545;\n color: white;\n}\n\n.panel-count {\n color: #6c757d;\n font-weight: 400;\n font-size: 0.9em;\n}\n\n.panel-content {\n padding: 20px;\n max-height: none !important;\n overflow: visible !important;\n}\n\n/* JSON Editor Container */\n.json-editor-container {\n border: 1px solid #e9ecef;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.json-toolbar {\n background: #f8f9fa;\n padding: 8px 12px;\n border-bottom: 1px solid #e9ecef;\n display: flex;\n justify-content: flex-end;\n}\n\n/* Error Message */\n.error-message {\n background: #dc354510;\n border: 1px solid #dc3545;\n border-radius: 6px;\n padding: 16px;\n display: flex;\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.error-message i {\n font-size: 1.5em;\n color: #dc3545;\n flex-shrink: 0;\n}\n\n.error-content h4 {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 1em;\n}\n\n.error-content p {\n margin: 0;\n color: #495057;\n}\n\n/* Empty State */\n.empty-state {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.empty-state i {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.3;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 1.1em;\n}\n\n/* Loading State */\n.loading-state {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.loading-state i {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.6;\n color: #007bff;\n}\n\n.loading-state p {\n margin: 0;\n font-size: 1.1em;\n}\n\n/* Metrics Grid */\n.metrics-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 24px;\n}\n\n.metric-card {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n}\n\n.metric-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.metric-header i {\n font-size: 1.2em;\n color: #6c757d;\n}\n\n.metric-header h4 {\n margin: 0;\n font-size: 0.9em;\n color: #6c757d;\n font-weight: 500;\n}\n\n.metric-value.large {\n font-size: 1.8em;\n font-weight: 700;\n color: #2c3e50;\n}\n\n.metric-rollup {\n margin-top: 8px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.metric-currency {\n margin-top: 4px;\n font-size: 0.85em;\n color: #6c757d;\n text-transform: uppercase;\n}\n\n/* Additional Metrics */\n.additional-metrics {\n border-top: 1px solid #e9ecef;\n padding-top: 16px;\n}\n\n.metric-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n border-bottom: 1px solid #f1f3f5;\n}\n\n.metric-row:last-child {\n border-bottom: none;\n}\n\n.metric-row .metric-label {\n font-weight: 500;\n color: #6c757d;\n}\n\n.metric-row .metric-value {\n font-weight: 400;\n color: #2c3e50;\n}\n\n.metric-row .metric-value.link {\n color: #007bff;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: color 0.2s;\n}\n\n.metric-row .metric-value.link:hover {\n color: #0056b3;\n}\n\n/* Hierarchy Section */\n.parent-run-section,\n.child-runs-section {\n margin-bottom: 24px;\n}\n\n.parent-run-section:last-child,\n.child-runs-section:last-child {\n margin-bottom: 0;\n}\n\n.parent-run-section h4,\n.child-runs-section h4 {\n margin: 0 0 12px 0;\n font-size: 0.95em;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.runs-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.run-item {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.run-item:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n}\n\n.run-item.parent {\n background: #e3f2fd;\n border-color: #90caf9;\n}\n\n.run-item.parent:hover {\n background: #bbdefb;\n}\n\n.run-item-icon {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-item-content {\n flex: 1;\n min-width: 0;\n}\n\n.run-item-title {\n font-weight: 500;\n color: #2c3e50;\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.execution-order {\n background: #6c757d;\n color: white;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 0.75em;\n font-weight: 600;\n}\n\n.run-item-type {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 400;\n}\n\n.run-item-meta {\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.run-item-meta span {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.status-indicator {\n font-weight: 500;\n}\n\n.run-item > i:last-child {\n color: #6c757d;\n font-size: 0.85em;\n}\n\n/* Detail Fields Grid */\n.detail-fields-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 24px;\n width: 100%;\n min-height: auto;\n overflow: visible;\n}\n\n.detail-field {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-field label {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-value {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 1em;\n color: #2c3e50;\n padding: 10px 14px;\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n transition: all 0.2s;\n}\n\n.detail-value i:first-child {\n color: #6c757d;\n font-size: 1.1em;\n width: 20px;\n text-align: center;\n}\n\n.detail-value.clickable {\n cursor: pointer;\n}\n\n.detail-value.clickable:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.detail-value.clickable i:last-child {\n margin-left: auto;\n font-size: 0.85em;\n opacity: 0.6;\n}\n\n.detail-value.clickable:hover i:last-child {\n opacity: 1;\n}\n\n.detail-value.null-value {\n color: #adb5bd;\n font-style: italic;\n}\n\n.detail-value.null-value i:first-child {\n opacity: 0.5;\n}\n\n/* Kendo Overrides */\nkendo-panelbar {\n border: none !important;\n}\n\nkendo-panelbar-item {\n margin-bottom: 8px;\n border: 1px solid #e9ecef !important;\n border-radius: 8px !important;\n overflow: hidden;\n}\n\nkendo-panelbar-item .k-panelbar-header {\n background: #f8f9fa !important;\n border: none !important;\n padding: 12px 16px !important;\n}\n\nkendo-panelbar-item .k-panelbar-header:hover {\n background: #e9ecef !important;\n}\n\nkendo-panelbar-item .k-panelbar-content {\n border: none !important;\n padding: 0 !important;\n max-height: none !important;\n overflow: visible !important;\n}\n\n/* Validation Panel Styles */\n.validation-summary {\n margin-bottom: 24px;\n}\n\n.summary-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.summary-header h4 {\n margin: 0;\n font-size: 1.1em;\n color: #2c3e50;\n}\n\n.validation-status {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 16px;\n border-radius: 20px;\n font-weight: 500;\n font-size: 0.9em;\n}\n\n.validation-status.success {\n background: #28a74520;\n color: #28a745;\n}\n\n.validation-status.failed {\n background: #dc354520;\n color: #dc3545;\n}\n\n.validation-metrics {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.metric-card.small {\n padding: 16px;\n text-align: center;\n}\n\n.metric-card.small .metric-label {\n font-size: 0.8em;\n margin-bottom: 8px;\n font-weight: 600;\n}\n\n.metric-card.small .metric-value {\n font-size: 1.4em;\n font-weight: 700;\n}\n\n.validation-error,\n.common-error {\n background: #dc354510;\n border: 1px solid #dc354530;\n border-radius: 8px;\n padding: 16px;\n margin-bottom: 16px;\n}\n\n.validation-error h5,\n.common-error h5 {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 0.95em;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.validation-error p,\n.common-error p {\n margin: 0;\n color: #495057;\n font-size: 0.9em;\n}\n\n.error-count {\n display: inline-block;\n margin-top: 8px;\n padding: 2px 8px;\n background: #dc3545;\n color: white;\n border-radius: 12px;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n/* Retry Timeline */\n.retry-timeline {\n margin-bottom: 24px;\n}\n\n.retry-timeline h4 {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.timeline-info {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n}\n\n.timeline-stat {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #6c757d;\n font-size: 0.9em;\n}\n\n.timeline-stat i {\n font-size: 1.1em;\n}\n\n/* Validation Attempts */\n.validation-attempts {\n margin-bottom: 24px;\n}\n\n.validation-attempts h4 {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.attempts-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.attempt-item {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n}\n\n.attempt-item.success {\n background: #28a74510;\n border-color: #28a74530;\n}\n\n.attempt-item.failed {\n background: #dc354510;\n border-color: #dc354530;\n}\n\n.attempt-number {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.attempt-item.success .attempt-number {\n color: #28a745;\n}\n\n.attempt-item.failed .attempt-number {\n color: #dc3545;\n}\n\n.attempt-details {\n flex: 1;\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n font-size: 0.85em;\n}\n\n.attempt-time {\n color: #6c757d;\n}\n\n.attempt-error {\n color: #dc3545;\n flex: 1 0 100%;\n}\n\n.output-length {\n color: #6c757d;\n font-style: italic;\n}\n\n/* Validation JSON */\n.validation-json {\n margin-top: 24px;\n}\n\n.validation-json h4 {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.json-viewer-container {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n overflow: hidden;\n}\n\n/* Panel badge styles */\n.panel-badge.success {\n background: #28a745;\n color: white;\n}"] }]
1563
1964
  }], () => [{ type: i0.ElementRef }, { type: i1.SharedService }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i3.TestHarnessWindowService }, { type: i0.ViewContainerRef }], null); })();
1564
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIPromptRunFormComponentExtended, { className: "AIPromptRunFormComponentExtended", filePath: "src/lib/custom/AIPromptRuns/ai-prompt-run-form.component.ts", lineNumber: 19 }); })();
1965
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIPromptRunFormComponentExtended, { className: "AIPromptRunFormComponentExtended", filePath: "src/lib/custom/AIPromptRuns/ai-prompt-run-form.component.ts", lineNumber: 20 }); })();
1565
1966
  //# sourceMappingURL=ai-prompt-run-form.component.js.map