@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.
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +11 -6
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +456 -447
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-category-dialog.component.d.ts +33 -0
- package/dist/lib/custom/Queries/query-category-dialog.component.d.ts.map +1 -0
- package/dist/lib/custom/Queries/query-category-dialog.component.js +241 -0
- package/dist/lib/custom/Queries/query-category-dialog.component.js.map +1 -0
- package/dist/lib/custom/Queries/query-form.component.d.ts +135 -0
- package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -0
- package/dist/lib/custom/Queries/query-form.component.js +1563 -0
- package/dist/lib/custom/Queries/query-form.component.js.map +1 -0
- package/dist/lib/custom/Queries/query-run-dialog.component.d.ts +66 -0
- package/dist/lib/custom/Queries/query-run-dialog.component.d.ts.map +1 -0
- package/dist/lib/custom/Queries/query-run-dialog.component.js +788 -0
- package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +35 -7
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +75 -61
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts +37 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts.map +1 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js +117 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js.map +1 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js +0 -8
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +0 -26
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +5 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +160 -103
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
- package/dist/lib/custom/custom-forms.module.d.ts +25 -22
- package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
- package/dist/lib/custom/custom-forms.module.js +18 -3
- package/dist/lib/custom/custom-forms.module.js.map +1 -1
- package/dist/lib/generated/Entities/AIPromptRun/sections/details.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/AIPromptRun/sections/details.component.js +15 -4
- package/dist/lib/generated/Entities/AIPromptRun/sections/details.component.js.map +1 -1
- package/dist/lib/generated/Entities/Query/query.form.component.js +14 -4
- package/dist/lib/generated/Entities/Query/query.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/Query/sections/details.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/Query/sections/details.component.js +13 -4
- package/dist/lib/generated/Entities/Query/sections/details.component.js.map +1 -1
- package/dist/lib/generated/Entities/QueryEntity/sections/details.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/QueryEntity/sections/details.component.js +22 -4
- package/dist/lib/generated/Entities/QueryEntity/sections/details.component.js.map +1 -1
- package/dist/lib/generated/Entities/QueryField/sections/details.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/QueryField/sections/details.component.js +22 -4
- package/dist/lib/generated/Entities/QueryField/sections/details.component.js.map +1 -1
- package/dist/lib/generated/Entities/QueryParameter/queryparameter.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/QueryParameter/queryparameter.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/QueryParameter/queryparameter.form.component.js +59 -0
- package/dist/lib/generated/Entities/QueryParameter/queryparameter.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/QueryParameter/sections/details.component.d.ts +11 -0
- package/dist/lib/generated/Entities/QueryParameter/sections/details.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/QueryParameter/sections/details.component.js +172 -0
- package/dist/lib/generated/Entities/QueryParameter/sections/details.component.js.map +1 -0
- package/dist/lib/generated/generated-forms.module.d.ts +265 -263
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
- package/dist/lib/generated/generated-forms.module.js +74 -66
- package/dist/lib/generated/generated-forms.module.js.map +1 -1
- 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
|
|
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 "@
|
|
17
|
-
import * as i4 from "@
|
|
18
|
-
import * as i5 from "@progress/kendo-angular-
|
|
19
|
-
import * as i6 from "@
|
|
20
|
-
import * as i7 from "@memberjunction/ng-
|
|
21
|
-
import * as i8 from "
|
|
22
|
-
import * as i9 from "
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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
|
|
84
|
-
i0.ɵɵ
|
|
85
|
-
i0.ɵɵ
|
|
86
|
-
i0.ɵɵ
|
|
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",
|
|
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
|
|
99
|
-
i0.ɵɵelementStart(0, "span",
|
|
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
|
|
104
|
-
i0.ɵɵelementStart(0, "span",
|
|
105
|
-
i0.ɵɵelement(1, "i",
|
|
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,
|
|
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
|
|
115
|
-
i0.ɵɵelementStart(0, "span",
|
|
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
|
|
124
|
-
i0.ɵɵelementStart(0, "span",
|
|
125
|
-
i0.ɵɵelement(1, "i",
|
|
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,
|
|
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
|
|
135
|
-
i0.ɵɵelementStart(0, "div",
|
|
136
|
-
i0.ɵɵelement(1, "i",
|
|
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
|
|
142
|
-
i0.ɵɵelement(0, "mj-chat-message-viewer",
|
|
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
|
|
148
|
-
i0.ɵɵelementStart(0, "div",
|
|
149
|
-
i0.ɵɵelement(1, "i",
|
|
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
|
|
155
|
-
i0.ɵɵelementStart(0, "span",
|
|
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
|
|
160
|
-
i0.ɵɵelementStart(0, "span",
|
|
161
|
-
i0.ɵɵelement(1, "i",
|
|
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,
|
|
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
|
|
171
|
-
const
|
|
172
|
-
i0.ɵɵelementStart(0, "div",
|
|
173
|
-
i0.ɵɵlistener("click", function
|
|
174
|
-
i0.ɵɵelement(3, "i",
|
|
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",
|
|
178
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
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
|
|
187
|
-
i0.ɵɵelementStart(0, "div",
|
|
188
|
-
i0.ɵɵelement(1, "i",
|
|
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
|
|
194
|
-
i0.ɵɵelementStart(0, "span",
|
|
195
|
-
i0.ɵɵelement(1, "i",
|
|
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
|
|
200
|
-
const
|
|
201
|
-
i0.ɵɵelementStart(0, "div",
|
|
202
|
-
i0.ɵɵtemplate(2,
|
|
203
|
-
i0.ɵɵelementStart(3, "div",
|
|
204
|
-
i0.ɵɵtemplate(4,
|
|
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",
|
|
207
|
-
i0.ɵɵtemplate(8,
|
|
208
|
-
i0.ɵɵelementStart(9, "div",
|
|
209
|
-
i0.ɵɵtemplate(10,
|
|
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",
|
|
212
|
-
i0.ɵɵtemplate(13,
|
|
213
|
-
i0.ɵɵelementStart(14, "div",
|
|
214
|
-
i0.ɵɵlistener("click", function
|
|
215
|
-
i0.ɵɵelement(18, "i",
|
|
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",
|
|
219
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
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
|
|
238
|
-
i0.ɵɵelementStart(0, "div",
|
|
239
|
-
i0.ɵɵelement(1, "i",
|
|
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
|
|
245
|
-
i0.ɵɵelementStart(0, "div",
|
|
246
|
-
i0.ɵɵtemplate(1,
|
|
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
|
|
254
|
-
i0.ɵɵelementStart(0, "span",
|
|
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
|
|
259
|
-
i0.ɵɵelementStart(0, "span",
|
|
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
|
|
264
|
-
i0.ɵɵelementStart(0, "span",
|
|
265
|
-
i0.ɵɵelement(1, "i",
|
|
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,
|
|
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
|
|
277
|
-
i0.ɵɵelementStart(0, "div",
|
|
278
|
-
i0.ɵɵelement(1, "i",
|
|
279
|
-
i0.ɵɵelementStart(2, "div",
|
|
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
|
|
291
|
-
const
|
|
292
|
-
i0.ɵɵelementStart(0, "div",
|
|
293
|
-
i0.ɵɵlistener("click", function
|
|
294
|
-
i0.ɵɵelement(3, "i",
|
|
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",
|
|
298
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
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
|
|
307
|
-
i0.ɵɵelementStart(0, "div",
|
|
308
|
-
i0.ɵɵelement(1, "i",
|
|
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
|
|
314
|
-
i0.ɵɵelementStart(0, "div",
|
|
315
|
-
i0.ɵɵtemplate(1,
|
|
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
|
|
325
|
-
i0.ɵɵelementStart(0, "span",
|
|
326
|
-
i0.ɵɵelement(1, "i",
|
|
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
|
|
331
|
-
i0.ɵɵelementStart(0, "div",
|
|
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
|
|
340
|
-
i0.ɵɵelementStart(0, "div",
|
|
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
|
|
349
|
-
i0.ɵɵelementStart(0, "div",
|
|
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
|
|
358
|
-
i0.ɵɵelementStart(0, "div",
|
|
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
|
|
367
|
-
i0.ɵɵelementStart(0, "div",
|
|
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
|
|
376
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
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
|
|
388
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
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
|
|
400
|
-
const
|
|
401
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
405
|
-
i0.ɵɵlistener("click", function
|
|
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",
|
|
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
|
|
415
|
-
i0.ɵɵelementStart(0, "div",
|
|
416
|
-
i0.ɵɵelement(4, "i",
|
|
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",
|
|
431
|
+
i0.ɵɵelementStart(7, "div", 81);
|
|
421
432
|
i0.ɵɵtext(8);
|
|
422
433
|
i0.ɵɵelementEnd();
|
|
423
|
-
i0.ɵɵtemplate(9,
|
|
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",
|
|
426
|
-
i0.ɵɵelement(12, "i",
|
|
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",
|
|
441
|
+
i0.ɵɵelementStart(15, "div", 81);
|
|
431
442
|
i0.ɵɵtext(16);
|
|
432
443
|
i0.ɵɵelementEnd();
|
|
433
|
-
i0.ɵɵtemplate(17,
|
|
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",
|
|
436
|
-
i0.ɵɵelement(20, "i",
|
|
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",
|
|
451
|
+
i0.ɵɵelementStart(23, "div", 81);
|
|
441
452
|
i0.ɵɵtext(24);
|
|
442
453
|
i0.ɵɵelementEnd();
|
|
443
|
-
i0.ɵɵtemplate(25,
|
|
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",
|
|
446
|
-
i0.ɵɵelement(28, "i",
|
|
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",
|
|
461
|
+
i0.ɵɵelementStart(31, "div", 81);
|
|
451
462
|
i0.ɵɵtext(32);
|
|
452
463
|
i0.ɵɵelementEnd();
|
|
453
|
-
i0.ɵɵtemplate(33,
|
|
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",
|
|
456
|
-
i0.ɵɵtemplate(36,
|
|
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
|
|
486
|
-
i0.ɵɵelementStart(0, "span",
|
|
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
|
|
495
|
-
i0.ɵɵelementStart(0, "span",
|
|
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
|
|
500
|
-
i0.ɵɵelementStart(0, "span",
|
|
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
|
|
505
|
-
i0.ɵɵelementStart(0, "span",
|
|
506
|
-
i0.ɵɵelement(1, "i",
|
|
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,
|
|
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
|
|
518
|
-
i0.ɵɵelementStart(0, "span",
|
|
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
|
|
527
|
-
i0.ɵɵelementStart(0, "div",
|
|
528
|
-
i0.ɵɵelement(2, "i",
|
|
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,
|
|
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
|
|
544
|
-
i0.ɵɵelementStart(0, "div",
|
|
545
|
-
i0.ɵɵelement(2, "i",
|
|
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
|
|
557
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
561
|
-
i0.ɵɵelement(5, "i",
|
|
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",
|
|
567
|
-
i0.ɵɵelement(10, "i",
|
|
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",
|
|
573
|
-
i0.ɵɵelement(15, "i",
|
|
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
|
|
587
|
-
i0.ɵɵelementStart(0, "span",
|
|
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
|
|
602
|
+
const attempt_r11 = i0.ɵɵnextContext(2).$implicit;
|
|
592
603
|
i0.ɵɵadvance();
|
|
593
|
-
i0.ɵɵtextInterpolate1("(",
|
|
604
|
+
i0.ɵɵtextInterpolate1("(", attempt_r11.validationErrorCount, " errors)");
|
|
594
605
|
} }
|
|
595
|
-
function
|
|
596
|
-
i0.ɵɵelementStart(0, "span",
|
|
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,
|
|
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
|
|
612
|
+
const attempt_r11 = i0.ɵɵnextContext().$implicit;
|
|
602
613
|
i0.ɵɵadvance();
|
|
603
|
-
i0.ɵɵtextInterpolate(
|
|
614
|
+
i0.ɵɵtextInterpolate(attempt_r11.errorMessage || "Unknown error");
|
|
604
615
|
i0.ɵɵadvance();
|
|
605
|
-
i0.ɵɵconditional(
|
|
616
|
+
i0.ɵɵconditional(attempt_r11.validationErrorCount > 0 ? 2 : -1);
|
|
606
617
|
} }
|
|
607
|
-
function
|
|
608
|
-
i0.ɵɵelementStart(0, "span",
|
|
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
|
|
623
|
+
const attempt_r11 = i0.ɵɵnextContext().$implicit;
|
|
613
624
|
i0.ɵɵadvance();
|
|
614
|
-
i0.ɵɵtextInterpolate1("Output: ",
|
|
625
|
+
i0.ɵɵtextInterpolate1("Output: ", attempt_r11.outputLength, " chars");
|
|
615
626
|
} }
|
|
616
|
-
function
|
|
617
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
632
|
+
i0.ɵɵelementStart(4, "div", 111)(5, "span", 112);
|
|
622
633
|
i0.ɵɵtext(6);
|
|
623
634
|
i0.ɵɵelementEnd();
|
|
624
|
-
i0.ɵɵtemplate(7,
|
|
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
|
|
628
|
-
i0.ɵɵclassProp("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(
|
|
641
|
+
i0.ɵɵclassMap(attempt_r11.success ? "fa-solid fa-check" : "fa-solid fa-times");
|
|
631
642
|
i0.ɵɵadvance();
|
|
632
|
-
i0.ɵɵtextInterpolate1(" Attempt #",
|
|
643
|
+
i0.ɵɵtextInterpolate1(" Attempt #", attempt_r11.attemptNumber, " ");
|
|
633
644
|
i0.ɵɵadvance(3);
|
|
634
|
-
i0.ɵɵtextInterpolate(
|
|
645
|
+
i0.ɵɵtextInterpolate(attempt_r11.timestamp);
|
|
635
646
|
i0.ɵɵadvance();
|
|
636
|
-
i0.ɵɵconditional(!
|
|
647
|
+
i0.ɵɵconditional(!attempt_r11.success ? 7 : -1);
|
|
637
648
|
i0.ɵɵadvance();
|
|
638
|
-
i0.ɵɵconditional(
|
|
649
|
+
i0.ɵɵconditional(attempt_r11.outputLength ? 8 : -1);
|
|
639
650
|
} }
|
|
640
|
-
function
|
|
641
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
645
|
-
i0.ɵɵrepeaterCreate(4,
|
|
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
|
|
653
|
-
const
|
|
654
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
658
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
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
|
|
667
|
-
const
|
|
668
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
672
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
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
|
|
681
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
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",
|
|
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",
|
|
702
|
+
i0.ɵɵelementStart(12, "div", 28);
|
|
692
703
|
i0.ɵɵtext(13);
|
|
693
704
|
i0.ɵɵelementEnd()();
|
|
694
|
-
i0.ɵɵelementStart(14, "div",
|
|
705
|
+
i0.ɵɵelementStart(14, "div", 95)(15, "div", 27);
|
|
695
706
|
i0.ɵɵtext(16, "Successful");
|
|
696
707
|
i0.ɵɵelementEnd();
|
|
697
|
-
i0.ɵɵelementStart(17, "div",
|
|
708
|
+
i0.ɵɵelementStart(17, "div", 28);
|
|
698
709
|
i0.ɵɵtext(18);
|
|
699
710
|
i0.ɵɵelementEnd()();
|
|
700
|
-
i0.ɵɵelementStart(19, "div",
|
|
711
|
+
i0.ɵɵelementStart(19, "div", 95)(20, "div", 27);
|
|
701
712
|
i0.ɵɵtext(21, "Behavior");
|
|
702
713
|
i0.ɵɵelementEnd();
|
|
703
|
-
i0.ɵɵelementStart(22, "div",
|
|
714
|
+
i0.ɵɵelementStart(22, "div", 28);
|
|
704
715
|
i0.ɵɵtext(23);
|
|
705
716
|
i0.ɵɵelementEnd()();
|
|
706
|
-
i0.ɵɵelementStart(24, "div",
|
|
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",
|
|
720
|
+
i0.ɵɵelementStart(27, "div", 28);
|
|
710
721
|
i0.ɵɵtext(28);
|
|
711
722
|
i0.ɵɵelementEnd()()();
|
|
712
|
-
i0.ɵɵtemplate(29,
|
|
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,
|
|
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
|
|
746
|
-
i0.ɵɵelementStart(0, "kendo-panelbar-item",
|
|
747
|
-
i0.ɵɵtemplate(1,
|
|
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
|
|
754
|
-
i0.ɵɵelementStart(0, "span",
|
|
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
|
|
763
|
-
i0.ɵɵelementStart(0, "span",
|
|
764
|
-
i0.ɵɵelement(1, "i",
|
|
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,
|
|
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
|
|
774
|
-
const
|
|
775
|
-
i0.ɵɵelementStart(0, "div",
|
|
776
|
-
i0.ɵɵelement(2, "i",
|
|
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",
|
|
780
|
-
i0.ɵɵlistener("click", function
|
|
781
|
-
i0.ɵɵelementStart(5, "div",
|
|
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",
|
|
795
|
+
i0.ɵɵelementStart(7, "div", 123)(8, "div", 124);
|
|
785
796
|
i0.ɵɵtext(9);
|
|
786
|
-
i0.ɵɵelementStart(10, "span",
|
|
797
|
+
i0.ɵɵelementStart(10, "span", 125);
|
|
787
798
|
i0.ɵɵtext(11);
|
|
788
799
|
i0.ɵɵelementEnd()();
|
|
789
|
-
i0.ɵɵelementStart(12, "div",
|
|
790
|
-
i0.ɵɵelement(14, "i",
|
|
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",
|
|
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",
|
|
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",
|
|
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
|
|
822
|
-
i0.ɵɵelementStart(0, "span",
|
|
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
|
|
837
|
+
const childRun_r16 = i0.ɵɵnextContext().$implicit;
|
|
827
838
|
i0.ɵɵadvance();
|
|
828
|
-
i0.ɵɵtextInterpolate1("#",
|
|
839
|
+
i0.ɵɵtextInterpolate1("#", childRun_r16.ExecutionOrder, "");
|
|
829
840
|
} }
|
|
830
|
-
function
|
|
831
|
-
const
|
|
832
|
-
i0.ɵɵelementStart(0, "div",
|
|
833
|
-
i0.ɵɵlistener("click", function
|
|
834
|
-
i0.ɵɵelementStart(1, "div",
|
|
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",
|
|
848
|
+
i0.ɵɵelementStart(3, "div", 123)(4, "div", 124);
|
|
838
849
|
i0.ɵɵtext(5);
|
|
839
|
-
i0.ɵɵtemplate(6,
|
|
840
|
-
i0.ɵɵelementStart(7, "span",
|
|
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",
|
|
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",
|
|
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",
|
|
863
|
+
i0.ɵɵelement(17, "i", 29);
|
|
853
864
|
i0.ɵɵtext(18);
|
|
854
865
|
i0.ɵɵelementEnd()()();
|
|
855
|
-
i0.ɵɵelement(19, "i",
|
|
866
|
+
i0.ɵɵelement(19, "i", 88);
|
|
856
867
|
i0.ɵɵelementEnd();
|
|
857
868
|
} if (rf & 2) {
|
|
858
|
-
const
|
|
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(
|
|
874
|
+
i0.ɵɵclassMap("fa-solid " + ctx_r1.getRunTypeIcon(childRun_r16.RunType));
|
|
864
875
|
i0.ɵɵadvance(3);
|
|
865
|
-
i0.ɵɵtextInterpolate1(" Child Run #",
|
|
876
|
+
i0.ɵɵtextInterpolate1(" Child Run #", childRun_r16.ID.substring(0, 8), " ");
|
|
866
877
|
i0.ɵɵadvance();
|
|
867
|
-
i0.ɵɵconditional(
|
|
878
|
+
i0.ɵɵconditional(childRun_r16.ExecutionOrder !== null ? 6 : -1);
|
|
868
879
|
i0.ɵɵadvance(2);
|
|
869
|
-
i0.ɵɵtextInterpolate(
|
|
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(" ",
|
|
886
|
+
i0.ɵɵtextInterpolate1(" ", childRun_r16.Success ? "Success" : childRun_r16.ErrorMessage ? "Failed" : "Running", " ");
|
|
876
887
|
i0.ɵɵadvance(3);
|
|
877
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r1.formatDuration(
|
|
888
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.formatDuration(childRun_r16.ExecutionTimeMS), "");
|
|
878
889
|
i0.ɵɵadvance(3);
|
|
879
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r1.formatTokens(
|
|
890
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.formatTokens(childRun_r16.TokensUsed), "");
|
|
880
891
|
} }
|
|
881
|
-
function
|
|
882
|
-
i0.ɵɵelementStart(0, "div",
|
|
883
|
-
i0.ɵɵelement(2, "i",
|
|
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",
|
|
887
|
-
i0.ɵɵrepeaterCreate(5,
|
|
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
|
|
895
|
-
i0.ɵɵelementStart(0, "div",
|
|
896
|
-
i0.ɵɵtemplate(1,
|
|
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
|
|
906
|
-
i0.ɵɵelementStart(0, "kendo-panelbar-item",
|
|
907
|
-
i0.ɵɵtemplate(1,
|
|
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
|
|
914
|
-
i0.ɵɵelementStart(0, "span",
|
|
915
|
-
i0.ɵɵelement(1, "i",
|
|
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
|
|
920
|
-
const
|
|
921
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
925
|
-
i0.ɵɵlistener("click", function
|
|
926
|
-
i0.ɵɵelement(4, "i",
|
|
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",
|
|
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
|
|
936
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
940
|
-
i0.ɵɵelement(4, "i",
|
|
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
|
|
949
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
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
|
|
964
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
968
|
-
i0.ɵɵelement(4, "i",
|
|
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
|
|
977
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
981
|
-
i0.ɵɵelement(4, "i",
|
|
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
|
|
991
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
995
|
-
i0.ɵɵelement(4, "i",
|
|
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
|
|
1005
|
-
i0.ɵɵelementStart(0, "div",
|
|
1006
|
-
i0.ɵɵtemplate(2,
|
|
1007
|
-
i0.ɵɵelementStart(6, "div",
|
|
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",
|
|
1011
|
-
i0.ɵɵelement(10, "i",
|
|
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",
|
|
1025
|
+
i0.ɵɵelementStart(12, "div", 135)(13, "label");
|
|
1015
1026
|
i0.ɵɵtext(14, "Top P");
|
|
1016
1027
|
i0.ɵɵelementEnd();
|
|
1017
|
-
i0.ɵɵelementStart(15, "div",
|
|
1018
|
-
i0.ɵɵelement(16, "i",
|
|
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",
|
|
1032
|
+
i0.ɵɵelementStart(18, "div", 135)(19, "label");
|
|
1022
1033
|
i0.ɵɵtext(20, "Top K");
|
|
1023
1034
|
i0.ɵɵelementEnd();
|
|
1024
|
-
i0.ɵɵelementStart(21, "div",
|
|
1025
|
-
i0.ɵɵelement(22, "i",
|
|
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",
|
|
1039
|
+
i0.ɵɵelementStart(24, "div", 135)(25, "label");
|
|
1029
1040
|
i0.ɵɵtext(26, "Min P");
|
|
1030
1041
|
i0.ɵɵelementEnd();
|
|
1031
|
-
i0.ɵɵelementStart(27, "div",
|
|
1032
|
-
i0.ɵɵelement(28, "i",
|
|
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",
|
|
1046
|
+
i0.ɵɵelementStart(30, "div", 135)(31, "label");
|
|
1036
1047
|
i0.ɵɵtext(32, "Frequency Penalty");
|
|
1037
1048
|
i0.ɵɵelementEnd();
|
|
1038
|
-
i0.ɵɵelementStart(33, "div",
|
|
1039
|
-
i0.ɵɵelement(34, "i",
|
|
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",
|
|
1053
|
+
i0.ɵɵelementStart(36, "div", 135)(37, "label");
|
|
1043
1054
|
i0.ɵɵtext(38, "Presence Penalty");
|
|
1044
1055
|
i0.ɵɵelementEnd();
|
|
1045
|
-
i0.ɵɵelementStart(39, "div",
|
|
1046
|
-
i0.ɵɵelement(40, "i",
|
|
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",
|
|
1060
|
+
i0.ɵɵelementStart(42, "div", 135)(43, "label");
|
|
1050
1061
|
i0.ɵɵtext(44, "Seed");
|
|
1051
1062
|
i0.ɵɵelementEnd();
|
|
1052
|
-
i0.ɵɵelementStart(45, "div",
|
|
1053
|
-
i0.ɵɵelement(46, "i",
|
|
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,
|
|
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(
|
|
1119
|
-
i0.ɵɵlistener("click", function
|
|
1120
|
-
i0.ɵɵelement(
|
|
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(
|
|
1123
|
-
i0.ɵɵelement(
|
|
1124
|
-
i0.ɵɵelementStart(
|
|
1125
|
-
i0.ɵɵtext(
|
|
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(
|
|
1128
|
-
i0.ɵɵtext(
|
|
1143
|
+
i0.ɵɵelementStart(33, "div", 28);
|
|
1144
|
+
i0.ɵɵtext(34);
|
|
1129
1145
|
i0.ɵɵelementEnd()()();
|
|
1130
|
-
i0.ɵɵelementStart(
|
|
1131
|
-
i0.ɵɵelement(
|
|
1132
|
-
i0.ɵɵelementStart(
|
|
1133
|
-
i0.ɵɵtext(
|
|
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(
|
|
1136
|
-
i0.ɵɵtext(
|
|
1151
|
+
i0.ɵɵelementStart(40, "div", 28);
|
|
1152
|
+
i0.ɵɵtext(41);
|
|
1137
1153
|
i0.ɵɵelementEnd()()();
|
|
1138
|
-
i0.ɵɵelementStart(
|
|
1139
|
-
i0.ɵɵelement(
|
|
1140
|
-
i0.ɵɵelementStart(
|
|
1141
|
-
i0.ɵɵtext(
|
|
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(
|
|
1144
|
-
i0.ɵɵtext(
|
|
1159
|
+
i0.ɵɵelementStart(47, "div", 28);
|
|
1160
|
+
i0.ɵɵtext(48);
|
|
1145
1161
|
i0.ɵɵelementEnd()()();
|
|
1146
|
-
i0.ɵɵtemplate(
|
|
1162
|
+
i0.ɵɵtemplate(49, AIPromptRunFormComponentExtended_Conditional_1_Conditional_49_Template, 8, 4, "div", 24);
|
|
1147
1163
|
i0.ɵɵelementEnd()();
|
|
1148
|
-
i0.ɵɵelementStart(
|
|
1149
|
-
i0.ɵɵlistener("stateChange", function
|
|
1150
|
-
i0.ɵɵtemplate(
|
|
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(
|
|
1153
|
-
i0.ɵɵtemplate(
|
|
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(
|
|
1156
|
-
i0.ɵɵtemplate(
|
|
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(
|
|
1159
|
-
i0.ɵɵelementStart(
|
|
1160
|
-
i0.ɵɵtemplate(
|
|
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(
|
|
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 ?
|
|
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) ?
|
|
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 ?
|
|
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
|
-
|
|
1327
|
+
if (result.Success) {
|
|
1328
|
+
this.childRuns = result.Results || [];
|
|
1329
|
+
}
|
|
1307
1330
|
}
|
|
1308
1331
|
formatJsonFields() {
|
|
1309
1332
|
this.isParsingMessages = true; // Start parsing
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
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
|
|
1356
|
-
|
|
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, "
|
|
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,
|
|
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:
|
|
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
|