@memberjunction/ng-core-entity-forms 2.75.0 → 2.77.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/README.md +124 -0
- package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-diagram.component.d.ts +109 -0
- package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-diagram.component.d.ts.map +1 -0
- package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-diagram.component.js +2020 -0
- package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-diagram.component.js.map +1 -0
- package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.d.ts +32 -0
- package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.d.ts.map +1 -0
- package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.js +413 -0
- package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.js.map +1 -0
- package/dist/lib/custom/AIAgents/FlowAgentType/step-info-control.component.d.ts +9 -0
- package/dist/lib/custom/AIAgents/FlowAgentType/step-info-control.component.d.ts.map +1 -0
- package/dist/lib/custom/AIAgents/FlowAgentType/step-info-control.component.js +84 -0
- package/dist/lib/custom/AIAgents/FlowAgentType/step-info-control.component.js.map +1 -0
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +34 -6
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js +656 -520
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +223 -221
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-execution-log-form.component.js +51 -49
- package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-test-harness.component.d.ts.map +1 -1
- package/dist/lib/custom/Actions/action-test-harness.component.js +5 -3
- package/dist/lib/custom/Actions/action-test-harness.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +160 -158
- 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.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js +3 -6
- package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts +49 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +211 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts +33 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts.map +1 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +265 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js.map +1 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +4 -8
- 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 +47 -163
- 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-visualization.component.d.ts +71 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts.map +1 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js +931 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js.map +1 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +6 -4
- 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 +202 -297
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
- package/dist/lib/custom/custom-forms.module.d.ts +30 -25
- package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
- package/dist/lib/custom/custom-forms.module.js +31 -4
- package/dist/lib/custom/custom-forms.module.js.map +1 -1
- package/dist/lib/generated/Entities/AIAgent/aiagent.form.component.js +34 -14
- package/dist/lib/generated/Entities/AIAgent/aiagent.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/AIAgentStep/aiagentstep.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/AIAgentStep/aiagentstep.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/AIAgentStep/aiagentstep.form.component.js +80 -0
- package/dist/lib/generated/Entities/AIAgentStep/aiagentstep.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/AIAgentStep/sections/details.component.d.ts +11 -0
- package/dist/lib/generated/Entities/AIAgentStep/sections/details.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/AIAgentStep/sections/details.component.js +277 -0
- package/dist/lib/generated/Entities/AIAgentStep/sections/details.component.js.map +1 -0
- package/dist/lib/generated/Entities/AIAgentStepPath/aiagentsteppath.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/AIAgentStepPath/aiagentsteppath.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/AIAgentStepPath/aiagentsteppath.form.component.js +59 -0
- package/dist/lib/generated/Entities/AIAgentStepPath/aiagentsteppath.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/AIAgentStepPath/sections/details.component.d.ts +11 -0
- package/dist/lib/generated/Entities/AIAgentStepPath/sections/details.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/AIAgentStepPath/sections/details.component.js +147 -0
- package/dist/lib/generated/Entities/AIAgentStepPath/sections/details.component.js.map +1 -0
- package/dist/lib/generated/Entities/AIAgentType/sections/details.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/AIAgentType/sections/details.component.js +31 -4
- package/dist/lib/generated/Entities/AIAgentType/sections/details.component.js.map +1 -1
- package/dist/lib/generated/Entities/AIPrompt/aiprompt.form.component.js +16 -6
- package/dist/lib/generated/Entities/AIPrompt/aiprompt.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/Action/action.form.component.js +19 -9
- package/dist/lib/generated/Entities/Action/action.form.component.js.map +1 -1
- package/dist/lib/generated/generated-forms.module.d.ts +294 -285
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
- package/dist/lib/generated/generated-forms.module.js +183 -110
- package/dist/lib/generated/generated-forms.module.js.map +1 -1
- package/dist/public-api.d.ts +2 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +21 -17
|
@@ -7,7 +7,6 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
import { Component, ViewChild } from '@angular/core';
|
|
8
8
|
import { Subject } from 'rxjs';
|
|
9
9
|
import { CompositeKey, Metadata } from '@memberjunction/core';
|
|
10
|
-
import { AIAgentRunStepEntity } from '@memberjunction/core-entities';
|
|
11
10
|
import { BaseFormComponent } from '@memberjunction/ng-base-forms';
|
|
12
11
|
import { RegisterClass } from '@memberjunction/global';
|
|
13
12
|
import { SharedService } from '@memberjunction/ng-shared';
|
|
@@ -15,19 +14,23 @@ import { AIAgentRunTimelineComponent } from './ai-agent-run-timeline.component';
|
|
|
15
14
|
import { AIAgentRunFormComponent } from '../../generated/Entities/AIAgentRun/aiagentrun.form.component';
|
|
16
15
|
import { ParseJSONRecursive } from '@memberjunction/global';
|
|
17
16
|
import { AIAgentRunAnalyticsComponent } from './ai-agent-run-analytics.component';
|
|
17
|
+
import { AIAgentRunVisualizationComponent } from './ai-agent-run-visualization.component';
|
|
18
18
|
import * as i0 from "@angular/core";
|
|
19
19
|
import * as i1 from "@memberjunction/ng-shared";
|
|
20
20
|
import * as i2 from "@angular/router";
|
|
21
21
|
import * as i3 from "./ai-agent-run-cost.service";
|
|
22
|
-
import * as i4 from "
|
|
23
|
-
import * as i5 from "@angular/
|
|
24
|
-
import * as i6 from "@
|
|
25
|
-
import * as i7 from "@
|
|
26
|
-
import * as i8 from "@memberjunction/ng-
|
|
27
|
-
import * as i9 from "
|
|
28
|
-
import * as i10 from "./ai-agent-run-
|
|
22
|
+
import * as i4 from "./ai-agent-run-data.service";
|
|
23
|
+
import * as i5 from "@angular/common";
|
|
24
|
+
import * as i6 from "@angular/forms";
|
|
25
|
+
import * as i7 from "@progress/kendo-angular-layout";
|
|
26
|
+
import * as i8 from "@memberjunction/ng-code-editor";
|
|
27
|
+
import * as i9 from "@memberjunction/ng-deep-diff";
|
|
28
|
+
import * as i10 from "./ai-agent-run-timeline.component";
|
|
29
|
+
import * as i11 from "./ai-agent-run-analytics.component";
|
|
30
|
+
import * as i12 from "./ai-agent-run-visualization.component";
|
|
31
|
+
import * as i13 from "./ai-agent-run-step-detail.component";
|
|
29
32
|
function AIAgentRunFormComponentExtended_span_11_Template(rf, ctx) { if (rf & 1) {
|
|
30
|
-
i0.ɵɵelementStart(0, "span",
|
|
33
|
+
i0.ɵɵelementStart(0, "span", 34);
|
|
31
34
|
i0.ɵɵtext(1);
|
|
32
35
|
i0.ɵɵelementEnd();
|
|
33
36
|
} if (rf & 2) {
|
|
@@ -37,18 +40,18 @@ function AIAgentRunFormComponentExtended_span_11_Template(rf, ctx) { if (rf & 1)
|
|
|
37
40
|
} }
|
|
38
41
|
function AIAgentRunFormComponentExtended_span_14_Template(rf, ctx) { if (rf & 1) {
|
|
39
42
|
const _r2 = i0.ɵɵgetCurrentView();
|
|
40
|
-
i0.ɵɵelementStart(0, "span",
|
|
41
|
-
i0.ɵɵelement(1, "i",
|
|
42
|
-
i0.ɵɵelementStart(2, "a",
|
|
43
|
+
i0.ɵɵelementStart(0, "span", 35);
|
|
44
|
+
i0.ɵɵelement(1, "i", 36);
|
|
45
|
+
i0.ɵɵelementStart(2, "a", 37);
|
|
43
46
|
i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_span_14_Template_a_click_2_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.navigateToParentRun()); });
|
|
44
47
|
i0.ɵɵtext(3, "Parent Run");
|
|
45
48
|
i0.ɵɵelementEnd()();
|
|
46
49
|
} }
|
|
47
50
|
function AIAgentRunFormComponentExtended_div_29_Template(rf, ctx) { if (rf & 1) {
|
|
48
|
-
i0.ɵɵelementStart(0, "div",
|
|
51
|
+
i0.ɵɵelementStart(0, "div", 21)(1, "span", 22);
|
|
49
52
|
i0.ɵɵtext(2, "Completed");
|
|
50
53
|
i0.ɵɵelementEnd();
|
|
51
|
-
i0.ɵɵelementStart(3, "span",
|
|
54
|
+
i0.ɵɵelementStart(3, "span", 23);
|
|
52
55
|
i0.ɵɵtext(4);
|
|
53
56
|
i0.ɵɵpipe(5, "date");
|
|
54
57
|
i0.ɵɵelementEnd()();
|
|
@@ -58,10 +61,10 @@ function AIAgentRunFormComponentExtended_div_29_Template(rf, ctx) { if (rf & 1)
|
|
|
58
61
|
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r0.record.CompletedAt, "medium"));
|
|
59
62
|
} }
|
|
60
63
|
function AIAgentRunFormComponentExtended_div_30_Template(rf, ctx) { if (rf & 1) {
|
|
61
|
-
i0.ɵɵelementStart(0, "div",
|
|
64
|
+
i0.ɵɵelementStart(0, "div", 21)(1, "span", 22);
|
|
62
65
|
i0.ɵɵtext(2, "Duration");
|
|
63
66
|
i0.ɵɵelementEnd();
|
|
64
|
-
i0.ɵɵelementStart(3, "span",
|
|
67
|
+
i0.ɵɵelementStart(3, "span", 23);
|
|
65
68
|
i0.ɵɵtext(4);
|
|
66
69
|
i0.ɵɵelementEnd()();
|
|
67
70
|
} if (rf & 2) {
|
|
@@ -70,10 +73,10 @@ function AIAgentRunFormComponentExtended_div_30_Template(rf, ctx) { if (rf & 1)
|
|
|
70
73
|
i0.ɵɵtextInterpolate(ctx_r0.calculateDuration(ctx_r0.record.StartedAt, ctx_r0.record.CompletedAt));
|
|
71
74
|
} }
|
|
72
75
|
function AIAgentRunFormComponentExtended_div_31_Template(rf, ctx) { if (rf & 1) {
|
|
73
|
-
i0.ɵɵelementStart(0, "div",
|
|
76
|
+
i0.ɵɵelementStart(0, "div", 21)(1, "span", 22);
|
|
74
77
|
i0.ɵɵtext(2, "Result");
|
|
75
78
|
i0.ɵɵelementEnd();
|
|
76
|
-
i0.ɵɵelementStart(3, "span",
|
|
79
|
+
i0.ɵɵelementStart(3, "span", 23);
|
|
77
80
|
i0.ɵɵtext(4);
|
|
78
81
|
i0.ɵɵelementEnd()();
|
|
79
82
|
} if (rf & 2) {
|
|
@@ -84,7 +87,7 @@ function AIAgentRunFormComponentExtended_div_31_Template(rf, ctx) { if (rf & 1)
|
|
|
84
87
|
i0.ɵɵtextInterpolate1(" ", ctx_r0.record.Success ? "Success" : "Failed", " ");
|
|
85
88
|
} }
|
|
86
89
|
function AIAgentRunFormComponentExtended_div_32_span_3_Template(rf, ctx) { if (rf & 1) {
|
|
87
|
-
i0.ɵɵelementStart(0, "span",
|
|
90
|
+
i0.ɵɵelementStart(0, "span", 23);
|
|
88
91
|
i0.ɵɵtext(1);
|
|
89
92
|
i0.ɵɵpipe(2, "number");
|
|
90
93
|
i0.ɵɵelementEnd();
|
|
@@ -94,15 +97,15 @@ function AIAgentRunFormComponentExtended_div_32_span_3_Template(rf, ctx) { if (r
|
|
|
94
97
|
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(2, 1, ctx_r0.costMetrics.totalTokensInput + ctx_r0.costMetrics.totalTokensOutput, "1.0-0"));
|
|
95
98
|
} }
|
|
96
99
|
function AIAgentRunFormComponentExtended_div_32_span_4_Template(rf, ctx) { if (rf & 1) {
|
|
97
|
-
i0.ɵɵelementStart(0, "span",
|
|
98
|
-
i0.ɵɵelement(1, "i",
|
|
100
|
+
i0.ɵɵelementStart(0, "span", 40);
|
|
101
|
+
i0.ɵɵelement(1, "i", 41);
|
|
99
102
|
i0.ɵɵelementEnd();
|
|
100
103
|
} }
|
|
101
104
|
function AIAgentRunFormComponentExtended_div_32_Template(rf, ctx) { if (rf & 1) {
|
|
102
|
-
i0.ɵɵelementStart(0, "div",
|
|
105
|
+
i0.ɵɵelementStart(0, "div", 21)(1, "span", 22);
|
|
103
106
|
i0.ɵɵtext(2, "Tokens");
|
|
104
107
|
i0.ɵɵelementEnd();
|
|
105
|
-
i0.ɵɵtemplate(3, AIAgentRunFormComponentExtended_div_32_span_3_Template, 3, 4, "span",
|
|
108
|
+
i0.ɵɵtemplate(3, AIAgentRunFormComponentExtended_div_32_span_3_Template, 3, 4, "span", 38)(4, AIAgentRunFormComponentExtended_div_32_span_4_Template, 2, 0, "span", 39);
|
|
106
109
|
i0.ɵɵelementEnd();
|
|
107
110
|
} if (rf & 2) {
|
|
108
111
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
@@ -112,7 +115,7 @@ function AIAgentRunFormComponentExtended_div_32_Template(rf, ctx) { if (rf & 1)
|
|
|
112
115
|
i0.ɵɵproperty("ngIf", ctx_r0.costMetrics.isLoading);
|
|
113
116
|
} }
|
|
114
117
|
function AIAgentRunFormComponentExtended_div_33_span_3_Template(rf, ctx) { if (rf & 1) {
|
|
115
|
-
i0.ɵɵelementStart(0, "span",
|
|
118
|
+
i0.ɵɵelementStart(0, "span", 23);
|
|
116
119
|
i0.ɵɵtext(1);
|
|
117
120
|
i0.ɵɵpipe(2, "number");
|
|
118
121
|
i0.ɵɵelementEnd();
|
|
@@ -122,15 +125,15 @@ function AIAgentRunFormComponentExtended_div_33_span_3_Template(rf, ctx) { if (r
|
|
|
122
125
|
i0.ɵɵtextInterpolate1("$", i0.ɵɵpipeBind2(2, 1, ctx_r0.costMetrics.totalCost, "1.2-4"), "");
|
|
123
126
|
} }
|
|
124
127
|
function AIAgentRunFormComponentExtended_div_33_span_4_Template(rf, ctx) { if (rf & 1) {
|
|
125
|
-
i0.ɵɵelementStart(0, "span",
|
|
126
|
-
i0.ɵɵelement(1, "i",
|
|
128
|
+
i0.ɵɵelementStart(0, "span", 40);
|
|
129
|
+
i0.ɵɵelement(1, "i", 41);
|
|
127
130
|
i0.ɵɵelementEnd();
|
|
128
131
|
} }
|
|
129
132
|
function AIAgentRunFormComponentExtended_div_33_Template(rf, ctx) { if (rf & 1) {
|
|
130
|
-
i0.ɵɵelementStart(0, "div",
|
|
133
|
+
i0.ɵɵelementStart(0, "div", 21)(1, "span", 22);
|
|
131
134
|
i0.ɵɵtext(2, "Cost");
|
|
132
135
|
i0.ɵɵelementEnd();
|
|
133
|
-
i0.ɵɵtemplate(3, AIAgentRunFormComponentExtended_div_33_span_3_Template, 3, 4, "span",
|
|
136
|
+
i0.ɵɵtemplate(3, AIAgentRunFormComponentExtended_div_33_span_3_Template, 3, 4, "span", 38)(4, AIAgentRunFormComponentExtended_div_33_span_4_Template, 2, 0, "span", 39);
|
|
134
137
|
i0.ɵɵelementEnd();
|
|
135
138
|
} if (rf & 2) {
|
|
136
139
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
@@ -139,122 +142,14 @@ function AIAgentRunFormComponentExtended_div_33_Template(rf, ctx) { if (rf & 1)
|
|
|
139
142
|
i0.ɵɵadvance();
|
|
140
143
|
i0.ɵɵproperty("ngIf", ctx_r0.costMetrics.isLoading);
|
|
141
144
|
} }
|
|
142
|
-
function
|
|
143
|
-
const _r5 = i0.ɵɵgetCurrentView();
|
|
144
|
-
i0.ɵɵelementStart(0, "div", 59)(1, "button", 60);
|
|
145
|
-
i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_div_45_div_5_div_24_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.navigateToActionLog(ctx_r0.selectedTimelineItem.data.ID)); });
|
|
146
|
-
i0.ɵɵelement(2, "i", 61);
|
|
147
|
-
i0.ɵɵtext(3, " View Action Execution Log ");
|
|
148
|
-
i0.ɵɵelementEnd()();
|
|
149
|
-
} }
|
|
150
|
-
function AIAgentRunFormComponentExtended_div_45_div_5_Conditional_25_Template(rf, ctx) { if (rf & 1) {
|
|
151
|
-
const _r6 = i0.ɵɵgetCurrentView();
|
|
152
|
-
i0.ɵɵelementStart(0, "div", 55)(1, "button", 62);
|
|
153
|
-
i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_div_45_div_5_Conditional_25_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.detailPaneTab = "diff"); });
|
|
154
|
-
i0.ɵɵelement(2, "i", 63);
|
|
155
|
-
i0.ɵɵtext(3, " Payload Changes ");
|
|
156
|
-
i0.ɵɵelementEnd();
|
|
157
|
-
i0.ɵɵelementStart(4, "button", 62);
|
|
158
|
-
i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_div_45_div_5_Conditional_25_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.detailPaneTab = "json"); });
|
|
159
|
-
i0.ɵɵelement(5, "i", 64);
|
|
160
|
-
i0.ɵɵtext(6, " Full JSON ");
|
|
161
|
-
i0.ɵɵelementEnd()();
|
|
162
|
-
} if (rf & 2) {
|
|
163
|
-
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
164
|
-
i0.ɵɵadvance();
|
|
165
|
-
i0.ɵɵclassProp("active", ctx_r0.detailPaneTab === "diff");
|
|
166
|
-
i0.ɵɵadvance(3);
|
|
167
|
-
i0.ɵɵclassProp("active", ctx_r0.detailPaneTab === "json");
|
|
168
|
-
} }
|
|
169
|
-
function AIAgentRunFormComponentExtended_div_45_div_5_Conditional_27_Template(rf, ctx) { if (rf & 1) {
|
|
170
|
-
i0.ɵɵelementStart(0, "div", 57);
|
|
171
|
-
i0.ɵɵelement(1, "mj-deep-diff", 65);
|
|
172
|
-
i0.ɵɵelementEnd();
|
|
173
|
-
} if (rf & 2) {
|
|
174
|
-
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
175
|
-
i0.ɵɵadvance();
|
|
176
|
-
i0.ɵɵproperty("oldValue", ctx_r0.stepPayloadAtStartObject)("newValue", ctx_r0.stepPayloadAtEndObject)("title", "")("showSummary", true)("showUnchanged", false)("expandAll", false)("maxDepth", 8)("maxStringLength", 150)("treatNullAsUndefined", true);
|
|
177
|
-
} }
|
|
178
|
-
function AIAgentRunFormComponentExtended_div_45_div_5_Conditional_28_Template(rf, ctx) { if (rf & 1) {
|
|
179
|
-
const _r7 = i0.ɵɵgetCurrentView();
|
|
180
|
-
i0.ɵɵelementStart(0, "div", 58)(1, "div", 66)(2, "button", 67);
|
|
181
|
-
i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_div_45_div_5_Conditional_28_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.copyToClipboard(ctx_r0.getSelectedItemJson())); });
|
|
182
|
-
i0.ɵɵelement(3, "i", 68);
|
|
183
|
-
i0.ɵɵelementEnd()();
|
|
184
|
-
i0.ɵɵelementStart(4, "mj-code-editor", 69);
|
|
185
|
-
i0.ɵɵtwoWayListener("ngModelChange", function AIAgentRunFormComponentExtended_div_45_div_5_Conditional_28_Template_mj_code_editor_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r0.selectedItemJsonString, $event) || (ctx_r0.selectedItemJsonString = $event); return i0.ɵɵresetView($event); });
|
|
186
|
-
i0.ɵɵelementEnd()();
|
|
187
|
-
} if (rf & 2) {
|
|
188
|
-
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
189
|
-
i0.ɵɵadvance(4);
|
|
190
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.selectedItemJsonString);
|
|
191
|
-
i0.ɵɵproperty("language", "json")("readonly", true);
|
|
192
|
-
} }
|
|
193
|
-
function AIAgentRunFormComponentExtended_div_45_div_5_Template(rf, ctx) { if (rf & 1) {
|
|
194
|
-
const _r4 = i0.ɵɵgetCurrentView();
|
|
195
|
-
i0.ɵɵelementStart(0, "div", 46)(1, "div", 47)(2, "h3");
|
|
196
|
-
i0.ɵɵelement(3, "i", 15);
|
|
197
|
-
i0.ɵɵtext(4);
|
|
198
|
-
i0.ɵɵelementEnd();
|
|
199
|
-
i0.ɵɵelementStart(5, "button", 48);
|
|
200
|
-
i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_div_45_div_5_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.closeJsonPanel()); });
|
|
201
|
-
i0.ɵɵelement(6, "i", 49);
|
|
202
|
-
i0.ɵɵelementEnd()();
|
|
203
|
-
i0.ɵɵelementStart(7, "div", 50)(8, "div", 51)(9, "div", 52)(10, "label");
|
|
204
|
-
i0.ɵɵtext(11, "Type");
|
|
205
|
-
i0.ɵɵelementEnd();
|
|
206
|
-
i0.ɵɵelementStart(12, "span");
|
|
207
|
-
i0.ɵɵtext(13);
|
|
208
|
-
i0.ɵɵelementEnd()();
|
|
209
|
-
i0.ɵɵelementStart(14, "div", 52)(15, "label");
|
|
210
|
-
i0.ɵɵtext(16, "Status");
|
|
211
|
-
i0.ɵɵelementEnd();
|
|
212
|
-
i0.ɵɵelementStart(17, "span", 53);
|
|
213
|
-
i0.ɵɵtext(18);
|
|
214
|
-
i0.ɵɵelementEnd()();
|
|
215
|
-
i0.ɵɵelementStart(19, "div", 52)(20, "label");
|
|
216
|
-
i0.ɵɵtext(21, "Duration");
|
|
217
|
-
i0.ɵɵelementEnd();
|
|
218
|
-
i0.ɵɵelementStart(22, "span");
|
|
219
|
-
i0.ɵɵtext(23);
|
|
220
|
-
i0.ɵɵelementEnd()()();
|
|
221
|
-
i0.ɵɵtemplate(24, AIAgentRunFormComponentExtended_div_45_div_5_div_24_Template, 4, 0, "div", 54)(25, AIAgentRunFormComponentExtended_div_45_div_5_Conditional_25_Template, 7, 4, "div", 55);
|
|
222
|
-
i0.ɵɵelementStart(26, "div", 56);
|
|
223
|
-
i0.ɵɵtemplate(27, AIAgentRunFormComponentExtended_div_45_div_5_Conditional_27_Template, 2, 9, "div", 57)(28, AIAgentRunFormComponentExtended_div_45_div_5_Conditional_28_Template, 5, 3, "div", 58);
|
|
224
|
-
i0.ɵɵelementEnd()()();
|
|
225
|
-
} if (rf & 2) {
|
|
226
|
-
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
227
|
-
i0.ɵɵadvance(3);
|
|
228
|
-
i0.ɵɵproperty("ngClass", ctx_r0.selectedTimelineItem.icon);
|
|
229
|
-
i0.ɵɵadvance();
|
|
230
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r0.selectedTimelineItem.title, " ");
|
|
231
|
-
i0.ɵɵadvance(9);
|
|
232
|
-
i0.ɵɵtextInterpolate(ctx_r0.selectedTimelineItem.type);
|
|
233
|
-
i0.ɵɵadvance(4);
|
|
234
|
-
i0.ɵɵattribute("data-status", ctx_r0.selectedTimelineItem.status);
|
|
235
|
-
i0.ɵɵadvance();
|
|
236
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r0.selectedTimelineItem.status, " ");
|
|
237
|
-
i0.ɵɵadvance(5);
|
|
238
|
-
i0.ɵɵtextInterpolate(ctx_r0.selectedTimelineItem.duration || "N/A");
|
|
239
|
-
i0.ɵɵadvance();
|
|
240
|
-
i0.ɵɵproperty("ngIf", ctx_r0.selectedTimelineItem.type === "action" && (ctx_r0.selectedTimelineItem.data == null ? null : ctx_r0.selectedTimelineItem.data.ID));
|
|
241
|
-
i0.ɵɵadvance();
|
|
242
|
-
i0.ɵɵconditional(ctx_r0.showStepPayloadDiff ? 25 : -1);
|
|
243
|
-
i0.ɵɵadvance();
|
|
244
|
-
i0.ɵɵclassProp("with-tabs", ctx_r0.showStepPayloadDiff);
|
|
245
|
-
i0.ɵɵadvance();
|
|
246
|
-
i0.ɵɵconditional(ctx_r0.detailPaneTab === "diff" && ctx_r0.showStepPayloadDiff ? 27 : -1);
|
|
247
|
-
i0.ɵɵadvance();
|
|
248
|
-
i0.ɵɵconditional(ctx_r0.detailPaneTab === "json" || !ctx_r0.showStepPayloadDiff ? 28 : -1);
|
|
249
|
-
} }
|
|
250
|
-
function AIAgentRunFormComponentExtended_div_45_Template(rf, ctx) { if (rf & 1) {
|
|
145
|
+
function AIAgentRunFormComponentExtended_div_48_Template(rf, ctx) { if (rf & 1) {
|
|
251
146
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
252
|
-
i0.ɵɵelementStart(0, "div",
|
|
253
|
-
i0.ɵɵlistener("itemSelected", function
|
|
147
|
+
i0.ɵɵelementStart(0, "div", 42)(1, "kendo-splitter", 43)(2, "kendo-splitter-pane", 44)(3, "mj-ai-agent-run-timeline", 45);
|
|
148
|
+
i0.ɵɵlistener("itemSelected", function AIAgentRunFormComponentExtended_div_48_Template_mj_ai_agent_run_timeline_itemSelected_3_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.selectTimelineItem($event)); })("navigateToEntity", function AIAgentRunFormComponentExtended_div_48_Template_mj_ai_agent_run_timeline_navigateToEntity_3_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.navigateToEntityRecord($event)); });
|
|
254
149
|
i0.ɵɵelementEnd()();
|
|
255
|
-
i0.ɵɵelementStart(4, "kendo-splitter-pane",
|
|
256
|
-
i0.ɵɵ
|
|
257
|
-
i0.ɵɵelementEnd()()();
|
|
150
|
+
i0.ɵɵelementStart(4, "kendo-splitter-pane", 46)(5, "mj-ai-agent-run-step-detail", 47);
|
|
151
|
+
i0.ɵɵlistener("closePanel", function AIAgentRunFormComponentExtended_div_48_Template_mj_ai_agent_run_step_detail_closePanel_5_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.closeJsonPanel()); })("navigateToActionLog", function AIAgentRunFormComponentExtended_div_48_Template_mj_ai_agent_run_step_detail_navigateToActionLog_5_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.navigateToActionLog($event)); })("copyToClipboard", function AIAgentRunFormComponentExtended_div_48_Template_mj_ai_agent_run_step_detail_copyToClipboard_5_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.copyToClipboard($event)); });
|
|
152
|
+
i0.ɵɵelementEnd()()()();
|
|
258
153
|
} if (rf & 2) {
|
|
259
154
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
260
155
|
i0.ɵɵadvance(2);
|
|
@@ -264,27 +159,42 @@ function AIAgentRunFormComponentExtended_div_45_Template(rf, ctx) { if (rf & 1)
|
|
|
264
159
|
i0.ɵɵadvance();
|
|
265
160
|
i0.ɵɵproperty("size", "45%")("min", "300px")("collapsed", !ctx_r0.selectedTimelineItem);
|
|
266
161
|
i0.ɵɵadvance();
|
|
267
|
-
i0.ɵɵproperty("
|
|
162
|
+
i0.ɵɵproperty("selectedTimelineItem", ctx_r0.selectedTimelineItem);
|
|
268
163
|
} }
|
|
269
|
-
function
|
|
270
|
-
i0.ɵɵelement(0, "mj-ai-agent-run-
|
|
164
|
+
function AIAgentRunFormComponentExtended_div_49_mj_ai_agent_run_visualization_1_Template(rf, ctx) { if (rf & 1) {
|
|
165
|
+
i0.ɵɵelement(0, "mj-ai-agent-run-visualization", 49, 0);
|
|
166
|
+
} if (rf & 2) {
|
|
167
|
+
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
168
|
+
i0.ɵɵproperty("aiAgentRunId", ctx_r0.record.ID);
|
|
169
|
+
} }
|
|
170
|
+
function AIAgentRunFormComponentExtended_div_49_Template(rf, ctx) { if (rf & 1) {
|
|
171
|
+
i0.ɵɵelementStart(0, "div", 42);
|
|
172
|
+
i0.ɵɵtemplate(1, AIAgentRunFormComponentExtended_div_49_mj_ai_agent_run_visualization_1_Template, 2, 1, "mj-ai-agent-run-visualization", 48);
|
|
173
|
+
i0.ɵɵelementEnd();
|
|
174
|
+
} if (rf & 2) {
|
|
175
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
176
|
+
i0.ɵɵadvance();
|
|
177
|
+
i0.ɵɵproperty("ngIf", ctx_r0.visualizationLoaded);
|
|
178
|
+
} }
|
|
179
|
+
function AIAgentRunFormComponentExtended_div_50_mj_ai_agent_run_analytics_1_Template(rf, ctx) { if (rf & 1) {
|
|
180
|
+
i0.ɵɵelement(0, "mj-ai-agent-run-analytics", 51, 1);
|
|
271
181
|
} if (rf & 2) {
|
|
272
182
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
273
183
|
i0.ɵɵproperty("agentRunId", ctx_r0.record.ID);
|
|
274
184
|
} }
|
|
275
|
-
function
|
|
276
|
-
i0.ɵɵelementStart(0, "div",
|
|
277
|
-
i0.ɵɵtemplate(1,
|
|
185
|
+
function AIAgentRunFormComponentExtended_div_50_Template(rf, ctx) { if (rf & 1) {
|
|
186
|
+
i0.ɵɵelementStart(0, "div", 42);
|
|
187
|
+
i0.ɵɵtemplate(1, AIAgentRunFormComponentExtended_div_50_mj_ai_agent_run_analytics_1_Template, 2, 1, "mj-ai-agent-run-analytics", 50);
|
|
278
188
|
i0.ɵɵelementEnd();
|
|
279
189
|
} if (rf & 2) {
|
|
280
190
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
281
191
|
i0.ɵɵadvance();
|
|
282
192
|
i0.ɵɵproperty("ngIf", ctx_r0.analyticsLoaded);
|
|
283
193
|
} }
|
|
284
|
-
function
|
|
285
|
-
const
|
|
286
|
-
i0.ɵɵelementStart(0, "a",
|
|
287
|
-
i0.ɵɵlistener("click", function
|
|
194
|
+
function AIAgentRunFormComponentExtended_div_51_ng_template_3_a_11_Template(rf, ctx) { if (rf & 1) {
|
|
195
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
196
|
+
i0.ɵɵelementStart(0, "a", 64);
|
|
197
|
+
i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_div_51_ng_template_3_a_11_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.openEntityRecord("MJ: AI Agent Runs", ctx_r0.record.ParentRunID)); });
|
|
288
198
|
i0.ɵɵtext(1);
|
|
289
199
|
i0.ɵɵelementEnd();
|
|
290
200
|
} if (rf & 2) {
|
|
@@ -292,15 +202,15 @@ function AIAgentRunFormComponentExtended_div_47_ng_template_3_a_11_Template(rf,
|
|
|
292
202
|
i0.ɵɵadvance();
|
|
293
203
|
i0.ɵɵtextInterpolate1(" ", ctx_r0.record.ParentRunID, " ");
|
|
294
204
|
} }
|
|
295
|
-
function
|
|
205
|
+
function AIAgentRunFormComponentExtended_div_51_ng_template_3_span_12_Template(rf, ctx) { if (rf & 1) {
|
|
296
206
|
i0.ɵɵelementStart(0, "span");
|
|
297
207
|
i0.ɵɵtext(1, "None (Root)");
|
|
298
208
|
i0.ɵɵelementEnd();
|
|
299
209
|
} }
|
|
300
|
-
function
|
|
301
|
-
const
|
|
302
|
-
i0.ɵɵelementStart(0, "a",
|
|
303
|
-
i0.ɵɵlistener("click", function
|
|
210
|
+
function AIAgentRunFormComponentExtended_div_51_ng_template_3_a_17_Template(rf, ctx) { if (rf & 1) {
|
|
211
|
+
const _r6 = i0.ɵɵgetCurrentView();
|
|
212
|
+
i0.ɵɵelementStart(0, "a", 64);
|
|
213
|
+
i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_div_51_ng_template_3_a_17_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.openEntityRecord("MJ: AI Agent Runs", ctx_r0.record.LastRunID)); });
|
|
304
214
|
i0.ɵɵtext(1);
|
|
305
215
|
i0.ɵɵelementEnd();
|
|
306
216
|
} if (rf & 2) {
|
|
@@ -308,15 +218,15 @@ function AIAgentRunFormComponentExtended_div_47_ng_template_3_a_17_Template(rf,
|
|
|
308
218
|
i0.ɵɵadvance();
|
|
309
219
|
i0.ɵɵtextInterpolate1(" ", ctx_r0.record.LastRunID, " ");
|
|
310
220
|
} }
|
|
311
|
-
function
|
|
221
|
+
function AIAgentRunFormComponentExtended_div_51_ng_template_3_span_18_Template(rf, ctx) { if (rf & 1) {
|
|
312
222
|
i0.ɵɵelementStart(0, "span");
|
|
313
223
|
i0.ɵɵtext(1, "None");
|
|
314
224
|
i0.ɵɵelementEnd();
|
|
315
225
|
} }
|
|
316
|
-
function
|
|
317
|
-
const
|
|
318
|
-
i0.ɵɵelementStart(0, "a",
|
|
319
|
-
i0.ɵɵlistener("click", function
|
|
226
|
+
function AIAgentRunFormComponentExtended_div_51_ng_template_3_a_23_Template(rf, ctx) { if (rf & 1) {
|
|
227
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
228
|
+
i0.ɵɵelementStart(0, "a", 64);
|
|
229
|
+
i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_div_51_ng_template_3_a_23_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.openEntityRecord("Conversations", ctx_r0.record.ConversationID)); });
|
|
320
230
|
i0.ɵɵtext(1);
|
|
321
231
|
i0.ɵɵelementEnd();
|
|
322
232
|
} if (rf & 2) {
|
|
@@ -324,15 +234,15 @@ function AIAgentRunFormComponentExtended_div_47_ng_template_3_a_23_Template(rf,
|
|
|
324
234
|
i0.ɵɵadvance();
|
|
325
235
|
i0.ɵɵtextInterpolate1(" ", ctx_r0.record.ConversationID, " ");
|
|
326
236
|
} }
|
|
327
|
-
function
|
|
237
|
+
function AIAgentRunFormComponentExtended_div_51_ng_template_3_span_24_Template(rf, ctx) { if (rf & 1) {
|
|
328
238
|
i0.ɵɵelementStart(0, "span");
|
|
329
239
|
i0.ɵɵtext(1, "N/A");
|
|
330
240
|
i0.ɵɵelementEnd();
|
|
331
241
|
} }
|
|
332
|
-
function
|
|
333
|
-
const
|
|
334
|
-
i0.ɵɵelementStart(0, "a",
|
|
335
|
-
i0.ɵɵlistener("click", function
|
|
242
|
+
function AIAgentRunFormComponentExtended_div_51_ng_template_3_a_29_Template(rf, ctx) { if (rf & 1) {
|
|
243
|
+
const _r8 = i0.ɵɵgetCurrentView();
|
|
244
|
+
i0.ɵɵelementStart(0, "a", 64);
|
|
245
|
+
i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_div_51_ng_template_3_a_29_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.openEntityRecord("Users", ctx_r0.record.UserID)); });
|
|
336
246
|
i0.ɵɵtext(1);
|
|
337
247
|
i0.ɵɵelementEnd();
|
|
338
248
|
} if (rf & 2) {
|
|
@@ -340,43 +250,43 @@ function AIAgentRunFormComponentExtended_div_47_ng_template_3_a_29_Template(rf,
|
|
|
340
250
|
i0.ɵɵadvance();
|
|
341
251
|
i0.ɵɵtextInterpolate1(" ", ctx_r0.record.User || "N/A", " ");
|
|
342
252
|
} }
|
|
343
|
-
function
|
|
253
|
+
function AIAgentRunFormComponentExtended_div_51_ng_template_3_span_30_Template(rf, ctx) { if (rf & 1) {
|
|
344
254
|
i0.ɵɵelementStart(0, "span");
|
|
345
255
|
i0.ɵɵtext(1, "N/A");
|
|
346
256
|
i0.ɵɵelementEnd();
|
|
347
257
|
} }
|
|
348
|
-
function
|
|
349
|
-
const
|
|
350
|
-
i0.ɵɵelementStart(0, "div",
|
|
258
|
+
function AIAgentRunFormComponentExtended_div_51_ng_template_3_Template(rf, ctx) { if (rf & 1) {
|
|
259
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
260
|
+
i0.ɵɵelementStart(0, "div", 62)(1, "div", 63)(2, "label");
|
|
351
261
|
i0.ɵɵtext(3, "Agent");
|
|
352
262
|
i0.ɵɵelementEnd();
|
|
353
|
-
i0.ɵɵelementStart(4, "span")(5, "a",
|
|
354
|
-
i0.ɵɵlistener("click", function
|
|
263
|
+
i0.ɵɵelementStart(4, "span")(5, "a", 64);
|
|
264
|
+
i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_div_51_ng_template_3_Template_a_click_5_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.openEntityRecord("AI Agents", ctx_r0.record.AgentID)); });
|
|
355
265
|
i0.ɵɵtext(6);
|
|
356
266
|
i0.ɵɵelementEnd()()();
|
|
357
|
-
i0.ɵɵelementStart(7, "div",
|
|
267
|
+
i0.ɵɵelementStart(7, "div", 63)(8, "label");
|
|
358
268
|
i0.ɵɵtext(9, "Parent Run ID");
|
|
359
269
|
i0.ɵɵelementEnd();
|
|
360
270
|
i0.ɵɵelementStart(10, "span");
|
|
361
|
-
i0.ɵɵtemplate(11,
|
|
271
|
+
i0.ɵɵtemplate(11, AIAgentRunFormComponentExtended_div_51_ng_template_3_a_11_Template, 2, 1, "a", 65)(12, AIAgentRunFormComponentExtended_div_51_ng_template_3_span_12_Template, 2, 0, "span", 66);
|
|
362
272
|
i0.ɵɵelementEnd()();
|
|
363
|
-
i0.ɵɵelementStart(13, "div",
|
|
273
|
+
i0.ɵɵelementStart(13, "div", 63)(14, "label");
|
|
364
274
|
i0.ɵɵtext(15, "Last Run ID");
|
|
365
275
|
i0.ɵɵelementEnd();
|
|
366
276
|
i0.ɵɵelementStart(16, "span");
|
|
367
|
-
i0.ɵɵtemplate(17,
|
|
277
|
+
i0.ɵɵtemplate(17, AIAgentRunFormComponentExtended_div_51_ng_template_3_a_17_Template, 2, 1, "a", 65)(18, AIAgentRunFormComponentExtended_div_51_ng_template_3_span_18_Template, 2, 0, "span", 66);
|
|
368
278
|
i0.ɵɵelementEnd()();
|
|
369
|
-
i0.ɵɵelementStart(19, "div",
|
|
279
|
+
i0.ɵɵelementStart(19, "div", 63)(20, "label");
|
|
370
280
|
i0.ɵɵtext(21, "Conversation ID");
|
|
371
281
|
i0.ɵɵelementEnd();
|
|
372
282
|
i0.ɵɵelementStart(22, "span");
|
|
373
|
-
i0.ɵɵtemplate(23,
|
|
283
|
+
i0.ɵɵtemplate(23, AIAgentRunFormComponentExtended_div_51_ng_template_3_a_23_Template, 2, 1, "a", 65)(24, AIAgentRunFormComponentExtended_div_51_ng_template_3_span_24_Template, 2, 0, "span", 66);
|
|
374
284
|
i0.ɵɵelementEnd()();
|
|
375
|
-
i0.ɵɵelementStart(25, "div",
|
|
285
|
+
i0.ɵɵelementStart(25, "div", 63)(26, "label");
|
|
376
286
|
i0.ɵɵtext(27, "User");
|
|
377
287
|
i0.ɵɵelementEnd();
|
|
378
288
|
i0.ɵɵelementStart(28, "span");
|
|
379
|
-
i0.ɵɵtemplate(29,
|
|
289
|
+
i0.ɵɵtemplate(29, AIAgentRunFormComponentExtended_div_51_ng_template_3_a_29_Template, 2, 1, "a", 65)(30, AIAgentRunFormComponentExtended_div_51_ng_template_3_span_30_Template, 2, 0, "span", 66);
|
|
380
290
|
i0.ɵɵelementEnd()()();
|
|
381
291
|
} if (rf & 2) {
|
|
382
292
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
@@ -399,11 +309,11 @@ function AIAgentRunFormComponentExtended_div_47_ng_template_3_Template(rf, ctx)
|
|
|
399
309
|
i0.ɵɵadvance();
|
|
400
310
|
i0.ɵɵproperty("ngIf", !ctx_r0.record.UserID);
|
|
401
311
|
} }
|
|
402
|
-
function
|
|
403
|
-
i0.ɵɵelementStart(0, "div",
|
|
312
|
+
function AIAgentRunFormComponentExtended_div_51_ng_template_5_div_11_Template(rf, ctx) { if (rf & 1) {
|
|
313
|
+
i0.ɵɵelementStart(0, "div", 68)(1, "label");
|
|
404
314
|
i0.ɵɵtext(2, "Error Message");
|
|
405
315
|
i0.ɵɵelementEnd();
|
|
406
|
-
i0.ɵɵelementStart(3, "div",
|
|
316
|
+
i0.ɵɵelementStart(3, "div", 69);
|
|
407
317
|
i0.ɵɵtext(4);
|
|
408
318
|
i0.ɵɵelementEnd()();
|
|
409
319
|
} if (rf & 2) {
|
|
@@ -411,20 +321,20 @@ function AIAgentRunFormComponentExtended_div_47_ng_template_5_div_11_Template(rf
|
|
|
411
321
|
i0.ɵɵadvance(4);
|
|
412
322
|
i0.ɵɵtextInterpolate(ctx_r0.record.ErrorMessage);
|
|
413
323
|
} }
|
|
414
|
-
function
|
|
415
|
-
i0.ɵɵelementStart(0, "div",
|
|
324
|
+
function AIAgentRunFormComponentExtended_div_51_ng_template_5_Template(rf, ctx) { if (rf & 1) {
|
|
325
|
+
i0.ɵɵelementStart(0, "div", 62)(1, "div", 63)(2, "label");
|
|
416
326
|
i0.ɵɵtext(3, "Status");
|
|
417
327
|
i0.ɵɵelementEnd();
|
|
418
|
-
i0.ɵɵelementStart(4, "span",
|
|
328
|
+
i0.ɵɵelementStart(4, "span", 15);
|
|
419
329
|
i0.ɵɵtext(5);
|
|
420
330
|
i0.ɵɵelementEnd()();
|
|
421
|
-
i0.ɵɵelementStart(6, "div",
|
|
331
|
+
i0.ɵɵelementStart(6, "div", 63)(7, "label");
|
|
422
332
|
i0.ɵɵtext(8, "Success");
|
|
423
333
|
i0.ɵɵelementEnd();
|
|
424
334
|
i0.ɵɵelementStart(9, "span");
|
|
425
335
|
i0.ɵɵtext(10);
|
|
426
336
|
i0.ɵɵelementEnd()();
|
|
427
|
-
i0.ɵɵtemplate(11,
|
|
337
|
+
i0.ɵɵtemplate(11, AIAgentRunFormComponentExtended_div_51_ng_template_5_div_11_Template, 5, 1, "div", 67);
|
|
428
338
|
i0.ɵɵelementEnd();
|
|
429
339
|
} if (rf & 2) {
|
|
430
340
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
@@ -439,36 +349,36 @@ function AIAgentRunFormComponentExtended_div_47_ng_template_5_Template(rf, ctx)
|
|
|
439
349
|
i0.ɵɵadvance();
|
|
440
350
|
i0.ɵɵproperty("ngIf", ctx_r0.record.ErrorMessage);
|
|
441
351
|
} }
|
|
442
|
-
function
|
|
443
|
-
i0.ɵɵelementStart(0, "div",
|
|
352
|
+
function AIAgentRunFormComponentExtended_div_51_ng_template_7_Template(rf, ctx) { if (rf & 1) {
|
|
353
|
+
i0.ɵɵelementStart(0, "div", 62)(1, "div", 63)(2, "label");
|
|
444
354
|
i0.ɵɵtext(3, "Total Tokens Used");
|
|
445
355
|
i0.ɵɵelementEnd();
|
|
446
356
|
i0.ɵɵelementStart(4, "span");
|
|
447
357
|
i0.ɵɵtext(5);
|
|
448
358
|
i0.ɵɵpipe(6, "number");
|
|
449
359
|
i0.ɵɵelementEnd()();
|
|
450
|
-
i0.ɵɵelementStart(7, "div",
|
|
360
|
+
i0.ɵɵelementStart(7, "div", 63)(8, "label");
|
|
451
361
|
i0.ɵɵtext(9, "Prompt Tokens");
|
|
452
362
|
i0.ɵɵelementEnd();
|
|
453
363
|
i0.ɵɵelementStart(10, "span");
|
|
454
364
|
i0.ɵɵtext(11);
|
|
455
365
|
i0.ɵɵpipe(12, "number");
|
|
456
366
|
i0.ɵɵelementEnd()();
|
|
457
|
-
i0.ɵɵelementStart(13, "div",
|
|
367
|
+
i0.ɵɵelementStart(13, "div", 63)(14, "label");
|
|
458
368
|
i0.ɵɵtext(15, "Completion Tokens");
|
|
459
369
|
i0.ɵɵelementEnd();
|
|
460
370
|
i0.ɵɵelementStart(16, "span");
|
|
461
371
|
i0.ɵɵtext(17);
|
|
462
372
|
i0.ɵɵpipe(18, "number");
|
|
463
373
|
i0.ɵɵelementEnd()();
|
|
464
|
-
i0.ɵɵelementStart(19, "div",
|
|
374
|
+
i0.ɵɵelementStart(19, "div", 63)(20, "label");
|
|
465
375
|
i0.ɵɵtext(21, "Total Cost");
|
|
466
376
|
i0.ɵɵelementEnd();
|
|
467
377
|
i0.ɵɵelementStart(22, "span");
|
|
468
378
|
i0.ɵɵtext(23);
|
|
469
379
|
i0.ɵɵpipe(24, "number");
|
|
470
380
|
i0.ɵɵelementEnd()();
|
|
471
|
-
i0.ɵɵelementStart(25, "div",
|
|
381
|
+
i0.ɵɵelementStart(25, "div", 63)(26, "label");
|
|
472
382
|
i0.ɵɵtext(27, "Total Prompt Iterations");
|
|
473
383
|
i0.ɵɵelementEnd();
|
|
474
384
|
i0.ɵɵelementStart(28, "span");
|
|
@@ -488,77 +398,79 @@ function AIAgentRunFormComponentExtended_div_47_ng_template_7_Template(rf, ctx)
|
|
|
488
398
|
i0.ɵɵadvance(6);
|
|
489
399
|
i0.ɵɵtextInterpolate(ctx_r0.record.TotalPromptIterations != null ? i0.ɵɵpipeBind2(30, 17, ctx_r0.record.TotalPromptIterations, "1.0-0") : "N/A");
|
|
490
400
|
} }
|
|
491
|
-
function
|
|
492
|
-
i0.ɵɵelementStart(0, "div",
|
|
493
|
-
i0.ɵɵelement(1, "mj-code-editor",
|
|
401
|
+
function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_8_ng_template_1_Template(rf, ctx) { if (rf & 1) {
|
|
402
|
+
i0.ɵɵelementStart(0, "div", 71);
|
|
403
|
+
i0.ɵɵelement(1, "mj-code-editor", 72);
|
|
494
404
|
i0.ɵɵelementEnd();
|
|
495
405
|
} if (rf & 2) {
|
|
496
406
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
497
407
|
i0.ɵɵadvance();
|
|
498
408
|
i0.ɵɵproperty("ngModel", ctx_r0.parsedResult)("language", "json")("readonly", true);
|
|
499
409
|
} }
|
|
500
|
-
function
|
|
501
|
-
i0.ɵɵelementStart(0, "kendo-panelbar-item",
|
|
502
|
-
i0.ɵɵtemplate(1,
|
|
410
|
+
function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_8_Template(rf, ctx) { if (rf & 1) {
|
|
411
|
+
i0.ɵɵelementStart(0, "kendo-panelbar-item", 70);
|
|
412
|
+
i0.ɵɵtemplate(1, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_8_ng_template_1_Template, 2, 3, "ng-template", 55);
|
|
503
413
|
i0.ɵɵelementEnd();
|
|
504
414
|
} }
|
|
505
|
-
function
|
|
506
|
-
i0.ɵɵelementStart(0, "div",
|
|
507
|
-
i0.ɵɵelement(1, "mj-code-editor",
|
|
415
|
+
function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_9_ng_template_1_Template(rf, ctx) { if (rf & 1) {
|
|
416
|
+
i0.ɵɵelementStart(0, "div", 71);
|
|
417
|
+
i0.ɵɵelement(1, "mj-code-editor", 72);
|
|
508
418
|
i0.ɵɵelementEnd();
|
|
509
419
|
} if (rf & 2) {
|
|
510
420
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
511
421
|
i0.ɵɵadvance();
|
|
512
422
|
i0.ɵɵproperty("ngModel", ctx_r0.parsedStartingPayload)("language", "json")("readonly", true);
|
|
513
423
|
} }
|
|
514
|
-
function
|
|
515
|
-
i0.ɵɵelementStart(0, "kendo-panelbar-item",
|
|
516
|
-
i0.ɵɵtemplate(1,
|
|
424
|
+
function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_9_Template(rf, ctx) { if (rf & 1) {
|
|
425
|
+
i0.ɵɵelementStart(0, "kendo-panelbar-item", 73);
|
|
426
|
+
i0.ɵɵtemplate(1, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_9_ng_template_1_Template, 2, 3, "ng-template", 55);
|
|
517
427
|
i0.ɵɵelementEnd();
|
|
518
428
|
} }
|
|
519
|
-
function
|
|
520
|
-
i0.ɵɵelementStart(0, "div",
|
|
521
|
-
i0.ɵɵelement(1, "mj-code-editor",
|
|
429
|
+
function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_10_ng_template_1_Template(rf, ctx) { if (rf & 1) {
|
|
430
|
+
i0.ɵɵelementStart(0, "div", 71);
|
|
431
|
+
i0.ɵɵelement(1, "mj-code-editor", 72);
|
|
522
432
|
i0.ɵɵelementEnd();
|
|
523
433
|
} if (rf & 2) {
|
|
524
434
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
525
435
|
i0.ɵɵadvance();
|
|
526
436
|
i0.ɵɵproperty("ngModel", ctx_r0.parsedFinalPayload)("language", "json")("readonly", true);
|
|
527
437
|
} }
|
|
528
|
-
function
|
|
529
|
-
i0.ɵɵelementStart(0, "kendo-panelbar-item",
|
|
530
|
-
i0.ɵɵtemplate(1,
|
|
438
|
+
function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_10_Template(rf, ctx) { if (rf & 1) {
|
|
439
|
+
i0.ɵɵelementStart(0, "kendo-panelbar-item", 74);
|
|
440
|
+
i0.ɵɵtemplate(1, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_10_ng_template_1_Template, 2, 3, "ng-template", 55);
|
|
531
441
|
i0.ɵɵelementEnd();
|
|
532
442
|
} }
|
|
533
|
-
function
|
|
534
|
-
i0.ɵɵelementStart(0, "div",
|
|
535
|
-
i0.ɵɵelement(1, "mj-deep-diff",
|
|
443
|
+
function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_11_ng_template_1_Template(rf, ctx) { if (rf & 1) {
|
|
444
|
+
i0.ɵɵelementStart(0, "div", 76);
|
|
445
|
+
i0.ɵɵelement(1, "mj-deep-diff", 77);
|
|
536
446
|
i0.ɵɵelementEnd();
|
|
537
447
|
} if (rf & 2) {
|
|
538
448
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
539
449
|
i0.ɵɵadvance();
|
|
540
450
|
i0.ɵɵproperty("oldValue", ctx_r0.startingPayloadObject)("newValue", ctx_r0.finalPayloadObject)("title", "")("showSummary", true)("showUnchanged", false)("expandAll", false)("maxDepth", 10)("maxStringLength", 200)("treatNullAsUndefined", true);
|
|
541
451
|
} }
|
|
542
|
-
function
|
|
543
|
-
i0.ɵɵelementStart(0, "kendo-panelbar-item",
|
|
544
|
-
i0.ɵɵtemplate(1,
|
|
452
|
+
function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_11_Template(rf, ctx) { if (rf & 1) {
|
|
453
|
+
i0.ɵɵelementStart(0, "kendo-panelbar-item", 75);
|
|
454
|
+
i0.ɵɵtemplate(1, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_11_ng_template_1_Template, 2, 9, "ng-template", 55);
|
|
545
455
|
i0.ɵɵelementEnd();
|
|
546
456
|
} }
|
|
547
|
-
function
|
|
548
|
-
i0.ɵɵelementStart(0, "div",
|
|
549
|
-
i0.ɵɵtemplate(3,
|
|
457
|
+
function AIAgentRunFormComponentExtended_div_51_Template(rf, ctx) { if (rf & 1) {
|
|
458
|
+
i0.ɵɵelementStart(0, "div", 52)(1, "kendo-panelbar", 53)(2, "kendo-panelbar-item", 54);
|
|
459
|
+
i0.ɵɵtemplate(3, AIAgentRunFormComponentExtended_div_51_ng_template_3_Template, 31, 9, "ng-template", 55);
|
|
550
460
|
i0.ɵɵelementEnd();
|
|
551
|
-
i0.ɵɵelementStart(4, "kendo-panelbar-item",
|
|
552
|
-
i0.ɵɵtemplate(5,
|
|
461
|
+
i0.ɵɵelementStart(4, "kendo-panelbar-item", 56);
|
|
462
|
+
i0.ɵɵtemplate(5, AIAgentRunFormComponentExtended_div_51_ng_template_5_Template, 12, 8, "ng-template", 55);
|
|
553
463
|
i0.ɵɵelementEnd();
|
|
554
|
-
i0.ɵɵelementStart(6, "kendo-panelbar-item",
|
|
555
|
-
i0.ɵɵtemplate(7,
|
|
464
|
+
i0.ɵɵelementStart(6, "kendo-panelbar-item", 57);
|
|
465
|
+
i0.ɵɵtemplate(7, AIAgentRunFormComponentExtended_div_51_ng_template_7_Template, 31, 20, "ng-template", 55);
|
|
556
466
|
i0.ɵɵelementEnd();
|
|
557
|
-
i0.ɵɵtemplate(8,
|
|
467
|
+
i0.ɵɵtemplate(8, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_8_Template, 2, 0, "kendo-panelbar-item", 58)(9, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_9_Template, 2, 0, "kendo-panelbar-item", 59)(10, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_10_Template, 2, 0, "kendo-panelbar-item", 60)(11, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_11_Template, 2, 0, "kendo-panelbar-item", 61);
|
|
558
468
|
i0.ɵɵelementEnd()();
|
|
559
469
|
} if (rf & 2) {
|
|
560
470
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
561
|
-
i0.ɵɵadvance(
|
|
471
|
+
i0.ɵɵadvance();
|
|
472
|
+
i0.ɵɵproperty("keepItemContent", true);
|
|
473
|
+
i0.ɵɵadvance();
|
|
562
474
|
i0.ɵɵproperty("expanded", true);
|
|
563
475
|
i0.ɵɵadvance(6);
|
|
564
476
|
i0.ɵɵproperty("ngIf", ctx_r0.record.Result);
|
|
@@ -570,10 +482,11 @@ function AIAgentRunFormComponentExtended_div_47_Template(rf, ctx) { if (rf & 1)
|
|
|
570
482
|
i0.ɵɵproperty("ngIf", ctx_r0.showPayloadDiff);
|
|
571
483
|
} }
|
|
572
484
|
let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended extends AIAgentRunFormComponent {
|
|
573
|
-
constructor(elementRef, sharedService, router, route, cdr, costService) {
|
|
485
|
+
constructor(elementRef, sharedService, router, route, cdr, costService, dataService) {
|
|
574
486
|
super(elementRef, sharedService, router, route, cdr);
|
|
575
487
|
this.router = router;
|
|
576
488
|
this.costService = costService;
|
|
489
|
+
this.dataService = dataService;
|
|
577
490
|
this.destroy$ = new Subject();
|
|
578
491
|
// UI state
|
|
579
492
|
this.activeTab = 'timeline';
|
|
@@ -581,16 +494,17 @@ let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended exte
|
|
|
581
494
|
this.jsonPanelExpanded = false;
|
|
582
495
|
this.loading = false;
|
|
583
496
|
this.error = null;
|
|
584
|
-
this.selectedItemJsonString = '{}';
|
|
585
|
-
this.detailPaneTab = 'diff';
|
|
586
497
|
this.analyticsLoaded = false;
|
|
498
|
+
this.visualizationLoaded = false;
|
|
587
499
|
this.agent = null;
|
|
588
500
|
// Cost metrics using shared service
|
|
589
501
|
this.costMetrics = null;
|
|
590
502
|
}
|
|
591
503
|
async ngOnInit() {
|
|
592
504
|
await super.ngOnInit();
|
|
593
|
-
if (this.record) {
|
|
505
|
+
if (this.record && this.record.ID) {
|
|
506
|
+
// Load all data through the service
|
|
507
|
+
await this.dataService.loadAgentRunData(this.record.ID);
|
|
594
508
|
await this.loadAgent();
|
|
595
509
|
await this.loadCostMetrics();
|
|
596
510
|
}
|
|
@@ -598,6 +512,8 @@ let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended exte
|
|
|
598
512
|
ngOnDestroy() {
|
|
599
513
|
this.destroy$.next();
|
|
600
514
|
this.destroy$.complete();
|
|
515
|
+
// Clear data when component is destroyed
|
|
516
|
+
this.dataService.clearData();
|
|
601
517
|
}
|
|
602
518
|
async loadAgent() {
|
|
603
519
|
if (!this.record?.AgentID)
|
|
@@ -634,6 +550,11 @@ let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended exte
|
|
|
634
550
|
}
|
|
635
551
|
changeTab(tab) {
|
|
636
552
|
this.activeTab = tab;
|
|
553
|
+
// Lazy load visualization when the tab is first accessed
|
|
554
|
+
if (tab === 'visualization' && !this.visualizationLoaded) {
|
|
555
|
+
this.visualizationLoaded = true;
|
|
556
|
+
this.cdr.detectChanges();
|
|
557
|
+
}
|
|
637
558
|
// Lazy load analytics when the tab is first accessed
|
|
638
559
|
if (tab === 'analytics' && !this.analyticsLoaded) {
|
|
639
560
|
this.analyticsLoaded = true;
|
|
@@ -655,15 +576,11 @@ let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended exte
|
|
|
655
576
|
}
|
|
656
577
|
selectTimelineItem(item) {
|
|
657
578
|
this.selectedTimelineItem = item;
|
|
658
|
-
this.selectedItemJsonString = this.getSelectedItemJson();
|
|
659
579
|
this.jsonPanelExpanded = true;
|
|
660
|
-
// Default to diff tab if step has payload diff, otherwise json tab
|
|
661
|
-
this.detailPaneTab = this.showStepPayloadDiff ? 'diff' : 'json';
|
|
662
580
|
this.cdr.detectChanges();
|
|
663
581
|
}
|
|
664
582
|
closeJsonPanel() {
|
|
665
583
|
this.selectedTimelineItem = null;
|
|
666
|
-
this.selectedItemJsonString = '{}';
|
|
667
584
|
this.cdr.detectChanges();
|
|
668
585
|
}
|
|
669
586
|
navigateToSubRun(runId) {
|
|
@@ -692,10 +609,8 @@ let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended exte
|
|
|
692
609
|
// Clear cost cache and reload
|
|
693
610
|
this.costService.clearCache(this.record.ID);
|
|
694
611
|
this.loadCostMetrics();
|
|
695
|
-
//
|
|
696
|
-
|
|
697
|
-
this.timelineComponent.loadData();
|
|
698
|
-
}
|
|
612
|
+
// Reload data through service - this will update all components
|
|
613
|
+
this.dataService.loadAgentRunData(this.record.ID);
|
|
699
614
|
// Trigger analytics refresh
|
|
700
615
|
if (this.analyticsComponent) {
|
|
701
616
|
this.analyticsComponent.loadData();
|
|
@@ -703,30 +618,6 @@ let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended exte
|
|
|
703
618
|
});
|
|
704
619
|
}
|
|
705
620
|
}
|
|
706
|
-
getSelectedItemJson() {
|
|
707
|
-
if (!this.selectedTimelineItem)
|
|
708
|
-
return '{}';
|
|
709
|
-
// Get all the data from the entity
|
|
710
|
-
// first check to see if the item is an AIAgentRunStepEntity
|
|
711
|
-
let data;
|
|
712
|
-
if (this.selectedTimelineItem.data instanceof AIAgentRunStepEntity) {
|
|
713
|
-
// If it's a step entity, we need to get the full run data
|
|
714
|
-
data = this.selectedTimelineItem.data.GetAll();
|
|
715
|
-
}
|
|
716
|
-
else {
|
|
717
|
-
data = this.selectedTimelineItem.data;
|
|
718
|
-
}
|
|
719
|
-
// Apply recursive JSON parsing to the entire data object with inline extraction
|
|
720
|
-
// This will handle any JSON strings regardless of property names
|
|
721
|
-
// and extract embedded JSON from text strings
|
|
722
|
-
const parseOptions = {
|
|
723
|
-
extractInlineJson: true,
|
|
724
|
-
maxDepth: 100,
|
|
725
|
-
debug: false // Disable debug logging - regex issue fixed
|
|
726
|
-
};
|
|
727
|
-
const parsedData = ParseJSONRecursive(data, parseOptions);
|
|
728
|
-
return JSON.stringify(parsedData, null, 2);
|
|
729
|
-
}
|
|
730
621
|
getStatusIcon(status) {
|
|
731
622
|
const iconMap = {
|
|
732
623
|
'Running': 'fa-circle-notch fa-spin',
|
|
@@ -971,62 +862,69 @@ let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended exte
|
|
|
971
862
|
return null;
|
|
972
863
|
}
|
|
973
864
|
}
|
|
974
|
-
static { this.ɵfac = function AIAgentRunFormComponentExtended_Factory(t) { return new (t || AIAgentRunFormComponentExtended)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i1.SharedService), i0.ɵɵdirectiveInject(i2.Router), i0.ɵɵdirectiveInject(i2.ActivatedRoute), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i3.AIAgentRunCostService)); }; }
|
|
865
|
+
static { this.ɵfac = function AIAgentRunFormComponentExtended_Factory(t) { return new (t || AIAgentRunFormComponentExtended)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i1.SharedService), i0.ɵɵdirectiveInject(i2.Router), i0.ɵɵdirectiveInject(i2.ActivatedRoute), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i3.AIAgentRunCostService), i0.ɵɵdirectiveInject(i4.AIAgentRunDataService)); }; }
|
|
975
866
|
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AIAgentRunFormComponentExtended, selectors: [["mj-ai-agent-run-form"]], viewQuery: function AIAgentRunFormComponentExtended_Query(rf, ctx) { if (rf & 1) {
|
|
976
867
|
i0.ɵɵviewQuery(AIAgentRunTimelineComponent, 5);
|
|
977
868
|
i0.ɵɵviewQuery(AIAgentRunAnalyticsComponent, 5);
|
|
869
|
+
i0.ɵɵviewQuery(AIAgentRunVisualizationComponent, 5);
|
|
978
870
|
} if (rf & 2) {
|
|
979
871
|
let _t;
|
|
980
872
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.timelineComponent = _t.first);
|
|
981
873
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.analyticsComponent = _t.first);
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
i0.ɵɵ
|
|
874
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.visualizationComponent = _t.first);
|
|
875
|
+
} }, features: [i0.ɵɵInheritDefinitionFeature], decls: 52, vars: 27, consts: [["visualizationComponent", ""], ["analyticsComponent", ""], [1, "record-form-container", "ai-agent-run-form"], [1, "record-form"], [1, "header"], [1, "header-content"], [1, "header-left"], [1, "icon-wrapper"], [1, "fas", "fa-robot"], [1, "header-info"], [1, "meta-info"], ["class", "agent-name", 4, "ngIf"], [1, "run-id"], ["class", "parent-run", 4, "ngIf"], [1, "header-right"], [1, "status-badge"], [1, "fas", 3, "ngClass"], [1, "header-actions"], ["title", "Refresh", 1, "btn-icon", 3, "click"], [1, "fas", "fa-sync-alt"], [1, "header-stats"], [1, "stat"], [1, "label"], [1, "value"], ["class", "stat", 4, "ngIf"], [1, "tabs"], [1, "tab", 3, "click"], [1, "fas", "fa-stream"], [1, "fas", "fa-diagram-project"], [1, "fas", "fa-chart-line"], [1, "fas", "fa-info-circle"], [1, "content-area"], ["class", "tab-content", "style", "height: 100%;", 4, "ngIf"], ["class", "tab-content", 4, "ngIf"], [1, "agent-name"], [1, "parent-run"], [1, "fas", "fa-level-up-alt"], [1, "parent-link", 3, "click"], ["class", "value", 4, "ngIf"], ["class", "value loading", 4, "ngIf"], [1, "value", "loading"], [1, "fas", "fa-spinner", "fa-spin"], [1, "tab-content", 2, "height", "100%"], ["orientation", "horizontal", 2, "height", "100%"], [3, "min"], [3, "itemSelected", "navigateToEntity", "aiAgentRunId", "autoRefresh", "refreshInterval"], [3, "size", "min", "collapsed"], [3, "closePanel", "navigateToActionLog", "copyToClipboard", "selectedTimelineItem"], [3, "aiAgentRunId", 4, "ngIf"], [3, "aiAgentRunId"], [3, "agentRunId", 4, "ngIf"], [3, "agentRunId"], [1, "tab-content"], [3, "keepItemContent"], ["title", "General Information", 3, "expanded"], ["kendoPanelBarContent", ""], ["title", "Execution Status"], ["title", "Usage & Cost"], ["title", "Result", 4, "ngIf"], ["title", "Starting Payload", 4, "ngIf"], ["title", "Final Payload", 4, "ngIf"], ["title", "Payload Diff", 4, "ngIf"], [1, "details-grid"], [1, "detail-item"], ["href", "javascript:void(0)", 1, "entity-link", 3, "click"], ["href", "javascript:void(0)", "class", "entity-link", 3, "click", 4, "ngIf"], [4, "ngIf"], ["class", "detail-item full-width", 4, "ngIf"], [1, "detail-item", "full-width"], [1, "error-message"], ["title", "Result"], [1, "result-viewer"], [2, "height", "300px", "width", "100%", 3, "ngModel", "language", "readonly"], ["title", "Starting Payload"], ["title", "Final Payload"], ["title", "Payload Diff"], [2, "padding", "20px", "background", "#f8f9fa"], [3, "oldValue", "newValue", "title", "showSummary", "showUnchanged", "expandAll", "maxDepth", "maxStringLength", "treatNullAsUndefined"]], template: function AIAgentRunFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
|
|
876
|
+
i0.ɵɵelementStart(0, "div", 2)(1, "div", 3)(2, "div", 4)(3, "div", 5)(4, "div", 6)(5, "div", 7);
|
|
877
|
+
i0.ɵɵelement(6, "i", 8);
|
|
985
878
|
i0.ɵɵelementEnd();
|
|
986
|
-
i0.ɵɵelementStart(7, "div",
|
|
879
|
+
i0.ɵɵelementStart(7, "div", 9)(8, "h2");
|
|
987
880
|
i0.ɵɵtext(9, "AI Agent Run");
|
|
988
881
|
i0.ɵɵelementEnd();
|
|
989
|
-
i0.ɵɵelementStart(10, "div",
|
|
990
|
-
i0.ɵɵtemplate(11, AIAgentRunFormComponentExtended_span_11_Template, 2, 1, "span",
|
|
991
|
-
i0.ɵɵelementStart(12, "span",
|
|
882
|
+
i0.ɵɵelementStart(10, "div", 10);
|
|
883
|
+
i0.ɵɵtemplate(11, AIAgentRunFormComponentExtended_span_11_Template, 2, 1, "span", 11);
|
|
884
|
+
i0.ɵɵelementStart(12, "span", 12);
|
|
992
885
|
i0.ɵɵtext(13);
|
|
993
886
|
i0.ɵɵelementEnd();
|
|
994
|
-
i0.ɵɵtemplate(14, AIAgentRunFormComponentExtended_span_14_Template, 4, 0, "span",
|
|
887
|
+
i0.ɵɵtemplate(14, AIAgentRunFormComponentExtended_span_14_Template, 4, 0, "span", 13);
|
|
995
888
|
i0.ɵɵelementEnd()()();
|
|
996
|
-
i0.ɵɵelementStart(15, "div",
|
|
997
|
-
i0.ɵɵelement(17, "i",
|
|
889
|
+
i0.ɵɵelementStart(15, "div", 14)(16, "div", 15);
|
|
890
|
+
i0.ɵɵelement(17, "i", 16);
|
|
998
891
|
i0.ɵɵtext(18);
|
|
999
892
|
i0.ɵɵelementEnd();
|
|
1000
|
-
i0.ɵɵelementStart(19, "div",
|
|
893
|
+
i0.ɵɵelementStart(19, "div", 17)(20, "button", 18);
|
|
1001
894
|
i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_Template_button_click_20_listener() { return ctx.refreshData(); });
|
|
1002
|
-
i0.ɵɵelement(21, "i",
|
|
895
|
+
i0.ɵɵelement(21, "i", 19);
|
|
1003
896
|
i0.ɵɵelementEnd()()()();
|
|
1004
|
-
i0.ɵɵelementStart(22, "div",
|
|
897
|
+
i0.ɵɵelementStart(22, "div", 20)(23, "div", 21)(24, "span", 22);
|
|
1005
898
|
i0.ɵɵtext(25, "Started");
|
|
1006
899
|
i0.ɵɵelementEnd();
|
|
1007
|
-
i0.ɵɵelementStart(26, "span",
|
|
900
|
+
i0.ɵɵelementStart(26, "span", 23);
|
|
1008
901
|
i0.ɵɵtext(27);
|
|
1009
902
|
i0.ɵɵpipe(28, "date");
|
|
1010
903
|
i0.ɵɵelementEnd()();
|
|
1011
|
-
i0.ɵɵtemplate(29, AIAgentRunFormComponentExtended_div_29_Template, 6, 4, "div",
|
|
904
|
+
i0.ɵɵtemplate(29, AIAgentRunFormComponentExtended_div_29_Template, 6, 4, "div", 24)(30, AIAgentRunFormComponentExtended_div_30_Template, 5, 1, "div", 24)(31, AIAgentRunFormComponentExtended_div_31_Template, 5, 5, "div", 24)(32, AIAgentRunFormComponentExtended_div_32_Template, 5, 2, "div", 24)(33, AIAgentRunFormComponentExtended_div_33_Template, 5, 2, "div", 24);
|
|
1012
905
|
i0.ɵɵelementEnd()();
|
|
1013
|
-
i0.ɵɵelementStart(34, "div",
|
|
906
|
+
i0.ɵɵelementStart(34, "div", 25)(35, "button", 26);
|
|
1014
907
|
i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_Template_button_click_35_listener() { return ctx.changeTab("timeline"); });
|
|
1015
|
-
i0.ɵɵelement(36, "i",
|
|
908
|
+
i0.ɵɵelement(36, "i", 27);
|
|
1016
909
|
i0.ɵɵtext(37, " Timeline ");
|
|
1017
910
|
i0.ɵɵelementEnd();
|
|
1018
|
-
i0.ɵɵelementStart(38, "button",
|
|
1019
|
-
i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_Template_button_click_38_listener() { return ctx.changeTab("
|
|
1020
|
-
i0.ɵɵelement(39, "i",
|
|
1021
|
-
i0.ɵɵtext(40, "
|
|
911
|
+
i0.ɵɵelementStart(38, "button", 26);
|
|
912
|
+
i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_Template_button_click_38_listener() { return ctx.changeTab("visualization"); });
|
|
913
|
+
i0.ɵɵelement(39, "i", 28);
|
|
914
|
+
i0.ɵɵtext(40, " Visualization ");
|
|
1022
915
|
i0.ɵɵelementEnd();
|
|
1023
|
-
i0.ɵɵelementStart(41, "button",
|
|
1024
|
-
i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_Template_button_click_41_listener() { return ctx.changeTab("
|
|
1025
|
-
i0.ɵɵelement(42, "i",
|
|
1026
|
-
i0.ɵɵtext(43, "
|
|
916
|
+
i0.ɵɵelementStart(41, "button", 26);
|
|
917
|
+
i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_Template_button_click_41_listener() { return ctx.changeTab("analytics"); });
|
|
918
|
+
i0.ɵɵelement(42, "i", 29);
|
|
919
|
+
i0.ɵɵtext(43, " Analytics ");
|
|
920
|
+
i0.ɵɵelementEnd();
|
|
921
|
+
i0.ɵɵelementStart(44, "button", 26);
|
|
922
|
+
i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_Template_button_click_44_listener() { return ctx.changeTab("details"); });
|
|
923
|
+
i0.ɵɵelement(45, "i", 30);
|
|
924
|
+
i0.ɵɵtext(46, " Details ");
|
|
1027
925
|
i0.ɵɵelementEnd()();
|
|
1028
|
-
i0.ɵɵelementStart(
|
|
1029
|
-
i0.ɵɵtemplate(
|
|
926
|
+
i0.ɵɵelementStart(47, "div", 31);
|
|
927
|
+
i0.ɵɵtemplate(48, AIAgentRunFormComponentExtended_div_48_Template, 6, 8, "div", 32)(49, AIAgentRunFormComponentExtended_div_49_Template, 2, 1, "div", 32)(50, AIAgentRunFormComponentExtended_div_50_Template, 2, 1, "div", 32)(51, AIAgentRunFormComponentExtended_div_51_Template, 12, 6, "div", 33);
|
|
1030
928
|
i0.ɵɵelementEnd()()();
|
|
1031
929
|
} if (rf & 2) {
|
|
1032
930
|
i0.ɵɵadvance(11);
|
|
@@ -1042,7 +940,7 @@ let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended exte
|
|
|
1042
940
|
i0.ɵɵadvance();
|
|
1043
941
|
i0.ɵɵtextInterpolate1(" ", ctx.record.Status, " ");
|
|
1044
942
|
i0.ɵɵadvance(9);
|
|
1045
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(28,
|
|
943
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(28, 24, ctx.record.StartedAt, "medium"));
|
|
1046
944
|
i0.ɵɵadvance(2);
|
|
1047
945
|
i0.ɵɵproperty("ngIf", ctx.record.CompletedAt);
|
|
1048
946
|
i0.ɵɵadvance();
|
|
@@ -1056,16 +954,20 @@ let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended exte
|
|
|
1056
954
|
i0.ɵɵadvance(2);
|
|
1057
955
|
i0.ɵɵclassProp("active", ctx.activeTab === "timeline");
|
|
1058
956
|
i0.ɵɵadvance(3);
|
|
957
|
+
i0.ɵɵclassProp("active", ctx.activeTab === "visualization");
|
|
958
|
+
i0.ɵɵadvance(3);
|
|
1059
959
|
i0.ɵɵclassProp("active", ctx.activeTab === "analytics");
|
|
1060
960
|
i0.ɵɵadvance(3);
|
|
1061
961
|
i0.ɵɵclassProp("active", ctx.activeTab === "details");
|
|
1062
962
|
i0.ɵɵadvance(4);
|
|
1063
963
|
i0.ɵɵproperty("ngIf", ctx.activeTab === "timeline");
|
|
1064
964
|
i0.ɵɵadvance();
|
|
965
|
+
i0.ɵɵproperty("ngIf", ctx.activeTab === "visualization");
|
|
966
|
+
i0.ɵɵadvance();
|
|
1065
967
|
i0.ɵɵproperty("ngIf", ctx.activeTab === "analytics");
|
|
1066
968
|
i0.ɵɵadvance();
|
|
1067
969
|
i0.ɵɵproperty("ngIf", ctx.activeTab === "details");
|
|
1068
|
-
} }, dependencies: [i4.NgClass, i4.NgIf, i5.NgControlStatus, i5.NgModel, i6.PanelBarComponent, i6.PanelBarItemComponent, i6.PanelBarContentDirective, i6.SplitterComponent, i6.SplitterPaneComponent, i7.CodeEditorComponent, i8.DeepDiffComponent, i9.AIAgentRunTimelineComponent, i10.AIAgentRunAnalyticsComponent, i4.DecimalPipe, i4.DatePipe], styles: [".ai-agent-run-form[_ngcontent-%COMP%] {\n height: 100%;\n overflow: auto;\n}\n\n\n\n.header[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);\n border-bottom: 1px solid #e0e6ed;\n padding: 20px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n}\n\n.header-content[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 16px;\n}\n\n.header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.icon-wrapper[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n background: linear-gradient(135deg, #2196f3, #1976d2);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 20px;\n}\n\n.header-info[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.meta-info[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n margin-top: 4px;\n font-size: 14px;\n color: #6c757d;\n}\n\n.parent-run[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.parent-link[_ngcontent-%COMP%] {\n color: #ff6358;\n text-decoration: none;\n cursor: pointer;\n transition: color 0.2s;\n}\n\n.parent-link[_ngcontent-%COMP%]:hover {\n color: #ff4444;\n text-decoration: underline;\n}\n\n.agent-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: #495057;\n}\n\n.run-id[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n opacity: 0.7;\n}\n\n.header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n padding: 6px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.status-badge[data-status=\"Running\"][_ngcontent-%COMP%] {\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.status-badge[data-status=\"Completed\"][_ngcontent-%COMP%] {\n background: #d4edda;\n color: #155724;\n}\n\n.status-badge[data-status=\"Failed\"][_ngcontent-%COMP%] {\n background: #f8d7da;\n color: #721c24;\n}\n\n.status-badge[data-status=\"Cancelled\"][_ngcontent-%COMP%] {\n background: #fff3cd;\n color: #856404;\n}\n\n.status-badge[data-status=\"Paused\"][_ngcontent-%COMP%] {\n background: #e2e3e5;\n color: #383d41;\n}\n\n.status-badge.small[_ngcontent-%COMP%] {\n padding: 4px 12px;\n font-size: 11px;\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.btn-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n}\n\n.btn-icon[_ngcontent-%COMP%]:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n color: #495057;\n}\n\n.header-stats[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n padding-top: 12px;\n border-top: 1px solid #e9ecef;\n}\n\n.stat[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.stat[_ngcontent-%COMP%] .label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat[_ngcontent-%COMP%] .value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: #495057;\n}\n\n.stat[_ngcontent-%COMP%] .value.success[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n.stat[_ngcontent-%COMP%] .value.error[_ngcontent-%COMP%] {\n color: #dc3545;\n}\n\n\n\n.tabs[_ngcontent-%COMP%] {\n display: flex;\n border-bottom: 1px solid #dee2e6;\n background: #f8f9fa;\n}\n\n.tab[_ngcontent-%COMP%] {\n padding: 12px 24px;\n border: none;\n background: transparent;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: #6c757d;\n display: flex;\n align-items: center;\n gap: 8px;\n transition: all 0.2s ease;\n border-bottom: 3px solid transparent;\n}\n\n.tab[_ngcontent-%COMP%]:hover {\n color: #495057;\n background: rgba(0,0,0,0.02);\n}\n\n.tab.active[_ngcontent-%COMP%] {\n color: #2196f3;\n border-bottom-color: #2196f3;\n background: white;\n}\n\n\n\n.content-area[_ngcontent-%COMP%] {\n position: relative;\n height: calc(100vh - 280px);\n overflow: auto;\n background: white;\n}\n\n.tab-content[_ngcontent-%COMP%] {\n height: 100%;\n overflow: auto;\n}\n\n\n\n.tab-content[ng-reflect-ng-if=\"true\"][_ngcontent-%COMP%] > kendo-panelbar[_ngcontent-%COMP%] {\n height: 100%;\n overflow-y: auto;\n}\n\n\n\n.json-detail-pane[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: #f8f9fa;\n border-left: 1px solid #e0e6ed;\n}\n\n.json-pane-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: white;\n border-bottom: 1px solid #e0e6ed;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n}\n\n.json-pane-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.json-pane-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #6b7280;\n font-size: 14px;\n}\n\n.json-pane-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: auto;\n padding: 16px;\n}\n\n.json-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 20px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.json-meta[_ngcontent-%COMP%] .meta-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta[_ngcontent-%COMP%] .meta-item[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: #6b7280;\n font-weight: 600;\n letter-spacing: 0.5px;\n}\n\n.json-meta[_ngcontent-%COMP%] .meta-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #2c3e50;\n font-weight: 500;\n}\n\n.action-link[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n.action-link[_ngcontent-%COMP%] .btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: #2196f3;\n font-size: 14px;\n cursor: pointer;\n padding: 6px 12px;\n border-radius: 4px;\n transition: all 0.2s;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.action-link[_ngcontent-%COMP%] .btn-link[_ngcontent-%COMP%]:hover {\n background: rgba(33, 150, 243, 0.08);\n color: #1976d2;\n}\n\n.json-viewer[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n background: white;\n border-radius: 8px;\n border: 1px solid #e0e6ed;\n overflow: auto;\n padding: 20px;\n gap: 10px;\n min-height: 0;\n margin-bottom: 45px;\n}\n\n\n.json-toolbar[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n padding: 8px 12px;\n background: #f8f9fa;\n border-bottom: 1px solid #e0e6ed;\n}\n\n\n\n.timeline-container[_ngcontent-%COMP%] {\n height: 100%;\n overflow-y: auto;\n padding: 20px;\n}\n\n.timeline-container[_ngcontent-%COMP%] > .timeline[_ngcontent-%COMP%] {\n max-width: 900px;\n margin: 0 auto;\n}\n\n.timeline[_ngcontent-%COMP%] {\n position: relative;\n padding-left: 40px;\n}\n\n.timeline[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: 20px;\n top: 0;\n bottom: 0;\n width: 2px;\n background: #e9ecef;\n}\n\n.timeline-item[_ngcontent-%COMP%] {\n position: relative;\n margin-bottom: 24px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.timeline-item[_ngcontent-%COMP%]:hover {\n transform: translateX(4px);\n}\n\n.timeline-item.selected[_ngcontent-%COMP%] {\n transform: translateX(8px);\n}\n\n.timeline-item.selected[_ngcontent-%COMP%] .timeline-content[_ngcontent-%COMP%] {\n background: #f0f7ff;\n border-color: #2196f3;\n}\n\n.timeline-marker[_ngcontent-%COMP%] {\n position: absolute;\n left: -30px;\n top: 0;\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: white;\n border: 3px solid #e9ecef;\n z-index: 1;\n transition: all 0.2s ease;\n}\n\n.timeline-marker[data-color=\"success\"][_ngcontent-%COMP%] {\n border-color: #28a745;\n color: #28a745;\n}\n\n.timeline-marker[data-color=\"error\"][_ngcontent-%COMP%] {\n border-color: #dc3545;\n color: #dc3545;\n}\n\n.timeline-marker[data-color=\"info\"][_ngcontent-%COMP%] {\n border-color: #17a2b8;\n color: #17a2b8;\n}\n\n.timeline-marker[data-color=\"warning\"][_ngcontent-%COMP%] {\n border-color: #ffc107;\n color: #ffc107;\n}\n\n.timeline-marker[data-color=\"secondary\"][_ngcontent-%COMP%] {\n border-color: #6c757d;\n color: #6c757d;\n}\n\n.timeline-marker.small[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n font-size: 12px;\n}\n\n.timeline-content[_ngcontent-%COMP%] {\n background: white;\n border: 1px solid #e9ecef;\n border-radius: 12px;\n padding: 16px 20px;\n margin-left: 20px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n transition: all 0.2s ease;\n}\n\n.timeline-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.timeline-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.timeline-header[_ngcontent-%COMP%] h5[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #495057;\n}\n\n.timeline-time[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6c757d;\n font-family: monospace;\n}\n\n.timeline-subtitle[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6c757d;\n margin-bottom: 8px;\n}\n\n.timeline-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: #6c757d;\n}\n\n.timeline-meta[_ngcontent-%COMP%] .status[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.timeline-meta[_ngcontent-%COMP%] .status[data-status=\"Completed\"][_ngcontent-%COMP%] {\n background: #d4edda;\n color: #155724;\n}\n\n.timeline-meta[_ngcontent-%COMP%] .status[data-status=\"Failed\"][_ngcontent-%COMP%] {\n background: #f8d7da;\n color: #721c24;\n}\n\n.timeline-meta[_ngcontent-%COMP%] .status[data-status=\"Running\"][_ngcontent-%COMP%] {\n background: #cce5ff;\n color: #004085;\n}\n\n.timeline-meta[_ngcontent-%COMP%] .status[data-status=\"Paused\"][_ngcontent-%COMP%] {\n background: #e2e3e5;\n color: #383d41;\n}\n\n.duration[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.timeline-actions[_ngcontent-%COMP%] {\n position: absolute;\n right: 20px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: #2196f3;\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s ease;\n}\n\n.btn-link[_ngcontent-%COMP%]:hover {\n background: rgba(33, 150, 243, 0.1);\n}\n\n.btn-expand[_ngcontent-%COMP%] {\n width: 24px;\n height: 24px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n font-size: 12px;\n}\n\n.btn-expand[_ngcontent-%COMP%]:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n color: #495057;\n}\n\n\n\n.timeline-children[_ngcontent-%COMP%] {\n position: relative;\n margin-top: 12px;\n margin-bottom: 12px;\n}\n\n.timeline-children[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: -10px;\n top: -12px;\n bottom: 0;\n width: 2px;\n background: #e9ecef;\n}\n\n.child-item[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n.child-item[_ngcontent-%COMP%] .timeline-content[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border-color: #e0e6ed;\n}\n\n\n\n.sub-run-timeline[_ngcontent-%COMP%] {\n background: rgba(33, 150, 243, 0.02);\n border-left: 2px solid rgba(33, 150, 243, 0.2);\n margin-left: 20px;\n padding-left: 20px;\n margin-top: 8px;\n margin-bottom: 8px;\n}\n\n.sub-run-item[_ngcontent-%COMP%] .timeline-marker[_ngcontent-%COMP%] {\n border-width: 2px;\n}\n\n.sub-run-item[_ngcontent-%COMP%] .timeline-content[_ngcontent-%COMP%] {\n transition: all 0.2s ease;\n}\n\n\n\n.json-detail-pane[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n border-left: 1px solid #e0e6ed;\n}\n\n.json-pane-header[_ngcontent-%COMP%] {\n padding: 16px 20px;\n background: #f8f9fa;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-shrink: 0;\n}\n\n.json-pane-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 10px;\n font-weight: 600;\n}\n\n.json-pane-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.json-meta[_ngcontent-%COMP%] {\n padding: 16px 20px;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n flex-shrink: 0;\n}\n\n.json-meta[_ngcontent-%COMP%] .meta-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #7c8798;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.json-meta[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #2c3e50;\n font-weight: 500;\n}\n\n.action-link[_ngcontent-%COMP%] {\n padding: 12px 20px;\n border-bottom: 1px solid #e0e6ed;\n flex-shrink: 0;\n}\n\n.action-link[_ngcontent-%COMP%] .btn-link[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: #2196f3;\n text-decoration: none;\n font-size: 14px;\n padding: 8px 12px;\n background: #f0f7ff;\n border: 1px solid #d0e5ff;\n border-radius: 4px;\n transition: all 0.2s;\n cursor: pointer;\n}\n\n.action-link[_ngcontent-%COMP%] .btn-link[_ngcontent-%COMP%]:hover {\n background: #e1f0ff;\n border-color: #b0d5ff;\n text-decoration: none;\n}\n\n\n.json-toolbar[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n\n\n.details-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n padding: 20px;\n}\n\n.detail-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-item.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.detail-item[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #495057;\n}\n\n.error-message[_ngcontent-%COMP%] {\n background: #f8d7da;\n color: #721c24;\n padding: 12px;\n border-radius: 8px;\n font-size: 13px;\n}\n\n.result-viewer[_ngcontent-%COMP%], \n.state-viewer[_ngcontent-%COMP%] {\n padding: 20px;\n max-height: 450px;\n overflow: auto;\n display: flex;\n flex-direction: column;\n}\n\n.result-viewer[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%], \n.state-viewer[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%], \n.loading-state[_ngcontent-%COMP%], \n.error-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 60px 20px;\n color: #6c757d;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.loading-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.error-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n opacity: 0.3;\n margin-bottom: 16px;\n}\n\n\n\n@media (max-width: 768px) {\n .header-content[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n }\n \n .header-stats[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n \n .json-detail-pane[_ngcontent-%COMP%] {\n width: 100%;\n }\n \n .timeline[_ngcontent-%COMP%] {\n padding-left: 30px;\n }\n \n .timeline-marker[_ngcontent-%COMP%] {\n left: -25px;\n width: 32px;\n height: 32px;\n }\n \n .timeline-content[_ngcontent-%COMP%] {\n margin-left: 10px;\n }\n}\n\n\n\n.entity-link[_ngcontent-%COMP%] {\n color: #2196f3;\n text-decoration: none;\n transition: all 0.2s ease;\n border-bottom: 1px solid transparent;\n display: inline-block;\n}\n\n.entity-link[_ngcontent-%COMP%]:hover {\n color: #1976d2;\n border-bottom-color: #1976d2;\n}\n\n.entity-link[_ngcontent-%COMP%]:active {\n color: #0d47a1;\n}\n\n\n\n.detail-pane-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n margin: 8px 0 0 0;\n border-bottom: 1px solid #e0e6ed;\n padding: 0 16px;\n}\n\n.detail-tab[_ngcontent-%COMP%] {\n padding: 10px 16px;\n background: none;\n border: none;\n border-bottom: 3px solid transparent;\n color: #6c757d;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.detail-tab[_ngcontent-%COMP%]:hover {\n color: #495057;\n background: rgba(0, 0, 0, 0.02);\n}\n\n.detail-tab.active[_ngcontent-%COMP%] {\n color: #2196f3;\n border-bottom-color: #2196f3;\n}\n\n.detail-tab[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n\n\n.detail-pane-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n min-height: 0;\n margin-bottom: 35px;\n}\n\n.detail-pane-content.with-tabs[_ngcontent-%COMP%] {\n \n\n margin-top: 0;\n}\n\n\n\n.step-payload-diff[_ngcontent-%COMP%] {\n height: 100%;\n overflow-y: auto;\n padding: 16px;\n}\n\n.step-payload-diff[_ngcontent-%COMP%] mj-deep-diff[_ngcontent-%COMP%] {\n display: block;\n height: 100%;\n}\n\n\n\n.detail-pane-content[_ngcontent-%COMP%]:not(.with-tabs) .json-viewer[_ngcontent-%COMP%] {\n margin-top: 16px;\n}"] }); }
|
|
970
|
+
} }, dependencies: [i5.NgClass, i5.NgIf, i6.NgControlStatus, i6.NgModel, i7.PanelBarComponent, i7.PanelBarItemComponent, i7.PanelBarContentDirective, i7.SplitterComponent, i7.SplitterPaneComponent, i8.CodeEditorComponent, i9.DeepDiffComponent, i10.AIAgentRunTimelineComponent, i11.AIAgentRunAnalyticsComponent, i12.AIAgentRunVisualizationComponent, i13.AIAgentRunStepDetailComponent, i5.DecimalPipe, i5.DatePipe], styles: [".ai-agent-run-form[_ngcontent-%COMP%] {\n height: 100%;\n overflow: auto;\n}\n\n\n\n.header[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);\n border-bottom: 1px solid #e0e6ed;\n padding: 20px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n}\n\n.header-content[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 16px;\n}\n\n.header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.icon-wrapper[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n background: linear-gradient(135deg, #2196f3, #1976d2);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 20px;\n}\n\n.header-info[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.meta-info[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n margin-top: 4px;\n font-size: 14px;\n color: #6c757d;\n}\n\n.parent-run[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.parent-link[_ngcontent-%COMP%] {\n color: #ff6358;\n text-decoration: none;\n cursor: pointer;\n transition: color 0.2s;\n}\n\n.parent-link[_ngcontent-%COMP%]:hover {\n color: #ff4444;\n text-decoration: underline;\n}\n\n.agent-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: #495057;\n}\n\n.run-id[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n opacity: 0.7;\n}\n\n.header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n padding: 6px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.status-badge[data-status=\"Running\"][_ngcontent-%COMP%] {\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.status-badge[data-status=\"Completed\"][_ngcontent-%COMP%] {\n background: #d4edda;\n color: #155724;\n}\n\n.status-badge[data-status=\"Failed\"][_ngcontent-%COMP%] {\n background: #f8d7da;\n color: #721c24;\n}\n\n.status-badge[data-status=\"Cancelled\"][_ngcontent-%COMP%] {\n background: #fff3cd;\n color: #856404;\n}\n\n.status-badge[data-status=\"Paused\"][_ngcontent-%COMP%] {\n background: #e2e3e5;\n color: #383d41;\n}\n\n.status-badge.small[_ngcontent-%COMP%] {\n padding: 4px 12px;\n font-size: 11px;\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.btn-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n}\n\n.btn-icon[_ngcontent-%COMP%]:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n color: #495057;\n}\n\n.header-stats[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n padding-top: 12px;\n border-top: 1px solid #e9ecef;\n}\n\n.stat[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.stat[_ngcontent-%COMP%] .label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat[_ngcontent-%COMP%] .value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: #495057;\n}\n\n.stat[_ngcontent-%COMP%] .value.success[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n.stat[_ngcontent-%COMP%] .value.error[_ngcontent-%COMP%] {\n color: #dc3545;\n}\n\n\n\n.tabs[_ngcontent-%COMP%] {\n display: flex;\n border-bottom: 1px solid #dee2e6;\n background: #f8f9fa;\n}\n\n.tab[_ngcontent-%COMP%] {\n padding: 12px 24px;\n border: none;\n background: transparent;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: #6c757d;\n display: flex;\n align-items: center;\n gap: 8px;\n transition: all 0.2s ease;\n border-bottom: 3px solid transparent;\n}\n\n.tab[_ngcontent-%COMP%]:hover {\n color: #495057;\n background: rgba(0,0,0,0.02);\n}\n\n.tab.active[_ngcontent-%COMP%] {\n color: #2196f3;\n border-bottom-color: #2196f3;\n background: white;\n}\n\n\n\n.content-area[_ngcontent-%COMP%] {\n position: relative;\n height: calc(100vh - 280px);\n overflow: auto;\n background: white;\n}\n\n.tab-content[_ngcontent-%COMP%] {\n height: 100%;\n overflow: auto;\n}\n\n\n\n.tab-content[ng-reflect-ng-if=\"true\"][_ngcontent-%COMP%] > kendo-panelbar[_ngcontent-%COMP%] {\n height: 100%;\n overflow-y: auto;\n}\n\n\n\n.json-detail-pane[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: #f8f9fa;\n border-left: 1px solid #e0e6ed;\n}\n\n.json-pane-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: white;\n border-bottom: 1px solid #e0e6ed;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n}\n\n.json-pane-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.json-pane-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #6b7280;\n font-size: 14px;\n}\n\n.json-pane-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: auto;\n padding: 16px;\n}\n\n.json-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 20px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.json-meta[_ngcontent-%COMP%] .meta-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta[_ngcontent-%COMP%] .meta-item[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: #6b7280;\n font-weight: 600;\n letter-spacing: 0.5px;\n}\n\n.json-meta[_ngcontent-%COMP%] .meta-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #2c3e50;\n font-weight: 500;\n}\n\n.action-link[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n.action-link[_ngcontent-%COMP%] .btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: #2196f3;\n font-size: 14px;\n cursor: pointer;\n padding: 6px 12px;\n border-radius: 4px;\n transition: all 0.2s;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.action-link[_ngcontent-%COMP%] .btn-link[_ngcontent-%COMP%]:hover {\n background: rgba(33, 150, 243, 0.08);\n color: #1976d2;\n}\n\n.json-viewer[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n background: white;\n border-radius: 8px;\n border: 1px solid #e0e6ed;\n overflow: auto;\n padding: 20px;\n gap: 10px;\n min-height: 0;\n margin-bottom: 45px;\n}\n\n\n.json-toolbar[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n padding: 8px 12px;\n background: #f8f9fa;\n border-bottom: 1px solid #e0e6ed;\n}\n\n\n\n.timeline-container[_ngcontent-%COMP%] {\n height: 100%;\n overflow-y: auto;\n padding: 20px;\n}\n\n.timeline-container[_ngcontent-%COMP%] > .timeline[_ngcontent-%COMP%] {\n max-width: 900px;\n margin: 0 auto;\n}\n\n.timeline[_ngcontent-%COMP%] {\n position: relative;\n padding-left: 40px;\n}\n\n.timeline[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: 20px;\n top: 0;\n bottom: 0;\n width: 2px;\n background: #e9ecef;\n}\n\n.timeline-item[_ngcontent-%COMP%] {\n position: relative;\n margin-bottom: 24px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.timeline-item[_ngcontent-%COMP%]:hover {\n transform: translateX(4px);\n}\n\n.timeline-item.selected[_ngcontent-%COMP%] {\n transform: translateX(8px);\n}\n\n.timeline-item.selected[_ngcontent-%COMP%] .timeline-content[_ngcontent-%COMP%] {\n background: #f0f7ff;\n border-color: #2196f3;\n}\n\n.timeline-marker[_ngcontent-%COMP%] {\n position: absolute;\n left: -30px;\n top: 0;\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: white;\n border: 3px solid #e9ecef;\n z-index: 1;\n transition: all 0.2s ease;\n}\n\n.timeline-marker[data-color=\"success\"][_ngcontent-%COMP%] {\n border-color: #28a745;\n color: #28a745;\n}\n\n.timeline-marker[data-color=\"error\"][_ngcontent-%COMP%] {\n border-color: #dc3545;\n color: #dc3545;\n}\n\n.timeline-marker[data-color=\"info\"][_ngcontent-%COMP%] {\n border-color: #17a2b8;\n color: #17a2b8;\n}\n\n.timeline-marker[data-color=\"warning\"][_ngcontent-%COMP%] {\n border-color: #ffc107;\n color: #ffc107;\n}\n\n.timeline-marker[data-color=\"secondary\"][_ngcontent-%COMP%] {\n border-color: #6c757d;\n color: #6c757d;\n}\n\n.timeline-marker.small[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n font-size: 12px;\n}\n\n.timeline-content[_ngcontent-%COMP%] {\n background: white;\n border: 1px solid #e9ecef;\n border-radius: 12px;\n padding: 16px 20px;\n margin-left: 20px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n transition: all 0.2s ease;\n}\n\n.timeline-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.timeline-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.timeline-header[_ngcontent-%COMP%] h5[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #495057;\n}\n\n.timeline-time[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6c757d;\n font-family: monospace;\n}\n\n.timeline-subtitle[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6c757d;\n margin-bottom: 8px;\n}\n\n.timeline-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: #6c757d;\n}\n\n.timeline-meta[_ngcontent-%COMP%] .status[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.timeline-meta[_ngcontent-%COMP%] .status[data-status=\"Completed\"][_ngcontent-%COMP%] {\n background: #d4edda;\n color: #155724;\n}\n\n.timeline-meta[_ngcontent-%COMP%] .status[data-status=\"Failed\"][_ngcontent-%COMP%] {\n background: #f8d7da;\n color: #721c24;\n}\n\n.timeline-meta[_ngcontent-%COMP%] .status[data-status=\"Running\"][_ngcontent-%COMP%] {\n background: #cce5ff;\n color: #004085;\n}\n\n.timeline-meta[_ngcontent-%COMP%] .status[data-status=\"Paused\"][_ngcontent-%COMP%] {\n background: #e2e3e5;\n color: #383d41;\n}\n\n.duration[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.timeline-actions[_ngcontent-%COMP%] {\n position: absolute;\n right: 20px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: #2196f3;\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s ease;\n}\n\n.btn-link[_ngcontent-%COMP%]:hover {\n background: rgba(33, 150, 243, 0.1);\n}\n\n.btn-expand[_ngcontent-%COMP%] {\n width: 24px;\n height: 24px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n font-size: 12px;\n}\n\n.btn-expand[_ngcontent-%COMP%]:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n color: #495057;\n}\n\n\n\n.timeline-children[_ngcontent-%COMP%] {\n position: relative;\n margin-top: 12px;\n margin-bottom: 12px;\n}\n\n.timeline-children[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: -10px;\n top: -12px;\n bottom: 0;\n width: 2px;\n background: #e9ecef;\n}\n\n.child-item[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n.child-item[_ngcontent-%COMP%] .timeline-content[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border-color: #e0e6ed;\n}\n\n\n\n.sub-run-timeline[_ngcontent-%COMP%] {\n background: rgba(33, 150, 243, 0.02);\n border-left: 2px solid rgba(33, 150, 243, 0.2);\n margin-left: 20px;\n padding-left: 20px;\n margin-top: 8px;\n margin-bottom: 8px;\n}\n\n.sub-run-item[_ngcontent-%COMP%] .timeline-marker[_ngcontent-%COMP%] {\n border-width: 2px;\n}\n\n.sub-run-item[_ngcontent-%COMP%] .timeline-content[_ngcontent-%COMP%] {\n transition: all 0.2s ease;\n}\n\n\n\n.json-detail-pane[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n border-left: 1px solid #e0e6ed;\n}\n\n.json-pane-header[_ngcontent-%COMP%] {\n padding: 16px 20px;\n background: #f8f9fa;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-shrink: 0;\n}\n\n.json-pane-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 10px;\n font-weight: 600;\n}\n\n.json-pane-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.json-meta[_ngcontent-%COMP%] {\n padding: 16px 20px;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n flex-shrink: 0;\n}\n\n.json-meta[_ngcontent-%COMP%] .meta-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #7c8798;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.json-meta[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #2c3e50;\n font-weight: 500;\n}\n\n.action-link[_ngcontent-%COMP%] {\n padding: 12px 20px;\n border-bottom: 1px solid #e0e6ed;\n flex-shrink: 0;\n}\n\n.action-link[_ngcontent-%COMP%] .btn-link[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: #2196f3;\n text-decoration: none;\n font-size: 14px;\n padding: 8px 12px;\n background: #f0f7ff;\n border: 1px solid #d0e5ff;\n border-radius: 4px;\n transition: all 0.2s;\n cursor: pointer;\n}\n\n.action-link[_ngcontent-%COMP%] .btn-link[_ngcontent-%COMP%]:hover {\n background: #e1f0ff;\n border-color: #b0d5ff;\n text-decoration: none;\n}\n\n\n.json-toolbar[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n\n\n.details-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n padding: 20px;\n}\n\n.detail-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-item.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.detail-item[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #495057;\n}\n\n.error-message[_ngcontent-%COMP%] {\n background: #f8d7da;\n color: #721c24;\n padding: 12px;\n border-radius: 8px;\n font-size: 13px;\n}\n\n.result-viewer[_ngcontent-%COMP%], \n.state-viewer[_ngcontent-%COMP%] {\n padding: 20px;\n max-height: 450px;\n overflow: auto;\n display: flex;\n flex-direction: column;\n}\n\n.result-viewer[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%], \n.state-viewer[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%], \n.loading-state[_ngcontent-%COMP%], \n.error-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 60px 20px;\n color: #6c757d;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.loading-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.error-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n opacity: 0.3;\n margin-bottom: 16px;\n}\n\n\n\n@media (max-width: 768px) {\n .header-content[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n }\n \n .header-stats[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n \n .json-detail-pane[_ngcontent-%COMP%] {\n width: 100%;\n }\n \n .timeline[_ngcontent-%COMP%] {\n padding-left: 30px;\n }\n \n .timeline-marker[_ngcontent-%COMP%] {\n left: -25px;\n width: 32px;\n height: 32px;\n }\n \n .timeline-content[_ngcontent-%COMP%] {\n margin-left: 10px;\n }\n}\n\n\n\n.entity-link[_ngcontent-%COMP%] {\n color: #2196f3;\n text-decoration: none;\n transition: all 0.2s ease;\n border-bottom: 1px solid transparent;\n display: inline-block;\n}\n\n.entity-link[_ngcontent-%COMP%]:hover {\n color: #1976d2;\n border-bottom-color: #1976d2;\n}\n\n.entity-link[_ngcontent-%COMP%]:active {\n color: #0d47a1;\n}\n\n\n\n.detail-pane-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n margin: 8px 0 0 0;\n border-bottom: 1px solid #e0e6ed;\n padding: 0 16px;\n}\n\n.detail-tab[_ngcontent-%COMP%] {\n padding: 10px 16px;\n background: none;\n border: none;\n border-bottom: 3px solid transparent;\n color: #6c757d;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.detail-tab[_ngcontent-%COMP%]:hover {\n color: #495057;\n background: rgba(0, 0, 0, 0.02);\n}\n\n.detail-tab.active[_ngcontent-%COMP%] {\n color: #2196f3;\n border-bottom-color: #2196f3;\n}\n\n.detail-tab[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n\n\n.detail-pane-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n min-height: 0;\n margin-bottom: 35px;\n}\n\n.detail-pane-content.with-tabs[_ngcontent-%COMP%] {\n \n\n margin-top: 0;\n}\n\n\n\n.step-payload-diff[_ngcontent-%COMP%] {\n height: 100%;\n overflow-y: auto;\n padding: 16px;\n}\n\n.step-payload-diff[_ngcontent-%COMP%] mj-deep-diff[_ngcontent-%COMP%] {\n display: block;\n height: 100%;\n}\n\n\n\n.detail-pane-content[_ngcontent-%COMP%]:not(.with-tabs) .json-viewer[_ngcontent-%COMP%] {\n margin-top: 16px;\n}"] }); }
|
|
1069
971
|
};
|
|
1070
972
|
AIAgentRunFormComponentExtended = __decorate([
|
|
1071
973
|
RegisterClass(BaseFormComponent, 'MJ: AI Agent Runs')
|
|
@@ -1073,15 +975,18 @@ AIAgentRunFormComponentExtended = __decorate([
|
|
|
1073
975
|
export { AIAgentRunFormComponentExtended };
|
|
1074
976
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AIAgentRunFormComponentExtended, [{
|
|
1075
977
|
type: Component,
|
|
1076
|
-
args: [{ selector: 'mj-ai-agent-run-form', template: "<div class=\"record-form-container ai-agent-run-form\">\n <div class=\"record-form\">\n <!-- Header -->\n <div class=\"header\">\n <div class=\"header-content\">\n <div class=\"header-left\">\n <div class=\"icon-wrapper\">\n <i class=\"fas fa-robot\"></i>\n </div>\n <div class=\"header-info\">\n <h2>AI Agent Run</h2>\n <div class=\"meta-info\">\n <span class=\"agent-name\" *ngIf=\"agent\">{{ agent.Name }}</span>\n <span class=\"run-id\">{{ record.ID }}</span>\n <span class=\"parent-run\" *ngIf=\"record.ParentRunID\">\n <i class=\"fas fa-level-up-alt\"></i>\n <a (click)=\"navigateToParentRun()\" class=\"parent-link\">Parent Run</a>\n </span>\n </div>\n </div>\n </div>\n <div class=\"header-right\">\n <div class=\"status-badge\" [attr.data-status]=\"record.Status\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon(record.Status || '')\"></i>\n {{ record.Status }}\n </div>\n <div class=\"header-actions\">\n <button class=\"btn-icon\" (click)=\"refreshData()\" title=\"Refresh\">\n <i class=\"fas fa-sync-alt\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"header-stats\">\n <div class=\"stat\">\n <span class=\"label\">Started</span>\n <span class=\"value\">{{ record.StartedAt | date:'medium' }}</span>\n </div>\n <div class=\"stat\" *ngIf=\"record.CompletedAt\">\n <span class=\"label\">Completed</span>\n <span class=\"value\">{{ record.CompletedAt | date:'medium' }}</span>\n </div>\n <div class=\"stat\" *ngIf=\"record.CompletedAt\">\n <span class=\"label\">Duration</span>\n <span class=\"value\">{{ calculateDuration(record.StartedAt, record.CompletedAt) }}</span>\n </div>\n <div class=\"stat\" *ngIf=\"record.Success !== null && record.CompletedAt !== null\">\n <span class=\"label\">Result</span>\n <span class=\"value\" [class.success]=\"record.Success\" [class.error]=\"!record.Success\">\n {{ record.Success ? 'Success' : 'Failed' }}\n </span>\n </div>\n <div class=\"stat\" *ngIf=\"costMetrics && (costMetrics.totalTokensInput + costMetrics.totalTokensOutput) > 0\">\n <span class=\"label\">Tokens</span>\n <span class=\"value\" *ngIf=\"!costMetrics.isLoading\">{{ (costMetrics.totalTokensInput + costMetrics.totalTokensOutput) | number:'1.0-0' }}</span>\n <span class=\"value loading\" *ngIf=\"costMetrics.isLoading\"><i class=\"fas fa-spinner fa-spin\"></i></span>\n </div>\n <div class=\"stat\" *ngIf=\"costMetrics && costMetrics.totalCost > 0\">\n <span class=\"label\">Cost</span>\n <span class=\"value\" *ngIf=\"!costMetrics.isLoading\">${{ costMetrics.totalCost | number:'1.2-4' }}</span>\n <span class=\"value loading\" *ngIf=\"costMetrics.isLoading\"><i class=\"fas fa-spinner fa-spin\"></i></span>\n </div>\n </div>\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs\">\n <button class=\"tab\" [class.active]=\"activeTab === 'timeline'\" (click)=\"changeTab('timeline')\">\n <i class=\"fas fa-stream\"></i> Timeline\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'analytics'\" (click)=\"changeTab('analytics')\">\n <i class=\"fas fa-chart-line\"></i> Analytics\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'details'\" (click)=\"changeTab('details')\">\n <i class=\"fas fa-info-circle\"></i> Details\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"content-area\">\n <!-- Timeline Tab -->\n <div class=\"tab-content\" *ngIf=\"activeTab === 'timeline'\" style=\"height: 100%;\">\n <kendo-splitter style=\"height: 100%;\" orientation=\"horizontal\">\n <!-- Timeline Pane -->\n <kendo-splitter-pane [min]=\"'400px'\">\n <mj-ai-agent-run-timeline\n [aiAgentRunId]=\"record.ID\"\n [autoRefresh]=\"record.Status === 'Running'\"\n [refreshInterval]=\"3000\"\n (itemSelected)=\"selectTimelineItem($event)\"\n (navigateToEntity)=\"navigateToEntityRecord($event)\">\n </mj-ai-agent-run-timeline>\n </kendo-splitter-pane>\n \n <!-- JSON Detail Pane -->\n <kendo-splitter-pane [size]=\"'45%'\" [min]=\"'300px'\" [collapsed]=\"!selectedTimelineItem\">\n <div class=\"json-detail-pane\" *ngIf=\"selectedTimelineItem\">\n <div class=\"json-pane-header\">\n <h3>\n <i class=\"fas\" [ngClass]=\"selectedTimelineItem.icon\"></i>\n {{ selectedTimelineItem.title }}\n </h3>\n <button class=\"btn-icon\" (click)=\"closeJsonPanel()\" title=\"Close\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"json-pane-content\">\n <div class=\"json-meta\">\n <div class=\"meta-item\">\n <label>Type</label>\n <span>{{ selectedTimelineItem.type }}</span>\n </div>\n <div class=\"meta-item\">\n <label>Status</label>\n <span class=\"status-badge small\" [attr.data-status]=\"selectedTimelineItem.status\">\n {{ selectedTimelineItem.status }}\n </span>\n </div>\n <div class=\"meta-item\">\n <label>Duration</label>\n <span>{{ selectedTimelineItem.duration || 'N/A' }}</span>\n </div>\n </div>\n \n <!-- Action-specific link -->\n <div class=\"action-link\" *ngIf=\"selectedTimelineItem.type === 'action' && selectedTimelineItem.data?.ID\">\n <button class=\"btn-link\" (click)=\"navigateToActionLog(selectedTimelineItem.data.ID)\">\n <i class=\"fas fa-external-link-alt\"></i> View Action Execution Log\n </button>\n </div>\n \n <!-- Tab Navigation - Only show when we have both options -->\n @if (showStepPayloadDiff) {\n <div class=\"detail-pane-tabs\">\n <button \n class=\"detail-tab\" \n [class.active]=\"detailPaneTab === 'diff'\"\n (click)=\"detailPaneTab = 'diff'\">\n <i class=\"fa-solid fa-code-branch\"></i>\n Payload Changes\n </button>\n <button \n class=\"detail-tab\" \n [class.active]=\"detailPaneTab === 'json'\"\n (click)=\"detailPaneTab = 'json'\">\n <i class=\"fa-solid fa-code\"></i>\n Full JSON\n </button>\n </div>\n }\n \n <!-- Tab Content -->\n <div class=\"detail-pane-content\" [class.with-tabs]=\"showStepPayloadDiff\">\n <!-- Payload Diff Tab -->\n @if (detailPaneTab === 'diff' && showStepPayloadDiff) {\n <div class=\"step-payload-diff\">\n <mj-deep-diff\n [oldValue]=\"stepPayloadAtStartObject\"\n [newValue]=\"stepPayloadAtEndObject\"\n [title]=\"''\"\n [showSummary]=\"true\"\n [showUnchanged]=\"false\"\n [expandAll]=\"false\"\n [maxDepth]=\"8\"\n [maxStringLength]=\"150\"\n [treatNullAsUndefined]=\"true\">\n </mj-deep-diff>\n </div>\n }\n \n <!-- Full JSON Tab -->\n @if (detailPaneTab === 'json' || !showStepPayloadDiff) {\n <div class=\"json-viewer\">\n <div class=\"json-toolbar\">\n <button class=\"btn-icon\" title=\"Copy JSON\" (click)=\"copyToClipboard(getSelectedItemJson())\">\n <i class=\"fas fa-copy\"></i>\n </button>\n </div>\n <mj-code-editor\n [(ngModel)]=\"selectedItemJsonString\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: calc(100% - 40px); width: 100%;\">\n </mj-code-editor>\n </div>\n }\n </div>\n </div>\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n </div>\n\n <!-- Analytics Tab -->\n <div class=\"tab-content\" *ngIf=\"activeTab === 'analytics'\" style=\"height: 100%;\">\n <mj-ai-agent-run-analytics \n #analyticsComponent\n [agentRunId]=\"record.ID\"\n *ngIf=\"analyticsLoaded\">\n </mj-ai-agent-run-analytics>\n </div>\n\n <!-- Details Tab -->\n <div class=\"tab-content\" *ngIf=\"activeTab === 'details'\">\n <kendo-panelbar>\n <kendo-panelbar-item title=\"General Information\" [expanded]=\"true\">\n <ng-template kendoPanelBarContent>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Agent</label>\n <span>\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('AI Agents', record.AgentID)\">\n {{ agent?.Name || 'N/A' }}\n </a>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Parent Run ID</label>\n <span>\n <a *ngIf=\"record.ParentRunID\" href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Agent Runs', record.ParentRunID)\">\n {{ record.ParentRunID }}\n </a>\n <span *ngIf=\"!record.ParentRunID\">None (Root)</span>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Last Run ID</label>\n <span>\n <a *ngIf=\"record.LastRunID\" href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Agent Runs', record.LastRunID)\">\n {{ record.LastRunID }}\n </a>\n <span *ngIf=\"!record.LastRunID\">None</span>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Conversation ID</label>\n <span>\n <a *ngIf=\"record.ConversationID\" href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('Conversations', record.ConversationID)\">\n {{ record.ConversationID }}\n </a>\n <span *ngIf=\"!record.ConversationID\">N/A</span>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>User</label>\n <span>\n <a *ngIf=\"record.UserID\" href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('Users', record.UserID)\">\n {{ record.User || 'N/A' }}\n </a>\n <span *ngIf=\"!record.UserID\">N/A</span>\n </span>\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Execution Status\">\n <ng-template kendoPanelBarContent>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Status</label>\n <span class=\"status-badge\" [attr.data-status]=\"record.Status\">\n {{ record.Status }}\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Success</label>\n <span [class.success]=\"record.Success\" [class.error]=\"record.Success === false\">\n {{ record.Success === null ? 'In Progress' : (record.Success ? 'Yes' : 'No') }}\n </span>\n </div>\n <div class=\"detail-item full-width\" *ngIf=\"record.ErrorMessage\">\n <label>Error Message</label>\n <div class=\"error-message\">{{ record.ErrorMessage }}</div>\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Usage & Cost\">\n <ng-template kendoPanelBarContent>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Total Tokens Used</label>\n <span>{{ record.TotalTokensUsed ? (record.TotalTokensUsed | number:'1.0-0') : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Prompt Tokens</label>\n <span>{{ record.TotalPromptTokensUsed ? (record.TotalPromptTokensUsed | number:'1.0-0') : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Completion Tokens</label>\n <span>{{ record.TotalCompletionTokensUsed ? (record.TotalCompletionTokensUsed | number:'1.0-0') : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Total Cost</label>\n <span>{{ record.TotalCost != null ? ('$' + (record.TotalCost | number:'1.2-4')) : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Total Prompt Iterations</label>\n <span>{{ record.TotalPromptIterations != null ? (record.TotalPromptIterations | number:'1.0-0') : 'N/A' }}</span>\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Result\" *ngIf=\"record.Result\">\n <ng-template kendoPanelBarContent>\n <div class=\"result-viewer\">\n <mj-code-editor\n [ngModel]=\"parsedResult\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Starting Payload\" *ngIf=\"record.StartingPayload\">\n <ng-template kendoPanelBarContent>\n <div class=\"result-viewer\">\n <mj-code-editor\n [ngModel]=\"parsedStartingPayload\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Final Payload\" *ngIf=\"record.FinalPayload\">\n <ng-template kendoPanelBarContent>\n <div class=\"result-viewer\">\n <mj-code-editor\n [ngModel]=\"parsedFinalPayload\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Payload Diff\" *ngIf=\"showPayloadDiff\">\n <ng-template kendoPanelBarContent>\n <div style=\"padding: 20px; background: #f8f9fa;\">\n <mj-deep-diff\n [oldValue]=\"startingPayloadObject\"\n [newValue]=\"finalPayloadObject\"\n [title]=\"''\"\n [showSummary]=\"true\"\n [showUnchanged]=\"false\"\n [expandAll]=\"false\"\n [maxDepth]=\"10\"\n [maxStringLength]=\"200\"\n [treatNullAsUndefined]=\"true\">\n </mj-deep-diff>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n </kendo-panelbar>\n </div>\n </div>\n </div>\n</div>", styles: [".ai-agent-run-form {\n height: 100%;\n overflow: auto;\n}\n\n/* Header Styles */\n.header {\n background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);\n border-bottom: 1px solid #e0e6ed;\n padding: 20px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n}\n\n.header-content {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 16px;\n}\n\n.header-left {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.icon-wrapper {\n width: 48px;\n height: 48px;\n background: linear-gradient(135deg, #2196f3, #1976d2);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 20px;\n}\n\n.header-info h2 {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.meta-info {\n display: flex;\n gap: 12px;\n margin-top: 4px;\n font-size: 14px;\n color: #6c757d;\n}\n\n.parent-run {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.parent-link {\n color: #ff6358;\n text-decoration: none;\n cursor: pointer;\n transition: color 0.2s;\n}\n\n.parent-link:hover {\n color: #ff4444;\n text-decoration: underline;\n}\n\n.agent-name {\n font-weight: 500;\n color: #495057;\n}\n\n.run-id {\n font-family: monospace;\n font-size: 12px;\n opacity: 0.7;\n}\n\n.header-right {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.status-badge {\n padding: 6px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.status-badge[data-status=\"Running\"] {\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.status-badge[data-status=\"Completed\"] {\n background: #d4edda;\n color: #155724;\n}\n\n.status-badge[data-status=\"Failed\"] {\n background: #f8d7da;\n color: #721c24;\n}\n\n.status-badge[data-status=\"Cancelled\"] {\n background: #fff3cd;\n color: #856404;\n}\n\n.status-badge[data-status=\"Paused\"] {\n background: #e2e3e5;\n color: #383d41;\n}\n\n.status-badge.small {\n padding: 4px 12px;\n font-size: 11px;\n}\n\n.header-actions {\n display: flex;\n gap: 8px;\n}\n\n.btn-icon {\n width: 36px;\n height: 36px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n}\n\n.btn-icon:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n color: #495057;\n}\n\n.header-stats {\n display: flex;\n gap: 24px;\n padding-top: 12px;\n border-top: 1px solid #e9ecef;\n}\n\n.stat {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.stat .label {\n font-size: 12px;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat .value {\n font-size: 14px;\n font-weight: 500;\n color: #495057;\n}\n\n.stat .value.success {\n color: #28a745;\n}\n\n.stat .value.error {\n color: #dc3545;\n}\n\n/* Tabs */\n.tabs {\n display: flex;\n border-bottom: 1px solid #dee2e6;\n background: #f8f9fa;\n}\n\n.tab {\n padding: 12px 24px;\n border: none;\n background: transparent;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: #6c757d;\n display: flex;\n align-items: center;\n gap: 8px;\n transition: all 0.2s ease;\n border-bottom: 3px solid transparent;\n}\n\n.tab:hover {\n color: #495057;\n background: rgba(0,0,0,0.02);\n}\n\n.tab.active {\n color: #2196f3;\n border-bottom-color: #2196f3;\n background: white;\n}\n\n/* Content Area */\n.content-area {\n position: relative;\n height: calc(100vh - 280px);\n overflow: auto;\n background: white;\n}\n\n.tab-content {\n height: 100%;\n overflow: auto;\n}\n\n/* Details tab specific */\n.tab-content[ng-reflect-ng-if=\"true\"] > kendo-panelbar {\n height: 100%;\n overflow-y: auto;\n}\n\n/* JSON Detail Pane */\n.json-detail-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: #f8f9fa;\n border-left: 1px solid #e0e6ed;\n}\n\n.json-pane-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: white;\n border-bottom: 1px solid #e0e6ed;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n}\n\n.json-pane-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.json-pane-header h3 i {\n color: #6b7280;\n font-size: 14px;\n}\n\n.json-pane-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: auto;\n padding: 16px;\n}\n\n.json-meta {\n display: flex;\n gap: 20px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.json-meta .meta-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta .meta-item label {\n font-size: 11px;\n text-transform: uppercase;\n color: #6b7280;\n font-weight: 600;\n letter-spacing: 0.5px;\n}\n\n.json-meta .meta-item span {\n font-size: 14px;\n color: #2c3e50;\n font-weight: 500;\n}\n\n.action-link {\n margin-bottom: 12px;\n}\n\n.action-link .btn-link {\n background: none;\n border: none;\n color: #2196f3;\n font-size: 14px;\n cursor: pointer;\n padding: 6px 12px;\n border-radius: 4px;\n transition: all 0.2s;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.action-link .btn-link:hover {\n background: rgba(33, 150, 243, 0.08);\n color: #1976d2;\n}\n\n.json-viewer {\n flex: 1;\n display: flex;\n flex-direction: column;\n background: white;\n border-radius: 8px;\n border: 1px solid #e0e6ed;\n overflow: auto;\n padding: 20px;\n gap: 10px;\n min-height: 0;\n margin-bottom: 45px;\n}\n\n\n.json-toolbar {\n display: flex;\n justify-content: flex-end;\n padding: 8px 12px;\n background: #f8f9fa;\n border-bottom: 1px solid #e0e6ed;\n}\n\n/* Timeline Styles */\n.timeline-container {\n height: 100%;\n overflow-y: auto;\n padding: 20px;\n}\n\n.timeline-container > .timeline {\n max-width: 900px;\n margin: 0 auto;\n}\n\n.timeline {\n position: relative;\n padding-left: 40px;\n}\n\n.timeline::before {\n content: '';\n position: absolute;\n left: 20px;\n top: 0;\n bottom: 0;\n width: 2px;\n background: #e9ecef;\n}\n\n.timeline-item {\n position: relative;\n margin-bottom: 24px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.timeline-item:hover {\n transform: translateX(4px);\n}\n\n.timeline-item.selected {\n transform: translateX(8px);\n}\n\n.timeline-item.selected .timeline-content {\n background: #f0f7ff;\n border-color: #2196f3;\n}\n\n.timeline-marker {\n position: absolute;\n left: -30px;\n top: 0;\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: white;\n border: 3px solid #e9ecef;\n z-index: 1;\n transition: all 0.2s ease;\n}\n\n.timeline-marker[data-color=\"success\"] {\n border-color: #28a745;\n color: #28a745;\n}\n\n.timeline-marker[data-color=\"error\"] {\n border-color: #dc3545;\n color: #dc3545;\n}\n\n.timeline-marker[data-color=\"info\"] {\n border-color: #17a2b8;\n color: #17a2b8;\n}\n\n.timeline-marker[data-color=\"warning\"] {\n border-color: #ffc107;\n color: #ffc107;\n}\n\n.timeline-marker[data-color=\"secondary\"] {\n border-color: #6c757d;\n color: #6c757d;\n}\n\n.timeline-marker.small {\n width: 28px;\n height: 28px;\n font-size: 12px;\n}\n\n.timeline-content {\n background: white;\n border: 1px solid #e9ecef;\n border-radius: 12px;\n padding: 16px 20px;\n margin-left: 20px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n transition: all 0.2s ease;\n}\n\n.timeline-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.timeline-header h4 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.timeline-header h5 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #495057;\n}\n\n.timeline-time {\n font-size: 12px;\n color: #6c757d;\n font-family: monospace;\n}\n\n.timeline-subtitle {\n font-size: 13px;\n color: #6c757d;\n margin-bottom: 8px;\n}\n\n.timeline-meta {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: #6c757d;\n}\n\n.timeline-meta .status {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.timeline-meta .status[data-status=\"Completed\"] {\n background: #d4edda;\n color: #155724;\n}\n\n.timeline-meta .status[data-status=\"Failed\"] {\n background: #f8d7da;\n color: #721c24;\n}\n\n.timeline-meta .status[data-status=\"Running\"] {\n background: #cce5ff;\n color: #004085;\n}\n\n.timeline-meta .status[data-status=\"Paused\"] {\n background: #e2e3e5;\n color: #383d41;\n}\n\n.duration {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.timeline-actions {\n position: absolute;\n right: 20px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn-link {\n background: none;\n border: none;\n color: #2196f3;\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s ease;\n}\n\n.btn-link:hover {\n background: rgba(33, 150, 243, 0.1);\n}\n\n.btn-expand {\n width: 24px;\n height: 24px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n font-size: 12px;\n}\n\n.btn-expand:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n color: #495057;\n}\n\n/* Timeline Children */\n.timeline-children {\n position: relative;\n margin-top: 12px;\n margin-bottom: 12px;\n}\n\n.timeline-children::before {\n content: '';\n position: absolute;\n left: -10px;\n top: -12px;\n bottom: 0;\n width: 2px;\n background: #e9ecef;\n}\n\n.child-item {\n margin-bottom: 12px;\n}\n\n.child-item .timeline-content {\n background: #f8f9fa;\n border-color: #e0e6ed;\n}\n\n/* Sub-run timeline styles */\n.sub-run-timeline {\n background: rgba(33, 150, 243, 0.02);\n border-left: 2px solid rgba(33, 150, 243, 0.2);\n margin-left: 20px;\n padding-left: 20px;\n margin-top: 8px;\n margin-bottom: 8px;\n}\n\n.sub-run-item .timeline-marker {\n border-width: 2px;\n}\n\n.sub-run-item .timeline-content {\n transition: all 0.2s ease;\n}\n\n/* JSON Detail Pane (in splitter) */\n.json-detail-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n border-left: 1px solid #e0e6ed;\n}\n\n.json-pane-header {\n padding: 16px 20px;\n background: #f8f9fa;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-shrink: 0;\n}\n\n.json-pane-header h3 {\n margin: 0;\n font-size: 16px;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 10px;\n font-weight: 600;\n}\n\n.json-pane-content {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.json-meta {\n padding: 16px 20px;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n flex-shrink: 0;\n}\n\n.json-meta .meta-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta label {\n font-size: 11px;\n color: #7c8798;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.json-meta span {\n font-size: 14px;\n color: #2c3e50;\n font-weight: 500;\n}\n\n.action-link {\n padding: 12px 20px;\n border-bottom: 1px solid #e0e6ed;\n flex-shrink: 0;\n}\n\n.action-link .btn-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: #2196f3;\n text-decoration: none;\n font-size: 14px;\n padding: 8px 12px;\n background: #f0f7ff;\n border: 1px solid #d0e5ff;\n border-radius: 4px;\n transition: all 0.2s;\n cursor: pointer;\n}\n\n.action-link .btn-link:hover {\n background: #e1f0ff;\n border-color: #b0d5ff;\n text-decoration: none;\n}\n\n\n.json-toolbar {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n/* Details Tab */\n.details-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n padding: 20px;\n}\n\n.detail-item {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-item.full-width {\n grid-column: 1 / -1;\n}\n\n.detail-item label {\n font-size: 12px;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-item span {\n font-size: 14px;\n color: #495057;\n}\n\n.error-message {\n background: #f8d7da;\n color: #721c24;\n padding: 12px;\n border-radius: 8px;\n font-size: 13px;\n}\n\n.result-viewer,\n.state-viewer {\n padding: 20px;\n max-height: 450px;\n overflow: auto;\n display: flex;\n flex-direction: column;\n}\n\n.result-viewer mj-code-editor,\n.state-viewer mj-code-editor {\n flex: 1;\n min-height: 0;\n}\n\n/* Empty States */\n.empty-state,\n.loading-state,\n.error-state {\n text-align: center;\n padding: 60px 20px;\n color: #6c757d;\n}\n\n.empty-state i,\n.loading-state i,\n.error-state i {\n opacity: 0.3;\n margin-bottom: 16px;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .header-content {\n flex-direction: column;\n gap: 16px;\n }\n \n .header-stats {\n flex-wrap: wrap;\n }\n \n .json-detail-pane {\n width: 100%;\n }\n \n .timeline {\n padding-left: 30px;\n }\n \n .timeline-marker {\n left: -25px;\n width: 32px;\n height: 32px;\n }\n \n .timeline-content {\n margin-left: 10px;\n }\n}\n\n/* Entity Link Styles */\n.entity-link {\n color: #2196f3;\n text-decoration: none;\n transition: all 0.2s ease;\n border-bottom: 1px solid transparent;\n display: inline-block;\n}\n\n.entity-link:hover {\n color: #1976d2;\n border-bottom-color: #1976d2;\n}\n\n.entity-link:active {\n color: #0d47a1;\n}\n\n/* Detail Pane Tabs */\n.detail-pane-tabs {\n display: flex;\n gap: 8px;\n margin: 8px 0 0 0;\n border-bottom: 1px solid #e0e6ed;\n padding: 0 16px;\n}\n\n.detail-tab {\n padding: 10px 16px;\n background: none;\n border: none;\n border-bottom: 3px solid transparent;\n color: #6c757d;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.detail-tab:hover {\n color: #495057;\n background: rgba(0, 0, 0, 0.02);\n}\n\n.detail-tab.active {\n color: #2196f3;\n border-bottom-color: #2196f3;\n}\n\n.detail-tab i {\n font-size: 14px;\n}\n\n/* Detail Pane Content */\n.detail-pane-content {\n flex: 1;\n overflow-y: auto;\n min-height: 0;\n margin-bottom: 35px;\n}\n\n.detail-pane-content.with-tabs {\n /* When tabs are shown, content starts right after tabs */\n margin-top: 0;\n}\n\n/* Step Payload Diff */\n.step-payload-diff {\n height: 100%;\n overflow-y: auto;\n padding: 16px;\n}\n\n.step-payload-diff mj-deep-diff {\n display: block;\n height: 100%;\n}\n\n/* JSON Viewer adjustments when no tabs */\n.detail-pane-content:not(.with-tabs) .json-viewer {\n margin-top: 16px;\n}"] }]
|
|
1077
|
-
}], () => [{ type: i0.ElementRef }, { type: i1.SharedService }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i3.AIAgentRunCostService }], { timelineComponent: [{
|
|
978
|
+
args: [{ selector: 'mj-ai-agent-run-form', template: "<div class=\"record-form-container ai-agent-run-form\">\n <div class=\"record-form\">\n <!-- Header -->\n <div class=\"header\">\n <div class=\"header-content\">\n <div class=\"header-left\">\n <div class=\"icon-wrapper\">\n <i class=\"fas fa-robot\"></i>\n </div>\n <div class=\"header-info\">\n <h2>AI Agent Run</h2>\n <div class=\"meta-info\">\n <span class=\"agent-name\" *ngIf=\"agent\">{{ agent.Name }}</span>\n <span class=\"run-id\">{{ record.ID }}</span>\n <span class=\"parent-run\" *ngIf=\"record.ParentRunID\">\n <i class=\"fas fa-level-up-alt\"></i>\n <a (click)=\"navigateToParentRun()\" class=\"parent-link\">Parent Run</a>\n </span>\n </div>\n </div>\n </div>\n <div class=\"header-right\">\n <div class=\"status-badge\" [attr.data-status]=\"record.Status\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon(record.Status || '')\"></i>\n {{ record.Status }}\n </div>\n <div class=\"header-actions\">\n <button class=\"btn-icon\" (click)=\"refreshData()\" title=\"Refresh\">\n <i class=\"fas fa-sync-alt\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"header-stats\">\n <div class=\"stat\">\n <span class=\"label\">Started</span>\n <span class=\"value\">{{ record.StartedAt | date:'medium' }}</span>\n </div>\n <div class=\"stat\" *ngIf=\"record.CompletedAt\">\n <span class=\"label\">Completed</span>\n <span class=\"value\">{{ record.CompletedAt | date:'medium' }}</span>\n </div>\n <div class=\"stat\" *ngIf=\"record.CompletedAt\">\n <span class=\"label\">Duration</span>\n <span class=\"value\">{{ calculateDuration(record.StartedAt, record.CompletedAt) }}</span>\n </div>\n <div class=\"stat\" *ngIf=\"record.Success !== null && record.CompletedAt !== null\">\n <span class=\"label\">Result</span>\n <span class=\"value\" [class.success]=\"record.Success\" [class.error]=\"!record.Success\">\n {{ record.Success ? 'Success' : 'Failed' }}\n </span>\n </div>\n <div class=\"stat\" *ngIf=\"costMetrics && (costMetrics.totalTokensInput + costMetrics.totalTokensOutput) > 0\">\n <span class=\"label\">Tokens</span>\n <span class=\"value\" *ngIf=\"!costMetrics.isLoading\">{{ (costMetrics.totalTokensInput + costMetrics.totalTokensOutput) | number:'1.0-0' }}</span>\n <span class=\"value loading\" *ngIf=\"costMetrics.isLoading\"><i class=\"fas fa-spinner fa-spin\"></i></span>\n </div>\n <div class=\"stat\" *ngIf=\"costMetrics && costMetrics.totalCost > 0\">\n <span class=\"label\">Cost</span>\n <span class=\"value\" *ngIf=\"!costMetrics.isLoading\">${{ costMetrics.totalCost | number:'1.2-4' }}</span>\n <span class=\"value loading\" *ngIf=\"costMetrics.isLoading\"><i class=\"fas fa-spinner fa-spin\"></i></span>\n </div>\n </div>\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs\">\n <button class=\"tab\" [class.active]=\"activeTab === 'timeline'\" (click)=\"changeTab('timeline')\">\n <i class=\"fas fa-stream\"></i> Timeline\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'visualization'\" (click)=\"changeTab('visualization')\">\n <i class=\"fas fa-diagram-project\"></i> Visualization\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'analytics'\" (click)=\"changeTab('analytics')\">\n <i class=\"fas fa-chart-line\"></i> Analytics\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'details'\" (click)=\"changeTab('details')\">\n <i class=\"fas fa-info-circle\"></i> Details\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"content-area\">\n <!-- Timeline Tab -->\n <div class=\"tab-content\" *ngIf=\"activeTab === 'timeline'\" style=\"height: 100%;\">\n <kendo-splitter style=\"height: 100%;\" orientation=\"horizontal\">\n <!-- Timeline Pane -->\n <kendo-splitter-pane [min]=\"'400px'\">\n <mj-ai-agent-run-timeline\n [aiAgentRunId]=\"record.ID\"\n [autoRefresh]=\"record.Status === 'Running'\"\n [refreshInterval]=\"3000\"\n (itemSelected)=\"selectTimelineItem($event)\"\n (navigateToEntity)=\"navigateToEntityRecord($event)\">\n </mj-ai-agent-run-timeline>\n </kendo-splitter-pane>\n \n <!-- JSON Detail Pane -->\n <kendo-splitter-pane [size]=\"'45%'\" [min]=\"'300px'\" [collapsed]=\"!selectedTimelineItem\">\n <mj-ai-agent-run-step-detail\n [selectedTimelineItem]=\"selectedTimelineItem\"\n (closePanel)=\"closeJsonPanel()\"\n (navigateToActionLog)=\"navigateToActionLog($event)\"\n (copyToClipboard)=\"copyToClipboard($event)\">\n </mj-ai-agent-run-step-detail>\n </kendo-splitter-pane>\n </kendo-splitter>\n </div>\n\n <!-- Visualization Tab -->\n <div class=\"tab-content\" *ngIf=\"activeTab === 'visualization'\" style=\"height: 100%;\">\n <mj-ai-agent-run-visualization\n #visualizationComponent\n [aiAgentRunId]=\"record.ID\"\n *ngIf=\"visualizationLoaded\">\n </mj-ai-agent-run-visualization>\n </div>\n\n <!-- Analytics Tab -->\n <div class=\"tab-content\" *ngIf=\"activeTab === 'analytics'\" style=\"height: 100%;\">\n <mj-ai-agent-run-analytics \n #analyticsComponent\n [agentRunId]=\"record.ID\"\n *ngIf=\"analyticsLoaded\">\n </mj-ai-agent-run-analytics>\n </div>\n\n <!-- Details Tab -->\n <div class=\"tab-content\" *ngIf=\"activeTab === 'details'\">\n <kendo-panelbar [keepItemContent]=\"true\">\n <kendo-panelbar-item title=\"General Information\" [expanded]=\"true\">\n <ng-template kendoPanelBarContent>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Agent</label>\n <span>\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('AI Agents', record.AgentID)\">\n {{ agent?.Name || 'N/A' }}\n </a>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Parent Run ID</label>\n <span>\n <a *ngIf=\"record.ParentRunID\" href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Agent Runs', record.ParentRunID)\">\n {{ record.ParentRunID }}\n </a>\n <span *ngIf=\"!record.ParentRunID\">None (Root)</span>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Last Run ID</label>\n <span>\n <a *ngIf=\"record.LastRunID\" href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Agent Runs', record.LastRunID)\">\n {{ record.LastRunID }}\n </a>\n <span *ngIf=\"!record.LastRunID\">None</span>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Conversation ID</label>\n <span>\n <a *ngIf=\"record.ConversationID\" href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('Conversations', record.ConversationID)\">\n {{ record.ConversationID }}\n </a>\n <span *ngIf=\"!record.ConversationID\">N/A</span>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>User</label>\n <span>\n <a *ngIf=\"record.UserID\" href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('Users', record.UserID)\">\n {{ record.User || 'N/A' }}\n </a>\n <span *ngIf=\"!record.UserID\">N/A</span>\n </span>\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Execution Status\">\n <ng-template kendoPanelBarContent>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Status</label>\n <span class=\"status-badge\" [attr.data-status]=\"record.Status\">\n {{ record.Status }}\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Success</label>\n <span [class.success]=\"record.Success\" [class.error]=\"record.Success === false\">\n {{ record.Success === null ? 'In Progress' : (record.Success ? 'Yes' : 'No') }}\n </span>\n </div>\n <div class=\"detail-item full-width\" *ngIf=\"record.ErrorMessage\">\n <label>Error Message</label>\n <div class=\"error-message\">{{ record.ErrorMessage }}</div>\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Usage & Cost\">\n <ng-template kendoPanelBarContent>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Total Tokens Used</label>\n <span>{{ record.TotalTokensUsed ? (record.TotalTokensUsed | number:'1.0-0') : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Prompt Tokens</label>\n <span>{{ record.TotalPromptTokensUsed ? (record.TotalPromptTokensUsed | number:'1.0-0') : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Completion Tokens</label>\n <span>{{ record.TotalCompletionTokensUsed ? (record.TotalCompletionTokensUsed | number:'1.0-0') : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Total Cost</label>\n <span>{{ record.TotalCost != null ? ('$' + (record.TotalCost | number:'1.2-4')) : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Total Prompt Iterations</label>\n <span>{{ record.TotalPromptIterations != null ? (record.TotalPromptIterations | number:'1.0-0') : 'N/A' }}</span>\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Result\" *ngIf=\"record.Result\">\n <ng-template kendoPanelBarContent>\n <div class=\"result-viewer\">\n <mj-code-editor\n [ngModel]=\"parsedResult\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Starting Payload\" *ngIf=\"record.StartingPayload\">\n <ng-template kendoPanelBarContent>\n <div class=\"result-viewer\">\n <mj-code-editor\n [ngModel]=\"parsedStartingPayload\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Final Payload\" *ngIf=\"record.FinalPayload\">\n <ng-template kendoPanelBarContent>\n <div class=\"result-viewer\">\n <mj-code-editor\n [ngModel]=\"parsedFinalPayload\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Payload Diff\" *ngIf=\"showPayloadDiff\">\n <ng-template kendoPanelBarContent>\n <div style=\"padding: 20px; background: #f8f9fa;\">\n <mj-deep-diff\n [oldValue]=\"startingPayloadObject\"\n [newValue]=\"finalPayloadObject\"\n [title]=\"''\"\n [showSummary]=\"true\"\n [showUnchanged]=\"false\"\n [expandAll]=\"false\"\n [maxDepth]=\"10\"\n [maxStringLength]=\"200\"\n [treatNullAsUndefined]=\"true\">\n </mj-deep-diff>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n </kendo-panelbar>\n </div>\n </div>\n </div>\n</div>", styles: [".ai-agent-run-form {\n height: 100%;\n overflow: auto;\n}\n\n/* Header Styles */\n.header {\n background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);\n border-bottom: 1px solid #e0e6ed;\n padding: 20px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n}\n\n.header-content {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 16px;\n}\n\n.header-left {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.icon-wrapper {\n width: 48px;\n height: 48px;\n background: linear-gradient(135deg, #2196f3, #1976d2);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 20px;\n}\n\n.header-info h2 {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.meta-info {\n display: flex;\n gap: 12px;\n margin-top: 4px;\n font-size: 14px;\n color: #6c757d;\n}\n\n.parent-run {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.parent-link {\n color: #ff6358;\n text-decoration: none;\n cursor: pointer;\n transition: color 0.2s;\n}\n\n.parent-link:hover {\n color: #ff4444;\n text-decoration: underline;\n}\n\n.agent-name {\n font-weight: 500;\n color: #495057;\n}\n\n.run-id {\n font-family: monospace;\n font-size: 12px;\n opacity: 0.7;\n}\n\n.header-right {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.status-badge {\n padding: 6px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.status-badge[data-status=\"Running\"] {\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.status-badge[data-status=\"Completed\"] {\n background: #d4edda;\n color: #155724;\n}\n\n.status-badge[data-status=\"Failed\"] {\n background: #f8d7da;\n color: #721c24;\n}\n\n.status-badge[data-status=\"Cancelled\"] {\n background: #fff3cd;\n color: #856404;\n}\n\n.status-badge[data-status=\"Paused\"] {\n background: #e2e3e5;\n color: #383d41;\n}\n\n.status-badge.small {\n padding: 4px 12px;\n font-size: 11px;\n}\n\n.header-actions {\n display: flex;\n gap: 8px;\n}\n\n.btn-icon {\n width: 36px;\n height: 36px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n}\n\n.btn-icon:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n color: #495057;\n}\n\n.header-stats {\n display: flex;\n gap: 24px;\n padding-top: 12px;\n border-top: 1px solid #e9ecef;\n}\n\n.stat {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.stat .label {\n font-size: 12px;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat .value {\n font-size: 14px;\n font-weight: 500;\n color: #495057;\n}\n\n.stat .value.success {\n color: #28a745;\n}\n\n.stat .value.error {\n color: #dc3545;\n}\n\n/* Tabs */\n.tabs {\n display: flex;\n border-bottom: 1px solid #dee2e6;\n background: #f8f9fa;\n}\n\n.tab {\n padding: 12px 24px;\n border: none;\n background: transparent;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: #6c757d;\n display: flex;\n align-items: center;\n gap: 8px;\n transition: all 0.2s ease;\n border-bottom: 3px solid transparent;\n}\n\n.tab:hover {\n color: #495057;\n background: rgba(0,0,0,0.02);\n}\n\n.tab.active {\n color: #2196f3;\n border-bottom-color: #2196f3;\n background: white;\n}\n\n/* Content Area */\n.content-area {\n position: relative;\n height: calc(100vh - 280px);\n overflow: auto;\n background: white;\n}\n\n.tab-content {\n height: 100%;\n overflow: auto;\n}\n\n/* Details tab specific */\n.tab-content[ng-reflect-ng-if=\"true\"] > kendo-panelbar {\n height: 100%;\n overflow-y: auto;\n}\n\n/* JSON Detail Pane */\n.json-detail-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: #f8f9fa;\n border-left: 1px solid #e0e6ed;\n}\n\n.json-pane-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: white;\n border-bottom: 1px solid #e0e6ed;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n}\n\n.json-pane-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.json-pane-header h3 i {\n color: #6b7280;\n font-size: 14px;\n}\n\n.json-pane-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: auto;\n padding: 16px;\n}\n\n.json-meta {\n display: flex;\n gap: 20px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.json-meta .meta-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta .meta-item label {\n font-size: 11px;\n text-transform: uppercase;\n color: #6b7280;\n font-weight: 600;\n letter-spacing: 0.5px;\n}\n\n.json-meta .meta-item span {\n font-size: 14px;\n color: #2c3e50;\n font-weight: 500;\n}\n\n.action-link {\n margin-bottom: 12px;\n}\n\n.action-link .btn-link {\n background: none;\n border: none;\n color: #2196f3;\n font-size: 14px;\n cursor: pointer;\n padding: 6px 12px;\n border-radius: 4px;\n transition: all 0.2s;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.action-link .btn-link:hover {\n background: rgba(33, 150, 243, 0.08);\n color: #1976d2;\n}\n\n.json-viewer {\n flex: 1;\n display: flex;\n flex-direction: column;\n background: white;\n border-radius: 8px;\n border: 1px solid #e0e6ed;\n overflow: auto;\n padding: 20px;\n gap: 10px;\n min-height: 0;\n margin-bottom: 45px;\n}\n\n\n.json-toolbar {\n display: flex;\n justify-content: flex-end;\n padding: 8px 12px;\n background: #f8f9fa;\n border-bottom: 1px solid #e0e6ed;\n}\n\n/* Timeline Styles */\n.timeline-container {\n height: 100%;\n overflow-y: auto;\n padding: 20px;\n}\n\n.timeline-container > .timeline {\n max-width: 900px;\n margin: 0 auto;\n}\n\n.timeline {\n position: relative;\n padding-left: 40px;\n}\n\n.timeline::before {\n content: '';\n position: absolute;\n left: 20px;\n top: 0;\n bottom: 0;\n width: 2px;\n background: #e9ecef;\n}\n\n.timeline-item {\n position: relative;\n margin-bottom: 24px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.timeline-item:hover {\n transform: translateX(4px);\n}\n\n.timeline-item.selected {\n transform: translateX(8px);\n}\n\n.timeline-item.selected .timeline-content {\n background: #f0f7ff;\n border-color: #2196f3;\n}\n\n.timeline-marker {\n position: absolute;\n left: -30px;\n top: 0;\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: white;\n border: 3px solid #e9ecef;\n z-index: 1;\n transition: all 0.2s ease;\n}\n\n.timeline-marker[data-color=\"success\"] {\n border-color: #28a745;\n color: #28a745;\n}\n\n.timeline-marker[data-color=\"error\"] {\n border-color: #dc3545;\n color: #dc3545;\n}\n\n.timeline-marker[data-color=\"info\"] {\n border-color: #17a2b8;\n color: #17a2b8;\n}\n\n.timeline-marker[data-color=\"warning\"] {\n border-color: #ffc107;\n color: #ffc107;\n}\n\n.timeline-marker[data-color=\"secondary\"] {\n border-color: #6c757d;\n color: #6c757d;\n}\n\n.timeline-marker.small {\n width: 28px;\n height: 28px;\n font-size: 12px;\n}\n\n.timeline-content {\n background: white;\n border: 1px solid #e9ecef;\n border-radius: 12px;\n padding: 16px 20px;\n margin-left: 20px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n transition: all 0.2s ease;\n}\n\n.timeline-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.timeline-header h4 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.timeline-header h5 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #495057;\n}\n\n.timeline-time {\n font-size: 12px;\n color: #6c757d;\n font-family: monospace;\n}\n\n.timeline-subtitle {\n font-size: 13px;\n color: #6c757d;\n margin-bottom: 8px;\n}\n\n.timeline-meta {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: #6c757d;\n}\n\n.timeline-meta .status {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.timeline-meta .status[data-status=\"Completed\"] {\n background: #d4edda;\n color: #155724;\n}\n\n.timeline-meta .status[data-status=\"Failed\"] {\n background: #f8d7da;\n color: #721c24;\n}\n\n.timeline-meta .status[data-status=\"Running\"] {\n background: #cce5ff;\n color: #004085;\n}\n\n.timeline-meta .status[data-status=\"Paused\"] {\n background: #e2e3e5;\n color: #383d41;\n}\n\n.duration {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.timeline-actions {\n position: absolute;\n right: 20px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn-link {\n background: none;\n border: none;\n color: #2196f3;\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s ease;\n}\n\n.btn-link:hover {\n background: rgba(33, 150, 243, 0.1);\n}\n\n.btn-expand {\n width: 24px;\n height: 24px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n font-size: 12px;\n}\n\n.btn-expand:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n color: #495057;\n}\n\n/* Timeline Children */\n.timeline-children {\n position: relative;\n margin-top: 12px;\n margin-bottom: 12px;\n}\n\n.timeline-children::before {\n content: '';\n position: absolute;\n left: -10px;\n top: -12px;\n bottom: 0;\n width: 2px;\n background: #e9ecef;\n}\n\n.child-item {\n margin-bottom: 12px;\n}\n\n.child-item .timeline-content {\n background: #f8f9fa;\n border-color: #e0e6ed;\n}\n\n/* Sub-run timeline styles */\n.sub-run-timeline {\n background: rgba(33, 150, 243, 0.02);\n border-left: 2px solid rgba(33, 150, 243, 0.2);\n margin-left: 20px;\n padding-left: 20px;\n margin-top: 8px;\n margin-bottom: 8px;\n}\n\n.sub-run-item .timeline-marker {\n border-width: 2px;\n}\n\n.sub-run-item .timeline-content {\n transition: all 0.2s ease;\n}\n\n/* JSON Detail Pane (in splitter) */\n.json-detail-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n border-left: 1px solid #e0e6ed;\n}\n\n.json-pane-header {\n padding: 16px 20px;\n background: #f8f9fa;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-shrink: 0;\n}\n\n.json-pane-header h3 {\n margin: 0;\n font-size: 16px;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 10px;\n font-weight: 600;\n}\n\n.json-pane-content {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.json-meta {\n padding: 16px 20px;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n flex-shrink: 0;\n}\n\n.json-meta .meta-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta label {\n font-size: 11px;\n color: #7c8798;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.json-meta span {\n font-size: 14px;\n color: #2c3e50;\n font-weight: 500;\n}\n\n.action-link {\n padding: 12px 20px;\n border-bottom: 1px solid #e0e6ed;\n flex-shrink: 0;\n}\n\n.action-link .btn-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: #2196f3;\n text-decoration: none;\n font-size: 14px;\n padding: 8px 12px;\n background: #f0f7ff;\n border: 1px solid #d0e5ff;\n border-radius: 4px;\n transition: all 0.2s;\n cursor: pointer;\n}\n\n.action-link .btn-link:hover {\n background: #e1f0ff;\n border-color: #b0d5ff;\n text-decoration: none;\n}\n\n\n.json-toolbar {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n/* Details Tab */\n.details-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n padding: 20px;\n}\n\n.detail-item {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-item.full-width {\n grid-column: 1 / -1;\n}\n\n.detail-item label {\n font-size: 12px;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-item span {\n font-size: 14px;\n color: #495057;\n}\n\n.error-message {\n background: #f8d7da;\n color: #721c24;\n padding: 12px;\n border-radius: 8px;\n font-size: 13px;\n}\n\n.result-viewer,\n.state-viewer {\n padding: 20px;\n max-height: 450px;\n overflow: auto;\n display: flex;\n flex-direction: column;\n}\n\n.result-viewer mj-code-editor,\n.state-viewer mj-code-editor {\n flex: 1;\n min-height: 0;\n}\n\n/* Empty States */\n.empty-state,\n.loading-state,\n.error-state {\n text-align: center;\n padding: 60px 20px;\n color: #6c757d;\n}\n\n.empty-state i,\n.loading-state i,\n.error-state i {\n opacity: 0.3;\n margin-bottom: 16px;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .header-content {\n flex-direction: column;\n gap: 16px;\n }\n \n .header-stats {\n flex-wrap: wrap;\n }\n \n .json-detail-pane {\n width: 100%;\n }\n \n .timeline {\n padding-left: 30px;\n }\n \n .timeline-marker {\n left: -25px;\n width: 32px;\n height: 32px;\n }\n \n .timeline-content {\n margin-left: 10px;\n }\n}\n\n/* Entity Link Styles */\n.entity-link {\n color: #2196f3;\n text-decoration: none;\n transition: all 0.2s ease;\n border-bottom: 1px solid transparent;\n display: inline-block;\n}\n\n.entity-link:hover {\n color: #1976d2;\n border-bottom-color: #1976d2;\n}\n\n.entity-link:active {\n color: #0d47a1;\n}\n\n/* Detail Pane Tabs */\n.detail-pane-tabs {\n display: flex;\n gap: 8px;\n margin: 8px 0 0 0;\n border-bottom: 1px solid #e0e6ed;\n padding: 0 16px;\n}\n\n.detail-tab {\n padding: 10px 16px;\n background: none;\n border: none;\n border-bottom: 3px solid transparent;\n color: #6c757d;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.detail-tab:hover {\n color: #495057;\n background: rgba(0, 0, 0, 0.02);\n}\n\n.detail-tab.active {\n color: #2196f3;\n border-bottom-color: #2196f3;\n}\n\n.detail-tab i {\n font-size: 14px;\n}\n\n/* Detail Pane Content */\n.detail-pane-content {\n flex: 1;\n overflow-y: auto;\n min-height: 0;\n margin-bottom: 35px;\n}\n\n.detail-pane-content.with-tabs {\n /* When tabs are shown, content starts right after tabs */\n margin-top: 0;\n}\n\n/* Step Payload Diff */\n.step-payload-diff {\n height: 100%;\n overflow-y: auto;\n padding: 16px;\n}\n\n.step-payload-diff mj-deep-diff {\n display: block;\n height: 100%;\n}\n\n/* JSON Viewer adjustments when no tabs */\n.detail-pane-content:not(.with-tabs) .json-viewer {\n margin-top: 16px;\n}"] }]
|
|
979
|
+
}], () => [{ type: i0.ElementRef }, { type: i1.SharedService }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i3.AIAgentRunCostService }, { type: i4.AIAgentRunDataService }], { timelineComponent: [{
|
|
1078
980
|
type: ViewChild,
|
|
1079
981
|
args: [AIAgentRunTimelineComponent]
|
|
1080
982
|
}], analyticsComponent: [{
|
|
1081
983
|
type: ViewChild,
|
|
1082
984
|
args: [AIAgentRunAnalyticsComponent]
|
|
985
|
+
}], visualizationComponent: [{
|
|
986
|
+
type: ViewChild,
|
|
987
|
+
args: [AIAgentRunVisualizationComponent]
|
|
1083
988
|
}] }); })();
|
|
1084
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIAgentRunFormComponentExtended, { className: "AIAgentRunFormComponentExtended", filePath: "src/lib/custom/ai-agent-run/ai-agent-run.component.ts", lineNumber:
|
|
989
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIAgentRunFormComponentExtended, { className: "AIAgentRunFormComponentExtended", filePath: "src/lib/custom/ai-agent-run/ai-agent-run.component.ts", lineNumber: 23 }); })();
|
|
1085
990
|
// Loader function for AIAgentRunFormComponent
|
|
1086
991
|
export function LoadAIAgentRunFormComponent() {
|
|
1087
992
|
// This function is called to ensure the form is loaded
|