@memberjunction/ng-core-entity-forms 2.74.0 → 2.76.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.d.ts +11 -6
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +459 -448
- 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.d.ts +35 -7
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +235 -219
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts +37 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts.map +1 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js +117 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js.map +1 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-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-step-node.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js +0 -8
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +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 -189
- 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 +10 -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 +257 -295
- 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/AIPromptRun/sections/details.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/AIPromptRun/sections/details.component.js +15 -4
- package/dist/lib/generated/Entities/AIPromptRun/sections/details.component.js.map +1 -1
- package/dist/lib/generated/Entities/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,18 +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
|
-
import * as i3 from "
|
|
22
|
-
import * as i4 from "
|
|
23
|
-
import * as i5 from "@
|
|
24
|
-
import * as i6 from "@
|
|
25
|
-
import * as i7 from "@
|
|
26
|
-
import * as i8 from "
|
|
27
|
-
import * as i9 from "
|
|
21
|
+
import * as i3 from "./ai-agent-run-cost.service";
|
|
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";
|
|
28
32
|
function AIAgentRunFormComponentExtended_span_11_Template(rf, ctx) { if (rf & 1) {
|
|
29
|
-
i0.ɵɵelementStart(0, "span",
|
|
33
|
+
i0.ɵɵelementStart(0, "span", 34);
|
|
30
34
|
i0.ɵɵtext(1);
|
|
31
35
|
i0.ɵɵelementEnd();
|
|
32
36
|
} if (rf & 2) {
|
|
@@ -36,18 +40,18 @@ function AIAgentRunFormComponentExtended_span_11_Template(rf, ctx) { if (rf & 1)
|
|
|
36
40
|
} }
|
|
37
41
|
function AIAgentRunFormComponentExtended_span_14_Template(rf, ctx) { if (rf & 1) {
|
|
38
42
|
const _r2 = i0.ɵɵgetCurrentView();
|
|
39
|
-
i0.ɵɵelementStart(0, "span",
|
|
40
|
-
i0.ɵɵelement(1, "i",
|
|
41
|
-
i0.ɵɵelementStart(2, "a",
|
|
43
|
+
i0.ɵɵelementStart(0, "span", 35);
|
|
44
|
+
i0.ɵɵelement(1, "i", 36);
|
|
45
|
+
i0.ɵɵelementStart(2, "a", 37);
|
|
42
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()); });
|
|
43
47
|
i0.ɵɵtext(3, "Parent Run");
|
|
44
48
|
i0.ɵɵelementEnd()();
|
|
45
49
|
} }
|
|
46
50
|
function AIAgentRunFormComponentExtended_div_29_Template(rf, ctx) { if (rf & 1) {
|
|
47
|
-
i0.ɵɵelementStart(0, "div",
|
|
51
|
+
i0.ɵɵelementStart(0, "div", 21)(1, "span", 22);
|
|
48
52
|
i0.ɵɵtext(2, "Completed");
|
|
49
53
|
i0.ɵɵelementEnd();
|
|
50
|
-
i0.ɵɵelementStart(3, "span",
|
|
54
|
+
i0.ɵɵelementStart(3, "span", 23);
|
|
51
55
|
i0.ɵɵtext(4);
|
|
52
56
|
i0.ɵɵpipe(5, "date");
|
|
53
57
|
i0.ɵɵelementEnd()();
|
|
@@ -57,10 +61,10 @@ function AIAgentRunFormComponentExtended_div_29_Template(rf, ctx) { if (rf & 1)
|
|
|
57
61
|
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r0.record.CompletedAt, "medium"));
|
|
58
62
|
} }
|
|
59
63
|
function AIAgentRunFormComponentExtended_div_30_Template(rf, ctx) { if (rf & 1) {
|
|
60
|
-
i0.ɵɵelementStart(0, "div",
|
|
64
|
+
i0.ɵɵelementStart(0, "div", 21)(1, "span", 22);
|
|
61
65
|
i0.ɵɵtext(2, "Duration");
|
|
62
66
|
i0.ɵɵelementEnd();
|
|
63
|
-
i0.ɵɵelementStart(3, "span",
|
|
67
|
+
i0.ɵɵelementStart(3, "span", 23);
|
|
64
68
|
i0.ɵɵtext(4);
|
|
65
69
|
i0.ɵɵelementEnd()();
|
|
66
70
|
} if (rf & 2) {
|
|
@@ -69,10 +73,10 @@ function AIAgentRunFormComponentExtended_div_30_Template(rf, ctx) { if (rf & 1)
|
|
|
69
73
|
i0.ɵɵtextInterpolate(ctx_r0.calculateDuration(ctx_r0.record.StartedAt, ctx_r0.record.CompletedAt));
|
|
70
74
|
} }
|
|
71
75
|
function AIAgentRunFormComponentExtended_div_31_Template(rf, ctx) { if (rf & 1) {
|
|
72
|
-
i0.ɵɵelementStart(0, "div",
|
|
76
|
+
i0.ɵɵelementStart(0, "div", 21)(1, "span", 22);
|
|
73
77
|
i0.ɵɵtext(2, "Result");
|
|
74
78
|
i0.ɵɵelementEnd();
|
|
75
|
-
i0.ɵɵelementStart(3, "span",
|
|
79
|
+
i0.ɵɵelementStart(3, "span", 23);
|
|
76
80
|
i0.ɵɵtext(4);
|
|
77
81
|
i0.ɵɵelementEnd()();
|
|
78
82
|
} if (rf & 2) {
|
|
@@ -82,148 +86,70 @@ function AIAgentRunFormComponentExtended_div_31_Template(rf, ctx) { if (rf & 1)
|
|
|
82
86
|
i0.ɵɵadvance();
|
|
83
87
|
i0.ɵɵtextInterpolate1(" ", ctx_r0.record.Success ? "Success" : "Failed", " ");
|
|
84
88
|
} }
|
|
85
|
-
function
|
|
86
|
-
i0.ɵɵelementStart(0, "
|
|
87
|
-
i0.ɵɵtext(
|
|
89
|
+
function AIAgentRunFormComponentExtended_div_32_span_3_Template(rf, ctx) { if (rf & 1) {
|
|
90
|
+
i0.ɵɵelementStart(0, "span", 23);
|
|
91
|
+
i0.ɵɵtext(1);
|
|
92
|
+
i0.ɵɵpipe(2, "number");
|
|
88
93
|
i0.ɵɵelementEnd();
|
|
89
|
-
i0.ɵɵelementStart(3, "span", 22);
|
|
90
|
-
i0.ɵɵtext(4);
|
|
91
|
-
i0.ɵɵpipe(5, "number");
|
|
92
|
-
i0.ɵɵelementEnd()();
|
|
93
94
|
} if (rf & 2) {
|
|
94
|
-
const ctx_r0 = i0.ɵɵnextContext();
|
|
95
|
-
i0.ɵɵadvance(
|
|
96
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(
|
|
95
|
+
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
96
|
+
i0.ɵɵadvance();
|
|
97
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(2, 1, ctx_r0.costMetrics.totalTokensInput + ctx_r0.costMetrics.totalTokensOutput, "1.0-0"));
|
|
97
98
|
} }
|
|
98
|
-
function
|
|
99
|
-
i0.ɵɵelementStart(0, "
|
|
100
|
-
i0.ɵɵ
|
|
99
|
+
function AIAgentRunFormComponentExtended_div_32_span_4_Template(rf, ctx) { if (rf & 1) {
|
|
100
|
+
i0.ɵɵelementStart(0, "span", 40);
|
|
101
|
+
i0.ɵɵelement(1, "i", 41);
|
|
101
102
|
i0.ɵɵelementEnd();
|
|
102
|
-
i0.ɵɵelementStart(3, "span", 22);
|
|
103
|
-
i0.ɵɵtext(4);
|
|
104
|
-
i0.ɵɵpipe(5, "number");
|
|
105
|
-
i0.ɵɵelementEnd()();
|
|
106
|
-
} if (rf & 2) {
|
|
107
|
-
const ctx_r0 = i0.ɵɵnextContext();
|
|
108
|
-
i0.ɵɵadvance(4);
|
|
109
|
-
i0.ɵɵtextInterpolate1("$", i0.ɵɵpipeBind2(5, 1, ctx_r0.record.TotalCost, "1.2-4"), "");
|
|
110
|
-
} }
|
|
111
|
-
function AIAgentRunFormComponentExtended_div_45_div_5_div_24_Template(rf, ctx) { if (rf & 1) {
|
|
112
|
-
const _r5 = i0.ɵɵgetCurrentView();
|
|
113
|
-
i0.ɵɵelementStart(0, "div", 55)(1, "button", 56);
|
|
114
|
-
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)); });
|
|
115
|
-
i0.ɵɵelement(2, "i", 57);
|
|
116
|
-
i0.ɵɵtext(3, " View Action Execution Log ");
|
|
117
|
-
i0.ɵɵelementEnd()();
|
|
118
103
|
} }
|
|
119
|
-
function
|
|
120
|
-
|
|
121
|
-
i0.ɵɵ
|
|
122
|
-
i0.ɵɵ
|
|
123
|
-
i0.ɵɵ
|
|
124
|
-
i0.ɵɵtext(3, " Payload Changes ");
|
|
104
|
+
function AIAgentRunFormComponentExtended_div_32_Template(rf, ctx) { if (rf & 1) {
|
|
105
|
+
i0.ɵɵelementStart(0, "div", 21)(1, "span", 22);
|
|
106
|
+
i0.ɵɵtext(2, "Tokens");
|
|
107
|
+
i0.ɵɵelementEnd();
|
|
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);
|
|
125
109
|
i0.ɵɵelementEnd();
|
|
126
|
-
i0.ɵɵelementStart(4, "button", 58);
|
|
127
|
-
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"); });
|
|
128
|
-
i0.ɵɵelement(5, "i", 60);
|
|
129
|
-
i0.ɵɵtext(6, " Full JSON ");
|
|
130
|
-
i0.ɵɵelementEnd()();
|
|
131
110
|
} if (rf & 2) {
|
|
132
|
-
const ctx_r0 = i0.ɵɵnextContext(
|
|
133
|
-
i0.ɵɵadvance();
|
|
134
|
-
i0.ɵɵclassProp("active", ctx_r0.detailPaneTab === "diff");
|
|
111
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
135
112
|
i0.ɵɵadvance(3);
|
|
136
|
-
i0.ɵɵ
|
|
113
|
+
i0.ɵɵproperty("ngIf", !ctx_r0.costMetrics.isLoading);
|
|
114
|
+
i0.ɵɵadvance();
|
|
115
|
+
i0.ɵɵproperty("ngIf", ctx_r0.costMetrics.isLoading);
|
|
137
116
|
} }
|
|
138
|
-
function
|
|
139
|
-
i0.ɵɵelementStart(0, "
|
|
140
|
-
i0.ɵɵ
|
|
117
|
+
function AIAgentRunFormComponentExtended_div_33_span_3_Template(rf, ctx) { if (rf & 1) {
|
|
118
|
+
i0.ɵɵelementStart(0, "span", 23);
|
|
119
|
+
i0.ɵɵtext(1);
|
|
120
|
+
i0.ɵɵpipe(2, "number");
|
|
141
121
|
i0.ɵɵelementEnd();
|
|
142
122
|
} if (rf & 2) {
|
|
143
|
-
const ctx_r0 = i0.ɵɵnextContext(
|
|
123
|
+
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
144
124
|
i0.ɵɵadvance();
|
|
145
|
-
i0.ɵɵ
|
|
146
|
-
} }
|
|
147
|
-
function AIAgentRunFormComponentExtended_div_45_div_5_Conditional_28_Template(rf, ctx) { if (rf & 1) {
|
|
148
|
-
const _r7 = i0.ɵɵgetCurrentView();
|
|
149
|
-
i0.ɵɵelementStart(0, "div", 54)(1, "div", 62)(2, "button", 63);
|
|
150
|
-
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())); });
|
|
151
|
-
i0.ɵɵelement(3, "i", 64);
|
|
152
|
-
i0.ɵɵelementEnd()();
|
|
153
|
-
i0.ɵɵelementStart(4, "mj-code-editor", 65);
|
|
154
|
-
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); });
|
|
155
|
-
i0.ɵɵelementEnd()();
|
|
156
|
-
} if (rf & 2) {
|
|
157
|
-
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
158
|
-
i0.ɵɵadvance(4);
|
|
159
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.selectedItemJsonString);
|
|
160
|
-
i0.ɵɵproperty("language", "json")("readonly", true);
|
|
125
|
+
i0.ɵɵtextInterpolate1("$", i0.ɵɵpipeBind2(2, 1, ctx_r0.costMetrics.totalCost, "1.2-4"), "");
|
|
161
126
|
} }
|
|
162
|
-
function
|
|
163
|
-
|
|
164
|
-
i0.ɵɵ
|
|
165
|
-
i0.ɵɵelement(3, "i", 15);
|
|
166
|
-
i0.ɵɵtext(4);
|
|
167
|
-
i0.ɵɵelementEnd();
|
|
168
|
-
i0.ɵɵelementStart(5, "button", 44);
|
|
169
|
-
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()); });
|
|
170
|
-
i0.ɵɵelement(6, "i", 45);
|
|
171
|
-
i0.ɵɵelementEnd()();
|
|
172
|
-
i0.ɵɵelementStart(7, "div", 46)(8, "div", 47)(9, "div", 48)(10, "label");
|
|
173
|
-
i0.ɵɵtext(11, "Type");
|
|
127
|
+
function AIAgentRunFormComponentExtended_div_33_span_4_Template(rf, ctx) { if (rf & 1) {
|
|
128
|
+
i0.ɵɵelementStart(0, "span", 40);
|
|
129
|
+
i0.ɵɵelement(1, "i", 41);
|
|
174
130
|
i0.ɵɵelementEnd();
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
i0.ɵɵ
|
|
178
|
-
i0.ɵɵ
|
|
179
|
-
i0.ɵɵtext(16, "Status");
|
|
131
|
+
} }
|
|
132
|
+
function AIAgentRunFormComponentExtended_div_33_Template(rf, ctx) { if (rf & 1) {
|
|
133
|
+
i0.ɵɵelementStart(0, "div", 21)(1, "span", 22);
|
|
134
|
+
i0.ɵɵtext(2, "Cost");
|
|
180
135
|
i0.ɵɵelementEnd();
|
|
181
|
-
i0.ɵɵ
|
|
182
|
-
i0.ɵɵtext(18);
|
|
183
|
-
i0.ɵɵelementEnd()();
|
|
184
|
-
i0.ɵɵelementStart(19, "div", 48)(20, "label");
|
|
185
|
-
i0.ɵɵtext(21, "Duration");
|
|
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);
|
|
186
137
|
i0.ɵɵelementEnd();
|
|
187
|
-
i0.ɵɵelementStart(22, "span");
|
|
188
|
-
i0.ɵɵtext(23);
|
|
189
|
-
i0.ɵɵelementEnd()()();
|
|
190
|
-
i0.ɵɵtemplate(24, AIAgentRunFormComponentExtended_div_45_div_5_div_24_Template, 4, 0, "div", 50)(25, AIAgentRunFormComponentExtended_div_45_div_5_Conditional_25_Template, 7, 4, "div", 51);
|
|
191
|
-
i0.ɵɵelementStart(26, "div", 52);
|
|
192
|
-
i0.ɵɵtemplate(27, AIAgentRunFormComponentExtended_div_45_div_5_Conditional_27_Template, 2, 9, "div", 53)(28, AIAgentRunFormComponentExtended_div_45_div_5_Conditional_28_Template, 5, 3, "div", 54);
|
|
193
|
-
i0.ɵɵelementEnd()()();
|
|
194
138
|
} if (rf & 2) {
|
|
195
|
-
const ctx_r0 = i0.ɵɵnextContext(
|
|
139
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
196
140
|
i0.ɵɵadvance(3);
|
|
197
|
-
i0.ɵɵproperty("
|
|
198
|
-
i0.ɵɵadvance();
|
|
199
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r0.selectedTimelineItem.title, " ");
|
|
200
|
-
i0.ɵɵadvance(9);
|
|
201
|
-
i0.ɵɵtextInterpolate(ctx_r0.selectedTimelineItem.type);
|
|
202
|
-
i0.ɵɵadvance(4);
|
|
203
|
-
i0.ɵɵattribute("data-status", ctx_r0.selectedTimelineItem.status);
|
|
204
|
-
i0.ɵɵadvance();
|
|
205
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r0.selectedTimelineItem.status, " ");
|
|
206
|
-
i0.ɵɵadvance(5);
|
|
207
|
-
i0.ɵɵtextInterpolate(ctx_r0.selectedTimelineItem.duration || "N/A");
|
|
141
|
+
i0.ɵɵproperty("ngIf", !ctx_r0.costMetrics.isLoading);
|
|
208
142
|
i0.ɵɵadvance();
|
|
209
|
-
i0.ɵɵproperty("ngIf", ctx_r0.
|
|
210
|
-
i0.ɵɵadvance();
|
|
211
|
-
i0.ɵɵconditional(ctx_r0.showStepPayloadDiff ? 25 : -1);
|
|
212
|
-
i0.ɵɵadvance();
|
|
213
|
-
i0.ɵɵclassProp("with-tabs", ctx_r0.showStepPayloadDiff);
|
|
214
|
-
i0.ɵɵadvance();
|
|
215
|
-
i0.ɵɵconditional(ctx_r0.detailPaneTab === "diff" && ctx_r0.showStepPayloadDiff ? 27 : -1);
|
|
216
|
-
i0.ɵɵadvance();
|
|
217
|
-
i0.ɵɵconditional(ctx_r0.detailPaneTab === "json" || !ctx_r0.showStepPayloadDiff ? 28 : -1);
|
|
143
|
+
i0.ɵɵproperty("ngIf", ctx_r0.costMetrics.isLoading);
|
|
218
144
|
} }
|
|
219
|
-
function
|
|
145
|
+
function AIAgentRunFormComponentExtended_div_48_Template(rf, ctx) { if (rf & 1) {
|
|
220
146
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
221
|
-
i0.ɵɵelementStart(0, "div",
|
|
222
|
-
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)); });
|
|
223
149
|
i0.ɵɵelementEnd()();
|
|
224
|
-
i0.ɵɵelementStart(4, "kendo-splitter-pane",
|
|
225
|
-
i0.ɵɵ
|
|
226
|
-
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()()()();
|
|
227
153
|
} if (rf & 2) {
|
|
228
154
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
229
155
|
i0.ɵɵadvance(2);
|
|
@@ -233,27 +159,42 @@ function AIAgentRunFormComponentExtended_div_45_Template(rf, ctx) { if (rf & 1)
|
|
|
233
159
|
i0.ɵɵadvance();
|
|
234
160
|
i0.ɵɵproperty("size", "45%")("min", "300px")("collapsed", !ctx_r0.selectedTimelineItem);
|
|
235
161
|
i0.ɵɵadvance();
|
|
236
|
-
i0.ɵɵproperty("
|
|
162
|
+
i0.ɵɵproperty("selectedTimelineItem", ctx_r0.selectedTimelineItem);
|
|
237
163
|
} }
|
|
238
|
-
function
|
|
239
|
-
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);
|
|
240
181
|
} if (rf & 2) {
|
|
241
182
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
242
183
|
i0.ɵɵproperty("agentRunId", ctx_r0.record.ID);
|
|
243
184
|
} }
|
|
244
|
-
function
|
|
245
|
-
i0.ɵɵelementStart(0, "div",
|
|
246
|
-
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);
|
|
247
188
|
i0.ɵɵelementEnd();
|
|
248
189
|
} if (rf & 2) {
|
|
249
190
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
250
191
|
i0.ɵɵadvance();
|
|
251
192
|
i0.ɵɵproperty("ngIf", ctx_r0.analyticsLoaded);
|
|
252
193
|
} }
|
|
253
|
-
function
|
|
254
|
-
const
|
|
255
|
-
i0.ɵɵelementStart(0, "a",
|
|
256
|
-
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)); });
|
|
257
198
|
i0.ɵɵtext(1);
|
|
258
199
|
i0.ɵɵelementEnd();
|
|
259
200
|
} if (rf & 2) {
|
|
@@ -261,15 +202,15 @@ function AIAgentRunFormComponentExtended_div_47_ng_template_3_a_11_Template(rf,
|
|
|
261
202
|
i0.ɵɵadvance();
|
|
262
203
|
i0.ɵɵtextInterpolate1(" ", ctx_r0.record.ParentRunID, " ");
|
|
263
204
|
} }
|
|
264
|
-
function
|
|
205
|
+
function AIAgentRunFormComponentExtended_div_51_ng_template_3_span_12_Template(rf, ctx) { if (rf & 1) {
|
|
265
206
|
i0.ɵɵelementStart(0, "span");
|
|
266
207
|
i0.ɵɵtext(1, "None (Root)");
|
|
267
208
|
i0.ɵɵelementEnd();
|
|
268
209
|
} }
|
|
269
|
-
function
|
|
270
|
-
const
|
|
271
|
-
i0.ɵɵelementStart(0, "a",
|
|
272
|
-
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)); });
|
|
273
214
|
i0.ɵɵtext(1);
|
|
274
215
|
i0.ɵɵelementEnd();
|
|
275
216
|
} if (rf & 2) {
|
|
@@ -277,15 +218,15 @@ function AIAgentRunFormComponentExtended_div_47_ng_template_3_a_17_Template(rf,
|
|
|
277
218
|
i0.ɵɵadvance();
|
|
278
219
|
i0.ɵɵtextInterpolate1(" ", ctx_r0.record.LastRunID, " ");
|
|
279
220
|
} }
|
|
280
|
-
function
|
|
221
|
+
function AIAgentRunFormComponentExtended_div_51_ng_template_3_span_18_Template(rf, ctx) { if (rf & 1) {
|
|
281
222
|
i0.ɵɵelementStart(0, "span");
|
|
282
223
|
i0.ɵɵtext(1, "None");
|
|
283
224
|
i0.ɵɵelementEnd();
|
|
284
225
|
} }
|
|
285
|
-
function
|
|
286
|
-
const
|
|
287
|
-
i0.ɵɵelementStart(0, "a",
|
|
288
|
-
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)); });
|
|
289
230
|
i0.ɵɵtext(1);
|
|
290
231
|
i0.ɵɵelementEnd();
|
|
291
232
|
} if (rf & 2) {
|
|
@@ -293,15 +234,15 @@ function AIAgentRunFormComponentExtended_div_47_ng_template_3_a_23_Template(rf,
|
|
|
293
234
|
i0.ɵɵadvance();
|
|
294
235
|
i0.ɵɵtextInterpolate1(" ", ctx_r0.record.ConversationID, " ");
|
|
295
236
|
} }
|
|
296
|
-
function
|
|
237
|
+
function AIAgentRunFormComponentExtended_div_51_ng_template_3_span_24_Template(rf, ctx) { if (rf & 1) {
|
|
297
238
|
i0.ɵɵelementStart(0, "span");
|
|
298
239
|
i0.ɵɵtext(1, "N/A");
|
|
299
240
|
i0.ɵɵelementEnd();
|
|
300
241
|
} }
|
|
301
|
-
function
|
|
302
|
-
const
|
|
303
|
-
i0.ɵɵelementStart(0, "a",
|
|
304
|
-
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)); });
|
|
305
246
|
i0.ɵɵtext(1);
|
|
306
247
|
i0.ɵɵelementEnd();
|
|
307
248
|
} if (rf & 2) {
|
|
@@ -309,43 +250,43 @@ function AIAgentRunFormComponentExtended_div_47_ng_template_3_a_29_Template(rf,
|
|
|
309
250
|
i0.ɵɵadvance();
|
|
310
251
|
i0.ɵɵtextInterpolate1(" ", ctx_r0.record.User || "N/A", " ");
|
|
311
252
|
} }
|
|
312
|
-
function
|
|
253
|
+
function AIAgentRunFormComponentExtended_div_51_ng_template_3_span_30_Template(rf, ctx) { if (rf & 1) {
|
|
313
254
|
i0.ɵɵelementStart(0, "span");
|
|
314
255
|
i0.ɵɵtext(1, "N/A");
|
|
315
256
|
i0.ɵɵelementEnd();
|
|
316
257
|
} }
|
|
317
|
-
function
|
|
318
|
-
const
|
|
319
|
-
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");
|
|
320
261
|
i0.ɵɵtext(3, "Agent");
|
|
321
262
|
i0.ɵɵelementEnd();
|
|
322
|
-
i0.ɵɵelementStart(4, "span")(5, "a",
|
|
323
|
-
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)); });
|
|
324
265
|
i0.ɵɵtext(6);
|
|
325
266
|
i0.ɵɵelementEnd()()();
|
|
326
|
-
i0.ɵɵelementStart(7, "div",
|
|
267
|
+
i0.ɵɵelementStart(7, "div", 63)(8, "label");
|
|
327
268
|
i0.ɵɵtext(9, "Parent Run ID");
|
|
328
269
|
i0.ɵɵelementEnd();
|
|
329
270
|
i0.ɵɵelementStart(10, "span");
|
|
330
|
-
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);
|
|
331
272
|
i0.ɵɵelementEnd()();
|
|
332
|
-
i0.ɵɵelementStart(13, "div",
|
|
273
|
+
i0.ɵɵelementStart(13, "div", 63)(14, "label");
|
|
333
274
|
i0.ɵɵtext(15, "Last Run ID");
|
|
334
275
|
i0.ɵɵelementEnd();
|
|
335
276
|
i0.ɵɵelementStart(16, "span");
|
|
336
|
-
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);
|
|
337
278
|
i0.ɵɵelementEnd()();
|
|
338
|
-
i0.ɵɵelementStart(19, "div",
|
|
279
|
+
i0.ɵɵelementStart(19, "div", 63)(20, "label");
|
|
339
280
|
i0.ɵɵtext(21, "Conversation ID");
|
|
340
281
|
i0.ɵɵelementEnd();
|
|
341
282
|
i0.ɵɵelementStart(22, "span");
|
|
342
|
-
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);
|
|
343
284
|
i0.ɵɵelementEnd()();
|
|
344
|
-
i0.ɵɵelementStart(25, "div",
|
|
285
|
+
i0.ɵɵelementStart(25, "div", 63)(26, "label");
|
|
345
286
|
i0.ɵɵtext(27, "User");
|
|
346
287
|
i0.ɵɵelementEnd();
|
|
347
288
|
i0.ɵɵelementStart(28, "span");
|
|
348
|
-
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);
|
|
349
290
|
i0.ɵɵelementEnd()()();
|
|
350
291
|
} if (rf & 2) {
|
|
351
292
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
@@ -368,11 +309,11 @@ function AIAgentRunFormComponentExtended_div_47_ng_template_3_Template(rf, ctx)
|
|
|
368
309
|
i0.ɵɵadvance();
|
|
369
310
|
i0.ɵɵproperty("ngIf", !ctx_r0.record.UserID);
|
|
370
311
|
} }
|
|
371
|
-
function
|
|
372
|
-
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");
|
|
373
314
|
i0.ɵɵtext(2, "Error Message");
|
|
374
315
|
i0.ɵɵelementEnd();
|
|
375
|
-
i0.ɵɵelementStart(3, "div",
|
|
316
|
+
i0.ɵɵelementStart(3, "div", 69);
|
|
376
317
|
i0.ɵɵtext(4);
|
|
377
318
|
i0.ɵɵelementEnd()();
|
|
378
319
|
} if (rf & 2) {
|
|
@@ -380,20 +321,20 @@ function AIAgentRunFormComponentExtended_div_47_ng_template_5_div_11_Template(rf
|
|
|
380
321
|
i0.ɵɵadvance(4);
|
|
381
322
|
i0.ɵɵtextInterpolate(ctx_r0.record.ErrorMessage);
|
|
382
323
|
} }
|
|
383
|
-
function
|
|
384
|
-
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");
|
|
385
326
|
i0.ɵɵtext(3, "Status");
|
|
386
327
|
i0.ɵɵelementEnd();
|
|
387
|
-
i0.ɵɵelementStart(4, "span",
|
|
328
|
+
i0.ɵɵelementStart(4, "span", 15);
|
|
388
329
|
i0.ɵɵtext(5);
|
|
389
330
|
i0.ɵɵelementEnd()();
|
|
390
|
-
i0.ɵɵelementStart(6, "div",
|
|
331
|
+
i0.ɵɵelementStart(6, "div", 63)(7, "label");
|
|
391
332
|
i0.ɵɵtext(8, "Success");
|
|
392
333
|
i0.ɵɵelementEnd();
|
|
393
334
|
i0.ɵɵelementStart(9, "span");
|
|
394
335
|
i0.ɵɵtext(10);
|
|
395
336
|
i0.ɵɵelementEnd()();
|
|
396
|
-
i0.ɵɵtemplate(11,
|
|
337
|
+
i0.ɵɵtemplate(11, AIAgentRunFormComponentExtended_div_51_ng_template_5_div_11_Template, 5, 1, "div", 67);
|
|
397
338
|
i0.ɵɵelementEnd();
|
|
398
339
|
} if (rf & 2) {
|
|
399
340
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
@@ -408,36 +349,36 @@ function AIAgentRunFormComponentExtended_div_47_ng_template_5_Template(rf, ctx)
|
|
|
408
349
|
i0.ɵɵadvance();
|
|
409
350
|
i0.ɵɵproperty("ngIf", ctx_r0.record.ErrorMessage);
|
|
410
351
|
} }
|
|
411
|
-
function
|
|
412
|
-
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");
|
|
413
354
|
i0.ɵɵtext(3, "Total Tokens Used");
|
|
414
355
|
i0.ɵɵelementEnd();
|
|
415
356
|
i0.ɵɵelementStart(4, "span");
|
|
416
357
|
i0.ɵɵtext(5);
|
|
417
358
|
i0.ɵɵpipe(6, "number");
|
|
418
359
|
i0.ɵɵelementEnd()();
|
|
419
|
-
i0.ɵɵelementStart(7, "div",
|
|
360
|
+
i0.ɵɵelementStart(7, "div", 63)(8, "label");
|
|
420
361
|
i0.ɵɵtext(9, "Prompt Tokens");
|
|
421
362
|
i0.ɵɵelementEnd();
|
|
422
363
|
i0.ɵɵelementStart(10, "span");
|
|
423
364
|
i0.ɵɵtext(11);
|
|
424
365
|
i0.ɵɵpipe(12, "number");
|
|
425
366
|
i0.ɵɵelementEnd()();
|
|
426
|
-
i0.ɵɵelementStart(13, "div",
|
|
367
|
+
i0.ɵɵelementStart(13, "div", 63)(14, "label");
|
|
427
368
|
i0.ɵɵtext(15, "Completion Tokens");
|
|
428
369
|
i0.ɵɵelementEnd();
|
|
429
370
|
i0.ɵɵelementStart(16, "span");
|
|
430
371
|
i0.ɵɵtext(17);
|
|
431
372
|
i0.ɵɵpipe(18, "number");
|
|
432
373
|
i0.ɵɵelementEnd()();
|
|
433
|
-
i0.ɵɵelementStart(19, "div",
|
|
374
|
+
i0.ɵɵelementStart(19, "div", 63)(20, "label");
|
|
434
375
|
i0.ɵɵtext(21, "Total Cost");
|
|
435
376
|
i0.ɵɵelementEnd();
|
|
436
377
|
i0.ɵɵelementStart(22, "span");
|
|
437
378
|
i0.ɵɵtext(23);
|
|
438
379
|
i0.ɵɵpipe(24, "number");
|
|
439
380
|
i0.ɵɵelementEnd()();
|
|
440
|
-
i0.ɵɵelementStart(25, "div",
|
|
381
|
+
i0.ɵɵelementStart(25, "div", 63)(26, "label");
|
|
441
382
|
i0.ɵɵtext(27, "Total Prompt Iterations");
|
|
442
383
|
i0.ɵɵelementEnd();
|
|
443
384
|
i0.ɵɵelementStart(28, "span");
|
|
@@ -457,77 +398,79 @@ function AIAgentRunFormComponentExtended_div_47_ng_template_7_Template(rf, ctx)
|
|
|
457
398
|
i0.ɵɵadvance(6);
|
|
458
399
|
i0.ɵɵtextInterpolate(ctx_r0.record.TotalPromptIterations != null ? i0.ɵɵpipeBind2(30, 17, ctx_r0.record.TotalPromptIterations, "1.0-0") : "N/A");
|
|
459
400
|
} }
|
|
460
|
-
function
|
|
461
|
-
i0.ɵɵelementStart(0, "div",
|
|
462
|
-
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);
|
|
463
404
|
i0.ɵɵelementEnd();
|
|
464
405
|
} if (rf & 2) {
|
|
465
406
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
466
407
|
i0.ɵɵadvance();
|
|
467
408
|
i0.ɵɵproperty("ngModel", ctx_r0.parsedResult)("language", "json")("readonly", true);
|
|
468
409
|
} }
|
|
469
|
-
function
|
|
470
|
-
i0.ɵɵelementStart(0, "kendo-panelbar-item",
|
|
471
|
-
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);
|
|
472
413
|
i0.ɵɵelementEnd();
|
|
473
414
|
} }
|
|
474
|
-
function
|
|
475
|
-
i0.ɵɵelementStart(0, "div",
|
|
476
|
-
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);
|
|
477
418
|
i0.ɵɵelementEnd();
|
|
478
419
|
} if (rf & 2) {
|
|
479
420
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
480
421
|
i0.ɵɵadvance();
|
|
481
422
|
i0.ɵɵproperty("ngModel", ctx_r0.parsedStartingPayload)("language", "json")("readonly", true);
|
|
482
423
|
} }
|
|
483
|
-
function
|
|
484
|
-
i0.ɵɵelementStart(0, "kendo-panelbar-item",
|
|
485
|
-
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);
|
|
486
427
|
i0.ɵɵelementEnd();
|
|
487
428
|
} }
|
|
488
|
-
function
|
|
489
|
-
i0.ɵɵelementStart(0, "div",
|
|
490
|
-
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);
|
|
491
432
|
i0.ɵɵelementEnd();
|
|
492
433
|
} if (rf & 2) {
|
|
493
434
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
494
435
|
i0.ɵɵadvance();
|
|
495
436
|
i0.ɵɵproperty("ngModel", ctx_r0.parsedFinalPayload)("language", "json")("readonly", true);
|
|
496
437
|
} }
|
|
497
|
-
function
|
|
498
|
-
i0.ɵɵelementStart(0, "kendo-panelbar-item",
|
|
499
|
-
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);
|
|
500
441
|
i0.ɵɵelementEnd();
|
|
501
442
|
} }
|
|
502
|
-
function
|
|
503
|
-
i0.ɵɵelementStart(0, "div",
|
|
504
|
-
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);
|
|
505
446
|
i0.ɵɵelementEnd();
|
|
506
447
|
} if (rf & 2) {
|
|
507
448
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
508
449
|
i0.ɵɵadvance();
|
|
509
450
|
i0.ɵɵproperty("oldValue", ctx_r0.startingPayloadObject)("newValue", ctx_r0.finalPayloadObject)("title", "")("showSummary", true)("showUnchanged", false)("expandAll", false)("maxDepth", 10)("maxStringLength", 200)("treatNullAsUndefined", true);
|
|
510
451
|
} }
|
|
511
|
-
function
|
|
512
|
-
i0.ɵɵelementStart(0, "kendo-panelbar-item",
|
|
513
|
-
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);
|
|
514
455
|
i0.ɵɵelementEnd();
|
|
515
456
|
} }
|
|
516
|
-
function
|
|
517
|
-
i0.ɵɵelementStart(0, "div",
|
|
518
|
-
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);
|
|
519
460
|
i0.ɵɵelementEnd();
|
|
520
|
-
i0.ɵɵelementStart(4, "kendo-panelbar-item",
|
|
521
|
-
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);
|
|
522
463
|
i0.ɵɵelementEnd();
|
|
523
|
-
i0.ɵɵelementStart(6, "kendo-panelbar-item",
|
|
524
|
-
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);
|
|
525
466
|
i0.ɵɵelementEnd();
|
|
526
|
-
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);
|
|
527
468
|
i0.ɵɵelementEnd()();
|
|
528
469
|
} if (rf & 2) {
|
|
529
470
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
530
|
-
i0.ɵɵadvance(
|
|
471
|
+
i0.ɵɵadvance();
|
|
472
|
+
i0.ɵɵproperty("keepItemContent", true);
|
|
473
|
+
i0.ɵɵadvance();
|
|
531
474
|
i0.ɵɵproperty("expanded", true);
|
|
532
475
|
i0.ɵɵadvance(6);
|
|
533
476
|
i0.ɵɵproperty("ngIf", ctx_r0.record.Result);
|
|
@@ -539,9 +482,11 @@ function AIAgentRunFormComponentExtended_div_47_Template(rf, ctx) { if (rf & 1)
|
|
|
539
482
|
i0.ɵɵproperty("ngIf", ctx_r0.showPayloadDiff);
|
|
540
483
|
} }
|
|
541
484
|
let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended extends AIAgentRunFormComponent {
|
|
542
|
-
constructor(elementRef, sharedService, router, route, cdr) {
|
|
485
|
+
constructor(elementRef, sharedService, router, route, cdr, costService, dataService) {
|
|
543
486
|
super(elementRef, sharedService, router, route, cdr);
|
|
544
487
|
this.router = router;
|
|
488
|
+
this.costService = costService;
|
|
489
|
+
this.dataService = dataService;
|
|
545
490
|
this.destroy$ = new Subject();
|
|
546
491
|
// UI state
|
|
547
492
|
this.activeTab = 'timeline';
|
|
@@ -549,20 +494,26 @@ let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended exte
|
|
|
549
494
|
this.jsonPanelExpanded = false;
|
|
550
495
|
this.loading = false;
|
|
551
496
|
this.error = null;
|
|
552
|
-
this.selectedItemJsonString = '{}';
|
|
553
|
-
this.detailPaneTab = 'diff';
|
|
554
497
|
this.analyticsLoaded = false;
|
|
498
|
+
this.visualizationLoaded = false;
|
|
555
499
|
this.agent = null;
|
|
500
|
+
// Cost metrics using shared service
|
|
501
|
+
this.costMetrics = null;
|
|
556
502
|
}
|
|
557
503
|
async ngOnInit() {
|
|
558
504
|
await super.ngOnInit();
|
|
559
|
-
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);
|
|
560
508
|
await this.loadAgent();
|
|
509
|
+
await this.loadCostMetrics();
|
|
561
510
|
}
|
|
562
511
|
}
|
|
563
512
|
ngOnDestroy() {
|
|
564
513
|
this.destroy$.next();
|
|
565
514
|
this.destroy$.complete();
|
|
515
|
+
// Clear data when component is destroyed
|
|
516
|
+
this.dataService.clearData();
|
|
566
517
|
}
|
|
567
518
|
async loadAgent() {
|
|
568
519
|
if (!this.record?.AgentID)
|
|
@@ -578,8 +529,32 @@ let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended exte
|
|
|
578
529
|
console.error('Error loading agent:', error);
|
|
579
530
|
}
|
|
580
531
|
}
|
|
532
|
+
async loadCostMetrics() {
|
|
533
|
+
if (!this.record?.ID)
|
|
534
|
+
return;
|
|
535
|
+
try {
|
|
536
|
+
this.costMetrics = await this.costService.getAgentRunCostMetrics(this.record.ID);
|
|
537
|
+
this.cdr.detectChanges();
|
|
538
|
+
}
|
|
539
|
+
catch (error) {
|
|
540
|
+
console.error('Error loading cost metrics:', error);
|
|
541
|
+
this.costMetrics = {
|
|
542
|
+
totalCost: 0,
|
|
543
|
+
totalPrompts: 0,
|
|
544
|
+
totalTokensInput: 0,
|
|
545
|
+
totalTokensOutput: 0,
|
|
546
|
+
isLoading: false,
|
|
547
|
+
error: 'Failed to load cost data'
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
}
|
|
581
551
|
changeTab(tab) {
|
|
582
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
|
+
}
|
|
583
558
|
// Lazy load analytics when the tab is first accessed
|
|
584
559
|
if (tab === 'analytics' && !this.analyticsLoaded) {
|
|
585
560
|
this.analyticsLoaded = true;
|
|
@@ -601,15 +576,11 @@ let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended exte
|
|
|
601
576
|
}
|
|
602
577
|
selectTimelineItem(item) {
|
|
603
578
|
this.selectedTimelineItem = item;
|
|
604
|
-
this.selectedItemJsonString = this.getSelectedItemJson();
|
|
605
579
|
this.jsonPanelExpanded = true;
|
|
606
|
-
// Default to diff tab if step has payload diff, otherwise json tab
|
|
607
|
-
this.detailPaneTab = this.showStepPayloadDiff ? 'diff' : 'json';
|
|
608
580
|
this.cdr.detectChanges();
|
|
609
581
|
}
|
|
610
582
|
closeJsonPanel() {
|
|
611
583
|
this.selectedTimelineItem = null;
|
|
612
|
-
this.selectedItemJsonString = '{}';
|
|
613
584
|
this.cdr.detectChanges();
|
|
614
585
|
}
|
|
615
586
|
navigateToSubRun(runId) {
|
|
@@ -635,10 +606,11 @@ let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended exte
|
|
|
635
606
|
// Reload the agent run record to get latest status
|
|
636
607
|
if (this.record?.ID) {
|
|
637
608
|
this.record.Load(this.record.ID).then(() => {
|
|
638
|
-
//
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
609
|
+
// Clear cost cache and reload
|
|
610
|
+
this.costService.clearCache(this.record.ID);
|
|
611
|
+
this.loadCostMetrics();
|
|
612
|
+
// Reload data through service - this will update all components
|
|
613
|
+
this.dataService.loadAgentRunData(this.record.ID);
|
|
642
614
|
// Trigger analytics refresh
|
|
643
615
|
if (this.analyticsComponent) {
|
|
644
616
|
this.analyticsComponent.loadData();
|
|
@@ -646,30 +618,6 @@ let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended exte
|
|
|
646
618
|
});
|
|
647
619
|
}
|
|
648
620
|
}
|
|
649
|
-
getSelectedItemJson() {
|
|
650
|
-
if (!this.selectedTimelineItem)
|
|
651
|
-
return '{}';
|
|
652
|
-
// Get all the data from the entity
|
|
653
|
-
// first check to see if the item is an AIAgentRunStepEntity
|
|
654
|
-
let data;
|
|
655
|
-
if (this.selectedTimelineItem.data instanceof AIAgentRunStepEntity) {
|
|
656
|
-
// If it's a step entity, we need to get the full run data
|
|
657
|
-
data = this.selectedTimelineItem.data.GetAll();
|
|
658
|
-
}
|
|
659
|
-
else {
|
|
660
|
-
data = this.selectedTimelineItem.data;
|
|
661
|
-
}
|
|
662
|
-
// Apply recursive JSON parsing to the entire data object with inline extraction
|
|
663
|
-
// This will handle any JSON strings regardless of property names
|
|
664
|
-
// and extract embedded JSON from text strings
|
|
665
|
-
const parseOptions = {
|
|
666
|
-
extractInlineJson: true,
|
|
667
|
-
maxDepth: 100,
|
|
668
|
-
debug: false // Disable debug logging - regex issue fixed
|
|
669
|
-
};
|
|
670
|
-
const parsedData = ParseJSONRecursive(data, parseOptions);
|
|
671
|
-
return JSON.stringify(parsedData, null, 2);
|
|
672
|
-
}
|
|
673
621
|
getStatusIcon(status) {
|
|
674
622
|
const iconMap = {
|
|
675
623
|
'Running': 'fa-circle-notch fa-spin',
|
|
@@ -914,62 +862,69 @@ let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended exte
|
|
|
914
862
|
return null;
|
|
915
863
|
}
|
|
916
864
|
}
|
|
917
|
-
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)); }; }
|
|
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)); }; }
|
|
918
866
|
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AIAgentRunFormComponentExtended, selectors: [["mj-ai-agent-run-form"]], viewQuery: function AIAgentRunFormComponentExtended_Query(rf, ctx) { if (rf & 1) {
|
|
919
867
|
i0.ɵɵviewQuery(AIAgentRunTimelineComponent, 5);
|
|
920
868
|
i0.ɵɵviewQuery(AIAgentRunAnalyticsComponent, 5);
|
|
869
|
+
i0.ɵɵviewQuery(AIAgentRunVisualizationComponent, 5);
|
|
921
870
|
} if (rf & 2) {
|
|
922
871
|
let _t;
|
|
923
872
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.timelineComponent = _t.first);
|
|
924
873
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.analyticsComponent = _t.first);
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
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);
|
|
928
878
|
i0.ɵɵelementEnd();
|
|
929
|
-
i0.ɵɵelementStart(7, "div",
|
|
879
|
+
i0.ɵɵelementStart(7, "div", 9)(8, "h2");
|
|
930
880
|
i0.ɵɵtext(9, "AI Agent Run");
|
|
931
881
|
i0.ɵɵelementEnd();
|
|
932
|
-
i0.ɵɵelementStart(10, "div",
|
|
933
|
-
i0.ɵɵtemplate(11, AIAgentRunFormComponentExtended_span_11_Template, 2, 1, "span",
|
|
934
|
-
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);
|
|
935
885
|
i0.ɵɵtext(13);
|
|
936
886
|
i0.ɵɵelementEnd();
|
|
937
|
-
i0.ɵɵtemplate(14, AIAgentRunFormComponentExtended_span_14_Template, 4, 0, "span",
|
|
887
|
+
i0.ɵɵtemplate(14, AIAgentRunFormComponentExtended_span_14_Template, 4, 0, "span", 13);
|
|
938
888
|
i0.ɵɵelementEnd()()();
|
|
939
|
-
i0.ɵɵelementStart(15, "div",
|
|
940
|
-
i0.ɵɵelement(17, "i",
|
|
889
|
+
i0.ɵɵelementStart(15, "div", 14)(16, "div", 15);
|
|
890
|
+
i0.ɵɵelement(17, "i", 16);
|
|
941
891
|
i0.ɵɵtext(18);
|
|
942
892
|
i0.ɵɵelementEnd();
|
|
943
|
-
i0.ɵɵelementStart(19, "div",
|
|
893
|
+
i0.ɵɵelementStart(19, "div", 17)(20, "button", 18);
|
|
944
894
|
i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_Template_button_click_20_listener() { return ctx.refreshData(); });
|
|
945
|
-
i0.ɵɵelement(21, "i",
|
|
895
|
+
i0.ɵɵelement(21, "i", 19);
|
|
946
896
|
i0.ɵɵelementEnd()()()();
|
|
947
|
-
i0.ɵɵelementStart(22, "div",
|
|
897
|
+
i0.ɵɵelementStart(22, "div", 20)(23, "div", 21)(24, "span", 22);
|
|
948
898
|
i0.ɵɵtext(25, "Started");
|
|
949
899
|
i0.ɵɵelementEnd();
|
|
950
|
-
i0.ɵɵelementStart(26, "span",
|
|
900
|
+
i0.ɵɵelementStart(26, "span", 23);
|
|
951
901
|
i0.ɵɵtext(27);
|
|
952
902
|
i0.ɵɵpipe(28, "date");
|
|
953
903
|
i0.ɵɵelementEnd()();
|
|
954
|
-
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);
|
|
955
905
|
i0.ɵɵelementEnd()();
|
|
956
|
-
i0.ɵɵelementStart(34, "div",
|
|
906
|
+
i0.ɵɵelementStart(34, "div", 25)(35, "button", 26);
|
|
957
907
|
i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_Template_button_click_35_listener() { return ctx.changeTab("timeline"); });
|
|
958
|
-
i0.ɵɵelement(36, "i",
|
|
908
|
+
i0.ɵɵelement(36, "i", 27);
|
|
959
909
|
i0.ɵɵtext(37, " Timeline ");
|
|
960
910
|
i0.ɵɵelementEnd();
|
|
961
|
-
i0.ɵɵelementStart(38, "button",
|
|
962
|
-
i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_Template_button_click_38_listener() { return ctx.changeTab("
|
|
963
|
-
i0.ɵɵelement(39, "i",
|
|
964
|
-
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 ");
|
|
915
|
+
i0.ɵɵelementEnd();
|
|
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 ");
|
|
965
920
|
i0.ɵɵelementEnd();
|
|
966
|
-
i0.ɵɵelementStart(
|
|
967
|
-
i0.ɵɵlistener("click", function
|
|
968
|
-
i0.ɵɵelement(
|
|
969
|
-
i0.ɵɵtext(
|
|
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 ");
|
|
970
925
|
i0.ɵɵelementEnd()();
|
|
971
|
-
i0.ɵɵelementStart(
|
|
972
|
-
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);
|
|
973
928
|
i0.ɵɵelementEnd()()();
|
|
974
929
|
} if (rf & 2) {
|
|
975
930
|
i0.ɵɵadvance(11);
|
|
@@ -985,7 +940,7 @@ let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended exte
|
|
|
985
940
|
i0.ɵɵadvance();
|
|
986
941
|
i0.ɵɵtextInterpolate1(" ", ctx.record.Status, " ");
|
|
987
942
|
i0.ɵɵadvance(9);
|
|
988
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(28,
|
|
943
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(28, 24, ctx.record.StartedAt, "medium"));
|
|
989
944
|
i0.ɵɵadvance(2);
|
|
990
945
|
i0.ɵɵproperty("ngIf", ctx.record.CompletedAt);
|
|
991
946
|
i0.ɵɵadvance();
|
|
@@ -993,22 +948,26 @@ let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended exte
|
|
|
993
948
|
i0.ɵɵadvance();
|
|
994
949
|
i0.ɵɵproperty("ngIf", ctx.record.Success !== null && ctx.record.CompletedAt !== null);
|
|
995
950
|
i0.ɵɵadvance();
|
|
996
|
-
i0.ɵɵproperty("ngIf", ctx.
|
|
951
|
+
i0.ɵɵproperty("ngIf", ctx.costMetrics && ctx.costMetrics.totalTokensInput + ctx.costMetrics.totalTokensOutput > 0);
|
|
997
952
|
i0.ɵɵadvance();
|
|
998
|
-
i0.ɵɵproperty("ngIf", ctx.
|
|
953
|
+
i0.ɵɵproperty("ngIf", ctx.costMetrics && ctx.costMetrics.totalCost > 0);
|
|
999
954
|
i0.ɵɵadvance(2);
|
|
1000
955
|
i0.ɵɵclassProp("active", ctx.activeTab === "timeline");
|
|
1001
956
|
i0.ɵɵadvance(3);
|
|
957
|
+
i0.ɵɵclassProp("active", ctx.activeTab === "visualization");
|
|
958
|
+
i0.ɵɵadvance(3);
|
|
1002
959
|
i0.ɵɵclassProp("active", ctx.activeTab === "analytics");
|
|
1003
960
|
i0.ɵɵadvance(3);
|
|
1004
961
|
i0.ɵɵclassProp("active", ctx.activeTab === "details");
|
|
1005
962
|
i0.ɵɵadvance(4);
|
|
1006
963
|
i0.ɵɵproperty("ngIf", ctx.activeTab === "timeline");
|
|
1007
964
|
i0.ɵɵadvance();
|
|
965
|
+
i0.ɵɵproperty("ngIf", ctx.activeTab === "visualization");
|
|
966
|
+
i0.ɵɵadvance();
|
|
1008
967
|
i0.ɵɵproperty("ngIf", ctx.activeTab === "analytics");
|
|
1009
968
|
i0.ɵɵadvance();
|
|
1010
969
|
i0.ɵɵproperty("ngIf", ctx.activeTab === "details");
|
|
1011
|
-
} }, dependencies: [i3.NgClass, i3.NgIf, i4.NgControlStatus, i4.NgModel, i5.PanelBarComponent, i5.PanelBarItemComponent, i5.PanelBarContentDirective, i5.SplitterComponent, i5.SplitterPaneComponent, i6.CodeEditorComponent, i7.DeepDiffComponent, i8.AIAgentRunTimelineComponent, i9.AIAgentRunAnalyticsComponent, i3.DecimalPipe, i3.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}"] }); }
|
|
1012
971
|
};
|
|
1013
972
|
AIAgentRunFormComponentExtended = __decorate([
|
|
1014
973
|
RegisterClass(BaseFormComponent, 'MJ: AI Agent Runs')
|
|
@@ -1016,15 +975,18 @@ AIAgentRunFormComponentExtended = __decorate([
|
|
|
1016
975
|
export { AIAgentRunFormComponentExtended };
|
|
1017
976
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AIAgentRunFormComponentExtended, [{
|
|
1018
977
|
type: Component,
|
|
1019
|
-
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=\"record.TotalTokensUsed\">\n <span class=\"label\">Tokens</span>\n <span class=\"value\">{{ record.TotalTokensUsed | number:'1.0-0' }}</span>\n </div>\n <div class=\"stat\" *ngIf=\"record.TotalCost != null && record.TotalCost > 0\">\n <span class=\"label\">Cost</span>\n <span class=\"value\">${{ record.TotalCost | number:'1.2-4' }}</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}"] }]
|
|
1020
|
-
}], () => [{ type: i0.ElementRef }, { type: i1.SharedService }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i0.ChangeDetectorRef }], { 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: [{
|
|
1021
980
|
type: ViewChild,
|
|
1022
981
|
args: [AIAgentRunTimelineComponent]
|
|
1023
982
|
}], analyticsComponent: [{
|
|
1024
983
|
type: ViewChild,
|
|
1025
984
|
args: [AIAgentRunAnalyticsComponent]
|
|
985
|
+
}], visualizationComponent: [{
|
|
986
|
+
type: ViewChild,
|
|
987
|
+
args: [AIAgentRunVisualizationComponent]
|
|
1026
988
|
}] }); })();
|
|
1027
|
-
(() => { (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 }); })();
|
|
1028
990
|
// Loader function for AIAgentRunFormComponent
|
|
1029
991
|
export function LoadAIAgentRunFormComponent() {
|
|
1030
992
|
// This function is called to ensure the form is loaded
|