@memberjunction/ng-core-entity-forms 2.73.0 → 2.75.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 (65) hide show
  1. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +11 -6
  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 +456 -447
  4. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  5. package/dist/lib/custom/Queries/query-category-dialog.component.d.ts +33 -0
  6. package/dist/lib/custom/Queries/query-category-dialog.component.d.ts.map +1 -0
  7. package/dist/lib/custom/Queries/query-category-dialog.component.js +241 -0
  8. package/dist/lib/custom/Queries/query-category-dialog.component.js.map +1 -0
  9. package/dist/lib/custom/Queries/query-form.component.d.ts +135 -0
  10. package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -0
  11. package/dist/lib/custom/Queries/query-form.component.js +1563 -0
  12. package/dist/lib/custom/Queries/query-form.component.js.map +1 -0
  13. package/dist/lib/custom/Queries/query-run-dialog.component.d.ts +66 -0
  14. package/dist/lib/custom/Queries/query-run-dialog.component.d.ts.map +1 -0
  15. package/dist/lib/custom/Queries/query-run-dialog.component.js +788 -0
  16. package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -0
  17. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +35 -7
  18. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
  19. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +75 -61
  20. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
  21. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts +37 -0
  22. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts.map +1 -0
  23. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js +117 -0
  24. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js.map +1 -0
  25. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts.map +1 -1
  26. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js +0 -8
  27. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js.map +1 -1
  28. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
  29. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +0 -26
  30. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  31. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +5 -1
  32. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
  33. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +160 -103
  34. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  35. package/dist/lib/custom/custom-forms.module.d.ts +25 -22
  36. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  37. package/dist/lib/custom/custom-forms.module.js +18 -3
  38. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  39. package/dist/lib/generated/Entities/AIPromptRun/sections/details.component.d.ts.map +1 -1
  40. package/dist/lib/generated/Entities/AIPromptRun/sections/details.component.js +15 -4
  41. package/dist/lib/generated/Entities/AIPromptRun/sections/details.component.js.map +1 -1
  42. package/dist/lib/generated/Entities/Query/query.form.component.js +14 -4
  43. package/dist/lib/generated/Entities/Query/query.form.component.js.map +1 -1
  44. package/dist/lib/generated/Entities/Query/sections/details.component.d.ts.map +1 -1
  45. package/dist/lib/generated/Entities/Query/sections/details.component.js +13 -4
  46. package/dist/lib/generated/Entities/Query/sections/details.component.js.map +1 -1
  47. package/dist/lib/generated/Entities/QueryEntity/sections/details.component.d.ts.map +1 -1
  48. package/dist/lib/generated/Entities/QueryEntity/sections/details.component.js +22 -4
  49. package/dist/lib/generated/Entities/QueryEntity/sections/details.component.js.map +1 -1
  50. package/dist/lib/generated/Entities/QueryField/sections/details.component.d.ts.map +1 -1
  51. package/dist/lib/generated/Entities/QueryField/sections/details.component.js +22 -4
  52. package/dist/lib/generated/Entities/QueryField/sections/details.component.js.map +1 -1
  53. package/dist/lib/generated/Entities/QueryParameter/queryparameter.form.component.d.ts +10 -0
  54. package/dist/lib/generated/Entities/QueryParameter/queryparameter.form.component.d.ts.map +1 -0
  55. package/dist/lib/generated/Entities/QueryParameter/queryparameter.form.component.js +59 -0
  56. package/dist/lib/generated/Entities/QueryParameter/queryparameter.form.component.js.map +1 -0
  57. package/dist/lib/generated/Entities/QueryParameter/sections/details.component.d.ts +11 -0
  58. package/dist/lib/generated/Entities/QueryParameter/sections/details.component.d.ts.map +1 -0
  59. package/dist/lib/generated/Entities/QueryParameter/sections/details.component.js +172 -0
  60. package/dist/lib/generated/Entities/QueryParameter/sections/details.component.js.map +1 -0
  61. package/dist/lib/generated/generated-forms.module.d.ts +265 -263
  62. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  63. package/dist/lib/generated/generated-forms.module.js +74 -66
  64. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  65. package/package.json +16 -16
@@ -5,21 +5,23 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  import { Component } from '@angular/core';
8
- import { RegisterClass, ParseJSONRecursive } from '@memberjunction/global';
8
+ import { RegisterClass } from '@memberjunction/global';
9
9
  import { BaseFormComponent } from '@memberjunction/ng-base-forms';
10
10
  import { Metadata, RunView, CompositeKey } from '@memberjunction/core';
11
11
  import { AIPromptRunFormComponent } from '../../generated/Entities/AIPromptRun/aipromptrun.form.component';
12
12
  import { SharedService } from '@memberjunction/ng-shared';
13
+ import { ParseJSONRecursive } from '@memberjunction/global';
13
14
  import * as i0 from "@angular/core";
14
15
  import * as i1 from "@memberjunction/ng-shared";
15
16
  import * as i2 from "@angular/router";
16
- import * as i3 from "@angular/forms";
17
- import * as i4 from "@progress/kendo-angular-layout";
18
- import * as i5 from "@progress/kendo-angular-buttons";
19
- import * as i6 from "@memberjunction/ng-form-toolbar";
20
- import * as i7 from "@memberjunction/ng-code-editor";
21
- import * as i8 from "./chat-message-viewer.component";
22
- import * as i9 from "@angular/common";
17
+ import * as i3 from "@memberjunction/ng-ai-test-harness";
18
+ import * as i4 from "@angular/forms";
19
+ import * as i5 from "@progress/kendo-angular-layout";
20
+ import * as i6 from "@progress/kendo-angular-buttons";
21
+ import * as i7 from "@memberjunction/ng-form-toolbar";
22
+ import * as i8 from "@memberjunction/ng-code-editor";
23
+ import * as i9 from "./chat-message-viewer.component";
24
+ import * as i10 from "@angular/common";
23
25
  const _forTrack0 = ($index, $item) => $item.attemptNumber;
24
26
  const _forTrack1 = ($index, $item) => $item.ID;
25
27
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_11_Template(rf, ctx) { if (rf & 1) {
@@ -32,7 +34,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_11_Template(
32
34
  i0.ɵɵtextInterpolate1("#", ctx_r1.record.ID.substring(0, 8), "");
33
35
  } }
34
36
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_16_Template(rf, ctx) { if (rf & 1) {
35
- i0.ɵɵelementStart(0, "span", 33);
37
+ i0.ɵɵelementStart(0, "span", 36);
36
38
  i0.ɵɵelement(1, "i");
37
39
  i0.ɵɵtext(2);
38
40
  i0.ɵɵelementEnd();
@@ -46,9 +48,9 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_16_Template(
46
48
  } }
47
49
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_17_Template(rf, ctx) { if (rf & 1) {
48
50
  const _r3 = i0.ɵɵgetCurrentView();
49
- i0.ɵɵelementStart(0, "span", 34);
51
+ i0.ɵɵelementStart(0, "span", 37);
50
52
  i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_17_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.navigateToEntity("AI Prompts", ctx_r1.prompt.ID)); });
51
- i0.ɵɵelement(1, "i", 35);
53
+ i0.ɵɵelement(1, "i", 38);
52
54
  i0.ɵɵtext(2);
53
55
  i0.ɵɵelementEnd();
54
56
  } if (rf & 2) {
@@ -58,9 +60,9 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_17_Template(
58
60
  } }
59
61
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_18_Template(rf, ctx) { if (rf & 1) {
60
62
  const _r4 = i0.ɵɵgetCurrentView();
61
- i0.ɵɵelementStart(0, "span", 36);
63
+ i0.ɵɵelementStart(0, "span", 39);
62
64
  i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_18_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.navigateToEntity("AI Models", ctx_r1.model.ID)); });
63
- i0.ɵɵelement(1, "i", 37);
65
+ i0.ɵɵelement(1, "i", 40);
64
66
  i0.ɵɵtext(2);
65
67
  i0.ɵɵelementEnd();
66
68
  } if (rf & 2) {
@@ -70,9 +72,9 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_18_Template(
70
72
  } }
71
73
  function AIPromptRunFormComponentExtended_Conditional_1_Conditional_19_Template(rf, ctx) { if (rf & 1) {
72
74
  const _r5 = i0.ɵɵgetCurrentView();
73
- i0.ɵɵelementStart(0, "span", 38);
75
+ i0.ɵɵelementStart(0, "span", 41);
74
76
  i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_19_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.navigateToEntity("MJ: AI Vendors", ctx_r1.record.VendorID)); });
75
- i0.ɵɵelement(1, "i", 39);
77
+ i0.ɵɵelement(1, "i", 42);
76
78
  i0.ɵɵtext(2);
77
79
  i0.ɵɵelementEnd();
78
80
  } if (rf & 2) {
@@ -80,13 +82,22 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_19_Template(
80
82
  i0.ɵɵadvance(2);
81
83
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Vendor, " ");
82
84
  } }
83
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_45_Template(rf, ctx) { if (rf & 1) {
84
- i0.ɵɵelementStart(0, "div", 21);
85
- i0.ɵɵelement(1, "i", 40);
86
- i0.ɵɵelementStart(2, "div", 23)(3, "div", 24);
85
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_20_Template(rf, ctx) { if (rf & 1) {
86
+ const _r6 = i0.ɵɵgetCurrentView();
87
+ i0.ɵɵelementStart(0, "span", 17);
88
+ i0.ɵɵelement(1, "i", 43);
89
+ i0.ɵɵelementStart(2, "a", 44);
90
+ i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_20_Template_a_click_2_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.navigateToOriginalRun()); });
91
+ i0.ɵɵtext(3, "Original Run");
92
+ i0.ɵɵelementEnd()();
93
+ } }
94
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_49_Template(rf, ctx) { if (rf & 1) {
95
+ i0.ɵɵelementStart(0, "div", 24);
96
+ i0.ɵɵelement(1, "i", 45);
97
+ i0.ɵɵelementStart(2, "div", 26)(3, "div", 27);
87
98
  i0.ɵɵtext(4, "Started");
88
99
  i0.ɵɵelementEnd();
89
- i0.ɵɵelementStart(5, "div", 25);
100
+ i0.ɵɵelementStart(5, "div", 28);
90
101
  i0.ɵɵtext(6);
91
102
  i0.ɵɵpipe(7, "date");
92
103
  i0.ɵɵelementEnd()()();
@@ -95,24 +106,24 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_45_Template(
95
106
  i0.ɵɵadvance(6);
96
107
  i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(7, 1, ctx_r1.record.RunAt, "short"));
97
108
  } }
98
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_49_Conditional_3_Template(rf, ctx) { if (rf & 1) {
99
- i0.ɵɵelementStart(0, "span", 42);
109
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_3_Template(rf, ctx) { if (rf & 1) {
110
+ i0.ɵɵelementStart(0, "span", 47);
100
111
  i0.ɵɵtext(1, "JSON");
101
112
  i0.ɵɵelementEnd();
102
113
  } }
103
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_49_Template(rf, ctx) { if (rf & 1) {
104
- i0.ɵɵelementStart(0, "span", 41);
105
- i0.ɵɵelement(1, "i", 35);
114
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Template(rf, ctx) { if (rf & 1) {
115
+ i0.ɵɵelementStart(0, "span", 46);
116
+ i0.ɵɵelement(1, "i", 38);
106
117
  i0.ɵɵtext(2, " Input ");
107
- i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_49_Conditional_3_Template, 2, 0, "span", 42);
118
+ i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_3_Template, 2, 0, "span", 47);
108
119
  i0.ɵɵelementEnd();
109
120
  } if (rf & 2) {
110
121
  const ctx_r1 = i0.ɵɵnextContext(2);
111
122
  i0.ɵɵadvance(3);
112
123
  i0.ɵɵconditional(ctx_r1.record.Messages && ctx_r1.record.Messages.trim() !== "" ? 3 : -1);
113
124
  } }
114
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_ng_template_2_Conditional_3_Template(rf, ctx) { if (rf & 1) {
115
- i0.ɵɵelementStart(0, "span", 58);
125
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_ng_template_2_Conditional_3_Template(rf, ctx) { if (rf & 1) {
126
+ i0.ɵɵelementStart(0, "span", 63);
116
127
  i0.ɵɵtext(1);
117
128
  i0.ɵɵelementEnd();
118
129
  } if (rf & 2) {
@@ -120,62 +131,62 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Condition
120
131
  i0.ɵɵadvance();
121
132
  i0.ɵɵtextInterpolate1("(", ctx_r1.chatMessages.length, ")");
122
133
  } }
123
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_ng_template_2_Template(rf, ctx) { if (rf & 1) {
124
- i0.ɵɵelementStart(0, "span", 56);
125
- i0.ɵɵelement(1, "i", 57);
134
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_ng_template_2_Template(rf, ctx) { if (rf & 1) {
135
+ i0.ɵɵelementStart(0, "span", 61);
136
+ i0.ɵɵelement(1, "i", 62);
126
137
  i0.ɵɵtext(2, " Messages ");
127
- i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_ng_template_2_Conditional_3_Template, 2, 1, "span", 58);
138
+ i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_ng_template_2_Conditional_3_Template, 2, 1, "span", 63);
128
139
  i0.ɵɵelementEnd();
129
140
  } if (rf & 2) {
130
141
  const ctx_r1 = i0.ɵɵnextContext(4);
131
142
  i0.ɵɵadvance(3);
132
143
  i0.ɵɵconditional(ctx_r1.chatMessages.length > 0 ? 3 : -1);
133
144
  } }
134
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
135
- i0.ɵɵelementStart(0, "div", 49);
136
- i0.ɵɵelement(1, "i", 59);
145
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
146
+ i0.ɵɵelementStart(0, "div", 54);
147
+ i0.ɵɵelement(1, "i", 64);
137
148
  i0.ɵɵelementStart(2, "p");
138
149
  i0.ɵɵtext(3, "Loading messages...");
139
150
  i0.ɵɵelementEnd()();
140
151
  } }
141
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
142
- i0.ɵɵelement(0, "mj-chat-message-viewer", 50);
152
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
153
+ i0.ɵɵelement(0, "mj-chat-message-viewer", 55);
143
154
  } if (rf & 2) {
144
155
  const ctx_r1 = i0.ɵɵnextContext(4);
145
156
  i0.ɵɵproperty("messages", ctx_r1.chatMessages);
146
157
  } }
147
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
148
- i0.ɵɵelementStart(0, "div", 45);
149
- i0.ɵɵelement(1, "i", 60);
158
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
159
+ i0.ɵɵelementStart(0, "div", 50);
160
+ i0.ɵɵelement(1, "i", 65);
150
161
  i0.ɵɵelementStart(2, "p");
151
162
  i0.ɵɵtext(3, "No chat messages found");
152
163
  i0.ɵɵelementEnd()();
153
164
  } }
154
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_ng_template_8_Conditional_3_Template(rf, ctx) { if (rf & 1) {
155
- i0.ɵɵelementStart(0, "span", 42);
165
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_ng_template_8_Conditional_3_Template(rf, ctx) { if (rf & 1) {
166
+ i0.ɵɵelementStart(0, "span", 47);
156
167
  i0.ɵɵtext(1, "Object");
157
168
  i0.ɵɵelementEnd();
158
169
  } }
159
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_ng_template_8_Template(rf, ctx) { if (rf & 1) {
160
- i0.ɵɵelementStart(0, "span", 56);
161
- i0.ɵɵelement(1, "i", 61);
170
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_ng_template_8_Template(rf, ctx) { if (rf & 1) {
171
+ i0.ɵɵelementStart(0, "span", 61);
172
+ i0.ɵɵelement(1, "i", 66);
162
173
  i0.ɵɵtext(2, " Data ");
163
- i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_ng_template_8_Conditional_3_Template, 2, 0, "span", 42);
174
+ i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_ng_template_8_Conditional_3_Template, 2, 0, "span", 47);
164
175
  i0.ɵɵelementEnd();
165
176
  } if (rf & 2) {
166
177
  const ctx_r1 = i0.ɵɵnextContext(4);
167
178
  i0.ɵɵadvance(3);
168
179
  i0.ɵɵconditional(ctx_r1.inputData ? 3 : -1);
169
180
  } }
170
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_10_Template(rf, ctx) { if (rf & 1) {
171
- const _r7 = i0.ɵɵgetCurrentView();
172
- i0.ɵɵelementStart(0, "div", 51)(1, "div", 52)(2, "button", 53);
173
- i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_10_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.copyToClipboard(ctx_r1.formattedData, "Data")); });
174
- i0.ɵɵelement(3, "i", 54);
181
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_Conditional_10_Template(rf, ctx) { if (rf & 1) {
182
+ const _r8 = i0.ɵɵgetCurrentView();
183
+ i0.ɵɵelementStart(0, "div", 56)(1, "div", 57)(2, "button", 58);
184
+ i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_Conditional_10_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.copyToClipboard(ctx_r1.formattedData, "Data")); });
185
+ i0.ɵɵelement(3, "i", 59);
175
186
  i0.ɵɵtext(4, " Copy ");
176
187
  i0.ɵɵelementEnd()();
177
- i0.ɵɵelementStart(5, "mj-code-editor", 62);
178
- i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_10_Template_mj_code_editor_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedData, $event) || (ctx_r1.formattedData = $event); return i0.ɵɵresetView($event); });
188
+ i0.ɵɵelementStart(5, "mj-code-editor", 67);
189
+ i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_Conditional_10_Template_mj_code_editor_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedData, $event) || (ctx_r1.formattedData = $event); return i0.ɵɵresetView($event); });
179
190
  i0.ɵɵelementEnd()();
180
191
  } if (rf & 2) {
181
192
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -183,40 +194,40 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Condition
183
194
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formattedData);
184
195
  i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
185
196
  } }
186
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_11_Template(rf, ctx) { if (rf & 1) {
187
- i0.ɵɵelementStart(0, "div", 45);
188
- i0.ɵɵelement(1, "i", 61);
197
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_Conditional_11_Template(rf, ctx) { if (rf & 1) {
198
+ i0.ɵɵelementStart(0, "div", 50);
199
+ i0.ɵɵelement(1, "i", 66);
189
200
  i0.ɵɵelementStart(2, "p");
190
201
  i0.ɵɵtext(3, "No data object found");
191
202
  i0.ɵɵelementEnd()();
192
203
  } }
193
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_ng_template_13_Template(rf, ctx) { if (rf & 1) {
194
- i0.ɵɵelementStart(0, "span", 56);
195
- i0.ɵɵelement(1, "i", 63);
204
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_ng_template_13_Template(rf, ctx) { if (rf & 1) {
205
+ i0.ɵɵelementStart(0, "span", 61);
206
+ i0.ɵɵelement(1, "i", 68);
196
207
  i0.ɵɵtext(2, " Raw ");
197
208
  i0.ɵɵelementEnd();
198
209
  } }
199
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Template(rf, ctx) { if (rf & 1) {
200
- const _r6 = i0.ɵɵgetCurrentView();
201
- i0.ɵɵelementStart(0, "div", 44)(1, "kendo-expansionpanel", 46);
202
- i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_ng_template_2_Template, 4, 1, "ng-template", 47);
203
- i0.ɵɵelementStart(3, "div", 48);
204
- i0.ɵɵtemplate(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_4_Template, 4, 0, "div", 49)(5, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_5_Template, 1, 1, "mj-chat-message-viewer", 50)(6, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_6_Template, 4, 0, "div", 45);
210
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_Template(rf, ctx) { if (rf & 1) {
211
+ const _r7 = i0.ɵɵgetCurrentView();
212
+ i0.ɵɵelementStart(0, "div", 49)(1, "kendo-expansionpanel", 51);
213
+ i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_ng_template_2_Template, 4, 1, "ng-template", 52);
214
+ i0.ɵɵelementStart(3, "div", 53);
215
+ i0.ɵɵtemplate(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_Conditional_4_Template, 4, 0, "div", 54)(5, AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_Conditional_5_Template, 1, 1, "mj-chat-message-viewer", 55)(6, AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_Conditional_6_Template, 4, 0, "div", 50);
205
216
  i0.ɵɵelementEnd()();
206
- i0.ɵɵelementStart(7, "kendo-expansionpanel", 46);
207
- i0.ɵɵtemplate(8, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_ng_template_8_Template, 4, 1, "ng-template", 47);
208
- i0.ɵɵelementStart(9, "div", 48);
209
- i0.ɵɵtemplate(10, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_10_Template, 6, 4, "div", 51)(11, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Conditional_11_Template, 4, 0, "div", 45);
217
+ i0.ɵɵelementStart(7, "kendo-expansionpanel", 51);
218
+ i0.ɵɵtemplate(8, AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_ng_template_8_Template, 4, 1, "ng-template", 52);
219
+ i0.ɵɵelementStart(9, "div", 53);
220
+ i0.ɵɵtemplate(10, AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_Conditional_10_Template, 6, 4, "div", 56)(11, AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_Conditional_11_Template, 4, 0, "div", 50);
210
221
  i0.ɵɵelementEnd()();
211
- i0.ɵɵelementStart(12, "kendo-expansionpanel", 46);
212
- i0.ɵɵtemplate(13, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_ng_template_13_Template, 3, 0, "ng-template", 47);
213
- i0.ɵɵelementStart(14, "div", 48)(15, "div", 51)(16, "div", 52)(17, "button", 53);
214
- i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.copyToClipboard(ctx_r1.formattedMessages, "Messages")); });
215
- i0.ɵɵelement(18, "i", 54);
222
+ i0.ɵɵelementStart(12, "kendo-expansionpanel", 51);
223
+ i0.ɵɵtemplate(13, AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_ng_template_13_Template, 3, 0, "ng-template", 52);
224
+ i0.ɵɵelementStart(14, "div", 53)(15, "div", 56)(16, "div", 57)(17, "button", 58);
225
+ i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.copyToClipboard(ctx_r1.formattedMessages, "Messages")); });
226
+ i0.ɵɵelement(18, "i", 59);
216
227
  i0.ɵɵtext(19, " Copy ");
217
228
  i0.ɵɵelementEnd()();
218
- i0.ɵɵelementStart(20, "mj-code-editor", 55);
219
- i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Template_mj_code_editor_ngModelChange_20_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedMessages, $event) || (ctx_r1.formattedMessages = $event); return i0.ɵɵresetView($event); });
229
+ i0.ɵɵelementStart(20, "mj-code-editor", 60);
230
+ i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_Template_mj_code_editor_ngModelChange_20_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedMessages, $event) || (ctx_r1.formattedMessages = $event); return i0.ɵɵresetView($event); });
220
231
  i0.ɵɵelementEnd()()()()();
221
232
  } if (rf & 2) {
222
233
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -234,37 +245,37 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Condition
234
245
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formattedMessages);
235
246
  i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
236
247
  } }
237
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_2_Template(rf, ctx) { if (rf & 1) {
238
- i0.ɵɵelementStart(0, "div", 45);
239
- i0.ɵɵelement(1, "i", 60);
248
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_2_Template(rf, ctx) { if (rf & 1) {
249
+ i0.ɵɵelementStart(0, "div", 50);
250
+ i0.ɵɵelement(1, "i", 65);
240
251
  i0.ɵɵelementStart(2, "p");
241
252
  i0.ɵɵtext(3, "No input messages recorded");
242
253
  i0.ɵɵelementEnd()();
243
254
  } }
244
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Template(rf, ctx) { if (rf & 1) {
245
- i0.ɵɵelementStart(0, "div", 43);
246
- i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_1_Template, 21, 12, "div", 44)(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Conditional_2_Template, 4, 0, "div", 45);
255
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Template(rf, ctx) { if (rf & 1) {
256
+ i0.ɵɵelementStart(0, "div", 48);
257
+ i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_1_Template, 21, 12, "div", 49)(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Conditional_2_Template, 4, 0, "div", 50);
247
258
  i0.ɵɵelementEnd();
248
259
  } if (rf & 2) {
249
260
  const ctx_r1 = i0.ɵɵnextContext(2);
250
261
  i0.ɵɵadvance();
251
262
  i0.ɵɵconditional(ctx_r1.record.Messages && ctx_r1.record.Messages.trim() !== "" ? 1 : 2);
252
263
  } }
253
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_52_Conditional_3_Template(rf, ctx) { if (rf & 1) {
254
- i0.ɵɵelementStart(0, "span", 42);
264
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_3_Template(rf, ctx) { if (rf & 1) {
265
+ i0.ɵɵelementStart(0, "span", 47);
255
266
  i0.ɵɵtext(1, "JSON");
256
267
  i0.ɵɵelementEnd();
257
268
  } }
258
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_52_Conditional_4_Template(rf, ctx) { if (rf & 1) {
259
- i0.ɵɵelementStart(0, "span", 65);
269
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_4_Template(rf, ctx) { if (rf & 1) {
270
+ i0.ɵɵelementStart(0, "span", 70);
260
271
  i0.ɵɵtext(1, "Error");
261
272
  i0.ɵɵelementEnd();
262
273
  } }
263
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_52_Template(rf, ctx) { if (rf & 1) {
264
- i0.ɵɵelementStart(0, "span", 41);
265
- i0.ɵɵelement(1, "i", 64);
274
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Template(rf, ctx) { if (rf & 1) {
275
+ i0.ɵɵelementStart(0, "span", 46);
276
+ i0.ɵɵelement(1, "i", 69);
266
277
  i0.ɵɵtext(2, " Result ");
267
- i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_52_Conditional_3_Template, 2, 0, "span", 42)(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_52_Conditional_4_Template, 2, 0, "span", 65);
278
+ i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_3_Template, 2, 0, "span", 47)(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_4_Template, 2, 0, "span", 70);
268
279
  i0.ɵɵelementEnd();
269
280
  } if (rf & 2) {
270
281
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -273,10 +284,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_52_Template(
273
284
  i0.ɵɵadvance();
274
285
  i0.ɵɵconditional(ctx_r1.record.ErrorMessage ? 4 : -1);
275
286
  } }
276
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_1_Template(rf, ctx) { if (rf & 1) {
277
- i0.ɵɵelementStart(0, "div", 66);
278
- i0.ɵɵelement(1, "i", 67);
279
- i0.ɵɵelementStart(2, "div", 68)(3, "h4");
287
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_1_Template(rf, ctx) { if (rf & 1) {
288
+ i0.ɵɵelementStart(0, "div", 71);
289
+ i0.ɵɵelement(1, "i", 72);
290
+ i0.ɵɵelementStart(2, "div", 73)(3, "h4");
280
291
  i0.ɵɵtext(4, "Error Message");
281
292
  i0.ɵɵelementEnd();
282
293
  i0.ɵɵelementStart(5, "p");
@@ -287,15 +298,15 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Condition
287
298
  i0.ɵɵadvance(6);
288
299
  i0.ɵɵtextInterpolate(ctx_r1.record.ErrorMessage);
289
300
  } }
290
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_2_Template(rf, ctx) { if (rf & 1) {
291
- const _r8 = i0.ɵɵgetCurrentView();
292
- i0.ɵɵelementStart(0, "div", 51)(1, "div", 52)(2, "button", 53);
293
- i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_2_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.copyToClipboard(ctx_r1.formattedResult, "Result")); });
294
- i0.ɵɵelement(3, "i", 54);
301
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_2_Template(rf, ctx) { if (rf & 1) {
302
+ const _r9 = i0.ɵɵgetCurrentView();
303
+ i0.ɵɵelementStart(0, "div", 56)(1, "div", 57)(2, "button", 58);
304
+ i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_2_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.copyToClipboard(ctx_r1.formattedResult, "Result")); });
305
+ i0.ɵɵelement(3, "i", 59);
295
306
  i0.ɵɵtext(4, " Copy ");
296
307
  i0.ɵɵelementEnd()();
297
- i0.ɵɵelementStart(5, "mj-code-editor", 69);
298
- i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_2_Template_mj_code_editor_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedResult, $event) || (ctx_r1.formattedResult = $event); return i0.ɵɵresetView($event); });
308
+ i0.ɵɵelementStart(5, "mj-code-editor", 74);
309
+ i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_2_Template_mj_code_editor_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedResult, $event) || (ctx_r1.formattedResult = $event); return i0.ɵɵresetView($event); });
299
310
  i0.ɵɵelementEnd()();
300
311
  } if (rf & 2) {
301
312
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -303,16 +314,16 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Condition
303
314
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formattedResult);
304
315
  i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
305
316
  } }
306
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_3_Template(rf, ctx) { if (rf & 1) {
307
- i0.ɵɵelementStart(0, "div", 45);
308
- i0.ɵɵelement(1, "i", 70);
317
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Template(rf, ctx) { if (rf & 1) {
318
+ i0.ɵɵelementStart(0, "div", 50);
319
+ i0.ɵɵelement(1, "i", 75);
309
320
  i0.ɵɵelementStart(2, "p");
310
321
  i0.ɵɵtext(3, "No result data recorded");
311
322
  i0.ɵɵelementEnd()();
312
323
  } }
313
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Template(rf, ctx) { if (rf & 1) {
314
- i0.ɵɵelementStart(0, "div", 43);
315
- i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_1_Template, 7, 1, "div", 66)(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_2_Template, 6, 4, "div", 51)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Conditional_3_Template, 4, 0, "div", 45);
324
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Template(rf, ctx) { if (rf & 1) {
325
+ i0.ɵɵelementStart(0, "div", 48);
326
+ i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_1_Template, 7, 1, "div", 71)(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_2_Template, 6, 4, "div", 56)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Template, 4, 0, "div", 50);
316
327
  i0.ɵɵelementEnd();
317
328
  } if (rf & 2) {
318
329
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -321,14 +332,14 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Template(
321
332
  i0.ɵɵadvance();
322
333
  i0.ɵɵconditional(ctx_r1.record.Result && ctx_r1.record.Result.trim() !== "" ? 2 : !ctx_r1.record.ErrorMessage ? 3 : -1);
323
334
  } }
324
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_55_Template(rf, ctx) { if (rf & 1) {
325
- i0.ɵɵelementStart(0, "span", 41);
326
- i0.ɵɵelement(1, "i", 71);
335
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_59_Template(rf, ctx) { if (rf & 1) {
336
+ i0.ɵɵelementStart(0, "span", 46);
337
+ i0.ɵɵelement(1, "i", 76);
327
338
  i0.ɵɵtext(2, " Token Usage & Metrics ");
328
339
  i0.ɵɵelementEnd();
329
340
  } }
330
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_9_Template(rf, ctx) { if (rf & 1) {
331
- i0.ɵɵelementStart(0, "div", 77)(1, "span");
341
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_9_Template(rf, ctx) { if (rf & 1) {
342
+ i0.ɵɵelementStart(0, "div", 82)(1, "span");
332
343
  i0.ɵɵtext(2);
333
344
  i0.ɵɵelementEnd()();
334
345
  } if (rf & 2) {
@@ -336,8 +347,8 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Condition
336
347
  i0.ɵɵadvance(2);
337
348
  i0.ɵɵtextInterpolate1("Rollup: ", ctx_r1.formatTokens(ctx_r1.record.TokensPromptRollup), "");
338
349
  } }
339
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_17_Template(rf, ctx) { if (rf & 1) {
340
- i0.ɵɵelementStart(0, "div", 77)(1, "span");
350
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_17_Template(rf, ctx) { if (rf & 1) {
351
+ i0.ɵɵelementStart(0, "div", 82)(1, "span");
341
352
  i0.ɵɵtext(2);
342
353
  i0.ɵɵelementEnd()();
343
354
  } if (rf & 2) {
@@ -345,8 +356,8 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Condition
345
356
  i0.ɵɵadvance(2);
346
357
  i0.ɵɵtextInterpolate1("Rollup: ", ctx_r1.formatTokens(ctx_r1.record.TokensCompletionRollup), "");
347
358
  } }
348
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_25_Template(rf, ctx) { if (rf & 1) {
349
- i0.ɵɵelementStart(0, "div", 77)(1, "span");
359
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_25_Template(rf, ctx) { if (rf & 1) {
360
+ i0.ɵɵelementStart(0, "div", 82)(1, "span");
350
361
  i0.ɵɵtext(2);
351
362
  i0.ɵɵelementEnd()();
352
363
  } if (rf & 2) {
@@ -354,8 +365,8 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Condition
354
365
  i0.ɵɵadvance(2);
355
366
  i0.ɵɵtextInterpolate1("Rollup: ", ctx_r1.formatTokens(ctx_r1.record.TokensUsedRollup), "");
356
367
  } }
357
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_33_Template(rf, ctx) { if (rf & 1) {
358
- i0.ɵɵelementStart(0, "div", 77)(1, "span");
368
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_33_Template(rf, ctx) { if (rf & 1) {
369
+ i0.ɵɵelementStart(0, "div", 82)(1, "span");
359
370
  i0.ɵɵtext(2);
360
371
  i0.ɵɵelementEnd()();
361
372
  } if (rf & 2) {
@@ -363,8 +374,8 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Condition
363
374
  i0.ɵɵadvance(2);
364
375
  i0.ɵɵtextInterpolate1("Total: ", ctx_r1.formatCost(ctx_r1.record.TotalCost), "");
365
376
  } }
366
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_34_Template(rf, ctx) { if (rf & 1) {
367
- i0.ɵɵelementStart(0, "div", 79);
377
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_34_Template(rf, ctx) { if (rf & 1) {
378
+ i0.ɵɵelementStart(0, "div", 84);
368
379
  i0.ɵɵtext(1);
369
380
  i0.ɵɵelementEnd();
370
381
  } if (rf & 2) {
@@ -372,11 +383,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Condition
372
383
  i0.ɵɵadvance();
373
384
  i0.ɵɵtextInterpolate(ctx_r1.record.CostCurrency);
374
385
  } }
375
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_36_Template(rf, ctx) { if (rf & 1) {
376
- i0.ɵɵelementStart(0, "div", 81)(1, "span", 24);
386
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_36_Template(rf, ctx) { if (rf & 1) {
387
+ i0.ɵɵelementStart(0, "div", 86)(1, "span", 27);
377
388
  i0.ɵɵtext(2, "Execution Order:");
378
389
  i0.ɵɵelementEnd();
379
- i0.ɵɵelementStart(3, "span", 25);
390
+ i0.ɵɵelementStart(3, "span", 28);
380
391
  i0.ɵɵtext(4);
381
392
  i0.ɵɵelementEnd()();
382
393
  } if (rf & 2) {
@@ -384,11 +395,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Condition
384
395
  i0.ɵɵadvance(4);
385
396
  i0.ɵɵtextInterpolate(ctx_r1.record.ExecutionOrder);
386
397
  } }
387
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_37_Template(rf, ctx) { if (rf & 1) {
388
- i0.ɵɵelementStart(0, "div", 81)(1, "span", 24);
398
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_37_Template(rf, ctx) { if (rf & 1) {
399
+ i0.ɵɵelementStart(0, "div", 86)(1, "span", 27);
389
400
  i0.ɵɵtext(2, "Configuration:");
390
401
  i0.ɵɵelementEnd();
391
- i0.ɵɵelementStart(3, "span", 25);
402
+ i0.ɵɵelementStart(3, "span", 28);
392
403
  i0.ɵɵtext(4);
393
404
  i0.ɵɵelementEnd()();
394
405
  } if (rf & 2) {
@@ -396,64 +407,64 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Condition
396
407
  i0.ɵɵadvance(4);
397
408
  i0.ɵɵtextInterpolate(ctx_r1.record.Configuration);
398
409
  } }
399
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_38_Template(rf, ctx) { if (rf & 1) {
400
- const _r9 = i0.ɵɵgetCurrentView();
401
- i0.ɵɵelementStart(0, "div", 81)(1, "span", 24);
410
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_38_Template(rf, ctx) { if (rf & 1) {
411
+ const _r10 = i0.ɵɵgetCurrentView();
412
+ i0.ɵɵelementStart(0, "div", 86)(1, "span", 27);
402
413
  i0.ɵɵtext(2, "Agent:");
403
414
  i0.ɵɵelementEnd();
404
- i0.ɵɵelementStart(3, "span", 82);
405
- i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_38_Template_span_click_3_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.navigateToEntity("AI Agents", ctx_r1.record.AgentID)); });
415
+ i0.ɵɵelementStart(3, "span", 87);
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)); });
406
417
  i0.ɵɵtext(4);
407
- i0.ɵɵelement(5, "i", 83);
418
+ i0.ɵɵelement(5, "i", 88);
408
419
  i0.ɵɵelementEnd()();
409
420
  } if (rf & 2) {
410
421
  const ctx_r1 = i0.ɵɵnextContext(3);
411
422
  i0.ɵɵadvance(4);
412
423
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Agent, " ");
413
424
  } }
414
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Template(rf, ctx) { if (rf & 1) {
415
- i0.ɵɵelementStart(0, "div", 43)(1, "div", 72)(2, "div", 73)(3, "div", 74);
416
- i0.ɵɵelement(4, "i", 75);
425
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Template(rf, ctx) { if (rf & 1) {
426
+ i0.ɵɵelementStart(0, "div", 48)(1, "div", 77)(2, "div", 78)(3, "div", 79);
427
+ i0.ɵɵelement(4, "i", 80);
417
428
  i0.ɵɵelementStart(5, "h4");
418
429
  i0.ɵɵtext(6, "Prompt Tokens");
419
430
  i0.ɵɵelementEnd()();
420
- i0.ɵɵelementStart(7, "div", 76);
431
+ i0.ɵɵelementStart(7, "div", 81);
421
432
  i0.ɵɵtext(8);
422
433
  i0.ɵɵelementEnd();
423
- i0.ɵɵtemplate(9, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_9_Template, 3, 1, "div", 77);
434
+ i0.ɵɵtemplate(9, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_9_Template, 3, 1, "div", 82);
424
435
  i0.ɵɵelementEnd();
425
- i0.ɵɵelementStart(10, "div", 73)(11, "div", 74);
426
- i0.ɵɵelement(12, "i", 78);
436
+ i0.ɵɵelementStart(10, "div", 78)(11, "div", 79);
437
+ i0.ɵɵelement(12, "i", 83);
427
438
  i0.ɵɵelementStart(13, "h4");
428
439
  i0.ɵɵtext(14, "Completion Tokens");
429
440
  i0.ɵɵelementEnd()();
430
- i0.ɵɵelementStart(15, "div", 76);
441
+ i0.ɵɵelementStart(15, "div", 81);
431
442
  i0.ɵɵtext(16);
432
443
  i0.ɵɵelementEnd();
433
- i0.ɵɵtemplate(17, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_17_Template, 3, 1, "div", 77);
444
+ i0.ɵɵtemplate(17, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_17_Template, 3, 1, "div", 82);
434
445
  i0.ɵɵelementEnd();
435
- i0.ɵɵelementStart(18, "div", 73)(19, "div", 74);
436
- i0.ɵɵelement(20, "i", 26);
446
+ i0.ɵɵelementStart(18, "div", 78)(19, "div", 79);
447
+ i0.ɵɵelement(20, "i", 29);
437
448
  i0.ɵɵelementStart(21, "h4");
438
449
  i0.ɵɵtext(22, "Total Tokens");
439
450
  i0.ɵɵelementEnd()();
440
- i0.ɵɵelementStart(23, "div", 76);
451
+ i0.ɵɵelementStart(23, "div", 81);
441
452
  i0.ɵɵtext(24);
442
453
  i0.ɵɵelementEnd();
443
- i0.ɵɵtemplate(25, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_25_Template, 3, 1, "div", 77);
454
+ i0.ɵɵtemplate(25, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_25_Template, 3, 1, "div", 82);
444
455
  i0.ɵɵelementEnd();
445
- i0.ɵɵelementStart(26, "div", 73)(27, "div", 74);
446
- i0.ɵɵelement(28, "i", 27);
456
+ i0.ɵɵelementStart(26, "div", 78)(27, "div", 79);
457
+ i0.ɵɵelement(28, "i", 30);
447
458
  i0.ɵɵelementStart(29, "h4");
448
459
  i0.ɵɵtext(30, "Cost");
449
460
  i0.ɵɵelementEnd()();
450
- i0.ɵɵelementStart(31, "div", 76);
461
+ i0.ɵɵelementStart(31, "div", 81);
451
462
  i0.ɵɵtext(32);
452
463
  i0.ɵɵelementEnd();
453
- i0.ɵɵtemplate(33, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_33_Template, 3, 1, "div", 77)(34, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_34_Template, 2, 1, "div", 79);
464
+ i0.ɵɵtemplate(33, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_33_Template, 3, 1, "div", 82)(34, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_34_Template, 2, 1, "div", 84);
454
465
  i0.ɵɵelementEnd()();
455
- i0.ɵɵelementStart(35, "div", 80);
456
- i0.ɵɵtemplate(36, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_36_Template, 5, 1, "div", 81)(37, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_37_Template, 5, 1, "div", 81)(38, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Conditional_38_Template, 6, 1, "div", 81);
466
+ i0.ɵɵelementStart(35, "div", 85);
467
+ i0.ɵɵtemplate(36, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_36_Template, 5, 1, "div", 86)(37, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_37_Template, 5, 1, "div", 86)(38, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_38_Template, 6, 1, "div", 86);
457
468
  i0.ɵɵelementEnd()();
458
469
  } if (rf & 2) {
459
470
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -482,8 +493,8 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Template(
482
493
  i0.ɵɵadvance();
483
494
  i0.ɵɵconditional(ctx_r1.record.AgentID ? 38 : -1);
484
495
  } }
485
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
486
- i0.ɵɵelementStart(0, "span", 58);
496
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
497
+ i0.ɵɵelementStart(0, "span", 63);
487
498
  i0.ɵɵtext(1);
488
499
  i0.ɵɵelementEnd();
489
500
  } if (rf & 2) {
@@ -491,21 +502,21 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_templa
491
502
  i0.ɵɵadvance();
492
503
  i0.ɵɵtextInterpolate1("(", ctx_r1.record.ValidationAttemptCount, " attempts)");
493
504
  } }
494
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
495
- i0.ɵɵelementStart(0, "span", 85);
505
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
506
+ i0.ɵɵelementStart(0, "span", 90);
496
507
  i0.ɵɵtext(1, "Passed");
497
508
  i0.ɵɵelementEnd();
498
509
  } }
499
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
500
- i0.ɵɵelementStart(0, "span", 65);
510
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
511
+ i0.ɵɵelementStart(0, "span", 70);
501
512
  i0.ɵɵtext(1, "Failed");
502
513
  i0.ɵɵelementEnd();
503
514
  } }
504
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_1_Template(rf, ctx) { if (rf & 1) {
505
- i0.ɵɵelementStart(0, "span", 41);
506
- i0.ɵɵelement(1, "i", 84);
515
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Template(rf, ctx) { if (rf & 1) {
516
+ i0.ɵɵelementStart(0, "span", 46);
517
+ i0.ɵɵelement(1, "i", 89);
507
518
  i0.ɵɵtext(2, " Validation & Retries ");
508
- i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_1_Conditional_3_Template, 2, 1, "span", 58)(4, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_1_Conditional_4_Template, 2, 0, "span", 85)(5, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_1_Conditional_5_Template, 2, 0, "span", 65);
519
+ i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Conditional_3_Template, 2, 1, "span", 63)(4, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Conditional_4_Template, 2, 0, "span", 90)(5, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Conditional_5_Template, 2, 0, "span", 70);
509
520
  i0.ɵɵelementEnd();
510
521
  } if (rf & 2) {
511
522
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -514,8 +525,8 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_templa
514
525
  i0.ɵɵadvance();
515
526
  i0.ɵɵconditional(ctx_r1.record.FinalValidationPassed ? 4 : ctx_r1.record.FinalValidationPassed === false ? 5 : -1);
516
527
  } }
517
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_29_Conditional_6_Template(rf, ctx) { if (rf & 1) {
518
- i0.ɵɵelementStart(0, "span", 96);
528
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_29_Conditional_6_Template(rf, ctx) { if (rf & 1) {
529
+ i0.ɵɵelementStart(0, "span", 101);
519
530
  i0.ɵɵtext(1);
520
531
  i0.ɵɵelementEnd();
521
532
  } if (rf & 2) {
@@ -523,15 +534,15 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_templa
523
534
  i0.ɵɵadvance();
524
535
  i0.ɵɵtextInterpolate1("", ctx_r1.record.ValidationErrorCount, " validation errors");
525
536
  } }
526
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_29_Template(rf, ctx) { if (rf & 1) {
527
- i0.ɵɵelementStart(0, "div", 91)(1, "h5");
528
- i0.ɵɵelement(2, "i", 67);
537
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_29_Template(rf, ctx) { if (rf & 1) {
538
+ i0.ɵɵelementStart(0, "div", 96)(1, "h5");
539
+ i0.ɵɵelement(2, "i", 72);
529
540
  i0.ɵɵtext(3, " Final Validation Error");
530
541
  i0.ɵɵelementEnd();
531
542
  i0.ɵɵelementStart(4, "p");
532
543
  i0.ɵɵtext(5);
533
544
  i0.ɵɵelementEnd();
534
- i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_29_Conditional_6_Template, 2, 1, "span", 96);
545
+ i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_29_Conditional_6_Template, 2, 1, "span", 101);
535
546
  i0.ɵɵelementEnd();
536
547
  } if (rf & 2) {
537
548
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -540,9 +551,9 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_templa
540
551
  i0.ɵɵadvance();
541
552
  i0.ɵɵconditional(ctx_r1.record && ctx_r1.record.ValidationErrorCount && ctx_r1.record.ValidationErrorCount > 0 ? 6 : -1);
542
553
  } }
543
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_30_Template(rf, ctx) { if (rf & 1) {
544
- i0.ɵɵelementStart(0, "div", 92)(1, "h5");
545
- i0.ɵɵelement(2, "i", 97);
554
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_30_Template(rf, ctx) { if (rf & 1) {
555
+ i0.ɵɵelementStart(0, "div", 97)(1, "h5");
556
+ i0.ɵɵelement(2, "i", 102);
546
557
  i0.ɵɵtext(3, " Most Common Error");
547
558
  i0.ɵɵelementEnd();
548
559
  i0.ɵɵelementStart(4, "p");
@@ -553,24 +564,24 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_templa
553
564
  i0.ɵɵadvance(5);
554
565
  i0.ɵɵtextInterpolate(ctx_r1.record.CommonValidationError);
555
566
  } }
556
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_31_Template(rf, ctx) { if (rf & 1) {
557
- i0.ɵɵelementStart(0, "div", 93)(1, "h4");
567
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_31_Template(rf, ctx) { if (rf & 1) {
568
+ i0.ɵɵelementStart(0, "div", 98)(1, "h4");
558
569
  i0.ɵɵtext(2, "Retry Timeline");
559
570
  i0.ɵɵelementEnd();
560
- i0.ɵɵelementStart(3, "div", 98)(4, "div", 99);
561
- i0.ɵɵelement(5, "i", 22);
571
+ i0.ɵɵelementStart(3, "div", 103)(4, "div", 104);
572
+ i0.ɵɵelement(5, "i", 25);
562
573
  i0.ɵɵelementStart(6, "span");
563
574
  i0.ɵɵtext(7);
564
575
  i0.ɵɵpipe(8, "date");
565
576
  i0.ɵɵelementEnd()();
566
- i0.ɵɵelementStart(9, "div", 99);
567
- i0.ɵɵelement(10, "i", 100);
577
+ i0.ɵɵelementStart(9, "div", 104);
578
+ i0.ɵɵelement(10, "i", 105);
568
579
  i0.ɵɵelementStart(11, "span");
569
580
  i0.ɵɵtext(12);
570
581
  i0.ɵɵpipe(13, "date");
571
582
  i0.ɵɵelementEnd()();
572
- i0.ɵɵelementStart(14, "div", 99);
573
- i0.ɵɵelement(15, "i", 101);
583
+ i0.ɵɵelementStart(14, "div", 104);
584
+ i0.ɵɵelement(15, "i", 106);
574
585
  i0.ɵɵelementStart(16, "span");
575
586
  i0.ɵɵtext(17);
576
587
  i0.ɵɵelementEnd()()()();
@@ -583,79 +594,79 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_templa
583
594
  i0.ɵɵadvance(5);
584
595
  i0.ɵɵtextInterpolate1("Total Retry Duration: ", ctx_r1.formatDuration(ctx_r1.record.TotalRetryDurationMS), "");
585
596
  } }
586
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_For_5_Conditional_7_Conditional_2_Template(rf, ctx) { if (rf & 1) {
587
- i0.ɵɵelementStart(0, "span", 96);
597
+ 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", 101);
588
599
  i0.ɵɵtext(1);
589
600
  i0.ɵɵelementEnd();
590
601
  } if (rf & 2) {
591
- const attempt_r10 = i0.ɵɵnextContext(2).$implicit;
602
+ const attempt_r11 = i0.ɵɵnextContext(2).$implicit;
592
603
  i0.ɵɵadvance();
593
- i0.ɵɵtextInterpolate1("(", attempt_r10.validationErrorCount, " errors)");
604
+ i0.ɵɵtextInterpolate1("(", attempt_r11.validationErrorCount, " errors)");
594
605
  } }
595
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_For_5_Conditional_7_Template(rf, ctx) { if (rf & 1) {
596
- i0.ɵɵelementStart(0, "span", 109);
606
+ 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", 114);
597
608
  i0.ɵɵtext(1);
598
609
  i0.ɵɵelementEnd();
599
- i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_For_5_Conditional_7_Conditional_2_Template, 2, 1, "span", 96);
610
+ i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Conditional_7_Conditional_2_Template, 2, 1, "span", 101);
600
611
  } if (rf & 2) {
601
- const attempt_r10 = i0.ɵɵnextContext().$implicit;
612
+ const attempt_r11 = i0.ɵɵnextContext().$implicit;
602
613
  i0.ɵɵadvance();
603
- i0.ɵɵtextInterpolate(attempt_r10.errorMessage || "Unknown error");
614
+ i0.ɵɵtextInterpolate(attempt_r11.errorMessage || "Unknown error");
604
615
  i0.ɵɵadvance();
605
- i0.ɵɵconditional(attempt_r10.validationErrorCount > 0 ? 2 : -1);
616
+ i0.ɵɵconditional(attempt_r11.validationErrorCount > 0 ? 2 : -1);
606
617
  } }
607
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_For_5_Conditional_8_Template(rf, ctx) { if (rf & 1) {
608
- i0.ɵɵelementStart(0, "span", 108);
618
+ 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", 113);
609
620
  i0.ɵɵtext(1);
610
621
  i0.ɵɵelementEnd();
611
622
  } if (rf & 2) {
612
- const attempt_r10 = i0.ɵɵnextContext().$implicit;
623
+ const attempt_r11 = i0.ɵɵnextContext().$implicit;
613
624
  i0.ɵɵadvance();
614
- i0.ɵɵtextInterpolate1("Output: ", attempt_r10.outputLength, " chars");
625
+ i0.ɵɵtextInterpolate1("Output: ", attempt_r11.outputLength, " chars");
615
626
  } }
616
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_For_5_Template(rf, ctx) { if (rf & 1) {
617
- i0.ɵɵelementStart(0, "div", 104)(1, "div", 105);
627
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Template(rf, ctx) { if (rf & 1) {
628
+ i0.ɵɵelementStart(0, "div", 109)(1, "div", 110);
618
629
  i0.ɵɵelement(2, "i");
619
630
  i0.ɵɵtext(3);
620
631
  i0.ɵɵelementEnd();
621
- i0.ɵɵelementStart(4, "div", 106)(5, "span", 107);
632
+ i0.ɵɵelementStart(4, "div", 111)(5, "span", 112);
622
633
  i0.ɵɵtext(6);
623
634
  i0.ɵɵelementEnd();
624
- i0.ɵɵtemplate(7, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_For_5_Conditional_7_Template, 3, 2)(8, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_For_5_Conditional_8_Template, 2, 1, "span", 108);
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", 113);
625
636
  i0.ɵɵelementEnd()();
626
637
  } if (rf & 2) {
627
- const attempt_r10 = ctx.$implicit;
628
- i0.ɵɵclassProp("success", attempt_r10.success)("failed", !attempt_r10.success);
638
+ const attempt_r11 = ctx.$implicit;
639
+ i0.ɵɵclassProp("success", attempt_r11.success)("failed", !attempt_r11.success);
629
640
  i0.ɵɵadvance(2);
630
- i0.ɵɵclassMap(attempt_r10.success ? "fa-solid fa-check" : "fa-solid fa-times");
641
+ i0.ɵɵclassMap(attempt_r11.success ? "fa-solid fa-check" : "fa-solid fa-times");
631
642
  i0.ɵɵadvance();
632
- i0.ɵɵtextInterpolate1(" Attempt #", attempt_r10.attemptNumber, " ");
643
+ i0.ɵɵtextInterpolate1(" Attempt #", attempt_r11.attemptNumber, " ");
633
644
  i0.ɵɵadvance(3);
634
- i0.ɵɵtextInterpolate(attempt_r10.timestamp);
645
+ i0.ɵɵtextInterpolate(attempt_r11.timestamp);
635
646
  i0.ɵɵadvance();
636
- i0.ɵɵconditional(!attempt_r10.success ? 7 : -1);
647
+ i0.ɵɵconditional(!attempt_r11.success ? 7 : -1);
637
648
  i0.ɵɵadvance();
638
- i0.ɵɵconditional(attempt_r10.outputLength ? 8 : -1);
649
+ i0.ɵɵconditional(attempt_r11.outputLength ? 8 : -1);
639
650
  } }
640
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_Template(rf, ctx) { if (rf & 1) {
641
- i0.ɵɵelementStart(0, "div", 94)(1, "h4");
651
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_Template(rf, ctx) { if (rf & 1) {
652
+ i0.ɵɵelementStart(0, "div", 99)(1, "h4");
642
653
  i0.ɵɵtext(2, "Validation Attempts");
643
654
  i0.ɵɵelementEnd();
644
- i0.ɵɵelementStart(3, "div", 102);
645
- i0.ɵɵrepeaterCreate(4, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_For_5_Template, 9, 10, "div", 103, _forTrack0);
655
+ i0.ɵɵelementStart(3, "div", 107);
656
+ i0.ɵɵrepeaterCreate(4, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Template, 9, 10, "div", 108, _forTrack0);
646
657
  i0.ɵɵelementEnd()();
647
658
  } if (rf & 2) {
648
659
  const ctx_r1 = i0.ɵɵnextContext(4);
649
660
  i0.ɵɵadvance(4);
650
661
  i0.ɵɵrepeater(ctx_r1.validationAttempts);
651
662
  } }
652
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_33_Template(rf, ctx) { if (rf & 1) {
653
- const _r11 = i0.ɵɵgetCurrentView();
654
- i0.ɵɵelementStart(0, "div", 95)(1, "h4");
663
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_33_Template(rf, ctx) { if (rf & 1) {
664
+ const _r12 = i0.ɵɵgetCurrentView();
665
+ i0.ɵɵelementStart(0, "div", 100)(1, "h4");
655
666
  i0.ɵɵtext(2, "Validation Summary Details");
656
667
  i0.ɵɵelementEnd();
657
- i0.ɵɵelementStart(3, "div", 110)(4, "mj-code-editor", 111);
658
- i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_33_Template_mj_code_editor_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedValidationSummary, $event) || (ctx_r1.formattedValidationSummary = $event); return i0.ɵɵresetView($event); });
668
+ i0.ɵɵelementStart(3, "div", 115)(4, "mj-code-editor", 116);
669
+ 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); });
659
670
  i0.ɵɵelementEnd()()();
660
671
  } if (rf & 2) {
661
672
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -663,13 +674,13 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_templa
663
674
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formattedValidationSummary);
664
675
  i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
665
676
  } }
666
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_34_Template(rf, ctx) { if (rf & 1) {
667
- const _r12 = i0.ɵɵgetCurrentView();
668
- i0.ɵɵelementStart(0, "div", 95)(1, "h4");
677
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_34_Template(rf, ctx) { if (rf & 1) {
678
+ const _r13 = i0.ɵɵgetCurrentView();
679
+ i0.ɵɵelementStart(0, "div", 100)(1, "h4");
669
680
  i0.ɵɵtext(2, "Validation Attempts (Raw JSON)");
670
681
  i0.ɵɵelementEnd();
671
- i0.ɵɵelementStart(3, "div", 110)(4, "mj-code-editor", 112);
672
- i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_34_Template_mj_code_editor_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedValidationAttempts, $event) || (ctx_r1.formattedValidationAttempts = $event); return i0.ɵɵresetView($event); });
682
+ i0.ɵɵelementStart(3, "div", 115)(4, "mj-code-editor", 117);
683
+ 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); });
673
684
  i0.ɵɵelementEnd()()();
674
685
  } if (rf & 2) {
675
686
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -677,41 +688,41 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_templa
677
688
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formattedValidationAttempts);
678
689
  i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
679
690
  } }
680
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Template(rf, ctx) { if (rf & 1) {
681
- i0.ɵɵelementStart(0, "div", 43)(1, "div", 86)(2, "div", 87)(3, "h4");
691
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Template(rf, ctx) { if (rf & 1) {
692
+ i0.ɵɵelementStart(0, "div", 48)(1, "div", 91)(2, "div", 92)(3, "h4");
682
693
  i0.ɵɵtext(4, "Validation Summary");
683
694
  i0.ɵɵelementEnd();
684
- i0.ɵɵelementStart(5, "div", 88);
695
+ i0.ɵɵelementStart(5, "div", 93);
685
696
  i0.ɵɵelement(6, "i");
686
697
  i0.ɵɵtext(7);
687
698
  i0.ɵɵelementEnd()();
688
- i0.ɵɵelementStart(8, "div", 89)(9, "div", 90)(10, "div", 24);
699
+ i0.ɵɵelementStart(8, "div", 94)(9, "div", 95)(10, "div", 27);
689
700
  i0.ɵɵtext(11, "Total Attempts");
690
701
  i0.ɵɵelementEnd();
691
- i0.ɵɵelementStart(12, "div", 25);
702
+ i0.ɵɵelementStart(12, "div", 28);
692
703
  i0.ɵɵtext(13);
693
704
  i0.ɵɵelementEnd()();
694
- i0.ɵɵelementStart(14, "div", 90)(15, "div", 24);
705
+ i0.ɵɵelementStart(14, "div", 95)(15, "div", 27);
695
706
  i0.ɵɵtext(16, "Successful");
696
707
  i0.ɵɵelementEnd();
697
- i0.ɵɵelementStart(17, "div", 25);
708
+ i0.ɵɵelementStart(17, "div", 28);
698
709
  i0.ɵɵtext(18);
699
710
  i0.ɵɵelementEnd()();
700
- i0.ɵɵelementStart(19, "div", 90)(20, "div", 24);
711
+ i0.ɵɵelementStart(19, "div", 95)(20, "div", 27);
701
712
  i0.ɵɵtext(21, "Behavior");
702
713
  i0.ɵɵelementEnd();
703
- i0.ɵɵelementStart(22, "div", 25);
714
+ i0.ɵɵelementStart(22, "div", 28);
704
715
  i0.ɵɵtext(23);
705
716
  i0.ɵɵelementEnd()();
706
- i0.ɵɵelementStart(24, "div", 90)(25, "div", 24);
717
+ i0.ɵɵelementStart(24, "div", 95)(25, "div", 27);
707
718
  i0.ɵɵtext(26, "Retry Strategy");
708
719
  i0.ɵɵelementEnd();
709
- i0.ɵɵelementStart(27, "div", 25);
720
+ i0.ɵɵelementStart(27, "div", 28);
710
721
  i0.ɵɵtext(28);
711
722
  i0.ɵɵelementEnd()()();
712
- i0.ɵɵtemplate(29, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_29_Template, 7, 2, "div", 91)(30, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_30_Template, 6, 1, "div", 92);
723
+ i0.ɵɵtemplate(29, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_29_Template, 7, 2, "div", 96)(30, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_30_Template, 6, 1, "div", 97);
713
724
  i0.ɵɵelementEnd();
714
- i0.ɵɵtemplate(31, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_31_Template, 18, 9, "div", 93)(32, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_32_Template, 6, 0, "div", 94)(33, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_33_Template, 5, 4, "div", 95)(34, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Conditional_34_Template, 5, 4, "div", 95);
725
+ i0.ɵɵtemplate(31, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_31_Template, 18, 9, "div", 98)(32, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_Template, 6, 0, "div", 99)(33, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_33_Template, 5, 4, "div", 100)(34, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_34_Template, 5, 4, "div", 100);
715
726
  i0.ɵɵelementEnd();
716
727
  } if (rf & 2) {
717
728
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -742,16 +753,16 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_templa
742
753
  i0.ɵɵadvance();
743
754
  i0.ɵɵconditional(ctx_r1.record.ValidationAttempts ? 34 : -1);
744
755
  } }
745
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_Template(rf, ctx) { if (rf & 1) {
746
- i0.ɵɵelementStart(0, "kendo-panelbar-item", 32);
747
- i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_1_Template, 6, 2, "ng-template", 30)(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_ng_template_2_Template, 35, 17, "ng-template", 31);
756
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_Template(rf, ctx) { if (rf & 1) {
757
+ i0.ɵɵelementStart(0, "kendo-panelbar-item", 35);
758
+ i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Template, 6, 2, "ng-template", 33)(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Template, 35, 17, "ng-template", 34);
748
759
  i0.ɵɵelementEnd();
749
760
  } if (rf & 2) {
750
761
  const ctx_r1 = i0.ɵɵnextContext(2);
751
762
  i0.ɵɵproperty("expanded", ctx_r1.validationExpanded);
752
763
  } }
753
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
754
- i0.ɵɵelementStart(0, "span", 58);
764
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
765
+ i0.ɵɵelementStart(0, "span", 63);
755
766
  i0.ɵɵtext(1);
756
767
  i0.ɵɵelementEnd();
757
768
  } if (rf & 2) {
@@ -759,47 +770,47 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_templa
759
770
  i0.ɵɵadvance();
760
771
  i0.ɵɵtextInterpolate1("(", ctx_r1.childRuns.length, " children)");
761
772
  } }
762
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_1_Template(rf, ctx) { if (rf & 1) {
763
- i0.ɵɵelementStart(0, "span", 41);
764
- i0.ɵɵelement(1, "i", 113);
773
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_1_Template(rf, ctx) { if (rf & 1) {
774
+ i0.ɵɵelementStart(0, "span", 46);
775
+ i0.ɵɵelement(1, "i", 118);
765
776
  i0.ɵɵtext(2, " Run Hierarchy ");
766
- i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_1_Conditional_3_Template, 2, 1, "span", 58);
777
+ i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_1_Conditional_3_Template, 2, 1, "span", 63);
767
778
  i0.ɵɵelementEnd();
768
779
  } if (rf & 2) {
769
780
  const ctx_r1 = i0.ɵɵnextContext(3);
770
781
  i0.ɵɵadvance(3);
771
782
  i0.ɵɵconditional(ctx_r1.childRuns.length > 0 ? 3 : -1);
772
783
  } }
773
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
774
- const _r13 = i0.ɵɵgetCurrentView();
775
- i0.ɵɵelementStart(0, "div", 114)(1, "h4");
776
- i0.ɵɵelement(2, "i", 116);
784
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
785
+ const _r14 = i0.ɵɵgetCurrentView();
786
+ i0.ɵɵelementStart(0, "div", 119)(1, "h4");
787
+ i0.ɵɵelement(2, "i", 43);
777
788
  i0.ɵɵtext(3, " Parent Run");
778
789
  i0.ɵɵelementEnd();
779
- i0.ɵɵelementStart(4, "div", 117);
780
- i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_1_Template_div_click_4_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.navigateToEntity("MJ: AI Prompt Runs", ctx_r1.parentRun.ID)); });
781
- i0.ɵɵelementStart(5, "div", 118);
790
+ i0.ɵɵelementStart(4, "div", 121);
791
+ 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", 122);
782
793
  i0.ɵɵelement(6, "i");
783
794
  i0.ɵɵelementEnd();
784
- i0.ɵɵelementStart(7, "div", 119)(8, "div", 120);
795
+ i0.ɵɵelementStart(7, "div", 123)(8, "div", 124);
785
796
  i0.ɵɵtext(9);
786
- i0.ɵɵelementStart(10, "span", 121);
797
+ i0.ɵɵelementStart(10, "span", 125);
787
798
  i0.ɵɵtext(11);
788
799
  i0.ɵɵelementEnd()();
789
- i0.ɵɵelementStart(12, "div", 122)(13, "span");
790
- i0.ɵɵelement(14, "i", 22);
800
+ i0.ɵɵelementStart(12, "div", 126)(13, "span");
801
+ i0.ɵɵelement(14, "i", 25);
791
802
  i0.ɵɵtext(15);
792
803
  i0.ɵɵelementEnd();
793
804
  i0.ɵɵelementStart(16, "span");
794
- i0.ɵɵelement(17, "i", 26);
805
+ i0.ɵɵelement(17, "i", 29);
795
806
  i0.ɵɵtext(18);
796
807
  i0.ɵɵelementEnd();
797
808
  i0.ɵɵelementStart(19, "span");
798
- i0.ɵɵelement(20, "i", 40);
809
+ i0.ɵɵelement(20, "i", 45);
799
810
  i0.ɵɵtext(21);
800
811
  i0.ɵɵpipe(22, "date");
801
812
  i0.ɵɵelementEnd()()();
802
- i0.ɵɵelement(23, "i", 83);
813
+ i0.ɵɵelement(23, "i", 88);
803
814
  i0.ɵɵelementEnd()();
804
815
  } if (rf & 2) {
805
816
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -818,82 +829,82 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_templa
818
829
  i0.ɵɵadvance(3);
819
830
  i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(22, 9, ctx_r1.parentRun.RunAt, "short"), "");
820
831
  } }
821
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_2_For_6_Conditional_6_Template(rf, ctx) { if (rf & 1) {
822
- i0.ɵɵelementStart(0, "span", 127);
832
+ 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", 131);
823
834
  i0.ɵɵtext(1);
824
835
  i0.ɵɵelementEnd();
825
836
  } if (rf & 2) {
826
- const childRun_r15 = i0.ɵɵnextContext().$implicit;
837
+ const childRun_r16 = i0.ɵɵnextContext().$implicit;
827
838
  i0.ɵɵadvance();
828
- i0.ɵɵtextInterpolate1("#", childRun_r15.ExecutionOrder, "");
839
+ i0.ɵɵtextInterpolate1("#", childRun_r16.ExecutionOrder, "");
829
840
  } }
830
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_2_For_6_Template(rf, ctx) { if (rf & 1) {
831
- const _r14 = i0.ɵɵgetCurrentView();
832
- i0.ɵɵelementStart(0, "div", 126);
833
- i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_2_For_6_Template_div_click_0_listener() { const childRun_r15 = i0.ɵɵrestoreView(_r14).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.navigateToEntity("MJ: AI Prompt Runs", childRun_r15.ID)); });
834
- i0.ɵɵelementStart(1, "div", 118);
841
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_For_6_Template(rf, ctx) { if (rf & 1) {
842
+ const _r15 = i0.ɵɵgetCurrentView();
843
+ i0.ɵɵelementStart(0, "div", 130);
844
+ 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", 122);
835
846
  i0.ɵɵelement(2, "i");
836
847
  i0.ɵɵelementEnd();
837
- i0.ɵɵelementStart(3, "div", 119)(4, "div", 120);
848
+ i0.ɵɵelementStart(3, "div", 123)(4, "div", 124);
838
849
  i0.ɵɵtext(5);
839
- i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_2_For_6_Conditional_6_Template, 2, 1, "span", 127);
840
- i0.ɵɵelementStart(7, "span", 121);
850
+ i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_For_6_Conditional_6_Template, 2, 1, "span", 131);
851
+ i0.ɵɵelementStart(7, "span", 125);
841
852
  i0.ɵɵtext(8);
842
853
  i0.ɵɵelementEnd()();
843
- i0.ɵɵelementStart(9, "div", 122)(10, "span", 128);
854
+ i0.ɵɵelementStart(9, "div", 126)(10, "span", 132);
844
855
  i0.ɵɵelement(11, "i");
845
856
  i0.ɵɵtext(12);
846
857
  i0.ɵɵelementEnd();
847
858
  i0.ɵɵelementStart(13, "span");
848
- i0.ɵɵelement(14, "i", 22);
859
+ i0.ɵɵelement(14, "i", 25);
849
860
  i0.ɵɵtext(15);
850
861
  i0.ɵɵelementEnd();
851
862
  i0.ɵɵelementStart(16, "span");
852
- i0.ɵɵelement(17, "i", 26);
863
+ i0.ɵɵelement(17, "i", 29);
853
864
  i0.ɵɵtext(18);
854
865
  i0.ɵɵelementEnd()()();
855
- i0.ɵɵelement(19, "i", 83);
866
+ i0.ɵɵelement(19, "i", 88);
856
867
  i0.ɵɵelementEnd();
857
868
  } if (rf & 2) {
858
- const childRun_r15 = ctx.$implicit;
869
+ const childRun_r16 = ctx.$implicit;
859
870
  const ctx_r1 = i0.ɵɵnextContext(5);
860
871
  i0.ɵɵadvance();
861
872
  i0.ɵɵstyleProp("background-color", ctx_r1.getStatusColor() + "20");
862
873
  i0.ɵɵadvance();
863
- i0.ɵɵclassMap("fa-solid " + ctx_r1.getRunTypeIcon(childRun_r15.RunType));
874
+ i0.ɵɵclassMap("fa-solid " + ctx_r1.getRunTypeIcon(childRun_r16.RunType));
864
875
  i0.ɵɵadvance(3);
865
- i0.ɵɵtextInterpolate1(" Child Run #", childRun_r15.ID.substring(0, 8), " ");
876
+ i0.ɵɵtextInterpolate1(" Child Run #", childRun_r16.ID.substring(0, 8), " ");
866
877
  i0.ɵɵadvance();
867
- i0.ɵɵconditional(childRun_r15.ExecutionOrder !== null ? 6 : -1);
878
+ i0.ɵɵconditional(childRun_r16.ExecutionOrder !== null ? 6 : -1);
868
879
  i0.ɵɵadvance(2);
869
- i0.ɵɵtextInterpolate(childRun_r15.RunType);
880
+ i0.ɵɵtextInterpolate(childRun_r16.RunType);
870
881
  i0.ɵɵadvance(2);
871
882
  i0.ɵɵstyleProp("color", ctx_r1.getStatusColor());
872
883
  i0.ɵɵadvance();
873
884
  i0.ɵɵclassMap("fa-solid " + ctx_r1.getStatusIcon());
874
885
  i0.ɵɵadvance();
875
- i0.ɵɵtextInterpolate1(" ", childRun_r15.Success ? "Success" : childRun_r15.ErrorMessage ? "Failed" : "Running", " ");
886
+ i0.ɵɵtextInterpolate1(" ", childRun_r16.Success ? "Success" : childRun_r16.ErrorMessage ? "Failed" : "Running", " ");
876
887
  i0.ɵɵadvance(3);
877
- i0.ɵɵtextInterpolate1(" ", ctx_r1.formatDuration(childRun_r15.ExecutionTimeMS), "");
888
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.formatDuration(childRun_r16.ExecutionTimeMS), "");
878
889
  i0.ɵɵadvance(3);
879
- i0.ɵɵtextInterpolate1(" ", ctx_r1.formatTokens(childRun_r15.TokensUsed), "");
890
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.formatTokens(childRun_r16.TokensUsed), "");
880
891
  } }
881
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
882
- i0.ɵɵelementStart(0, "div", 115)(1, "h4");
883
- i0.ɵɵelement(2, "i", 123);
892
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
893
+ i0.ɵɵelementStart(0, "div", 120)(1, "h4");
894
+ i0.ɵɵelement(2, "i", 127);
884
895
  i0.ɵɵtext(3, " Child Runs");
885
896
  i0.ɵɵelementEnd();
886
- i0.ɵɵelementStart(4, "div", 124);
887
- i0.ɵɵrepeaterCreate(5, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_2_For_6_Template, 20, 14, "div", 125, _forTrack1);
897
+ i0.ɵɵelementStart(4, "div", 128);
898
+ i0.ɵɵrepeaterCreate(5, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_For_6_Template, 20, 14, "div", 129, _forTrack1);
888
899
  i0.ɵɵelementEnd()();
889
900
  } if (rf & 2) {
890
901
  const ctx_r1 = i0.ɵɵnextContext(4);
891
902
  i0.ɵɵadvance(5);
892
903
  i0.ɵɵrepeater(ctx_r1.childRuns);
893
904
  } }
894
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Template(rf, ctx) { if (rf & 1) {
895
- i0.ɵɵelementStart(0, "div", 43);
896
- i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_1_Template, 24, 12, "div", 114)(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Conditional_2_Template, 7, 0, "div", 115);
905
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Template(rf, ctx) { if (rf & 1) {
906
+ i0.ɵɵelementStart(0, "div", 48);
907
+ i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_1_Template, 24, 12, "div", 119)(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_Template, 7, 0, "div", 120);
897
908
  i0.ɵɵelementEnd();
898
909
  } if (rf & 2) {
899
910
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -902,42 +913,42 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_templa
902
913
  i0.ɵɵadvance();
903
914
  i0.ɵɵconditional(ctx_r1.childRuns.length > 0 ? 2 : -1);
904
915
  } }
905
- function AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_Template(rf, ctx) { if (rf & 1) {
906
- i0.ɵɵelementStart(0, "kendo-panelbar-item", 32);
907
- i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_1_Template, 4, 1, "ng-template", 30)(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_ng_template_2_Template, 3, 2, "ng-template", 31);
916
+ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_Template(rf, ctx) { if (rf & 1) {
917
+ i0.ɵɵelementStart(0, "kendo-panelbar-item", 35);
918
+ i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_1_Template, 4, 1, "ng-template", 33)(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Template, 3, 2, "ng-template", 34);
908
919
  i0.ɵɵelementEnd();
909
920
  } if (rf & 2) {
910
921
  const ctx_r1 = i0.ɵɵnextContext(2);
911
922
  i0.ɵɵproperty("expanded", ctx_r1.hierarchyExpanded);
912
923
  } }
913
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Template(rf, ctx) { if (rf & 1) {
914
- i0.ɵɵelementStart(0, "span", 41);
915
- i0.ɵɵelement(1, "i", 129);
924
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_64_Template(rf, ctx) { if (rf & 1) {
925
+ i0.ɵɵelementStart(0, "span", 46);
926
+ i0.ɵɵelement(1, "i", 133);
916
927
  i0.ɵɵtext(2, " Additional Details ");
917
928
  i0.ɵɵelementEnd();
918
929
  } }
919
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_2_Template(rf, ctx) { if (rf & 1) {
920
- const _r16 = i0.ɵɵgetCurrentView();
921
- i0.ɵɵelementStart(0, "div", 131)(1, "label");
930
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_2_Template(rf, ctx) { if (rf & 1) {
931
+ const _r17 = i0.ɵɵgetCurrentView();
932
+ i0.ɵɵelementStart(0, "div", 135)(1, "label");
922
933
  i0.ɵɵtext(2, "Agent");
923
934
  i0.ɵɵelementEnd();
924
- i0.ɵɵelementStart(3, "div", 139);
925
- i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_2_Template_div_click_3_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.navigateToEntity("AI Agents", ctx_r1.record.AgentID)); });
926
- i0.ɵɵelement(4, "i", 140);
935
+ i0.ɵɵelementStart(3, "div", 143);
936
+ 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", 144);
927
938
  i0.ɵɵtext(5);
928
- i0.ɵɵelement(6, "i", 83);
939
+ i0.ɵɵelement(6, "i", 88);
929
940
  i0.ɵɵelementEnd()();
930
941
  } if (rf & 2) {
931
942
  const ctx_r1 = i0.ɵɵnextContext(3);
932
943
  i0.ɵɵadvance(5);
933
944
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Agent || "Unknown", " ");
934
945
  } }
935
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_3_Template(rf, ctx) { if (rf & 1) {
936
- i0.ɵɵelementStart(0, "div", 131)(1, "label");
946
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_3_Template(rf, ctx) { if (rf & 1) {
947
+ i0.ɵɵelementStart(0, "div", 135)(1, "label");
937
948
  i0.ɵɵtext(2, "Configuration");
938
949
  i0.ɵɵelementEnd();
939
- i0.ɵɵelementStart(3, "div", 132);
940
- i0.ɵɵelement(4, "i", 141);
950
+ i0.ɵɵelementStart(3, "div", 136);
951
+ i0.ɵɵelement(4, "i", 145);
941
952
  i0.ɵɵtext(5);
942
953
  i0.ɵɵelementEnd()();
943
954
  } if (rf & 2) {
@@ -945,11 +956,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Condition
945
956
  i0.ɵɵadvance(5);
946
957
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Configuration || "Unknown", " ");
947
958
  } }
948
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_4_Template(rf, ctx) { if (rf & 1) {
949
- i0.ɵɵelementStart(0, "div", 131)(1, "label");
959
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_4_Template(rf, ctx) { if (rf & 1) {
960
+ i0.ɵɵelementStart(0, "div", 135)(1, "label");
950
961
  i0.ɵɵtext(2, "Run Type");
951
962
  i0.ɵɵelementEnd();
952
- i0.ɵɵelementStart(3, "div", 132);
963
+ i0.ɵɵelementStart(3, "div", 136);
953
964
  i0.ɵɵelement(4, "i");
954
965
  i0.ɵɵtext(5);
955
966
  i0.ɵɵelementEnd()();
@@ -960,12 +971,12 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Condition
960
971
  i0.ɵɵadvance();
961
972
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.RunType, " ");
962
973
  } }
963
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_5_Template(rf, ctx) { if (rf & 1) {
964
- i0.ɵɵelementStart(0, "div", 131)(1, "label");
974
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_5_Template(rf, ctx) { if (rf & 1) {
975
+ i0.ɵɵelementStart(0, "div", 135)(1, "label");
965
976
  i0.ɵɵtext(2, "Response Format");
966
977
  i0.ɵɵelementEnd();
967
- i0.ɵɵelementStart(3, "div", 132);
968
- i0.ɵɵelement(4, "i", 63);
978
+ i0.ɵɵelementStart(3, "div", 136);
979
+ i0.ɵɵelement(4, "i", 68);
969
980
  i0.ɵɵtext(5);
970
981
  i0.ɵɵelementEnd()();
971
982
  } if (rf & 2) {
@@ -973,12 +984,12 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Condition
973
984
  i0.ɵɵadvance(5);
974
985
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.ResponseFormat, " ");
975
986
  } }
976
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_48_Template(rf, ctx) { if (rf & 1) {
977
- i0.ɵɵelementStart(0, "div", 131)(1, "label");
987
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_48_Template(rf, ctx) { if (rf & 1) {
988
+ i0.ɵɵelementStart(0, "div", 135)(1, "label");
978
989
  i0.ɵɵtext(2, "Started At");
979
990
  i0.ɵɵelementEnd();
980
- i0.ɵɵelementStart(3, "div", 132);
981
- i0.ɵɵelement(4, "i", 22);
991
+ i0.ɵɵelementStart(3, "div", 136);
992
+ i0.ɵɵelement(4, "i", 25);
982
993
  i0.ɵɵtext(5);
983
994
  i0.ɵɵpipe(6, "date");
984
995
  i0.ɵɵelementEnd()();
@@ -987,12 +998,12 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Condition
987
998
  i0.ɵɵadvance(5);
988
999
  i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(6, 1, ctx_r1.record.RunAt, "medium"), " ");
989
1000
  } }
990
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_49_Template(rf, ctx) { if (rf & 1) {
991
- i0.ɵɵelementStart(0, "div", 131)(1, "label");
1001
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_49_Template(rf, ctx) { if (rf & 1) {
1002
+ i0.ɵɵelementStart(0, "div", 135)(1, "label");
992
1003
  i0.ɵɵtext(2, "Completed At");
993
1004
  i0.ɵɵelementEnd();
994
- i0.ɵɵelementStart(3, "div", 132);
995
- i0.ɵɵelement(4, "i", 142);
1005
+ i0.ɵɵelementStart(3, "div", 136);
1006
+ i0.ɵɵelement(4, "i", 146);
996
1007
  i0.ɵɵtext(5);
997
1008
  i0.ɵɵpipe(6, "date");
998
1009
  i0.ɵɵelementEnd()();
@@ -1001,59 +1012,59 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Condition
1001
1012
  i0.ɵɵadvance(5);
1002
1013
  i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(6, 1, ctx_r1.record.CompletedAt, "medium"), " ");
1003
1014
  } }
1004
- function AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Template(rf, ctx) { if (rf & 1) {
1005
- i0.ɵɵelementStart(0, "div", 43)(1, "div", 130);
1006
- i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_2_Template, 7, 1, "div", 131)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_3_Template, 6, 1, "div", 131)(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_4_Template, 6, 3, "div", 131)(5, AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_5_Template, 6, 1, "div", 131);
1007
- i0.ɵɵelementStart(6, "div", 131)(7, "label");
1015
+ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Template(rf, ctx) { if (rf & 1) {
1016
+ i0.ɵɵelementStart(0, "div", 48)(1, "div", 134);
1017
+ i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_2_Template, 7, 1, "div", 135)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_3_Template, 6, 1, "div", 135)(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_4_Template, 6, 3, "div", 135)(5, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_5_Template, 6, 1, "div", 135);
1018
+ i0.ɵɵelementStart(6, "div", 135)(7, "label");
1008
1019
  i0.ɵɵtext(8, "Temperature");
1009
1020
  i0.ɵɵelementEnd();
1010
- i0.ɵɵelementStart(9, "div", 132);
1011
- i0.ɵɵelement(10, "i", 133);
1021
+ i0.ɵɵelementStart(9, "div", 136);
1022
+ i0.ɵɵelement(10, "i", 137);
1012
1023
  i0.ɵɵtext(11);
1013
1024
  i0.ɵɵelementEnd()();
1014
- i0.ɵɵelementStart(12, "div", 131)(13, "label");
1025
+ i0.ɵɵelementStart(12, "div", 135)(13, "label");
1015
1026
  i0.ɵɵtext(14, "Top P");
1016
1027
  i0.ɵɵelementEnd();
1017
- i0.ɵɵelementStart(15, "div", 132);
1018
- i0.ɵɵelement(16, "i", 134);
1028
+ i0.ɵɵelementStart(15, "div", 136);
1029
+ i0.ɵɵelement(16, "i", 138);
1019
1030
  i0.ɵɵtext(17);
1020
1031
  i0.ɵɵelementEnd()();
1021
- i0.ɵɵelementStart(18, "div", 131)(19, "label");
1032
+ i0.ɵɵelementStart(18, "div", 135)(19, "label");
1022
1033
  i0.ɵɵtext(20, "Top K");
1023
1034
  i0.ɵɵelementEnd();
1024
- i0.ɵɵelementStart(21, "div", 132);
1025
- i0.ɵɵelement(22, "i", 135);
1035
+ i0.ɵɵelementStart(21, "div", 136);
1036
+ i0.ɵɵelement(22, "i", 139);
1026
1037
  i0.ɵɵtext(23);
1027
1038
  i0.ɵɵelementEnd()();
1028
- i0.ɵɵelementStart(24, "div", 131)(25, "label");
1039
+ i0.ɵɵelementStart(24, "div", 135)(25, "label");
1029
1040
  i0.ɵɵtext(26, "Min P");
1030
1041
  i0.ɵɵelementEnd();
1031
- i0.ɵɵelementStart(27, "div", 132);
1032
- i0.ɵɵelement(28, "i", 136);
1042
+ i0.ɵɵelementStart(27, "div", 136);
1043
+ i0.ɵɵelement(28, "i", 140);
1033
1044
  i0.ɵɵtext(29);
1034
1045
  i0.ɵɵelementEnd()();
1035
- i0.ɵɵelementStart(30, "div", 131)(31, "label");
1046
+ i0.ɵɵelementStart(30, "div", 135)(31, "label");
1036
1047
  i0.ɵɵtext(32, "Frequency Penalty");
1037
1048
  i0.ɵɵelementEnd();
1038
- i0.ɵɵelementStart(33, "div", 132);
1039
- i0.ɵɵelement(34, "i", 97);
1049
+ i0.ɵɵelementStart(33, "div", 136);
1050
+ i0.ɵɵelement(34, "i", 102);
1040
1051
  i0.ɵɵtext(35);
1041
1052
  i0.ɵɵelementEnd()();
1042
- i0.ɵɵelementStart(36, "div", 131)(37, "label");
1053
+ i0.ɵɵelementStart(36, "div", 135)(37, "label");
1043
1054
  i0.ɵɵtext(38, "Presence Penalty");
1044
1055
  i0.ɵɵelementEnd();
1045
- i0.ɵɵelementStart(39, "div", 132);
1046
- i0.ɵɵelement(40, "i", 137);
1056
+ i0.ɵɵelementStart(39, "div", 136);
1057
+ i0.ɵɵelement(40, "i", 141);
1047
1058
  i0.ɵɵtext(41);
1048
1059
  i0.ɵɵelementEnd()();
1049
- i0.ɵɵelementStart(42, "div", 131)(43, "label");
1060
+ i0.ɵɵelementStart(42, "div", 135)(43, "label");
1050
1061
  i0.ɵɵtext(44, "Seed");
1051
1062
  i0.ɵɵelementEnd();
1052
- i0.ɵɵelementStart(45, "div", 132);
1053
- i0.ɵɵelement(46, "i", 138);
1063
+ i0.ɵɵelementStart(45, "div", 136);
1064
+ i0.ɵɵelement(46, "i", 142);
1054
1065
  i0.ɵɵtext(47);
1055
1066
  i0.ɵɵelementEnd()();
1056
- i0.ɵɵtemplate(48, AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_48_Template, 7, 4, "div", 131)(49, AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Conditional_49_Template, 7, 4, "div", 131);
1067
+ i0.ɵɵtemplate(48, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_48_Template, 7, 4, "div", 135)(49, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_49_Template, 7, 4, "div", 135);
1057
1068
  i0.ɵɵelementEnd()();
1058
1069
  } if (rf & 2) {
1059
1070
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -1113,51 +1124,56 @@ function AIPromptRunFormComponentExtended_Conditional_1_Template(rf, ctx) { if (
1113
1124
  i0.ɵɵelement(14, "i");
1114
1125
  i0.ɵɵtext(15);
1115
1126
  i0.ɵɵelementEnd();
1116
- i0.ɵɵtemplate(16, AIPromptRunFormComponentExtended_Conditional_1_Conditional_16_Template, 3, 5, "span", 13)(17, AIPromptRunFormComponentExtended_Conditional_1_Conditional_17_Template, 3, 1, "span", 14)(18, AIPromptRunFormComponentExtended_Conditional_1_Conditional_18_Template, 3, 1, "span", 15)(19, AIPromptRunFormComponentExtended_Conditional_1_Conditional_19_Template, 3, 1, "span", 16);
1127
+ i0.ɵɵtemplate(16, AIPromptRunFormComponentExtended_Conditional_1_Conditional_16_Template, 3, 5, "span", 13)(17, AIPromptRunFormComponentExtended_Conditional_1_Conditional_17_Template, 3, 1, "span", 14)(18, AIPromptRunFormComponentExtended_Conditional_1_Conditional_18_Template, 3, 1, "span", 15)(19, AIPromptRunFormComponentExtended_Conditional_1_Conditional_19_Template, 3, 1, "span", 16)(20, AIPromptRunFormComponentExtended_Conditional_1_Conditional_20_Template, 4, 0, "span", 17);
1117
1128
  i0.ɵɵelementEnd()()();
1118
- i0.ɵɵelementStart(20, "div", 17)(21, "button", 18);
1119
- i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Template_button_click_21_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.refreshData()); });
1120
- i0.ɵɵelement(22, "i", 19);
1129
+ i0.ɵɵelementStart(21, "div", 18)(22, "button", 19);
1130
+ i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Template_button_click_22_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.reRunPrompt()); });
1131
+ i0.ɵɵelement(23, "i", 20);
1132
+ i0.ɵɵtext(24, " Re-Run ");
1133
+ i0.ɵɵelementEnd();
1134
+ i0.ɵɵelementStart(25, "button", 21);
1135
+ i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Template_button_click_25_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.refreshData()); });
1136
+ i0.ɵɵelement(26, "i", 22);
1121
1137
  i0.ɵɵelementEnd()()();
1122
- i0.ɵɵelementStart(23, "div", 20)(24, "div", 21);
1123
- i0.ɵɵelement(25, "i", 22);
1124
- i0.ɵɵelementStart(26, "div", 23)(27, "div", 24);
1125
- i0.ɵɵtext(28, "Duration");
1138
+ i0.ɵɵelementStart(27, "div", 23)(28, "div", 24);
1139
+ i0.ɵɵelement(29, "i", 25);
1140
+ i0.ɵɵelementStart(30, "div", 26)(31, "div", 27);
1141
+ i0.ɵɵtext(32, "Duration");
1126
1142
  i0.ɵɵelementEnd();
1127
- i0.ɵɵelementStart(29, "div", 25);
1128
- i0.ɵɵtext(30);
1143
+ i0.ɵɵelementStart(33, "div", 28);
1144
+ i0.ɵɵtext(34);
1129
1145
  i0.ɵɵelementEnd()()();
1130
- i0.ɵɵelementStart(31, "div", 21);
1131
- i0.ɵɵelement(32, "i", 26);
1132
- i0.ɵɵelementStart(33, "div", 23)(34, "div", 24);
1133
- i0.ɵɵtext(35, "Total Tokens");
1146
+ i0.ɵɵelementStart(35, "div", 24);
1147
+ i0.ɵɵelement(36, "i", 29);
1148
+ i0.ɵɵelementStart(37, "div", 26)(38, "div", 27);
1149
+ i0.ɵɵtext(39, "Total Tokens");
1134
1150
  i0.ɵɵelementEnd();
1135
- i0.ɵɵelementStart(36, "div", 25);
1136
- i0.ɵɵtext(37);
1151
+ i0.ɵɵelementStart(40, "div", 28);
1152
+ i0.ɵɵtext(41);
1137
1153
  i0.ɵɵelementEnd()()();
1138
- i0.ɵɵelementStart(38, "div", 21);
1139
- i0.ɵɵelement(39, "i", 27);
1140
- i0.ɵɵelementStart(40, "div", 23)(41, "div", 24);
1141
- i0.ɵɵtext(42, "Cost");
1154
+ i0.ɵɵelementStart(42, "div", 24);
1155
+ i0.ɵɵelement(43, "i", 30);
1156
+ i0.ɵɵelementStart(44, "div", 26)(45, "div", 27);
1157
+ i0.ɵɵtext(46, "Cost");
1142
1158
  i0.ɵɵelementEnd();
1143
- i0.ɵɵelementStart(43, "div", 25);
1144
- i0.ɵɵtext(44);
1159
+ i0.ɵɵelementStart(47, "div", 28);
1160
+ i0.ɵɵtext(48);
1145
1161
  i0.ɵɵelementEnd()()();
1146
- i0.ɵɵtemplate(45, AIPromptRunFormComponentExtended_Conditional_1_Conditional_45_Template, 8, 4, "div", 21);
1162
+ i0.ɵɵtemplate(49, AIPromptRunFormComponentExtended_Conditional_1_Conditional_49_Template, 8, 4, "div", 24);
1147
1163
  i0.ɵɵelementEnd()();
1148
- i0.ɵɵelementStart(46, "div", 28)(47, "kendo-panelbar")(48, "kendo-panelbar-item", 29);
1149
- i0.ɵɵlistener("stateChange", function AIPromptRunFormComponentExtended_Conditional_1_Template_kendo_panelbar_item_stateChange_48_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onInputPanelToggle()); });
1150
- i0.ɵɵtemplate(49, AIPromptRunFormComponentExtended_Conditional_1_ng_template_49_Template, 4, 1, "ng-template", 30)(50, AIPromptRunFormComponentExtended_Conditional_1_ng_template_50_Template, 3, 1, "ng-template", 31);
1164
+ i0.ɵɵelementStart(50, "div", 31)(51, "kendo-panelbar")(52, "kendo-panelbar-item", 32);
1165
+ i0.ɵɵlistener("stateChange", function AIPromptRunFormComponentExtended_Conditional_1_Template_kendo_panelbar_item_stateChange_52_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onInputPanelToggle()); });
1166
+ i0.ɵɵtemplate(53, AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Template, 4, 1, "ng-template", 33)(54, AIPromptRunFormComponentExtended_Conditional_1_ng_template_54_Template, 3, 1, "ng-template", 34);
1151
1167
  i0.ɵɵelementEnd();
1152
- i0.ɵɵelementStart(51, "kendo-panelbar-item", 32);
1153
- i0.ɵɵtemplate(52, AIPromptRunFormComponentExtended_Conditional_1_ng_template_52_Template, 5, 2, "ng-template", 30)(53, AIPromptRunFormComponentExtended_Conditional_1_ng_template_53_Template, 4, 2, "ng-template", 31);
1168
+ i0.ɵɵelementStart(55, "kendo-panelbar-item", 35);
1169
+ i0.ɵɵtemplate(56, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Template, 5, 2, "ng-template", 33)(57, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Template, 4, 2, "ng-template", 34);
1154
1170
  i0.ɵɵelementEnd();
1155
- i0.ɵɵelementStart(54, "kendo-panelbar-item", 32);
1156
- i0.ɵɵtemplate(55, AIPromptRunFormComponentExtended_Conditional_1_ng_template_55_Template, 3, 0, "ng-template", 30)(56, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Template, 39, 12, "ng-template", 31);
1171
+ i0.ɵɵelementStart(58, "kendo-panelbar-item", 35);
1172
+ i0.ɵɵtemplate(59, AIPromptRunFormComponentExtended_Conditional_1_ng_template_59_Template, 3, 0, "ng-template", 33)(60, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Template, 39, 12, "ng-template", 34);
1157
1173
  i0.ɵɵelementEnd();
1158
- i0.ɵɵtemplate(57, AIPromptRunFormComponentExtended_Conditional_1_Conditional_57_Template, 3, 1, "kendo-panelbar-item", 32)(58, AIPromptRunFormComponentExtended_Conditional_1_Conditional_58_Template, 3, 1, "kendo-panelbar-item", 32);
1159
- i0.ɵɵelementStart(59, "kendo-panelbar-item", 32);
1160
- i0.ɵɵtemplate(60, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Template, 3, 0, "ng-template", 30)(61, AIPromptRunFormComponentExtended_Conditional_1_ng_template_61_Template, 50, 27, "ng-template", 31);
1174
+ i0.ɵɵtemplate(61, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_Template, 3, 1, "kendo-panelbar-item", 35)(62, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_Template, 3, 1, "kendo-panelbar-item", 35);
1175
+ i0.ɵɵelementStart(63, "kendo-panelbar-item", 35);
1176
+ i0.ɵɵtemplate(64, AIPromptRunFormComponentExtended_Conditional_1_ng_template_64_Template, 3, 0, "ng-template", 33)(65, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Template, 50, 27, "ng-template", 34);
1161
1177
  i0.ɵɵelementEnd()()()();
1162
1178
  } if (rf & 2) {
1163
1179
  const ctx_r1 = i0.ɵɵnextContext();
@@ -1184,14 +1200,16 @@ function AIPromptRunFormComponentExtended_Conditional_1_Template(rf, ctx) { if (
1184
1200
  i0.ɵɵconditional(ctx_r1.model ? 18 : -1);
1185
1201
  i0.ɵɵadvance();
1186
1202
  i0.ɵɵconditional(ctx_r1.record.Vendor ? 19 : -1);
1187
- i0.ɵɵadvance(11);
1203
+ i0.ɵɵadvance();
1204
+ i0.ɵɵconditional(ctx_r1.record.RerunFromPromptRunID ? 20 : -1);
1205
+ i0.ɵɵadvance(14);
1188
1206
  i0.ɵɵtextInterpolate(ctx_r1.formatDuration(ctx_r1.record.ExecutionTimeMS));
1189
1207
  i0.ɵɵadvance(7);
1190
1208
  i0.ɵɵtextInterpolate(ctx_r1.formatTokens(ctx_r1.record.TokensUsed));
1191
1209
  i0.ɵɵadvance(7);
1192
1210
  i0.ɵɵtextInterpolate(ctx_r1.formatCost(ctx_r1.record.TotalCost || ctx_r1.record.Cost));
1193
1211
  i0.ɵɵadvance();
1194
- i0.ɵɵconditional(ctx_r1.record.RunAt ? 45 : -1);
1212
+ i0.ɵɵconditional(ctx_r1.record.RunAt ? 49 : -1);
1195
1213
  i0.ɵɵadvance(3);
1196
1214
  i0.ɵɵproperty("expanded", ctx_r1.inputExpanded);
1197
1215
  i0.ɵɵadvance(3);
@@ -1199,16 +1217,18 @@ function AIPromptRunFormComponentExtended_Conditional_1_Template(rf, ctx) { if (
1199
1217
  i0.ɵɵadvance(3);
1200
1218
  i0.ɵɵproperty("expanded", ctx_r1.metricsExpanded);
1201
1219
  i0.ɵɵadvance(3);
1202
- i0.ɵɵconditional(ctx_r1.record && (ctx_r1.record.ValidationAttemptCount && ctx_r1.record.ValidationAttemptCount > 0 || ctx_r1.record.ValidationBehavior) ? 57 : -1);
1220
+ i0.ɵɵconditional(ctx_r1.record && (ctx_r1.record.ValidationAttemptCount && ctx_r1.record.ValidationAttemptCount > 0 || ctx_r1.record.ValidationBehavior) ? 61 : -1);
1203
1221
  i0.ɵɵadvance();
1204
- i0.ɵɵconditional(ctx_r1.record.ParentID || ctx_r1.childRuns.length > 0 ? 58 : -1);
1222
+ i0.ɵɵconditional(ctx_r1.record.ParentID || ctx_r1.childRuns.length > 0 ? 62 : -1);
1205
1223
  i0.ɵɵadvance();
1206
1224
  i0.ɵɵproperty("expanded", false);
1207
1225
  } }
1208
1226
  let AIPromptRunFormComponentExtended = class AIPromptRunFormComponentExtended extends AIPromptRunFormComponent {
1209
- constructor(elementRef, sharedService, router, route, cdr) {
1227
+ constructor(elementRef, sharedService, router, route, cdr, testHarnessWindowService, viewContainerRef) {
1210
1228
  super(elementRef, sharedService, router, route, cdr);
1211
1229
  this.sharedService = sharedService;
1230
+ this.testHarnessWindowService = testHarnessWindowService;
1231
+ this.viewContainerRef = viewContainerRef;
1212
1232
  // Related entities
1213
1233
  this.prompt = null;
1214
1234
  this.model = null;
@@ -1301,71 +1321,24 @@ let AIPromptRunFormComponentExtended = class AIPromptRunFormComponentExtended ex
1301
1321
  const result = await rv.RunView({
1302
1322
  EntityName: 'MJ: AI Prompt Runs',
1303
1323
  ExtraFilter: `ParentID='${this.record.ID}'`,
1304
- OrderBy: 'ExecutionOrder ASC, RunAt DESC'
1324
+ OrderBy: 'ExecutionOrder ASC, RunAt DESC',
1325
+ ResultType: 'entity_object'
1305
1326
  });
1306
- this.childRuns = result.Results;
1327
+ if (result.Success) {
1328
+ this.childRuns = result.Results || [];
1329
+ }
1307
1330
  }
1308
1331
  formatJsonFields() {
1309
1332
  this.isParsingMessages = true; // Start parsing
1310
- const parseOptions = {
1311
- extractInlineJson: true,
1312
- maxDepth: 100,
1313
- debug: false
1314
- };
1315
- // Format messages with recursive JSON parsing
1316
- if (this.record.Messages) {
1317
- try {
1318
- const parsed = JSON.parse(this.record.Messages);
1319
- const recursivelyParsed = ParseJSONRecursive(parsed, parseOptions);
1320
- this.formattedMessages = JSON.stringify(recursivelyParsed, null, 2);
1321
- // Extract messages array and data
1322
- if (recursivelyParsed && typeof recursivelyParsed === 'object') {
1323
- // Extract chat messages if they exist
1324
- if (recursivelyParsed.messages && Array.isArray(recursivelyParsed.messages)) {
1325
- this.chatMessages = recursivelyParsed.messages;
1326
- }
1327
- else {
1328
- this.chatMessages = [];
1329
- }
1330
- // Extract data object if it exists
1331
- if (recursivelyParsed.data) {
1332
- this.inputData = recursivelyParsed.data;
1333
- this.formattedData = JSON.stringify(recursivelyParsed.data, null, 2);
1334
- }
1335
- else {
1336
- this.inputData = null;
1337
- this.formattedData = '';
1338
- }
1339
- }
1340
- }
1341
- catch {
1342
- this.formattedMessages = this.record.Messages;
1343
- this.chatMessages = [];
1344
- this.inputData = null;
1345
- this.formattedData = '';
1346
- }
1347
- }
1348
- else {
1349
- this.formattedMessages = '';
1350
- this.chatMessages = [];
1351
- this.inputData = null;
1352
- this.formattedData = '';
1353
- }
1333
+ // Use the extended entity methods to parse messages
1334
+ const messageData = this.record.ParseMessagesData();
1335
+ this.chatMessages = messageData.chatMessages;
1336
+ this.inputData = messageData.inputData;
1337
+ this.formattedMessages = messageData.formattedMessages;
1338
+ this.formattedData = messageData.formattedData;
1354
1339
  this.isParsingMessages = false; // Done parsing
1355
- // Format result with recursive JSON parsing
1356
- if (this.record.Result) {
1357
- try {
1358
- const parsed = JSON.parse(this.record.Result);
1359
- const recursivelyParsed = ParseJSONRecursive(parsed, parseOptions);
1360
- this.formattedResult = JSON.stringify(recursivelyParsed, null, 2);
1361
- }
1362
- catch {
1363
- this.formattedResult = this.record.Result;
1364
- }
1365
- }
1366
- else {
1367
- this.formattedResult = '';
1368
- }
1340
+ // Format result using extended entity method
1341
+ this.formattedResult = this.record.GetFormattedResult();
1369
1342
  }
1370
1343
  getStatusColor() {
1371
1344
  if (!this.record)
@@ -1473,6 +1446,42 @@ let AIPromptRunFormComponentExtended = class AIPromptRunFormComponentExtended ex
1473
1446
  return;
1474
1447
  SharedService.Instance.OpenEntityRecord(entityName, CompositeKey.FromID(recordId));
1475
1448
  }
1449
+ navigateToOriginalRun() {
1450
+ if (this.record?.RerunFromPromptRunID) {
1451
+ SharedService.Instance.OpenEntityRecord('MJ: AI Prompt Runs', CompositeKey.FromID(this.record.RerunFromPromptRunID));
1452
+ }
1453
+ }
1454
+ reRunPrompt() {
1455
+ console.log('🚀 Re-Run button clicked');
1456
+ console.log('📋 Current record:', this.record);
1457
+ console.log('🆔 Record ID:', this.record?.ID);
1458
+ console.log('🎯 Prompt ID:', this.record?.PromptID);
1459
+ if (!this.record?.ID || !this.record.PromptID) {
1460
+ console.error('❌ Cannot re-run: missing record ID or PromptID');
1461
+ return;
1462
+ }
1463
+ const params = {
1464
+ promptId: this.record.PromptID,
1465
+ promptRunId: this.record.ID,
1466
+ title: `Re-Run: ${this.prompt?.Name || 'Prompt'}`,
1467
+ width: '80vw',
1468
+ height: '80vh',
1469
+ viewContainerRef: this.viewContainerRef
1470
+ };
1471
+ console.log('📞 Calling openPromptTestHarness with params:', params);
1472
+ // Open AI Test Harness dialog with the prompt run ID
1473
+ this.testHarnessWindowService.openPromptTestHarness(params).subscribe({
1474
+ next: (result) => {
1475
+ if (result) {
1476
+ // Optionally refresh the current view or show a success message
1477
+ console.log('Test harness completed', result);
1478
+ }
1479
+ },
1480
+ error: (error) => {
1481
+ console.error('Error in test harness:', error);
1482
+ }
1483
+ });
1484
+ }
1476
1485
  copyToClipboard(text, fieldName) {
1477
1486
  navigator.clipboard.writeText(text).then(() => {
1478
1487
  // Just show a console log for now, as ShowSimpleNotification may not exist
@@ -1532,15 +1541,15 @@ let AIPromptRunFormComponentExtended = class AIPromptRunFormComponentExtended ex
1532
1541
  // Set validation panel expansion based on whether there were retries
1533
1542
  this.validationExpanded = (this.record.ValidationAttemptCount || 0) > 1;
1534
1543
  }
1535
- static { this.ɵfac = function AIPromptRunFormComponentExtended_Factory(t) { return new (t || AIPromptRunFormComponentExtended)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i1.SharedService), i0.ɵɵdirectiveInject(i2.Router), i0.ɵɵdirectiveInject(i2.ActivatedRoute), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; }
1536
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AIPromptRunFormComponentExtended, selectors: [["mj-ai-prompt-run-form"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [["form", "ngForm"], [1, "record-form-container"], [1, "record-form"], [3, "form"], [1, "prompt-run-header"], [1, "header-content"], [1, "run-overview"], [1, "run-icon-wrapper"], [1, "run-info"], [1, "run-title"], [1, "run-id"], [1, "run-meta"], [1, "status-badge"], [1, "run-type-badge", 3, "color"], ["title", "View Prompt", 1, "prompt-name"], ["title", "View Model", 1, "model-name"], ["title", "View Vendor", 1, "vendor-name"], [1, "run-actions"], ["kendoButton", "", "fillMode", "outline", "size", "small", "title", "Refresh data", 3, "click"], [1, "fa-solid", "fa-refresh"], [1, "metrics-bar"], [1, "metric-item"], [1, "fa-solid", "fa-clock"], [1, "metric-content"], [1, "metric-label"], [1, "metric-value"], [1, "fa-solid", "fa-coins"], [1, "fa-solid", "fa-dollar-sign"], [1, "form-content"], [3, "stateChange", "expanded"], ["kendoPanelBarItemTitle", ""], ["kendoPanelBarContent", ""], [3, "expanded"], [1, "run-type-badge"], ["title", "View Prompt", 1, "prompt-name", 3, "click"], [1, "fa-solid", "fa-comment-dots"], ["title", "View Model", 1, "model-name", 3, "click"], [1, "fa-solid", "fa-microchip"], ["title", "View Vendor", 1, "vendor-name", 3, "click"], [1, "fa-solid", "fa-building"], [1, "fa-solid", "fa-calendar"], [1, "panel-title"], [1, "panel-badge"], [1, "panel-content"], [1, "nested-panels"], [1, "empty-state"], [1, "sub-expansion-panel", 3, "expanded", "animation"], ["kendoExpansionPanelTitleDirective", ""], [1, "sub-panel-content"], [1, "loading-state"], [3, "messages"], [1, "json-editor-container"], [1, "json-toolbar"], ["kendoButton", "", "fillMode", "flat", "size", "small", "title", "Copy JSON", 3, "click"], [1, "fa-solid", "fa-copy"], ["name", "formattedMessages", 2, "height", "400px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "sub-panel-title"], [1, "fa-solid", "fa-comments"], [1, "panel-count"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-comment-slash"], [1, "fa-solid", "fa-database"], ["name", "formattedData", 2, "height", "300px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-code"], [1, "fa-solid", "fa-square-check"], [1, "panel-badge", "error"], [1, "error-message"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "error-content"], ["name", "formattedResult", 2, "height", "400px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-inbox"], [1, "fa-solid", "fa-chart-line"], [1, "metrics-grid"], [1, "metric-card"], [1, "metric-header"], [1, "fa-solid", "fa-message"], [1, "metric-value", "large"], [1, "metric-rollup"], [1, "fa-solid", "fa-reply"], [1, "metric-currency"], [1, "additional-metrics"], [1, "metric-row"], [1, "metric-value", "link", 3, "click"], [1, "fa-solid", "fa-external-link"], [1, "fa-solid", "fa-shield-check"], [1, "panel-badge", "success"], [1, "validation-summary"], [1, "summary-header"], [1, "validation-status"], [1, "validation-metrics"], [1, "metric-card", "small"], [1, "validation-error"], [1, "common-error"], [1, "retry-timeline"], [1, "validation-attempts"], [1, "validation-json"], [1, "error-count"], [1, "fa-solid", "fa-repeat"], [1, "timeline-info"], [1, "timeline-stat"], [1, "fa-solid", "fa-flag-checkered"], [1, "fa-solid", "fa-stopwatch"], [1, "attempts-list"], [1, "attempt-item", 3, "success", "failed"], [1, "attempt-item"], [1, "attempt-number"], [1, "attempt-details"], [1, "attempt-time"], [1, "output-length"], [1, "attempt-error"], [1, "json-viewer-container"], ["name", "formattedValidationSummary", 2, "height", "200px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], ["name", "formattedValidationAttempts", 2, "height", "300px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-sitemap"], [1, "parent-run-section"], [1, "child-runs-section"], [1, "fa-solid", "fa-level-up-alt"], [1, "run-item", "parent", 3, "click"], [1, "run-item-icon"], [1, "run-item-content"], [1, "run-item-title"], [1, "run-item-type"], [1, "run-item-meta"], [1, "fa-solid", "fa-level-down-alt"], [1, "runs-list"], [1, "run-item", "child"], [1, "run-item", "child", 3, "click"], [1, "execution-order"], [1, "status-indicator"], [1, "fa-solid", "fa-info-circle"], [1, "detail-fields-grid"], [1, "detail-field"], [1, "detail-value"], [1, "fa-solid", "fa-temperature-high"], [1, "fa-solid", "fa-percentage"], [1, "fa-solid", "fa-list-ol"], [1, "fa-solid", "fa-filter"], [1, "fa-solid", "fa-plus-circle"], [1, "fa-solid", "fa-seedling"], ["title", "View Agent", 1, "detail-value", "clickable", 3, "click"], [1, "fa-solid", "fa-robot"], [1, "fa-solid", "fa-cog"], [1, "fa-solid", "fa-check-circle"]], template: function AIPromptRunFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
1544
+ 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)); }; }
1545
+ 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, "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) {
1537
1546
  i0.ɵɵelementStart(0, "div", 1);
1538
- i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Template, 62, 27, "form", 2);
1547
+ i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Template, 66, 28, "form", 2);
1539
1548
  i0.ɵɵelementEnd();
1540
1549
  } if (rf & 2) {
1541
1550
  i0.ɵɵadvance();
1542
1551
  i0.ɵɵconditional(ctx.record ? 1 : -1);
1543
- } }, dependencies: [i3.ɵNgNoValidate, i3.NgControlStatus, i3.NgControlStatusGroup, i3.NgModel, i3.NgForm, i4.PanelBarComponent, i4.PanelBarItemComponent, i4.PanelBarContentDirective, i4.PanelBarItemTitleDirective, i4.ExpansionPanelComponent, i4.ExpansionPanelTitleDirective, i5.ButtonComponent, i6.FormToolbarComponent, i7.CodeEditorComponent, i8.ChatMessageViewerComponent, i9.DatePipe], styles: ["\n\n.prompt-run-header[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border-bottom: 2px solid #e9ecef;\n padding: 20px;\n margin-bottom: 0;\n}\n\n.header-content[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n margin-bottom: 16px;\n}\n\n.run-overview[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n flex: 1;\n}\n\n.run-icon-wrapper[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-icon-wrapper[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n}\n\n.run-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.run-title[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 1.5em;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.run-id[_ngcontent-%COMP%] {\n font-size: 0.8em;\n color: #6c757d;\n font-weight: 400;\n font-family: 'Courier New', monospace;\n}\n\n.run-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n color: white;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.status-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.9em;\n}\n\n.run-type-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #f1f3f5;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.prompt-name[_ngcontent-%COMP%], .model-name[_ngcontent-%COMP%], .vendor-name[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.85em;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.prompt-name[_ngcontent-%COMP%]:hover, .model-name[_ngcontent-%COMP%]:hover, .vendor-name[_ngcontent-%COMP%]:hover {\n background: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.run-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n\n\n.metrics-bar[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n padding-top: 16px;\n border-top: 1px solid #e9ecef;\n flex-wrap: wrap;\n}\n\n.metric-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.metric-item[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n font-size: 1.2em;\n color: #6c757d;\n width: 24px;\n text-align: center;\n}\n\n.metric-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.metric-label[_ngcontent-%COMP%] {\n font-size: 0.75em;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value[_ngcontent-%COMP%] {\n font-size: 1.1em;\n font-weight: 600;\n color: #2c3e50;\n}\n\n\n\n.form-content[_ngcontent-%COMP%] {\n padding: 16px;\n}\n\n.panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n\n\n.sub-panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n font-size: 0.95em;\n}\n\n.sub-panel-content[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] > .k-item[_ngcontent-%COMP%] {\n border: 1px solid #e5e7eb;\n margin-bottom: 8px;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] > .k-item[_ngcontent-%COMP%] > .k-link[_ngcontent-%COMP%] {\n background-color: #f9fafb;\n padding: 12px 16px;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] > .k-item.k-expanded[_ngcontent-%COMP%] > .k-link[_ngcontent-%COMP%] {\n background-color: #f3f4f6;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] .k-content[_ngcontent-%COMP%] {\n padding: 0;\n background: white;\n}\n\n\n\n.sub-panel-content[_ngcontent-%COMP%] mj-chat-message-viewer[_ngcontent-%COMP%] {\n display: block;\n min-height: 200px;\n max-height: 750px; \n\n height: auto;\n overflow: hidden;\n}\n\n\n\n.sub-expansion-panel[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-expander {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-expander:hover {\n background-color: #edf2f7;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-header {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-content {\n background-color: #ffffff;\n border-color: #e2e8f0;\n}\n\n.panel-badge[_ngcontent-%COMP%] {\n margin-left: auto;\n padding: 2px 8px;\n border-radius: 12px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n.panel-badge.error[_ngcontent-%COMP%] {\n background: #dc3545;\n color: white;\n}\n\n.panel-count[_ngcontent-%COMP%] {\n color: #6c757d;\n font-weight: 400;\n font-size: 0.9em;\n}\n\n.panel-content[_ngcontent-%COMP%] {\n padding: 20px;\n max-height: none !important;\n overflow: visible !important;\n}\n\n\n\n.json-editor-container[_ngcontent-%COMP%] {\n border: 1px solid #e9ecef;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.json-toolbar[_ngcontent-%COMP%] {\n background: #f8f9fa;\n padding: 8px 12px;\n border-bottom: 1px solid #e9ecef;\n display: flex;\n justify-content: flex-end;\n}\n\n\n\n.error-message[_ngcontent-%COMP%] {\n background: #dc354510;\n border: 1px solid #dc3545;\n border-radius: 6px;\n padding: 16px;\n display: flex;\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.error-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.5em;\n color: #dc3545;\n flex-shrink: 0;\n}\n\n.error-content[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 1em;\n}\n\n.error-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: #495057;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.3;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1em;\n}\n\n\n\n.loading-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.loading-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.6;\n color: #007bff;\n}\n\n.loading-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1em;\n}\n\n\n\n.metrics-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 24px;\n}\n\n.metric-card[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n}\n\n.metric-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.metric-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.2em;\n color: #6c757d;\n}\n\n.metric-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.9em;\n color: #6c757d;\n font-weight: 500;\n}\n\n.metric-value.large[_ngcontent-%COMP%] {\n font-size: 1.8em;\n font-weight: 700;\n color: #2c3e50;\n}\n\n.metric-rollup[_ngcontent-%COMP%] {\n margin-top: 8px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.metric-currency[_ngcontent-%COMP%] {\n margin-top: 4px;\n font-size: 0.85em;\n color: #6c757d;\n text-transform: uppercase;\n}\n\n\n\n.additional-metrics[_ngcontent-%COMP%] {\n border-top: 1px solid #e9ecef;\n padding-top: 16px;\n}\n\n.metric-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n border-bottom: 1px solid #f1f3f5;\n}\n\n.metric-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-label[_ngcontent-%COMP%] {\n font-weight: 500;\n color: #6c757d;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-value[_ngcontent-%COMP%] {\n font-weight: 400;\n color: #2c3e50;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-value.link[_ngcontent-%COMP%] {\n color: #007bff;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: color 0.2s;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-value.link[_ngcontent-%COMP%]:hover {\n color: #0056b3;\n}\n\n\n\n.parent-run-section[_ngcontent-%COMP%], \n.child-runs-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.parent-run-section[_ngcontent-%COMP%]:last-child, \n.child-runs-section[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.parent-run-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%], \n.child-runs-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 0.95em;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.runs-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.run-item[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.run-item[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n}\n\n.run-item.parent[_ngcontent-%COMP%] {\n background: #e3f2fd;\n border-color: #90caf9;\n}\n\n.run-item.parent[_ngcontent-%COMP%]:hover {\n background: #bbdefb;\n}\n\n.run-item-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-item-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.run-item-title[_ngcontent-%COMP%] {\n font-weight: 500;\n color: #2c3e50;\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.execution-order[_ngcontent-%COMP%] {\n background: #6c757d;\n color: white;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 0.75em;\n font-weight: 600;\n}\n\n.run-item-type[_ngcontent-%COMP%] {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 400;\n}\n\n.run-item-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.run-item-meta[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.status-indicator[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.run-item[_ngcontent-%COMP%] > i[_ngcontent-%COMP%]:last-child {\n color: #6c757d;\n font-size: 0.85em;\n}\n\n\n\n.detail-fields-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 24px;\n width: 100%;\n min-height: auto;\n overflow: visible;\n}\n\n.detail-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-field[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-value[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 1em;\n color: #2c3e50;\n padding: 10px 14px;\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n transition: all 0.2s;\n}\n\n.detail-value[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child {\n color: #6c757d;\n font-size: 1.1em;\n width: 20px;\n text-align: center;\n}\n\n.detail-value.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.detail-value.clickable[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.detail-value.clickable[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:last-child {\n margin-left: auto;\n font-size: 0.85em;\n opacity: 0.6;\n}\n\n.detail-value.clickable[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%]:last-child {\n opacity: 1;\n}\n\n.detail-value.null-value[_ngcontent-%COMP%] {\n color: #adb5bd;\n font-style: italic;\n}\n\n.detail-value.null-value[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child {\n opacity: 0.5;\n}\n\n\n\nkendo-panelbar[_ngcontent-%COMP%] {\n border: none !important;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n border: 1px solid #e9ecef !important;\n border-radius: 8px !important;\n overflow: hidden;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] .k-panelbar-header[_ngcontent-%COMP%] {\n background: #f8f9fa !important;\n border: none !important;\n padding: 12px 16px !important;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] .k-panelbar-header[_ngcontent-%COMP%]:hover {\n background: #e9ecef !important;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] .k-panelbar-content[_ngcontent-%COMP%] {\n border: none !important;\n padding: 0 !important;\n max-height: none !important;\n overflow: visible !important;\n}\n\n\n\n.validation-summary[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.summary-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.summary-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1em;\n color: #2c3e50;\n}\n\n.validation-status[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 16px;\n border-radius: 20px;\n font-weight: 500;\n font-size: 0.9em;\n}\n\n.validation-status.success[_ngcontent-%COMP%] {\n background: #28a74520;\n color: #28a745;\n}\n\n.validation-status.failed[_ngcontent-%COMP%] {\n background: #dc354520;\n color: #dc3545;\n}\n\n.validation-metrics[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.metric-card.small[_ngcontent-%COMP%] {\n padding: 16px;\n text-align: center;\n}\n\n.metric-card.small[_ngcontent-%COMP%] .metric-label[_ngcontent-%COMP%] {\n font-size: 0.8em;\n margin-bottom: 8px;\n font-weight: 600;\n}\n\n.metric-card.small[_ngcontent-%COMP%] .metric-value[_ngcontent-%COMP%] {\n font-size: 1.4em;\n font-weight: 700;\n}\n\n.validation-error[_ngcontent-%COMP%], \n.common-error[_ngcontent-%COMP%] {\n background: #dc354510;\n border: 1px solid #dc354530;\n border-radius: 8px;\n padding: 16px;\n margin-bottom: 16px;\n}\n\n.validation-error[_ngcontent-%COMP%] h5[_ngcontent-%COMP%], \n.common-error[_ngcontent-%COMP%] h5[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 0.95em;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.validation-error[_ngcontent-%COMP%] p[_ngcontent-%COMP%], \n.common-error[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: #495057;\n font-size: 0.9em;\n}\n\n.error-count[_ngcontent-%COMP%] {\n display: inline-block;\n margin-top: 8px;\n padding: 2px 8px;\n background: #dc3545;\n color: white;\n border-radius: 12px;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n\n\n.retry-timeline[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.retry-timeline[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.timeline-info[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n}\n\n.timeline-stat[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #6c757d;\n font-size: 0.9em;\n}\n\n.timeline-stat[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.1em;\n}\n\n\n\n.validation-attempts[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.validation-attempts[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.attempts-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.attempt-item[_ngcontent-%COMP%] {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n}\n\n.attempt-item.success[_ngcontent-%COMP%] {\n background: #28a74510;\n border-color: #28a74530;\n}\n\n.attempt-item.failed[_ngcontent-%COMP%] {\n background: #dc354510;\n border-color: #dc354530;\n}\n\n.attempt-number[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.attempt-item.success[_ngcontent-%COMP%] .attempt-number[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n.attempt-item.failed[_ngcontent-%COMP%] .attempt-number[_ngcontent-%COMP%] {\n color: #dc3545;\n}\n\n.attempt-details[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n font-size: 0.85em;\n}\n\n.attempt-time[_ngcontent-%COMP%] {\n color: #6c757d;\n}\n\n.attempt-error[_ngcontent-%COMP%] {\n color: #dc3545;\n flex: 1 0 100%;\n}\n\n.output-length[_ngcontent-%COMP%] {\n color: #6c757d;\n font-style: italic;\n}\n\n\n\n.validation-json[_ngcontent-%COMP%] {\n margin-top: 24px;\n}\n\n.validation-json[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.json-viewer-container[_ngcontent-%COMP%] {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n overflow: hidden;\n}\n\n\n\n.panel-badge.success[_ngcontent-%COMP%] {\n background: #28a745;\n color: white;\n}"] }); }
1552
+ } }, 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}"] }); }
1544
1553
  };
1545
1554
  AIPromptRunFormComponentExtended = __decorate([
1546
1555
  RegisterClass(BaseFormComponent, 'MJ: AI Prompt Runs')
@@ -1548,7 +1557,7 @@ AIPromptRunFormComponentExtended = __decorate([
1548
1557
  export { AIPromptRunFormComponentExtended };
1549
1558
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AIPromptRunFormComponentExtended, [{
1550
1559
  type: Component,
1551
- args: [{ selector: 'mj-ai-prompt-run-form', template: "<div class=\"record-form-container\">\n @if (record) {\n <form class=\"record-form\" #form=\"ngForm\">\n <mj-form-toolbar [form]=\"this\"></mj-form-toolbar>\n\n <!-- Header Section -->\n <div class=\"prompt-run-header\">\n <div class=\"header-content\">\n <div class=\"run-overview\">\n <div class=\"run-icon-wrapper\" [style.background-color]=\"getStatusColor() + '20'\">\n <i [class]=\"'fa-solid ' + getStatusIcon()\" [style.color]=\"getStatusColor()\"></i>\n </div>\n <div class=\"run-info\">\n <h1 class=\"run-title\">\n Prompt Run\n @if (record.ID) {\n <span class=\"run-id\">#{{ record.ID.substring(0, 8) }}</span>\n }\n </h1>\n <div class=\"run-meta\">\n <span class=\"status-badge\" [style.background-color]=\"getStatusColor()\">\n <i [class]=\"'fa-solid ' + getStatusIcon()\"></i>\n {{ getStatusText() }}\n </span>\n @if (record.RunType) {\n <span class=\"run-type-badge\" [style.color]=\"getRunTypeColor(record.RunType)\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(record.RunType)\"></i>\n {{ record.RunType }}\n </span>\n }\n @if (prompt) {\n <span class=\"prompt-name\" (click)=\"navigateToEntity('AI Prompts', prompt.ID)\" title=\"View Prompt\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n {{ prompt.Name }}\n </span>\n }\n @if (model) {\n <span class=\"model-name\" (click)=\"navigateToEntity('AI Models', model.ID)\" title=\"View Model\">\n <i class=\"fa-solid fa-microchip\"></i>\n {{ model.Name }}\n </span>\n }\n @if (record.Vendor) {\n <span class=\"vendor-name\" (click)=\"navigateToEntity('MJ: AI Vendors', record.VendorID)\" title=\"View Vendor\">\n <i class=\"fa-solid fa-building\"></i>\n {{ record.Vendor }}\n </span>\n }\n </div>\n </div>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"run-actions\">\n <button kendoButton fillMode=\"outline\" size=\"small\" (click)=\"refreshData()\" title=\"Refresh data\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n \n <!-- Key Metrics Bar -->\n <div class=\"metrics-bar\">\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-clock\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Duration</div>\n <div class=\"metric-value\">{{ formatDuration(record.ExecutionTimeMS) }}</div>\n </div>\n </div>\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-coins\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Total Tokens</div>\n <div class=\"metric-value\">{{ formatTokens(record.TokensUsed) }}</div>\n </div>\n </div>\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-dollar-sign\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Cost</div>\n <div class=\"metric-value\">{{ formatCost(record.TotalCost || record.Cost) }}</div>\n </div>\n </div>\n @if (record.RunAt) {\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Started</div>\n <div class=\"metric-value\">{{ record.RunAt | date:'short' }}</div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Main Content with Expansion Panels -->\n <div class=\"form-content\">\n <kendo-panelbar>\n \n <!-- Input Panel with nested sub-panels -->\n <kendo-panelbar-item [expanded]=\"inputExpanded\" (stateChange)=\"onInputPanelToggle()\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n Input\n @if (record.Messages && record.Messages.trim() !== '') {\n <span class=\"panel-badge\">JSON</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n @if (record.Messages && record.Messages.trim() !== '') {\n <!-- Nested expansion panels for sub-sections -->\n <div class=\"nested-panels\">\n <!-- Messages Sub-Panel -->\n <kendo-expansionpanel \n [expanded]=\"messagesExpanded\" \n class=\"sub-expansion-panel\"\n [animation]=\"false\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span class=\"sub-panel-title\">\n <i class=\"fa-solid fa-comments\"></i>\n Messages\n @if (chatMessages.length > 0) {\n <span class=\"panel-count\">({{ chatMessages.length }})</span>\n }\n </span>\n </ng-template>\n <div class=\"sub-panel-content\">\n @if (isParsingMessages || isLoadingRelatedData) {\n <div class=\"loading-state\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <p>Loading messages...</p>\n </div>\n } @else if (chatMessages.length > 0) {\n <mj-chat-message-viewer \n [messages]=\"chatMessages\">\n </mj-chat-message-viewer>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-comment-slash\"></i>\n <p>No chat messages found</p>\n </div>\n }\n </div>\n </kendo-expansionpanel>\n \n <!-- Data Sub-Panel -->\n <kendo-expansionpanel \n [expanded]=\"dataExpanded\" \n class=\"sub-expansion-panel\"\n [animation]=\"false\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span class=\"sub-panel-title\">\n <i class=\"fa-solid fa-database\"></i>\n Data\n @if (inputData) {\n <span class=\"panel-badge\">Object</span>\n }\n </span>\n </ng-template>\n <div class=\"sub-panel-content\">\n @if (inputData && formattedData) {\n <div class=\"json-editor-container\">\n <div class=\"json-toolbar\">\n <button kendoButton\n fillMode=\"flat\" \n size=\"small\"\n (click)=\"copyToClipboard(formattedData, 'Data')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedData\"\n name=\"formattedData\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-database\"></i>\n <p>No data object found</p>\n </div>\n }\n </div>\n </kendo-expansionpanel>\n \n <!-- Raw Sub-Panel -->\n <kendo-expansionpanel \n [expanded]=\"rawExpanded\" \n class=\"sub-expansion-panel\"\n [animation]=\"false\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span class=\"sub-panel-title\">\n <i class=\"fa-solid fa-code\"></i>\n Raw\n </span>\n </ng-template>\n <div class=\"sub-panel-content\">\n <div class=\"json-editor-container\">\n <div class=\"json-toolbar\">\n <button kendoButton\n fillMode=\"flat\" \n size=\"small\"\n (click)=\"copyToClipboard(formattedMessages, 'Messages')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedMessages\"\n name=\"formattedMessages\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n </kendo-expansionpanel>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-comment-slash\"></i>\n <p>No input messages recorded</p>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Result Panel -->\n <kendo-panelbar-item [expanded]=\"resultExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-square-check\"></i>\n Result\n @if (record.Result && record.Result.trim() !== '') {\n <span class=\"panel-badge\">JSON</span>\n }\n @if (record.ErrorMessage) {\n <span class=\"panel-badge error\">Error</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n @if (record.ErrorMessage) {\n <div class=\"error-message\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <div class=\"error-content\">\n <h4>Error Message</h4>\n <p>{{ record.ErrorMessage }}</p>\n </div>\n </div>\n }\n \n @if (record.Result && record.Result.trim() !== '') {\n <div class=\"json-editor-container\">\n <div class=\"json-toolbar\">\n <button kendoButton\n fillMode=\"flat\" \n size=\"small\"\n (click)=\"copyToClipboard(formattedResult, 'Result')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedResult\"\n name=\"formattedResult\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </div>\n } @else if (!record.ErrorMessage) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No result data recorded</p>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Token Usage & Metrics Panel -->\n <kendo-panelbar-item [expanded]=\"metricsExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n Token Usage & Metrics\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <div class=\"metrics-grid\">\n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-message\"></i>\n <h4>Prompt Tokens</h4>\n </div>\n <div class=\"metric-value large\">{{ formatTokens(record.TokensPrompt) }}</div>\n @if (record.TokensPromptRollup && record.TokensPromptRollup !== record.TokensPrompt) {\n <div class=\"metric-rollup\">\n <span>Rollup: {{ formatTokens(record.TokensPromptRollup) }}</span>\n </div>\n }\n </div>\n \n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-reply\"></i>\n <h4>Completion Tokens</h4>\n </div>\n <div class=\"metric-value large\">{{ formatTokens(record.TokensCompletion) }}</div>\n @if (record.TokensCompletionRollup && record.TokensCompletionRollup !== record.TokensCompletion) {\n <div class=\"metric-rollup\">\n <span>Rollup: {{ formatTokens(record.TokensCompletionRollup) }}</span>\n </div>\n }\n </div>\n \n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-coins\"></i>\n <h4>Total Tokens</h4>\n </div>\n <div class=\"metric-value large\">{{ formatTokens(record.TokensUsed) }}</div>\n @if (record.TokensUsedRollup && record.TokensUsedRollup !== record.TokensUsed) {\n <div class=\"metric-rollup\">\n <span>Rollup: {{ formatTokens(record.TokensUsedRollup) }}</span>\n </div>\n }\n </div>\n \n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-dollar-sign\"></i>\n <h4>Cost</h4>\n </div>\n <div class=\"metric-value large\">{{ formatCost(record.Cost) }}</div>\n @if (record.TotalCost && record.TotalCost !== record.Cost) {\n <div class=\"metric-rollup\">\n <span>Total: {{ formatCost(record.TotalCost) }}</span>\n </div>\n }\n @if (record.CostCurrency) {\n <div class=\"metric-currency\">{{ record.CostCurrency }}</div>\n }\n </div>\n </div>\n \n <!-- Additional Metrics -->\n <div class=\"additional-metrics\">\n @if (record.ExecutionOrder !== null) {\n <div class=\"metric-row\">\n <span class=\"metric-label\">Execution Order:</span>\n <span class=\"metric-value\">{{ record.ExecutionOrder }}</span>\n </div>\n }\n @if (record.ConfigurationID) {\n <div class=\"metric-row\">\n <span class=\"metric-label\">Configuration:</span>\n <span class=\"metric-value\">{{ record.Configuration }}</span>\n </div>\n }\n @if (record.AgentID) {\n <div class=\"metric-row\">\n <span class=\"metric-label\">Agent:</span>\n <span class=\"metric-value link\" (click)=\"navigateToEntity('AI Agents', record.AgentID)\">\n {{ record.Agent }}\n <i class=\"fa-solid fa-external-link\"></i>\n </span>\n </div>\n }\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Validation & Retry Panel -->\n @if (record && ((record.ValidationAttemptCount && record.ValidationAttemptCount > 0) || record.ValidationBehavior)) {\n <kendo-panelbar-item [expanded]=\"validationExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-shield-check\"></i>\n Validation & Retries\n @if (record && record.ValidationAttemptCount && record.ValidationAttemptCount > 1) {\n <span class=\"panel-count\">({{ record.ValidationAttemptCount }} attempts)</span>\n }\n @if (record.FinalValidationPassed) {\n <span class=\"panel-badge success\">Passed</span>\n } @else if (record.FinalValidationPassed === false) {\n <span class=\"panel-badge error\">Failed</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <!-- Validation Summary -->\n <div class=\"validation-summary\">\n <div class=\"summary-header\">\n <h4>Validation Summary</h4>\n <div class=\"validation-status\" [class.success]=\"record.FinalValidationPassed\" [class.failed]=\"!record.FinalValidationPassed\">\n <i [class]=\"record.FinalValidationPassed ? 'fa-solid fa-check-circle' : 'fa-solid fa-times-circle'\"></i>\n {{ record.FinalValidationPassed ? 'Validation Passed' : 'Validation Failed' }}\n </div>\n </div>\n \n <div class=\"validation-metrics\">\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Total Attempts</div>\n <div class=\"metric-value\">{{ record.ValidationAttemptCount || 0 }}</div>\n </div>\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Successful</div>\n <div class=\"metric-value\">{{ record.SuccessfulValidationCount || 0 }}</div>\n </div>\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Behavior</div>\n <div class=\"metric-value\">{{ record.ValidationBehavior || 'Not set' }}</div>\n </div>\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Retry Strategy</div>\n <div class=\"metric-value\">{{ record.RetryStrategy || 'Not set' }}</div>\n </div>\n </div>\n \n @if (record.FinalValidationError) {\n <div class=\"validation-error\">\n <h5><i class=\"fa-solid fa-exclamation-triangle\"></i> Final Validation Error</h5>\n <p>{{ record.FinalValidationError }}</p>\n @if (record && record.ValidationErrorCount && record.ValidationErrorCount > 0) {\n <span class=\"error-count\">{{ record.ValidationErrorCount }} validation errors</span>\n }\n </div>\n }\n \n @if (record.CommonValidationError && record.CommonValidationError !== record.FinalValidationError) {\n <div class=\"common-error\">\n <h5><i class=\"fa-solid fa-repeat\"></i> Most Common Error</h5>\n <p>{{ record.CommonValidationError }}</p>\n </div>\n }\n </div>\n \n <!-- Retry Timeline -->\n @if (record && record.ValidationAttemptCount && record.ValidationAttemptCount > 1) {\n <div class=\"retry-timeline\">\n <h4>Retry Timeline</h4>\n <div class=\"timeline-info\">\n <div class=\"timeline-stat\">\n <i class=\"fa-solid fa-clock\"></i>\n <span>First Attempt: {{ record.FirstAttemptAt | date:'short' }}</span>\n </div>\n <div class=\"timeline-stat\">\n <i class=\"fa-solid fa-flag-checkered\"></i>\n <span>Last Attempt: {{ record.LastAttemptAt | date:'short' }}</span>\n </div>\n <div class=\"timeline-stat\">\n <i class=\"fa-solid fa-stopwatch\"></i>\n <span>Total Retry Duration: {{ formatDuration(record.TotalRetryDurationMS) }}</span>\n </div>\n </div>\n </div>\n }\n \n <!-- Validation Attempts Details -->\n @if (validationAttempts && validationAttempts.length > 0) {\n <div class=\"validation-attempts\">\n <h4>Validation Attempts</h4>\n <div class=\"attempts-list\">\n @for (attempt of validationAttempts; track attempt.attemptNumber) {\n <div class=\"attempt-item\" [class.success]=\"attempt.success\" [class.failed]=\"!attempt.success\">\n <div class=\"attempt-number\">\n <i [class]=\"attempt.success ? 'fa-solid fa-check' : 'fa-solid fa-times'\"></i>\n Attempt #{{ attempt.attemptNumber }}\n </div>\n <div class=\"attempt-details\">\n <span class=\"attempt-time\">{{ attempt.timestamp }}</span>\n @if (!attempt.success) {\n <span class=\"attempt-error\">{{ attempt.errorMessage || 'Unknown error' }}</span>\n @if (attempt.validationErrorCount > 0) {\n <span class=\"error-count\">({{ attempt.validationErrorCount }} errors)</span>\n }\n }\n @if (attempt.outputLength) {\n <span class=\"output-length\">Output: {{ attempt.outputLength }} chars</span>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Validation Summary JSON -->\n @if (validationSummary) {\n <div class=\"validation-json\">\n <h4>Validation Summary Details</h4>\n <div class=\"json-viewer-container\">\n <mj-code-editor \n [(ngModel)]=\"formattedValidationSummary\"\n name=\"formattedValidationSummary\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 200px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n }\n \n <!-- Validation Attempts JSON -->\n @if (record.ValidationAttempts) {\n <div class=\"validation-json\">\n <h4>Validation Attempts (Raw JSON)</h4>\n <div class=\"json-viewer-container\">\n <mj-code-editor \n [(ngModel)]=\"formattedValidationAttempts\"\n name=\"formattedValidationAttempts\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n }\n \n <!-- Hierarchy Panel (for parent/child relationships) -->\n @if (record.ParentID || childRuns.length > 0) {\n <kendo-panelbar-item [expanded]=\"hierarchyExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-sitemap\"></i>\n Run Hierarchy\n @if (childRuns.length > 0) {\n <span class=\"panel-count\">({{ childRuns.length }} children)</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n @if (parentRun) {\n <div class=\"parent-run-section\">\n <h4><i class=\"fa-solid fa-level-up-alt\"></i> Parent Run</h4>\n <div class=\"run-item parent\" (click)=\"navigateToEntity('MJ: AI Prompt Runs', parentRun.ID)\">\n <div class=\"run-item-icon\" [style.background-color]=\"getStatusColor() + '20'\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(parentRun.RunType)\"></i>\n </div>\n <div class=\"run-item-content\">\n <div class=\"run-item-title\">\n Parent Run #{{ parentRun.ID.substring(0, 8) }}\n <span class=\"run-item-type\">{{ parentRun.RunType }}</span>\n </div>\n <div class=\"run-item-meta\">\n <span><i class=\"fa-solid fa-clock\"></i> {{ formatDuration(parentRun.ExecutionTimeMS) }}</span>\n <span><i class=\"fa-solid fa-coins\"></i> {{ formatTokens(parentRun.TokensUsed) }}</span>\n <span><i class=\"fa-solid fa-calendar\"></i> {{ parentRun.RunAt | date:'short' }}</span>\n </div>\n </div>\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n </div>\n }\n \n @if (childRuns.length > 0) {\n <div class=\"child-runs-section\">\n <h4><i class=\"fa-solid fa-level-down-alt\"></i> Child Runs</h4>\n <div class=\"runs-list\">\n @for (childRun of childRuns; track childRun.ID) {\n <div class=\"run-item child\" (click)=\"navigateToEntity('MJ: AI Prompt Runs', childRun.ID)\">\n <div class=\"run-item-icon\" [style.background-color]=\"getStatusColor() + '20'\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(childRun.RunType)\"></i>\n </div>\n <div class=\"run-item-content\">\n <div class=\"run-item-title\">\n Child Run #{{ childRun.ID.substring(0, 8) }}\n @if (childRun.ExecutionOrder !== null) {\n <span class=\"execution-order\">#{{ childRun.ExecutionOrder }}</span>\n }\n <span class=\"run-item-type\">{{ childRun.RunType }}</span>\n </div>\n <div class=\"run-item-meta\">\n <span class=\"status-indicator\" [style.color]=\"getStatusColor()\">\n <i [class]=\"'fa-solid ' + getStatusIcon()\"></i>\n {{ childRun.Success ? 'Success' : childRun.ErrorMessage ? 'Failed' : 'Running' }}\n </span>\n <span><i class=\"fa-solid fa-clock\"></i> {{ formatDuration(childRun.ExecutionTimeMS) }}</span>\n <span><i class=\"fa-solid fa-coins\"></i> {{ formatTokens(childRun.TokensUsed) }}</span>\n </div>\n </div>\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n }\n \n <!-- Additional Details Panel -->\n <kendo-panelbar-item [expanded]=\"false\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Additional Details\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <div class=\"detail-fields-grid\">\n @if (record.AgentID) {\n <div class=\"detail-field\">\n <label>Agent</label>\n <div class=\"detail-value clickable\" (click)=\"navigateToEntity('AI Agents', record.AgentID)\" title=\"View Agent\">\n <i class=\"fa-solid fa-robot\"></i>\n {{ record.Agent || 'Unknown' }}\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n </div>\n }\n \n @if (record.ConfigurationID) {\n <div class=\"detail-field\">\n <label>Configuration</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-cog\"></i>\n {{ record.Configuration || 'Unknown' }}\n </div>\n </div>\n }\n \n @if (record.RunType) {\n <div class=\"detail-field\">\n <label>Run Type</label>\n <div class=\"detail-value\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(record.RunType)\"></i>\n {{ record.RunType }}\n </div>\n </div>\n }\n \n @if (record.ResponseFormat) {\n <div class=\"detail-field\">\n <label>Response Format</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-code\"></i>\n {{ record.ResponseFormat }}\n </div>\n </div>\n }\n \n <div class=\"detail-field\">\n <label>Temperature</label>\n <div class=\"detail-value\" [class.null-value]=\"record.Temperature === null || record.Temperature === undefined\">\n <i class=\"fa-solid fa-temperature-high\"></i>\n {{ record.Temperature !== null && record.Temperature !== undefined ? record.Temperature : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Top P</label>\n <div class=\"detail-value\" [class.null-value]=\"record.TopP === null || record.TopP === undefined\">\n <i class=\"fa-solid fa-percentage\"></i>\n {{ record.TopP !== null && record.TopP !== undefined ? record.TopP : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Top K</label>\n <div class=\"detail-value\" [class.null-value]=\"record.TopK === null || record.TopK === undefined\">\n <i class=\"fa-solid fa-list-ol\"></i>\n {{ record.TopK !== null && record.TopK !== undefined ? record.TopK : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Min P</label>\n <div class=\"detail-value\" [class.null-value]=\"record.MinP === null || record.MinP === undefined\">\n <i class=\"fa-solid fa-filter\"></i>\n {{ record.MinP !== null && record.MinP !== undefined ? record.MinP : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Frequency Penalty</label>\n <div class=\"detail-value\" [class.null-value]=\"record.FrequencyPenalty === null || record.FrequencyPenalty === undefined\">\n <i class=\"fa-solid fa-repeat\"></i>\n {{ record.FrequencyPenalty !== null && record.FrequencyPenalty !== undefined ? record.FrequencyPenalty : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Presence Penalty</label>\n <div class=\"detail-value\" [class.null-value]=\"record.PresencePenalty === null || record.PresencePenalty === undefined\">\n <i class=\"fa-solid fa-plus-circle\"></i>\n {{ record.PresencePenalty !== null && record.PresencePenalty !== undefined ? record.PresencePenalty : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Seed</label>\n <div class=\"detail-value\" [class.null-value]=\"record.Seed === null || record.Seed === undefined\">\n <i class=\"fa-solid fa-seedling\"></i>\n {{ record.Seed !== null && record.Seed !== undefined ? record.Seed : '\u2014' }}\n </div>\n </div>\n \n @if (record.RunAt) {\n <div class=\"detail-field\">\n <label>Started At</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ record.RunAt | date:'medium' }}\n </div>\n </div>\n }\n \n @if (record.CompletedAt) {\n <div class=\"detail-field\">\n <label>Completed At</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{ record.CompletedAt | date:'medium' }}\n </div>\n </div>\n }\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n </kendo-panelbar>\n </div>\n </form>\n }\n</div>", styles: ["/* Header Section */\n.prompt-run-header {\n background: #f8f9fa;\n border-bottom: 2px solid #e9ecef;\n padding: 20px;\n margin-bottom: 0;\n}\n\n.header-content {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n margin-bottom: 16px;\n}\n\n.run-overview {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n flex: 1;\n}\n\n.run-icon-wrapper {\n width: 56px;\n height: 56px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-icon-wrapper i {\n font-size: 24px;\n}\n\n.run-info {\n flex: 1;\n min-width: 0;\n}\n\n.run-title {\n margin: 0 0 8px 0;\n font-size: 1.5em;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.run-id {\n font-size: 0.8em;\n color: #6c757d;\n font-weight: 400;\n font-family: 'Courier New', monospace;\n}\n\n.run-meta {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n color: white;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.status-badge i {\n font-size: 0.9em;\n}\n\n.run-type-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #f1f3f5;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.prompt-name, .model-name, .vendor-name {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.85em;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.prompt-name:hover, .model-name:hover, .vendor-name:hover {\n background: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.run-actions {\n display: flex;\n gap: 8px;\n}\n\n/* Metrics Bar */\n.metrics-bar {\n display: flex;\n gap: 24px;\n padding-top: 16px;\n border-top: 1px solid #e9ecef;\n flex-wrap: wrap;\n}\n\n.metric-item {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.metric-item > i {\n font-size: 1.2em;\n color: #6c757d;\n width: 24px;\n text-align: center;\n}\n\n.metric-content {\n display: flex;\n flex-direction: column;\n}\n\n.metric-label {\n font-size: 0.75em;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value {\n font-size: 1.1em;\n font-weight: 600;\n color: #2c3e50;\n}\n\n/* Panels */\n.form-content {\n padding: 16px;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n/* Nested Sub-Panel Styles */\n.sub-panel-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n font-size: 0.95em;\n}\n\n.sub-panel-content {\n padding: 0;\n}\n\n/* Nested kendo-panelbar styles */\n.k-panelbar .k-panelbar {\n border: none;\n background: transparent;\n}\n\n.k-panelbar .k-panelbar > .k-item {\n border: 1px solid #e5e7eb;\n margin-bottom: 8px;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.k-panelbar .k-panelbar > .k-item > .k-link {\n background-color: #f9fafb;\n padding: 12px 16px;\n}\n\n.k-panelbar .k-panelbar > .k-item.k-expanded > .k-link {\n background-color: #f3f4f6;\n}\n\n.k-panelbar .k-panelbar .k-content {\n padding: 0;\n background: white;\n}\n\n/* Ensure chat message viewer takes appropriate height */\n.sub-panel-content mj-chat-message-viewer {\n display: block;\n min-height: 200px;\n max-height: 750px; /* Increased by 50% from 500px */\n height: auto;\n overflow: hidden;\n}\n\n/* Different colors for sub-expansion panels */\n.sub-expansion-panel {\n margin-bottom: 8px;\n}\n\n.sub-expansion-panel::ng-deep .k-expander {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel::ng-deep .k-expander:hover {\n background-color: #edf2f7;\n}\n\n.sub-expansion-panel::ng-deep .k-header {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel::ng-deep .k-content {\n background-color: #ffffff;\n border-color: #e2e8f0;\n}\n\n.panel-badge {\n margin-left: auto;\n padding: 2px 8px;\n border-radius: 12px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n.panel-badge.error {\n background: #dc3545;\n color: white;\n}\n\n.panel-count {\n color: #6c757d;\n font-weight: 400;\n font-size: 0.9em;\n}\n\n.panel-content {\n padding: 20px;\n max-height: none !important;\n overflow: visible !important;\n}\n\n/* JSON Editor Container */\n.json-editor-container {\n border: 1px solid #e9ecef;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.json-toolbar {\n background: #f8f9fa;\n padding: 8px 12px;\n border-bottom: 1px solid #e9ecef;\n display: flex;\n justify-content: flex-end;\n}\n\n/* Error Message */\n.error-message {\n background: #dc354510;\n border: 1px solid #dc3545;\n border-radius: 6px;\n padding: 16px;\n display: flex;\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.error-message i {\n font-size: 1.5em;\n color: #dc3545;\n flex-shrink: 0;\n}\n\n.error-content h4 {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 1em;\n}\n\n.error-content p {\n margin: 0;\n color: #495057;\n}\n\n/* Empty State */\n.empty-state {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.empty-state i {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.3;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 1.1em;\n}\n\n/* Loading State */\n.loading-state {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.loading-state i {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.6;\n color: #007bff;\n}\n\n.loading-state p {\n margin: 0;\n font-size: 1.1em;\n}\n\n/* Metrics Grid */\n.metrics-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 24px;\n}\n\n.metric-card {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n}\n\n.metric-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.metric-header i {\n font-size: 1.2em;\n color: #6c757d;\n}\n\n.metric-header h4 {\n margin: 0;\n font-size: 0.9em;\n color: #6c757d;\n font-weight: 500;\n}\n\n.metric-value.large {\n font-size: 1.8em;\n font-weight: 700;\n color: #2c3e50;\n}\n\n.metric-rollup {\n margin-top: 8px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.metric-currency {\n margin-top: 4px;\n font-size: 0.85em;\n color: #6c757d;\n text-transform: uppercase;\n}\n\n/* Additional Metrics */\n.additional-metrics {\n border-top: 1px solid #e9ecef;\n padding-top: 16px;\n}\n\n.metric-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n border-bottom: 1px solid #f1f3f5;\n}\n\n.metric-row:last-child {\n border-bottom: none;\n}\n\n.metric-row .metric-label {\n font-weight: 500;\n color: #6c757d;\n}\n\n.metric-row .metric-value {\n font-weight: 400;\n color: #2c3e50;\n}\n\n.metric-row .metric-value.link {\n color: #007bff;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: color 0.2s;\n}\n\n.metric-row .metric-value.link:hover {\n color: #0056b3;\n}\n\n/* Hierarchy Section */\n.parent-run-section,\n.child-runs-section {\n margin-bottom: 24px;\n}\n\n.parent-run-section:last-child,\n.child-runs-section:last-child {\n margin-bottom: 0;\n}\n\n.parent-run-section h4,\n.child-runs-section h4 {\n margin: 0 0 12px 0;\n font-size: 0.95em;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.runs-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.run-item {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.run-item:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n}\n\n.run-item.parent {\n background: #e3f2fd;\n border-color: #90caf9;\n}\n\n.run-item.parent:hover {\n background: #bbdefb;\n}\n\n.run-item-icon {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-item-content {\n flex: 1;\n min-width: 0;\n}\n\n.run-item-title {\n font-weight: 500;\n color: #2c3e50;\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.execution-order {\n background: #6c757d;\n color: white;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 0.75em;\n font-weight: 600;\n}\n\n.run-item-type {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 400;\n}\n\n.run-item-meta {\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.run-item-meta span {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.status-indicator {\n font-weight: 500;\n}\n\n.run-item > i:last-child {\n color: #6c757d;\n font-size: 0.85em;\n}\n\n/* Detail Fields Grid */\n.detail-fields-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 24px;\n width: 100%;\n min-height: auto;\n overflow: visible;\n}\n\n.detail-field {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-field label {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-value {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 1em;\n color: #2c3e50;\n padding: 10px 14px;\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n transition: all 0.2s;\n}\n\n.detail-value i:first-child {\n color: #6c757d;\n font-size: 1.1em;\n width: 20px;\n text-align: center;\n}\n\n.detail-value.clickable {\n cursor: pointer;\n}\n\n.detail-value.clickable:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.detail-value.clickable i:last-child {\n margin-left: auto;\n font-size: 0.85em;\n opacity: 0.6;\n}\n\n.detail-value.clickable:hover i:last-child {\n opacity: 1;\n}\n\n.detail-value.null-value {\n color: #adb5bd;\n font-style: italic;\n}\n\n.detail-value.null-value i:first-child {\n opacity: 0.5;\n}\n\n/* Kendo Overrides */\nkendo-panelbar {\n border: none !important;\n}\n\nkendo-panelbar-item {\n margin-bottom: 8px;\n border: 1px solid #e9ecef !important;\n border-radius: 8px !important;\n overflow: hidden;\n}\n\nkendo-panelbar-item .k-panelbar-header {\n background: #f8f9fa !important;\n border: none !important;\n padding: 12px 16px !important;\n}\n\nkendo-panelbar-item .k-panelbar-header:hover {\n background: #e9ecef !important;\n}\n\nkendo-panelbar-item .k-panelbar-content {\n border: none !important;\n padding: 0 !important;\n max-height: none !important;\n overflow: visible !important;\n}\n\n/* Validation Panel Styles */\n.validation-summary {\n margin-bottom: 24px;\n}\n\n.summary-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.summary-header h4 {\n margin: 0;\n font-size: 1.1em;\n color: #2c3e50;\n}\n\n.validation-status {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 16px;\n border-radius: 20px;\n font-weight: 500;\n font-size: 0.9em;\n}\n\n.validation-status.success {\n background: #28a74520;\n color: #28a745;\n}\n\n.validation-status.failed {\n background: #dc354520;\n color: #dc3545;\n}\n\n.validation-metrics {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.metric-card.small {\n padding: 16px;\n text-align: center;\n}\n\n.metric-card.small .metric-label {\n font-size: 0.8em;\n margin-bottom: 8px;\n font-weight: 600;\n}\n\n.metric-card.small .metric-value {\n font-size: 1.4em;\n font-weight: 700;\n}\n\n.validation-error,\n.common-error {\n background: #dc354510;\n border: 1px solid #dc354530;\n border-radius: 8px;\n padding: 16px;\n margin-bottom: 16px;\n}\n\n.validation-error h5,\n.common-error h5 {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 0.95em;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.validation-error p,\n.common-error p {\n margin: 0;\n color: #495057;\n font-size: 0.9em;\n}\n\n.error-count {\n display: inline-block;\n margin-top: 8px;\n padding: 2px 8px;\n background: #dc3545;\n color: white;\n border-radius: 12px;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n/* Retry Timeline */\n.retry-timeline {\n margin-bottom: 24px;\n}\n\n.retry-timeline h4 {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.timeline-info {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n}\n\n.timeline-stat {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #6c757d;\n font-size: 0.9em;\n}\n\n.timeline-stat i {\n font-size: 1.1em;\n}\n\n/* Validation Attempts */\n.validation-attempts {\n margin-bottom: 24px;\n}\n\n.validation-attempts h4 {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.attempts-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.attempt-item {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n}\n\n.attempt-item.success {\n background: #28a74510;\n border-color: #28a74530;\n}\n\n.attempt-item.failed {\n background: #dc354510;\n border-color: #dc354530;\n}\n\n.attempt-number {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.attempt-item.success .attempt-number {\n color: #28a745;\n}\n\n.attempt-item.failed .attempt-number {\n color: #dc3545;\n}\n\n.attempt-details {\n flex: 1;\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n font-size: 0.85em;\n}\n\n.attempt-time {\n color: #6c757d;\n}\n\n.attempt-error {\n color: #dc3545;\n flex: 1 0 100%;\n}\n\n.output-length {\n color: #6c757d;\n font-style: italic;\n}\n\n/* Validation JSON */\n.validation-json {\n margin-top: 24px;\n}\n\n.validation-json h4 {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.json-viewer-container {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n overflow: hidden;\n}\n\n/* Panel badge styles */\n.panel-badge.success {\n background: #28a745;\n color: white;\n}"] }]
1552
- }], () => [{ type: i0.ElementRef }, { type: i1.SharedService }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i0.ChangeDetectorRef }], null); })();
1553
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIPromptRunFormComponentExtended, { className: "AIPromptRunFormComponentExtended", filePath: "src/lib/custom/AIPromptRuns/ai-prompt-run-form.component.ts", lineNumber: 17 }); })();
1560
+ 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>\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}"] }]
1561
+ }], () => [{ type: i0.ElementRef }, { type: i1.SharedService }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i3.TestHarnessWindowService }, { type: i0.ViewContainerRef }], null); })();
1562
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIPromptRunFormComponentExtended, { className: "AIPromptRunFormComponentExtended", filePath: "src/lib/custom/AIPromptRuns/ai-prompt-run-form.component.ts", lineNumber: 19 }); })();
1554
1563
  //# sourceMappingURL=ai-prompt-run-form.component.js.map