@memberjunction/ng-dashboards 2.50.0 → 2.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/ai-dashboard.component.d.ts +4 -0
- package/dist/AI/ai-dashboard.component.d.ts.map +1 -1
- package/dist/AI/ai-dashboard.component.js +71 -23
- package/dist/AI/ai-dashboard.component.js.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.d.ts +18 -8
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +338 -130
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +0 -5
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts +16 -1
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +124 -14
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
- package/dist/AI/components/charts/time-series-chart.component.d.ts +2 -0
- package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -1
- package/dist/AI/components/charts/time-series-chart.component.js +56 -2
- package/dist/AI/components/charts/time-series-chart.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts +4 -7
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +339 -368
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management-v2.component.d.ts +92 -0
- package/dist/AI/components/models/model-management-v2.component.d.ts.map +1 -0
- package/dist/AI/components/models/model-management-v2.component.js +1004 -0
- package/dist/AI/components/models/model-management-v2.component.js.map +1 -0
- package/dist/AI/components/prompts/prompt-management-v2.component.d.ts +66 -0
- package/dist/AI/components/prompts/prompt-management-v2.component.d.ts.map +1 -0
- package/dist/AI/components/prompts/prompt-management-v2.component.js +719 -0
- package/dist/AI/components/prompts/prompt-management-v2.component.js.map +1 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts +7 -6
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js +141 -147
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/Actions/actions-management-dashboard.component.js +8 -8
- package/dist/Actions/actions-management-dashboard.component.js.map +1 -1
- package/dist/Actions/components/actions-list-view.component.d.ts +0 -2
- package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-list-view.component.js +37 -37
- package/dist/Actions/components/actions-list-view.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +7 -4
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +147 -90
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.d.ts +23 -2
- package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +283 -17
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +0 -2
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +25 -37
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/module.d.ts +3 -3
- package/dist/module.js +6 -6
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +7 -6
- package/dist/AI/components/models/model-management.component.d.ts +0 -73
- package/dist/AI/components/models/model-management.component.d.ts.map +0 -1
- package/dist/AI/components/models/model-management.component.js +0 -643
- package/dist/AI/components/models/model-management.component.js.map +0 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts +0 -118
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +0 -1
- package/dist/AI/components/prompts/prompt-management.component.js +0 -1351
- package/dist/AI/components/prompts/prompt-management.component.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Component, Output, EventEmitter, Input } from '@angular/core';
|
|
1
|
+
import { Component, Output, EventEmitter, Input, ChangeDetectionStrategy } from '@angular/core';
|
|
2
2
|
import { Subject } from 'rxjs';
|
|
3
3
|
import { map, takeUntil, debounceTime } from 'rxjs/operators';
|
|
4
4
|
import { RunView } from '@memberjunction/core';
|
|
@@ -15,10 +15,17 @@ const _forTrack0 = ($index, $item) => $item.title;
|
|
|
15
15
|
const _forTrack1 = ($index, $item) => $item.id;
|
|
16
16
|
const _forTrack2 = ($index, $item) => $item.model;
|
|
17
17
|
const _c0 = () => [];
|
|
18
|
-
function
|
|
18
|
+
function ExecutionMonitoringComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
19
|
+
i0.ɵɵelementStart(0, "div", 1)(1, "div", 51);
|
|
20
|
+
i0.ɵɵelement(2, "i", 52);
|
|
21
|
+
i0.ɵɵelementStart(3, "p");
|
|
22
|
+
i0.ɵɵtext(4, "Loading dashboard data...");
|
|
23
|
+
i0.ɵɵelementEnd()()();
|
|
24
|
+
} }
|
|
25
|
+
function ExecutionMonitoringComponent_For_27_Template(rf, ctx) { if (rf & 1) {
|
|
19
26
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
20
|
-
i0.ɵɵelementStart(0, "app-kpi-card",
|
|
21
|
-
i0.ɵɵlistener("click", function
|
|
27
|
+
i0.ɵɵelementStart(0, "app-kpi-card", 53);
|
|
28
|
+
i0.ɵɵlistener("click", function ExecutionMonitoringComponent_For_27_Template_app_kpi_card_click_0_listener() { const kpi_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onKpiClick(kpi_r2)); });
|
|
22
29
|
i0.ɵɵelementEnd();
|
|
23
30
|
} if (rf & 2) {
|
|
24
31
|
const kpi_r2 = ctx.$implicit;
|
|
@@ -26,53 +33,53 @@ function ExecutionMonitoringComponent_For_40_Template(rf, ctx) { if (rf & 1) {
|
|
|
26
33
|
i0.ɵɵclassProp("clickable", ctx_r2.isKpiClickable(kpi_r2));
|
|
27
34
|
i0.ɵɵproperty("data", kpi_r2);
|
|
28
35
|
} }
|
|
29
|
-
function
|
|
30
|
-
i0.ɵɵelementStart(0, "div",
|
|
31
|
-
i0.ɵɵelement(3, "i",
|
|
36
|
+
function ExecutionMonitoringComponent_Conditional_39_Template(rf, ctx) { if (rf & 1) {
|
|
37
|
+
i0.ɵɵelementStart(0, "div", 27)(1, "div", 54)(2, "div", 55);
|
|
38
|
+
i0.ɵɵelement(3, "i", 56);
|
|
32
39
|
i0.ɵɵelementEnd();
|
|
33
|
-
i0.ɵɵelementStart(4, "div",
|
|
40
|
+
i0.ɵɵelementStart(4, "div", 57)(5, "div", 58);
|
|
34
41
|
i0.ɵɵtext(6, "Success Rate");
|
|
35
42
|
i0.ɵɵelementEnd();
|
|
36
|
-
i0.ɵɵelementStart(7, "div",
|
|
43
|
+
i0.ɵɵelementStart(7, "div", 59);
|
|
37
44
|
i0.ɵɵtext(8);
|
|
38
45
|
i0.ɵɵelementEnd();
|
|
39
|
-
i0.ɵɵelementStart(9, "div",
|
|
46
|
+
i0.ɵɵelementStart(9, "div", 60);
|
|
40
47
|
i0.ɵɵtext(10);
|
|
41
48
|
i0.ɵɵelementEnd()()();
|
|
42
|
-
i0.ɵɵelementStart(11, "div",
|
|
43
|
-
i0.ɵɵelement(13, "i",
|
|
49
|
+
i0.ɵɵelementStart(11, "div", 54)(12, "div", 61);
|
|
50
|
+
i0.ɵɵelement(13, "i", 62);
|
|
44
51
|
i0.ɵɵelementEnd();
|
|
45
|
-
i0.ɵɵelementStart(14, "div",
|
|
52
|
+
i0.ɵɵelementStart(14, "div", 57)(15, "div", 58);
|
|
46
53
|
i0.ɵɵtext(16, "Error Rate");
|
|
47
54
|
i0.ɵɵelementEnd();
|
|
48
|
-
i0.ɵɵelementStart(17, "div",
|
|
55
|
+
i0.ɵɵelementStart(17, "div", 59);
|
|
49
56
|
i0.ɵɵtext(18);
|
|
50
57
|
i0.ɵɵelementEnd();
|
|
51
|
-
i0.ɵɵelementStart(19, "div",
|
|
58
|
+
i0.ɵɵelementStart(19, "div", 60);
|
|
52
59
|
i0.ɵɵtext(20);
|
|
53
60
|
i0.ɵɵelementEnd()()();
|
|
54
|
-
i0.ɵɵelementStart(21, "div",
|
|
55
|
-
i0.ɵɵelement(23, "i",
|
|
61
|
+
i0.ɵɵelementStart(21, "div", 54)(22, "div", 63);
|
|
62
|
+
i0.ɵɵelement(23, "i", 64);
|
|
56
63
|
i0.ɵɵelementEnd();
|
|
57
|
-
i0.ɵɵelementStart(24, "div",
|
|
64
|
+
i0.ɵɵelementStart(24, "div", 57)(25, "div", 58);
|
|
58
65
|
i0.ɵɵtext(26, "Avg Response Time");
|
|
59
66
|
i0.ɵɵelementEnd();
|
|
60
|
-
i0.ɵɵelementStart(27, "div",
|
|
67
|
+
i0.ɵɵelementStart(27, "div", 59);
|
|
61
68
|
i0.ɵɵtext(28);
|
|
62
69
|
i0.ɵɵelementEnd();
|
|
63
|
-
i0.ɵɵelementStart(29, "div",
|
|
70
|
+
i0.ɵɵelementStart(29, "div", 60);
|
|
64
71
|
i0.ɵɵtext(30, "Across all models");
|
|
65
72
|
i0.ɵɵelementEnd()()();
|
|
66
|
-
i0.ɵɵelementStart(31, "div",
|
|
67
|
-
i0.ɵɵelement(33, "i",
|
|
73
|
+
i0.ɵɵelementStart(31, "div", 54)(32, "div", 65);
|
|
74
|
+
i0.ɵɵelement(33, "i", 48);
|
|
68
75
|
i0.ɵɵelementEnd();
|
|
69
|
-
i0.ɵɵelementStart(34, "div",
|
|
76
|
+
i0.ɵɵelementStart(34, "div", 57)(35, "div", 58);
|
|
70
77
|
i0.ɵɵtext(36, "Active Executions");
|
|
71
78
|
i0.ɵɵelementEnd();
|
|
72
|
-
i0.ɵɵelementStart(37, "div",
|
|
79
|
+
i0.ɵɵelementStart(37, "div", 59);
|
|
73
80
|
i0.ɵɵtext(38);
|
|
74
81
|
i0.ɵɵelementEnd();
|
|
75
|
-
i0.ɵɵelementStart(39, "div",
|
|
82
|
+
i0.ɵɵelementStart(39, "div", 60);
|
|
76
83
|
i0.ɵɵtext(40, "Currently running");
|
|
77
84
|
i0.ɵɵelementEnd()()()();
|
|
78
85
|
} if (rf & 2) {
|
|
@@ -91,21 +98,21 @@ function ExecutionMonitoringComponent_Conditional_52_Template(rf, ctx) { if (rf
|
|
|
91
98
|
i0.ɵɵadvance(10);
|
|
92
99
|
i0.ɵɵtextInterpolate(kpis_r4.activeExecutions);
|
|
93
100
|
} }
|
|
94
|
-
function
|
|
101
|
+
function ExecutionMonitoringComponent_For_46_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
95
102
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
96
|
-
i0.ɵɵelementStart(0, "button",
|
|
97
|
-
i0.ɵɵlistener("click", function
|
|
98
|
-
i0.ɵɵelement(1, "i",
|
|
103
|
+
i0.ɵɵelementStart(0, "button", 69);
|
|
104
|
+
i0.ɵɵlistener("click", function ExecutionMonitoringComponent_For_46_Conditional_3_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r7); const tab_r6 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeTab($event, tab_r6.id)); });
|
|
105
|
+
i0.ɵɵelement(1, "i", 70);
|
|
99
106
|
i0.ɵɵelementEnd();
|
|
100
107
|
} }
|
|
101
|
-
function
|
|
108
|
+
function ExecutionMonitoringComponent_For_46_Template(rf, ctx) { if (rf & 1) {
|
|
102
109
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
103
|
-
i0.ɵɵelementStart(0, "div",
|
|
104
|
-
i0.ɵɵlistener("click", function
|
|
105
|
-
i0.ɵɵelementStart(1, "span",
|
|
110
|
+
i0.ɵɵelementStart(0, "div", 66);
|
|
111
|
+
i0.ɵɵlistener("click", function ExecutionMonitoringComponent_For_46_Template_div_click_0_listener() { const tab_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.selectTab(tab_r6.id)); });
|
|
112
|
+
i0.ɵɵelementStart(1, "span", 67);
|
|
106
113
|
i0.ɵɵtext(2);
|
|
107
114
|
i0.ɵɵelementEnd();
|
|
108
|
-
i0.ɵɵtemplate(3,
|
|
115
|
+
i0.ɵɵtemplate(3, ExecutionMonitoringComponent_For_46_Conditional_3_Template, 2, 0, "button", 68);
|
|
109
116
|
i0.ɵɵelementEnd();
|
|
110
117
|
} if (rf & 2) {
|
|
111
118
|
const tab_r6 = ctx.$implicit;
|
|
@@ -116,11 +123,11 @@ function ExecutionMonitoringComponent_For_59_Template(rf, ctx) { if (rf & 1) {
|
|
|
116
123
|
i0.ɵɵadvance();
|
|
117
124
|
i0.ɵɵconditional(tab_r6.closeable ? 3 : -1);
|
|
118
125
|
} }
|
|
119
|
-
function
|
|
126
|
+
function ExecutionMonitoringComponent_Conditional_48_Template(rf, ctx) { if (rf & 1) {
|
|
120
127
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
121
|
-
i0.ɵɵelementStart(0, "div",
|
|
128
|
+
i0.ɵɵelementStart(0, "div", 34)(1, "app-time-series-chart", 71);
|
|
122
129
|
i0.ɵɵpipe(2, "async");
|
|
123
|
-
i0.ɵɵlistener("dataPointClick", function
|
|
130
|
+
i0.ɵɵlistener("dataPointClick", function ExecutionMonitoringComponent_Conditional_48_Template_app_time_series_chart_dataPointClick_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onDataPointClick($event)); })("timeRangeChange", function ExecutionMonitoringComponent_Conditional_48_Template_app_time_series_chart_timeRangeChange_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onChartTimeRangeChange($event)); });
|
|
124
131
|
i0.ɵɵelementEnd()();
|
|
125
132
|
} if (rf & 2) {
|
|
126
133
|
let tmp_1_0;
|
|
@@ -128,8 +135,8 @@ function ExecutionMonitoringComponent_Conditional_61_Template(rf, ctx) { if (rf
|
|
|
128
135
|
i0.ɵɵadvance();
|
|
129
136
|
i0.ɵɵproperty("data", (tmp_1_0 = i0.ɵɵpipeBind1(2, 2, ctx_r2.trends$)) !== null && tmp_1_0 !== undefined ? tmp_1_0 : i0.ɵɵpureFunction0(4, _c0))("config", ctx_r2.timeSeriesConfig);
|
|
130
137
|
} }
|
|
131
|
-
function
|
|
132
|
-
i0.ɵɵelementStart(0, "span",
|
|
138
|
+
function ExecutionMonitoringComponent_Conditional_49_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
139
|
+
i0.ɵɵelementStart(0, "span", 75);
|
|
133
140
|
i0.ɵɵtext(1);
|
|
134
141
|
i0.ɵɵelementEnd();
|
|
135
142
|
} if (rf & 2) {
|
|
@@ -137,8 +144,8 @@ function ExecutionMonitoringComponent_Conditional_62_Conditional_6_Template(rf,
|
|
|
137
144
|
i0.ɵɵadvance();
|
|
138
145
|
i0.ɵɵtextInterpolate(ctx_r2.getFormattedTimestamp(ctx_r2.activeTab));
|
|
139
146
|
} }
|
|
140
|
-
function
|
|
141
|
-
i0.ɵɵelementStart(0, "span",
|
|
147
|
+
function ExecutionMonitoringComponent_Conditional_49_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
148
|
+
i0.ɵɵelementStart(0, "span", 76);
|
|
142
149
|
i0.ɵɵtext(1);
|
|
143
150
|
i0.ɵɵelementEnd();
|
|
144
151
|
} if (rf & 2) {
|
|
@@ -146,38 +153,38 @@ function ExecutionMonitoringComponent_Conditional_62_Conditional_7_Template(rf,
|
|
|
146
153
|
i0.ɵɵadvance();
|
|
147
154
|
i0.ɵɵtextInterpolate(ctx_r2.getFormattedMetricLabel(ctx_r2.activeTab));
|
|
148
155
|
} }
|
|
149
|
-
function
|
|
150
|
-
i0.ɵɵelementStart(0, "div",
|
|
151
|
-
i0.ɵɵelement(1, "i",
|
|
156
|
+
function ExecutionMonitoringComponent_Conditional_49_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
157
|
+
i0.ɵɵelementStart(0, "div", 77);
|
|
158
|
+
i0.ɵɵelement(1, "i", 80);
|
|
152
159
|
i0.ɵɵtext(2, " Loading execution details... ");
|
|
153
160
|
i0.ɵɵelementEnd();
|
|
154
161
|
} }
|
|
155
|
-
function
|
|
162
|
+
function ExecutionMonitoringComponent_Conditional_49_Conditional_9_For_19_Template(rf, ctx) { if (rf & 1) {
|
|
156
163
|
const _r9 = i0.ɵɵgetCurrentView();
|
|
157
|
-
i0.ɵɵelementStart(0, "div",
|
|
158
|
-
i0.ɵɵlistener("click", function
|
|
159
|
-
i0.ɵɵelementStart(1, "div",
|
|
164
|
+
i0.ɵɵelementStart(0, "div", 84);
|
|
165
|
+
i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Conditional_49_Conditional_9_For_19_Template_div_click_0_listener() { const execution_r10 = i0.ɵɵrestoreView(_r9).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.viewExecutionDetail(execution_r10)); });
|
|
166
|
+
i0.ɵɵelementStart(1, "div", 85)(2, "span", 86);
|
|
160
167
|
i0.ɵɵtext(3);
|
|
161
168
|
i0.ɵɵelementEnd()();
|
|
162
|
-
i0.ɵɵelementStart(4, "div",
|
|
169
|
+
i0.ɵɵelementStart(4, "div", 85);
|
|
163
170
|
i0.ɵɵtext(5);
|
|
164
171
|
i0.ɵɵelementEnd();
|
|
165
|
-
i0.ɵɵelementStart(6, "div",
|
|
172
|
+
i0.ɵɵelementStart(6, "div", 85);
|
|
166
173
|
i0.ɵɵtext(7);
|
|
167
174
|
i0.ɵɵelementEnd();
|
|
168
|
-
i0.ɵɵelementStart(8, "div",
|
|
175
|
+
i0.ɵɵelementStart(8, "div", 85)(9, "span", 87);
|
|
169
176
|
i0.ɵɵtext(10);
|
|
170
177
|
i0.ɵɵelementEnd()();
|
|
171
|
-
i0.ɵɵelementStart(11, "div",
|
|
178
|
+
i0.ɵɵelementStart(11, "div", 85);
|
|
172
179
|
i0.ɵɵtext(12);
|
|
173
180
|
i0.ɵɵelementEnd();
|
|
174
|
-
i0.ɵɵelementStart(13, "div",
|
|
181
|
+
i0.ɵɵelementStart(13, "div", 85);
|
|
175
182
|
i0.ɵɵtext(14);
|
|
176
183
|
i0.ɵɵelementEnd();
|
|
177
|
-
i0.ɵɵelementStart(15, "div",
|
|
184
|
+
i0.ɵɵelementStart(15, "div", 85);
|
|
178
185
|
i0.ɵɵtext(16);
|
|
179
186
|
i0.ɵɵelementEnd();
|
|
180
|
-
i0.ɵɵelementStart(17, "div",
|
|
187
|
+
i0.ɵɵelementStart(17, "div", 85);
|
|
181
188
|
i0.ɵɵtext(18);
|
|
182
189
|
i0.ɵɵelementEnd()();
|
|
183
190
|
} if (rf & 2) {
|
|
@@ -204,54 +211,54 @@ function ExecutionMonitoringComponent_Conditional_62_Conditional_9_For_19_Templa
|
|
|
204
211
|
i0.ɵɵadvance(2);
|
|
205
212
|
i0.ɵɵtextInterpolate(ctx_r2.formatTime(execution_r10.startTime));
|
|
206
213
|
} }
|
|
207
|
-
function
|
|
208
|
-
i0.ɵɵelementStart(0, "div",
|
|
214
|
+
function ExecutionMonitoringComponent_Conditional_49_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
215
|
+
i0.ɵɵelementStart(0, "div", 78)(1, "div", 81)(2, "div", 82);
|
|
209
216
|
i0.ɵɵtext(3, "Type");
|
|
210
217
|
i0.ɵɵelementEnd();
|
|
211
|
-
i0.ɵɵelementStart(4, "div",
|
|
218
|
+
i0.ɵɵelementStart(4, "div", 82);
|
|
212
219
|
i0.ɵɵtext(5, "Name");
|
|
213
220
|
i0.ɵɵelementEnd();
|
|
214
|
-
i0.ɵɵelementStart(6, "div",
|
|
221
|
+
i0.ɵɵelementStart(6, "div", 82);
|
|
215
222
|
i0.ɵɵtext(7, "Model");
|
|
216
223
|
i0.ɵɵelementEnd();
|
|
217
|
-
i0.ɵɵelementStart(8, "div",
|
|
224
|
+
i0.ɵɵelementStart(8, "div", 82);
|
|
218
225
|
i0.ɵɵtext(9, "Status");
|
|
219
226
|
i0.ɵɵelementEnd();
|
|
220
|
-
i0.ɵɵelementStart(10, "div",
|
|
227
|
+
i0.ɵɵelementStart(10, "div", 82);
|
|
221
228
|
i0.ɵɵtext(11, "Duration");
|
|
222
229
|
i0.ɵɵelementEnd();
|
|
223
|
-
i0.ɵɵelementStart(12, "div",
|
|
230
|
+
i0.ɵɵelementStart(12, "div", 82);
|
|
224
231
|
i0.ɵɵtext(13, "Cost");
|
|
225
232
|
i0.ɵɵelementEnd();
|
|
226
|
-
i0.ɵɵelementStart(14, "div",
|
|
233
|
+
i0.ɵɵelementStart(14, "div", 82);
|
|
227
234
|
i0.ɵɵtext(15, "Tokens");
|
|
228
235
|
i0.ɵɵelementEnd();
|
|
229
|
-
i0.ɵɵelementStart(16, "div",
|
|
236
|
+
i0.ɵɵelementStart(16, "div", 82);
|
|
230
237
|
i0.ɵɵtext(17, "Time");
|
|
231
238
|
i0.ɵɵelementEnd()();
|
|
232
|
-
i0.ɵɵrepeaterCreate(18,
|
|
239
|
+
i0.ɵɵrepeaterCreate(18, ExecutionMonitoringComponent_Conditional_49_Conditional_9_For_19_Template, 19, 12, "div", 83, _forTrack1);
|
|
233
240
|
i0.ɵɵelementEnd();
|
|
234
241
|
} if (rf & 2) {
|
|
235
242
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
236
243
|
i0.ɵɵadvance(18);
|
|
237
244
|
i0.ɵɵrepeater(ctx_r2.activeTab == null ? null : ctx_r2.activeTab.data);
|
|
238
245
|
} }
|
|
239
|
-
function
|
|
240
|
-
i0.ɵɵelementStart(0, "div",
|
|
241
|
-
i0.ɵɵelement(1, "i",
|
|
246
|
+
function ExecutionMonitoringComponent_Conditional_49_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
247
|
+
i0.ɵɵelementStart(0, "div", 79);
|
|
248
|
+
i0.ɵɵelement(1, "i", 88);
|
|
242
249
|
i0.ɵɵelementStart(2, "p");
|
|
243
250
|
i0.ɵɵtext(3, "No executions found for this time period");
|
|
244
251
|
i0.ɵɵelementEnd()();
|
|
245
252
|
} }
|
|
246
|
-
function
|
|
247
|
-
i0.ɵɵelementStart(0, "div",
|
|
248
|
-
i0.ɵɵelement(3, "i",
|
|
253
|
+
function ExecutionMonitoringComponent_Conditional_49_Template(rf, ctx) { if (rf & 1) {
|
|
254
|
+
i0.ɵɵelementStart(0, "div", 35)(1, "div", 72)(2, "h4");
|
|
255
|
+
i0.ɵɵelement(3, "i", 73);
|
|
249
256
|
i0.ɵɵtext(4);
|
|
250
257
|
i0.ɵɵelementEnd();
|
|
251
|
-
i0.ɵɵelementStart(5, "div",
|
|
252
|
-
i0.ɵɵtemplate(6,
|
|
258
|
+
i0.ɵɵelementStart(5, "div", 74);
|
|
259
|
+
i0.ɵɵtemplate(6, ExecutionMonitoringComponent_Conditional_49_Conditional_6_Template, 2, 1, "span", 75)(7, ExecutionMonitoringComponent_Conditional_49_Conditional_7_Template, 2, 1, "span", 76);
|
|
253
260
|
i0.ɵɵelementEnd()();
|
|
254
|
-
i0.ɵɵtemplate(8,
|
|
261
|
+
i0.ɵɵtemplate(8, ExecutionMonitoringComponent_Conditional_49_Conditional_8_Template, 3, 0, "div", 77)(9, ExecutionMonitoringComponent_Conditional_49_Conditional_9_Template, 20, 0, "div", 78)(10, ExecutionMonitoringComponent_Conditional_49_Conditional_10_Template, 4, 0, "div", 79);
|
|
255
262
|
i0.ɵɵelementEnd();
|
|
256
263
|
} if (rf & 2) {
|
|
257
264
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
@@ -264,14 +271,14 @@ function ExecutionMonitoringComponent_Conditional_62_Template(rf, ctx) { if (rf
|
|
|
264
271
|
i0.ɵɵadvance();
|
|
265
272
|
i0.ɵɵconditional(ctx_r2.loadingDrillDown ? 8 : (ctx_r2.activeTab == null ? null : ctx_r2.activeTab.data == null ? null : ctx_r2.activeTab.data.length) > 0 ? 9 : 10);
|
|
266
273
|
} }
|
|
267
|
-
function
|
|
268
|
-
i0.ɵɵelementStart(0, "div",
|
|
269
|
-
i0.ɵɵelement(1, "i",
|
|
274
|
+
function ExecutionMonitoringComponent_Conditional_50_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
275
|
+
i0.ɵɵelementStart(0, "div", 77);
|
|
276
|
+
i0.ɵɵelement(1, "i", 80);
|
|
270
277
|
i0.ɵɵtext(2, " Loading model details... ");
|
|
271
278
|
i0.ɵɵelementEnd();
|
|
272
279
|
} }
|
|
273
|
-
function
|
|
274
|
-
i0.ɵɵelementStart(0, "div",
|
|
280
|
+
function ExecutionMonitoringComponent_Conditional_50_Conditional_6_Conditional_32_Template(rf, ctx) { if (rf & 1) {
|
|
281
|
+
i0.ɵɵelementStart(0, "div", 94)(1, "h5");
|
|
275
282
|
i0.ɵɵtext(2, "Description");
|
|
276
283
|
i0.ɵɵelementEnd();
|
|
277
284
|
i0.ɵɵelementStart(3, "p");
|
|
@@ -282,44 +289,44 @@ function ExecutionMonitoringComponent_Conditional_63_Conditional_6_Conditional_3
|
|
|
282
289
|
i0.ɵɵadvance(4);
|
|
283
290
|
i0.ɵɵtextInterpolate(ctx_r2.activeTab == null ? null : ctx_r2.activeTab.data == null ? null : ctx_r2.activeTab.data.description);
|
|
284
291
|
} }
|
|
285
|
-
function
|
|
286
|
-
i0.ɵɵelementStart(0, "div",
|
|
292
|
+
function ExecutionMonitoringComponent_Conditional_50_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
293
|
+
i0.ɵɵelementStart(0, "div", 90)(1, "div", 91)(2, "div", 92)(3, "label");
|
|
287
294
|
i0.ɵɵtext(4, "Model Name:");
|
|
288
295
|
i0.ɵɵelementEnd();
|
|
289
296
|
i0.ɵɵelementStart(5, "span");
|
|
290
297
|
i0.ɵɵtext(6);
|
|
291
298
|
i0.ɵɵelementEnd()();
|
|
292
|
-
i0.ɵɵelementStart(7, "div",
|
|
299
|
+
i0.ɵɵelementStart(7, "div", 92)(8, "label");
|
|
293
300
|
i0.ɵɵtext(9, "Vendor:");
|
|
294
301
|
i0.ɵɵelementEnd();
|
|
295
302
|
i0.ɵɵelementStart(10, "span");
|
|
296
303
|
i0.ɵɵtext(11);
|
|
297
304
|
i0.ɵɵelementEnd()();
|
|
298
|
-
i0.ɵɵelementStart(12, "div",
|
|
305
|
+
i0.ɵɵelementStart(12, "div", 92)(13, "label");
|
|
299
306
|
i0.ɵɵtext(14, "API Name:");
|
|
300
307
|
i0.ɵɵelementEnd();
|
|
301
308
|
i0.ɵɵelementStart(15, "span");
|
|
302
309
|
i0.ɵɵtext(16);
|
|
303
310
|
i0.ɵɵelementEnd()();
|
|
304
|
-
i0.ɵɵelementStart(17, "div",
|
|
311
|
+
i0.ɵɵelementStart(17, "div", 92)(18, "label");
|
|
305
312
|
i0.ɵɵtext(19, "Input Cost:");
|
|
306
313
|
i0.ɵɵelementEnd();
|
|
307
314
|
i0.ɵɵelementStart(20, "span");
|
|
308
315
|
i0.ɵɵtext(21);
|
|
309
316
|
i0.ɵɵelementEnd()();
|
|
310
|
-
i0.ɵɵelementStart(22, "div",
|
|
317
|
+
i0.ɵɵelementStart(22, "div", 92)(23, "label");
|
|
311
318
|
i0.ɵɵtext(24, "Output Cost:");
|
|
312
319
|
i0.ɵɵelementEnd();
|
|
313
320
|
i0.ɵɵelementStart(25, "span");
|
|
314
321
|
i0.ɵɵtext(26);
|
|
315
322
|
i0.ɵɵelementEnd()();
|
|
316
|
-
i0.ɵɵelementStart(27, "div",
|
|
323
|
+
i0.ɵɵelementStart(27, "div", 92)(28, "label");
|
|
317
324
|
i0.ɵɵtext(29, "Active:");
|
|
318
325
|
i0.ɵɵelementEnd();
|
|
319
|
-
i0.ɵɵelementStart(30, "span",
|
|
326
|
+
i0.ɵɵelementStart(30, "span", 93);
|
|
320
327
|
i0.ɵɵtext(31);
|
|
321
328
|
i0.ɵɵelementEnd()()();
|
|
322
|
-
i0.ɵɵtemplate(32,
|
|
329
|
+
i0.ɵɵtemplate(32, ExecutionMonitoringComponent_Conditional_50_Conditional_6_Conditional_32_Template, 5, 1, "div", 94);
|
|
323
330
|
i0.ɵɵelementEnd();
|
|
324
331
|
} if (rf & 2) {
|
|
325
332
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
@@ -340,12 +347,12 @@ function ExecutionMonitoringComponent_Conditional_63_Conditional_6_Template(rf,
|
|
|
340
347
|
i0.ɵɵadvance();
|
|
341
348
|
i0.ɵɵconditional((ctx_r2.activeTab == null ? null : ctx_r2.activeTab.data == null ? null : ctx_r2.activeTab.data.description) ? 32 : -1);
|
|
342
349
|
} }
|
|
343
|
-
function
|
|
344
|
-
i0.ɵɵelementStart(0, "div",
|
|
345
|
-
i0.ɵɵelement(3, "i",
|
|
350
|
+
function ExecutionMonitoringComponent_Conditional_50_Template(rf, ctx) { if (rf & 1) {
|
|
351
|
+
i0.ɵɵelementStart(0, "div", 36)(1, "div", 72)(2, "h4");
|
|
352
|
+
i0.ɵɵelement(3, "i", 89);
|
|
346
353
|
i0.ɵɵtext(4);
|
|
347
354
|
i0.ɵɵelementEnd()();
|
|
348
|
-
i0.ɵɵtemplate(5,
|
|
355
|
+
i0.ɵɵtemplate(5, ExecutionMonitoringComponent_Conditional_50_Conditional_5_Template, 3, 0, "div", 77)(6, ExecutionMonitoringComponent_Conditional_50_Conditional_6_Template, 33, 9, "div", 90);
|
|
349
356
|
i0.ɵɵelementEnd();
|
|
350
357
|
} if (rf & 2) {
|
|
351
358
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
@@ -354,17 +361,17 @@ function ExecutionMonitoringComponent_Conditional_63_Template(rf, ctx) { if (rf
|
|
|
354
361
|
i0.ɵɵadvance();
|
|
355
362
|
i0.ɵɵconditional(ctx_r2.loadingDrillDown ? 5 : (ctx_r2.activeTab == null ? null : ctx_r2.activeTab.data) ? 6 : -1);
|
|
356
363
|
} }
|
|
357
|
-
function
|
|
358
|
-
i0.ɵɵelementStart(0, "div",
|
|
364
|
+
function ExecutionMonitoringComponent_Conditional_65_Conditional_1_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
365
|
+
i0.ɵɵelementStart(0, "div", 96)(1, "div", 97)(2, "span", 98);
|
|
359
366
|
i0.ɵɵtext(3);
|
|
360
367
|
i0.ɵɵelementEnd();
|
|
361
|
-
i0.ɵɵelementStart(4, "span",
|
|
368
|
+
i0.ɵɵelementStart(4, "span", 99);
|
|
362
369
|
i0.ɵɵtext(5);
|
|
363
370
|
i0.ɵɵelementEnd()();
|
|
364
|
-
i0.ɵɵelementStart(6, "div",
|
|
365
|
-
i0.ɵɵelement(7, "div",
|
|
371
|
+
i0.ɵɵelementStart(6, "div", 100);
|
|
372
|
+
i0.ɵɵelement(7, "div", 101);
|
|
366
373
|
i0.ɵɵelementEnd();
|
|
367
|
-
i0.ɵɵelementStart(8, "div",
|
|
374
|
+
i0.ɵɵelementStart(8, "div", 102);
|
|
368
375
|
i0.ɵɵtext(9);
|
|
369
376
|
i0.ɵɵelementEnd()();
|
|
370
377
|
} if (rf & 2) {
|
|
@@ -380,17 +387,17 @@ function ExecutionMonitoringComponent_Conditional_78_Conditional_1_For_2_Templat
|
|
|
380
387
|
i0.ɵɵadvance(2);
|
|
381
388
|
i0.ɵɵtextInterpolate1(" ", ctx_r2.formatTokens(item_r11.tokens), " tokens ");
|
|
382
389
|
} }
|
|
383
|
-
function
|
|
384
|
-
i0.ɵɵelementStart(0, "div",
|
|
385
|
-
i0.ɵɵrepeaterCreate(1,
|
|
390
|
+
function ExecutionMonitoringComponent_Conditional_65_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
391
|
+
i0.ɵɵelementStart(0, "div", 95);
|
|
392
|
+
i0.ɵɵrepeaterCreate(1, ExecutionMonitoringComponent_Conditional_65_Conditional_1_For_2_Template, 10, 5, "div", 96, _forTrack2);
|
|
386
393
|
i0.ɵɵelementEnd();
|
|
387
394
|
} if (rf & 2) {
|
|
388
395
|
i0.ɵɵadvance();
|
|
389
396
|
i0.ɵɵrepeater(ctx.slice(0, 8));
|
|
390
397
|
} }
|
|
391
|
-
function
|
|
392
|
-
i0.ɵɵelementStart(0, "div",
|
|
393
|
-
i0.ɵɵtemplate(1,
|
|
398
|
+
function ExecutionMonitoringComponent_Conditional_65_Template(rf, ctx) { if (rf & 1) {
|
|
399
|
+
i0.ɵɵelementStart(0, "div", 46);
|
|
400
|
+
i0.ɵɵtemplate(1, ExecutionMonitoringComponent_Conditional_65_Conditional_1_Template, 3, 0, "div", 95);
|
|
394
401
|
i0.ɵɵpipe(2, "async");
|
|
395
402
|
i0.ɵɵelementEnd();
|
|
396
403
|
} if (rf & 2) {
|
|
@@ -399,23 +406,23 @@ function ExecutionMonitoringComponent_Conditional_78_Template(rf, ctx) { if (rf
|
|
|
399
406
|
i0.ɵɵadvance();
|
|
400
407
|
i0.ɵɵconditional((tmp_1_0 = i0.ɵɵpipeBind1(2, 1, ctx_r2.costData$)) ? 1 : -1, tmp_1_0);
|
|
401
408
|
} }
|
|
402
|
-
function
|
|
403
|
-
i0.ɵɵelementStart(0, "div",
|
|
409
|
+
function ExecutionMonitoringComponent_Conditional_72_Conditional_1_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
410
|
+
i0.ɵɵelementStart(0, "div", 104)(1, "div", 105)(2, "span", 98);
|
|
404
411
|
i0.ɵɵtext(3);
|
|
405
412
|
i0.ɵɵelementEnd();
|
|
406
|
-
i0.ɵɵelementStart(4, "span",
|
|
413
|
+
i0.ɵɵelementStart(4, "span", 106);
|
|
407
414
|
i0.ɵɵtext(5);
|
|
408
415
|
i0.ɵɵelementEnd()();
|
|
409
|
-
i0.ɵɵelementStart(6, "div",
|
|
410
|
-
i0.ɵɵelement(8, "div",
|
|
416
|
+
i0.ɵɵelementStart(6, "div", 107)(7, "div", 108);
|
|
417
|
+
i0.ɵɵelement(8, "div", 109)(9, "div", 110);
|
|
411
418
|
i0.ɵɵelementEnd();
|
|
412
|
-
i0.ɵɵelementStart(10, "div",
|
|
419
|
+
i0.ɵɵelementStart(10, "div", 111)(11, "span", 112);
|
|
413
420
|
i0.ɵɵtext(12);
|
|
414
421
|
i0.ɵɵelementEnd();
|
|
415
|
-
i0.ɵɵelementStart(13, "span",
|
|
422
|
+
i0.ɵɵelementStart(13, "span", 113);
|
|
416
423
|
i0.ɵɵtext(14);
|
|
417
424
|
i0.ɵɵelementEnd()()();
|
|
418
|
-
i0.ɵɵelementStart(15, "div",
|
|
425
|
+
i0.ɵɵelementStart(15, "div", 114);
|
|
419
426
|
i0.ɵɵtext(16);
|
|
420
427
|
i0.ɵɵelementEnd()();
|
|
421
428
|
} if (rf & 2) {
|
|
@@ -436,17 +443,17 @@ function ExecutionMonitoringComponent_Conditional_85_Conditional_1_For_2_Templat
|
|
|
436
443
|
i0.ɵɵadvance(2);
|
|
437
444
|
i0.ɵɵtextInterpolate1(" ", ctx_r2.formatCostPerToken(item_r13.cost, item_r13.inputTokens + item_r13.outputTokens), " ");
|
|
438
445
|
} }
|
|
439
|
-
function
|
|
440
|
-
i0.ɵɵelementStart(0, "div",
|
|
441
|
-
i0.ɵɵrepeaterCreate(1,
|
|
446
|
+
function ExecutionMonitoringComponent_Conditional_72_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
447
|
+
i0.ɵɵelementStart(0, "div", 103);
|
|
448
|
+
i0.ɵɵrepeaterCreate(1, ExecutionMonitoringComponent_Conditional_72_Conditional_1_For_2_Template, 17, 9, "div", 104, _forTrack2);
|
|
442
449
|
i0.ɵɵelementEnd();
|
|
443
450
|
} if (rf & 2) {
|
|
444
451
|
i0.ɵɵadvance();
|
|
445
452
|
i0.ɵɵrepeater(ctx.slice(0, 6));
|
|
446
453
|
} }
|
|
447
|
-
function
|
|
448
|
-
i0.ɵɵelementStart(0, "div",
|
|
449
|
-
i0.ɵɵtemplate(1,
|
|
454
|
+
function ExecutionMonitoringComponent_Conditional_72_Template(rf, ctx) { if (rf & 1) {
|
|
455
|
+
i0.ɵɵelementStart(0, "div", 46);
|
|
456
|
+
i0.ɵɵtemplate(1, ExecutionMonitoringComponent_Conditional_72_Conditional_1_Template, 3, 0, "div", 103);
|
|
450
457
|
i0.ɵɵpipe(2, "async");
|
|
451
458
|
i0.ɵɵelementEnd();
|
|
452
459
|
} if (rf & 2) {
|
|
@@ -455,11 +462,11 @@ function ExecutionMonitoringComponent_Conditional_85_Template(rf, ctx) { if (rf
|
|
|
455
462
|
i0.ɵɵadvance();
|
|
456
463
|
i0.ɵɵconditional((tmp_1_0 = i0.ɵɵpipeBind1(2, 1, ctx_r2.tokenEfficiency$)) ? 1 : -1, tmp_1_0);
|
|
457
464
|
} }
|
|
458
|
-
function
|
|
465
|
+
function ExecutionMonitoringComponent_Conditional_79_Template(rf, ctx) { if (rf & 1) {
|
|
459
466
|
const _r14 = i0.ɵɵgetCurrentView();
|
|
460
|
-
i0.ɵɵelementStart(0, "div",
|
|
467
|
+
i0.ɵɵelementStart(0, "div", 49)(1, "app-live-execution-widget", 115);
|
|
461
468
|
i0.ɵɵpipe(2, "async");
|
|
462
|
-
i0.ɵɵlistener("executionClick", function
|
|
469
|
+
i0.ɵɵlistener("executionClick", function ExecutionMonitoringComponent_Conditional_79_Template_app_live_execution_widget_executionClick_1_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onExecutionClick($event)); });
|
|
463
470
|
i0.ɵɵelementEnd()();
|
|
464
471
|
} if (rf & 2) {
|
|
465
472
|
let tmp_1_0;
|
|
@@ -467,8 +474,8 @@ function ExecutionMonitoringComponent_Conditional_92_Template(rf, ctx) { if (rf
|
|
|
467
474
|
i0.ɵɵadvance();
|
|
468
475
|
i0.ɵɵproperty("executions", (tmp_1_0 = i0.ɵɵpipeBind1(2, 1, ctx_r2.liveExecutions$)) !== null && tmp_1_0 !== undefined ? tmp_1_0 : i0.ɵɵpureFunction0(3, _c0));
|
|
469
476
|
} }
|
|
470
|
-
function
|
|
471
|
-
i0.ɵɵelementStart(0, "div",
|
|
477
|
+
function ExecutionMonitoringComponent_Conditional_80_Conditional_12_Conditional_28_Template(rf, ctx) { if (rf & 1) {
|
|
478
|
+
i0.ɵɵelementStart(0, "div", 128)(1, "label");
|
|
472
479
|
i0.ɵɵtext(2, "Completed:");
|
|
473
480
|
i0.ɵɵelementEnd();
|
|
474
481
|
i0.ɵɵelementStart(3, "span");
|
|
@@ -480,8 +487,8 @@ function ExecutionMonitoringComponent_Conditional_93_Conditional_12_Conditional_
|
|
|
480
487
|
i0.ɵɵadvance(4);
|
|
481
488
|
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r2.executionDetails.endTime, "medium"));
|
|
482
489
|
} }
|
|
483
|
-
function
|
|
484
|
-
i0.ɵɵelementStart(0, "div",
|
|
490
|
+
function ExecutionMonitoringComponent_Conditional_80_Conditional_12_Conditional_48_Template(rf, ctx) { if (rf & 1) {
|
|
491
|
+
i0.ɵɵelementStart(0, "div", 128)(1, "label");
|
|
485
492
|
i0.ɵɵtext(2, "Model:");
|
|
486
493
|
i0.ɵɵelementEnd();
|
|
487
494
|
i0.ɵɵelementStart(3, "span");
|
|
@@ -492,11 +499,11 @@ function ExecutionMonitoringComponent_Conditional_93_Conditional_12_Conditional_
|
|
|
492
499
|
i0.ɵɵadvance(4);
|
|
493
500
|
i0.ɵɵtextInterpolate(ctx_r2.executionDetails.model);
|
|
494
501
|
} }
|
|
495
|
-
function
|
|
496
|
-
i0.ɵɵelementStart(0, "div",
|
|
502
|
+
function ExecutionMonitoringComponent_Conditional_80_Conditional_12_Conditional_49_Template(rf, ctx) { if (rf & 1) {
|
|
503
|
+
i0.ɵɵelementStart(0, "div", 126)(1, "h4");
|
|
497
504
|
i0.ɵɵtext(2, "Error Information");
|
|
498
505
|
i0.ɵɵelementEnd();
|
|
499
|
-
i0.ɵɵelementStart(3, "div",
|
|
506
|
+
i0.ɵɵelementStart(3, "div", 129);
|
|
500
507
|
i0.ɵɵtext(4);
|
|
501
508
|
i0.ɵɵelementEnd()();
|
|
502
509
|
} if (rf & 2) {
|
|
@@ -504,17 +511,17 @@ function ExecutionMonitoringComponent_Conditional_93_Conditional_12_Conditional_
|
|
|
504
511
|
i0.ɵɵadvance(4);
|
|
505
512
|
i0.ɵɵtextInterpolate(ctx_r2.executionDetails.errorMessage);
|
|
506
513
|
} }
|
|
507
|
-
function
|
|
508
|
-
i0.ɵɵelementStart(0, "div",
|
|
514
|
+
function ExecutionMonitoringComponent_Conditional_80_Conditional_12_Conditional_50_For_5_Template(rf, ctx) { if (rf & 1) {
|
|
515
|
+
i0.ɵɵelementStart(0, "div", 131)(1, "div", 132)(2, "span", 133);
|
|
509
516
|
i0.ɵɵtext(3);
|
|
510
517
|
i0.ɵɵelementEnd();
|
|
511
|
-
i0.ɵɵelementStart(4, "span",
|
|
518
|
+
i0.ɵɵelementStart(4, "span", 134);
|
|
512
519
|
i0.ɵɵtext(5);
|
|
513
520
|
i0.ɵɵelementEnd();
|
|
514
|
-
i0.ɵɵelementStart(6, "span",
|
|
521
|
+
i0.ɵɵelementStart(6, "span", 135);
|
|
515
522
|
i0.ɵɵtext(7);
|
|
516
523
|
i0.ɵɵelementEnd()();
|
|
517
|
-
i0.ɵɵelementStart(8, "div",
|
|
524
|
+
i0.ɵɵelementStart(8, "div", 136)(9, "span");
|
|
518
525
|
i0.ɵɵtext(10);
|
|
519
526
|
i0.ɵɵelementEnd();
|
|
520
527
|
i0.ɵɵelementStart(11, "span");
|
|
@@ -536,12 +543,12 @@ function ExecutionMonitoringComponent_Conditional_93_Conditional_12_Conditional_
|
|
|
536
543
|
i0.ɵɵadvance(2);
|
|
537
544
|
i0.ɵɵtextInterpolate1("", child_r16.tokens.toLocaleString(), " tokens");
|
|
538
545
|
} }
|
|
539
|
-
function
|
|
540
|
-
i0.ɵɵelementStart(0, "div",
|
|
546
|
+
function ExecutionMonitoringComponent_Conditional_80_Conditional_12_Conditional_50_Template(rf, ctx) { if (rf & 1) {
|
|
547
|
+
i0.ɵɵelementStart(0, "div", 126)(1, "h4");
|
|
541
548
|
i0.ɵɵtext(2);
|
|
542
549
|
i0.ɵɵelementEnd();
|
|
543
|
-
i0.ɵɵelementStart(3, "div",
|
|
544
|
-
i0.ɵɵrepeaterCreate(4,
|
|
550
|
+
i0.ɵɵelementStart(3, "div", 130);
|
|
551
|
+
i0.ɵɵrepeaterCreate(4, ExecutionMonitoringComponent_Conditional_80_Conditional_12_Conditional_50_For_5_Template, 13, 7, "div", 131, _forTrack1);
|
|
545
552
|
i0.ɵɵelementEnd()();
|
|
546
553
|
} if (rf & 2) {
|
|
547
554
|
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
@@ -550,62 +557,62 @@ function ExecutionMonitoringComponent_Conditional_93_Conditional_12_Conditional_
|
|
|
550
557
|
i0.ɵɵadvance(2);
|
|
551
558
|
i0.ɵɵrepeater(ctx_r2.executionDetails.children);
|
|
552
559
|
} }
|
|
553
|
-
function
|
|
554
|
-
i0.ɵɵelementStart(0, "div",
|
|
560
|
+
function ExecutionMonitoringComponent_Conditional_80_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
561
|
+
i0.ɵɵelementStart(0, "div", 124)(1, "div", 126)(2, "h4");
|
|
555
562
|
i0.ɵɵtext(3, "Basic Information");
|
|
556
563
|
i0.ɵɵelementEnd();
|
|
557
|
-
i0.ɵɵelementStart(4, "div",
|
|
564
|
+
i0.ɵɵelementStart(4, "div", 127)(5, "div", 128)(6, "label");
|
|
558
565
|
i0.ɵɵtext(7, "Type:");
|
|
559
566
|
i0.ɵɵelementEnd();
|
|
560
567
|
i0.ɵɵelementStart(8, "span");
|
|
561
568
|
i0.ɵɵtext(9);
|
|
562
569
|
i0.ɵɵpipe(10, "titlecase");
|
|
563
570
|
i0.ɵɵelementEnd()();
|
|
564
|
-
i0.ɵɵelementStart(11, "div",
|
|
571
|
+
i0.ɵɵelementStart(11, "div", 128)(12, "label");
|
|
565
572
|
i0.ɵɵtext(13, "Name:");
|
|
566
573
|
i0.ɵɵelementEnd();
|
|
567
574
|
i0.ɵɵelementStart(14, "span");
|
|
568
575
|
i0.ɵɵtext(15);
|
|
569
576
|
i0.ɵɵelementEnd()();
|
|
570
|
-
i0.ɵɵelementStart(16, "div",
|
|
577
|
+
i0.ɵɵelementStart(16, "div", 128)(17, "label");
|
|
571
578
|
i0.ɵɵtext(18, "Status:");
|
|
572
579
|
i0.ɵɵelementEnd();
|
|
573
|
-
i0.ɵɵelementStart(19, "span",
|
|
580
|
+
i0.ɵɵelementStart(19, "span", 87);
|
|
574
581
|
i0.ɵɵtext(20);
|
|
575
582
|
i0.ɵɵpipe(21, "titlecase");
|
|
576
583
|
i0.ɵɵelementEnd()();
|
|
577
|
-
i0.ɵɵelementStart(22, "div",
|
|
584
|
+
i0.ɵɵelementStart(22, "div", 128)(23, "label");
|
|
578
585
|
i0.ɵɵtext(24, "Started:");
|
|
579
586
|
i0.ɵɵelementEnd();
|
|
580
587
|
i0.ɵɵelementStart(25, "span");
|
|
581
588
|
i0.ɵɵtext(26);
|
|
582
589
|
i0.ɵɵpipe(27, "date");
|
|
583
590
|
i0.ɵɵelementEnd()();
|
|
584
|
-
i0.ɵɵtemplate(28,
|
|
585
|
-
i0.ɵɵelementStart(29, "div",
|
|
591
|
+
i0.ɵɵtemplate(28, ExecutionMonitoringComponent_Conditional_80_Conditional_12_Conditional_28_Template, 6, 4, "div", 128);
|
|
592
|
+
i0.ɵɵelementStart(29, "div", 128)(30, "label");
|
|
586
593
|
i0.ɵɵtext(31, "Duration:");
|
|
587
594
|
i0.ɵɵelementEnd();
|
|
588
595
|
i0.ɵɵelementStart(32, "span");
|
|
589
596
|
i0.ɵɵtext(33);
|
|
590
597
|
i0.ɵɵelementEnd()()()();
|
|
591
|
-
i0.ɵɵelementStart(34, "div",
|
|
598
|
+
i0.ɵɵelementStart(34, "div", 126)(35, "h4");
|
|
592
599
|
i0.ɵɵtext(36, "Resource Usage");
|
|
593
600
|
i0.ɵɵelementEnd();
|
|
594
|
-
i0.ɵɵelementStart(37, "div",
|
|
601
|
+
i0.ɵɵelementStart(37, "div", 127)(38, "div", 128)(39, "label");
|
|
595
602
|
i0.ɵɵtext(40, "Cost:");
|
|
596
603
|
i0.ɵɵelementEnd();
|
|
597
604
|
i0.ɵɵelementStart(41, "span");
|
|
598
605
|
i0.ɵɵtext(42);
|
|
599
606
|
i0.ɵɵelementEnd()();
|
|
600
|
-
i0.ɵɵelementStart(43, "div",
|
|
607
|
+
i0.ɵɵelementStart(43, "div", 128)(44, "label");
|
|
601
608
|
i0.ɵɵtext(45, "Tokens:");
|
|
602
609
|
i0.ɵɵelementEnd();
|
|
603
610
|
i0.ɵɵelementStart(46, "span");
|
|
604
611
|
i0.ɵɵtext(47);
|
|
605
612
|
i0.ɵɵelementEnd()();
|
|
606
|
-
i0.ɵɵtemplate(48,
|
|
613
|
+
i0.ɵɵtemplate(48, ExecutionMonitoringComponent_Conditional_80_Conditional_12_Conditional_48_Template, 5, 1, "div", 128);
|
|
607
614
|
i0.ɵɵelementEnd()();
|
|
608
|
-
i0.ɵɵtemplate(49,
|
|
615
|
+
i0.ɵɵtemplate(49, ExecutionMonitoringComponent_Conditional_80_Conditional_12_Conditional_49_Template, 5, 1, "div", 126)(50, ExecutionMonitoringComponent_Conditional_80_Conditional_12_Conditional_50_Template, 6, 1, "div", 126);
|
|
609
616
|
i0.ɵɵelementEnd();
|
|
610
617
|
} if (rf & 2) {
|
|
611
618
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
@@ -634,33 +641,33 @@ function ExecutionMonitoringComponent_Conditional_93_Conditional_12_Template(rf,
|
|
|
634
641
|
i0.ɵɵadvance();
|
|
635
642
|
i0.ɵɵconditional(ctx_r2.executionDetails.children.length > 0 ? 50 : -1);
|
|
636
643
|
} }
|
|
637
|
-
function
|
|
638
|
-
i0.ɵɵelementStart(0, "div",
|
|
639
|
-
i0.ɵɵelement(1, "div",
|
|
644
|
+
function ExecutionMonitoringComponent_Conditional_80_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
645
|
+
i0.ɵɵelementStart(0, "div", 125);
|
|
646
|
+
i0.ɵɵelement(1, "div", 137);
|
|
640
647
|
i0.ɵɵelementStart(2, "p");
|
|
641
648
|
i0.ɵɵtext(3, "Loading execution details...");
|
|
642
649
|
i0.ɵɵelementEnd()();
|
|
643
650
|
} }
|
|
644
|
-
function
|
|
651
|
+
function ExecutionMonitoringComponent_Conditional_80_Template(rf, ctx) { if (rf & 1) {
|
|
645
652
|
const _r15 = i0.ɵɵgetCurrentView();
|
|
646
|
-
i0.ɵɵelementStart(0, "div",
|
|
647
|
-
i0.ɵɵlistener("click", function
|
|
648
|
-
i0.ɵɵelementStart(1, "div",
|
|
649
|
-
i0.ɵɵlistener("click", function
|
|
650
|
-
i0.ɵɵelementStart(2, "div",
|
|
653
|
+
i0.ɵɵelementStart(0, "div", 116);
|
|
654
|
+
i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Conditional_80_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeExecutionModal()); });
|
|
655
|
+
i0.ɵɵelementStart(1, "div", 117);
|
|
656
|
+
i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Conditional_80_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r15); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
657
|
+
i0.ɵɵelementStart(2, "div", 118)(3, "h3");
|
|
651
658
|
i0.ɵɵtext(4, "Execution Details");
|
|
652
659
|
i0.ɵɵelementEnd();
|
|
653
|
-
i0.ɵɵelementStart(5, "div",
|
|
654
|
-
i0.ɵɵlistener("click", function
|
|
655
|
-
i0.ɵɵelement(7, "i",
|
|
660
|
+
i0.ɵɵelementStart(5, "div", 119)(6, "button", 120);
|
|
661
|
+
i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Conditional_80_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.openFullRecord()); });
|
|
662
|
+
i0.ɵɵelement(7, "i", 121);
|
|
656
663
|
i0.ɵɵtext(8, " Open ");
|
|
657
664
|
i0.ɵɵelementEnd();
|
|
658
|
-
i0.ɵɵelementStart(9, "button",
|
|
659
|
-
i0.ɵɵlistener("click", function
|
|
660
|
-
i0.ɵɵelement(10, "i",
|
|
665
|
+
i0.ɵɵelementStart(9, "button", 122);
|
|
666
|
+
i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Conditional_80_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeExecutionModal()); });
|
|
667
|
+
i0.ɵɵelement(10, "i", 70);
|
|
661
668
|
i0.ɵɵelementEnd()()();
|
|
662
|
-
i0.ɵɵelementStart(11, "div",
|
|
663
|
-
i0.ɵɵtemplate(12,
|
|
669
|
+
i0.ɵɵelementStart(11, "div", 123);
|
|
670
|
+
i0.ɵɵtemplate(12, ExecutionMonitoringComponent_Conditional_80_Conditional_12_Template, 51, 20, "div", 124)(13, ExecutionMonitoringComponent_Conditional_80_Conditional_13_Template, 4, 0, "div", 125);
|
|
664
671
|
i0.ɵɵelementEnd()()();
|
|
665
672
|
} if (rf & 2) {
|
|
666
673
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
@@ -671,13 +678,13 @@ function ExecutionMonitoringComponent_Conditional_93_Template(rf, ctx) { if (rf
|
|
|
671
678
|
} }
|
|
672
679
|
export class ExecutionMonitoringComponent {
|
|
673
680
|
instrumentationService;
|
|
681
|
+
cdr;
|
|
674
682
|
initialState;
|
|
675
683
|
openEntityRecord = new EventEmitter();
|
|
676
684
|
stateChange = new EventEmitter();
|
|
677
685
|
destroy$ = new Subject();
|
|
678
686
|
stateChangeSubject$ = new Subject();
|
|
679
687
|
// Configuration
|
|
680
|
-
refreshInterval = 30000; // 30 seconds
|
|
681
688
|
selectedTimeRange = '24h';
|
|
682
689
|
isLoading = false;
|
|
683
690
|
// Chart configurations
|
|
@@ -719,13 +726,19 @@ export class ExecutionMonitoringComponent {
|
|
|
719
726
|
get activeTab() {
|
|
720
727
|
return this.drillDownTabs.find(tab => tab.id === this.activeTabId);
|
|
721
728
|
}
|
|
722
|
-
constructor(instrumentationService) {
|
|
729
|
+
constructor(instrumentationService, cdr) {
|
|
723
730
|
this.instrumentationService = instrumentationService;
|
|
731
|
+
this.cdr = cdr;
|
|
724
732
|
// Initialize data streams
|
|
725
733
|
this.kpis$ = this.instrumentationService.kpis$;
|
|
726
734
|
this.trends$ = this.instrumentationService.trends$;
|
|
727
735
|
this.liveExecutions$ = this.instrumentationService.liveExecutions$;
|
|
728
736
|
this.chartData$ = this.instrumentationService.chartData$;
|
|
737
|
+
// Subscribe to loading state from service
|
|
738
|
+
this.instrumentationService.isLoading$.pipe(takeUntil(this.destroy$)).subscribe(loading => {
|
|
739
|
+
this.isLoading = loading;
|
|
740
|
+
this.cdr.markForCheck();
|
|
741
|
+
});
|
|
729
742
|
// Derived streams
|
|
730
743
|
this.kpiCards$ = this.kpis$.pipe(map(kpis => this.createKPICards(kpis)));
|
|
731
744
|
this.performanceMatrix$ = this.chartData$.pipe(map(data => data.performanceMatrix.map(item => ({
|
|
@@ -744,7 +757,6 @@ export class ExecutionMonitoringComponent {
|
|
|
744
757
|
}
|
|
745
758
|
else {
|
|
746
759
|
// Default initialization
|
|
747
|
-
this.instrumentationService.setRefreshInterval(this.refreshInterval);
|
|
748
760
|
this.setTimeRange(this.selectedTimeRange);
|
|
749
761
|
// Initialize with main chart tab
|
|
750
762
|
this.drillDownTabs = [
|
|
@@ -755,6 +767,8 @@ export class ExecutionMonitoringComponent {
|
|
|
755
767
|
closeable: false
|
|
756
768
|
}
|
|
757
769
|
];
|
|
770
|
+
// Trigger initial data load
|
|
771
|
+
this.instrumentationService.refresh();
|
|
758
772
|
}
|
|
759
773
|
// Set up debounced state change emission
|
|
760
774
|
this.stateChangeSubject$.pipe(debounceTime(2000), // 2 second debounce
|
|
@@ -770,7 +784,7 @@ export class ExecutionMonitoringComponent {
|
|
|
770
784
|
getCurrentState() {
|
|
771
785
|
return {
|
|
772
786
|
selectedTimeRange: this.selectedTimeRange,
|
|
773
|
-
refreshInterval:
|
|
787
|
+
refreshInterval: 0, // Always manual refresh now
|
|
774
788
|
panelStates: { ...this.panelStates },
|
|
775
789
|
drillDownTabs: this.drillDownTabs.map(tab => ({
|
|
776
790
|
id: tab.id,
|
|
@@ -791,10 +805,7 @@ export class ExecutionMonitoringComponent {
|
|
|
791
805
|
this.selectedTimeRange = state.selectedTimeRange;
|
|
792
806
|
this.setTimeRange(state.selectedTimeRange);
|
|
793
807
|
}
|
|
794
|
-
|
|
795
|
-
this.refreshInterval = state.refreshInterval;
|
|
796
|
-
this.instrumentationService.setRefreshInterval(this.refreshInterval);
|
|
797
|
-
}
|
|
808
|
+
// No longer need to handle refreshInterval since we removed auto-refresh
|
|
798
809
|
if (state.panelStates) {
|
|
799
810
|
// Only override if state has explicit panel states, otherwise keep defaults
|
|
800
811
|
this.panelStates = { ...this.panelStates, ...state.panelStates };
|
|
@@ -868,18 +879,20 @@ export class ExecutionMonitoringComponent {
|
|
|
868
879
|
}
|
|
869
880
|
];
|
|
870
881
|
}
|
|
871
|
-
onRefreshIntervalChange() {
|
|
872
|
-
this.instrumentationService.setRefreshInterval(this.refreshInterval);
|
|
873
|
-
this.emitStateChange();
|
|
874
|
-
}
|
|
875
882
|
onTimeRangeChange() {
|
|
883
|
+
// Simply change time range - loading state is managed by the service
|
|
876
884
|
this.setTimeRange(this.selectedTimeRange);
|
|
877
885
|
this.emitStateChange();
|
|
878
886
|
}
|
|
879
887
|
setTimeRange(range) {
|
|
888
|
+
const { start, end } = this.getTimeRangeFromSelection(range);
|
|
889
|
+
this.instrumentationService.setDateRange(start, end);
|
|
890
|
+
}
|
|
891
|
+
getTimeRangeFromSelection(range) {
|
|
880
892
|
const now = new Date();
|
|
893
|
+
const selectedRange = range || this.selectedTimeRange;
|
|
881
894
|
let start;
|
|
882
|
-
switch (
|
|
895
|
+
switch (selectedRange) {
|
|
883
896
|
case '1h':
|
|
884
897
|
start = new Date(now.getTime() - 60 * 60 * 1000);
|
|
885
898
|
break;
|
|
@@ -898,17 +911,11 @@ export class ExecutionMonitoringComponent {
|
|
|
898
911
|
default:
|
|
899
912
|
start = new Date(now.getTime() - 24 * 60 * 60 * 1000);
|
|
900
913
|
}
|
|
901
|
-
|
|
914
|
+
return { start, end: now };
|
|
902
915
|
}
|
|
903
916
|
refreshData() {
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
const currentInterval = this.refreshInterval;
|
|
907
|
-
this.instrumentationService.setRefreshInterval(0);
|
|
908
|
-
setTimeout(() => {
|
|
909
|
-
this.instrumentationService.setRefreshInterval(currentInterval);
|
|
910
|
-
this.isLoading = false;
|
|
911
|
-
}, 100);
|
|
917
|
+
// Simply trigger refresh - loading state is managed by the service
|
|
918
|
+
this.instrumentationService.refresh();
|
|
912
919
|
}
|
|
913
920
|
onExecutionClick(execution) {
|
|
914
921
|
this.selectedExecution = execution;
|
|
@@ -932,6 +939,7 @@ export class ExecutionMonitoringComponent {
|
|
|
932
939
|
if (!this.drillDownTabs.find(tab => tab.id === tabId)) {
|
|
933
940
|
this.drillDownTabs.push(newTab);
|
|
934
941
|
this.emitStateChange(); // Emit state when new tab is added
|
|
942
|
+
this.cdr.markForCheck();
|
|
935
943
|
}
|
|
936
944
|
// Switch to the new tab
|
|
937
945
|
this.selectTab(tabId);
|
|
@@ -1050,6 +1058,7 @@ export class ExecutionMonitoringComponent {
|
|
|
1050
1058
|
window.dispatchEvent(new Event('resize'));
|
|
1051
1059
|
}, 100);
|
|
1052
1060
|
this.emitStateChange();
|
|
1061
|
+
this.cdr.markForCheck();
|
|
1053
1062
|
}
|
|
1054
1063
|
closeTab(event, tabId) {
|
|
1055
1064
|
event.stopPropagation();
|
|
@@ -1111,9 +1120,39 @@ export class ExecutionMonitoringComponent {
|
|
|
1111
1120
|
return;
|
|
1112
1121
|
this.loadingDrillDown = true;
|
|
1113
1122
|
try {
|
|
1114
|
-
//
|
|
1115
|
-
const
|
|
1116
|
-
const
|
|
1123
|
+
// Determine bucket size based on selected time range
|
|
1124
|
+
const { start, end } = this.getTimeRangeFromSelection();
|
|
1125
|
+
const duration = end.getTime() - start.getTime();
|
|
1126
|
+
const hours = duration / (1000 * 60 * 60);
|
|
1127
|
+
let windowSizeMs;
|
|
1128
|
+
let alignToDay = false;
|
|
1129
|
+
if (hours <= 24) {
|
|
1130
|
+
// For up to 24 hours, use 1 hour window (30 min before and after)
|
|
1131
|
+
windowSizeMs = 30 * 60 * 1000;
|
|
1132
|
+
}
|
|
1133
|
+
else if (hours <= 24 * 7) {
|
|
1134
|
+
// For up to 7 days, use full day window
|
|
1135
|
+
// Since data is aggregated into 4-hour buckets, we need to capture the full day
|
|
1136
|
+
windowSizeMs = 12 * 60 * 60 * 1000; // 12 hours before/after = 24 hour window
|
|
1137
|
+
alignToDay = true;
|
|
1138
|
+
}
|
|
1139
|
+
else {
|
|
1140
|
+
// For more than 7 days, use full day window
|
|
1141
|
+
windowSizeMs = 12 * 60 * 60 * 1000; // 12 hours before/after = 24 hour window
|
|
1142
|
+
alignToDay = true;
|
|
1143
|
+
}
|
|
1144
|
+
// Create time window around the clicked point
|
|
1145
|
+
let startTime = new Date(tab.timestamp.getTime() - windowSizeMs);
|
|
1146
|
+
let endTime = new Date(tab.timestamp.getTime() + windowSizeMs);
|
|
1147
|
+
// For day-aligned queries, expand to full day boundaries
|
|
1148
|
+
if (alignToDay) {
|
|
1149
|
+
// Set start to beginning of the day
|
|
1150
|
+
startTime = new Date(tab.timestamp);
|
|
1151
|
+
startTime.setHours(0, 0, 0, 0);
|
|
1152
|
+
// Set end to end of the day
|
|
1153
|
+
endTime = new Date(tab.timestamp);
|
|
1154
|
+
endTime.setHours(23, 59, 59, 999);
|
|
1155
|
+
}
|
|
1117
1156
|
// Load executions for this time period
|
|
1118
1157
|
const [promptResults, agentResults] = await Promise.all([
|
|
1119
1158
|
new RunView().RunView({
|
|
@@ -1139,8 +1178,8 @@ export class ExecutionMonitoringComponent {
|
|
|
1139
1178
|
executions.push({
|
|
1140
1179
|
id: run.ID,
|
|
1141
1180
|
type: 'prompt',
|
|
1142
|
-
name:
|
|
1143
|
-
model: run.
|
|
1181
|
+
name: run.Prompt || 'Unnamed Prompt',
|
|
1182
|
+
model: run.Model || undefined,
|
|
1144
1183
|
status: run.Success ? 'completed' : (run.Success === false ? 'failed' : 'running'),
|
|
1145
1184
|
startTime: new Date(run.RunAt),
|
|
1146
1185
|
endTime: run.CompletedAt ? new Date(run.CompletedAt) : undefined,
|
|
@@ -1158,7 +1197,7 @@ export class ExecutionMonitoringComponent {
|
|
|
1158
1197
|
executions.push({
|
|
1159
1198
|
id: run.ID,
|
|
1160
1199
|
type: 'agent',
|
|
1161
|
-
name:
|
|
1200
|
+
name: run.Agent || 'Unnamed Agent',
|
|
1162
1201
|
status: run.Status.toLowerCase(),
|
|
1163
1202
|
startTime: new Date(run.StartedAt),
|
|
1164
1203
|
endTime: run.CompletedAt ? new Date(run.CompletedAt) : undefined,
|
|
@@ -1172,13 +1211,16 @@ export class ExecutionMonitoringComponent {
|
|
|
1172
1211
|
executions.sort((a, b) => b.startTime.getTime() - a.startTime.getTime());
|
|
1173
1212
|
// Update tab data
|
|
1174
1213
|
tab.data = executions;
|
|
1214
|
+
this.cdr.markForCheck();
|
|
1175
1215
|
}
|
|
1176
1216
|
catch (error) {
|
|
1177
1217
|
console.error('Error loading drill-down data:', error);
|
|
1178
1218
|
tab.data = [];
|
|
1219
|
+
this.cdr.markForCheck();
|
|
1179
1220
|
}
|
|
1180
1221
|
finally {
|
|
1181
1222
|
this.loadingDrillDown = false;
|
|
1223
|
+
this.cdr.markForCheck();
|
|
1182
1224
|
}
|
|
1183
1225
|
}
|
|
1184
1226
|
async loadModelDetails(tab, modelName) {
|
|
@@ -1216,48 +1258,6 @@ export class ExecutionMonitoringComponent {
|
|
|
1216
1258
|
}
|
|
1217
1259
|
}
|
|
1218
1260
|
// Helper methods for drill-down
|
|
1219
|
-
async getPromptName(promptId) {
|
|
1220
|
-
try {
|
|
1221
|
-
const rv = new RunView();
|
|
1222
|
-
const result = await rv.RunView({
|
|
1223
|
-
EntityName: 'AI Prompts',
|
|
1224
|
-
ExtraFilter: `ID = '${promptId}'`,
|
|
1225
|
-
ResultType: 'entity_object'
|
|
1226
|
-
});
|
|
1227
|
-
return result.Results[0]?.Name || 'Unknown Prompt';
|
|
1228
|
-
}
|
|
1229
|
-
catch {
|
|
1230
|
-
return 'Unknown Prompt';
|
|
1231
|
-
}
|
|
1232
|
-
}
|
|
1233
|
-
async getAgentName(agentId) {
|
|
1234
|
-
try {
|
|
1235
|
-
const rv = new RunView();
|
|
1236
|
-
const result = await rv.RunView({
|
|
1237
|
-
EntityName: 'AI Agents',
|
|
1238
|
-
ExtraFilter: `ID = '${agentId}'`,
|
|
1239
|
-
ResultType: 'entity_object'
|
|
1240
|
-
});
|
|
1241
|
-
return result.Results[0]?.Name || 'Unknown Agent';
|
|
1242
|
-
}
|
|
1243
|
-
catch {
|
|
1244
|
-
return 'Unknown Agent';
|
|
1245
|
-
}
|
|
1246
|
-
}
|
|
1247
|
-
async getModelName(modelId) {
|
|
1248
|
-
try {
|
|
1249
|
-
const rv = new RunView();
|
|
1250
|
-
const result = await rv.RunView({
|
|
1251
|
-
EntityName: 'AI Models',
|
|
1252
|
-
ExtraFilter: `ID = '${modelId}'`,
|
|
1253
|
-
ResultType: 'entity_object'
|
|
1254
|
-
});
|
|
1255
|
-
return result.Results[0]?.Name || 'Unknown Model';
|
|
1256
|
-
}
|
|
1257
|
-
catch {
|
|
1258
|
-
return 'Unknown Model';
|
|
1259
|
-
}
|
|
1260
|
-
}
|
|
1261
1261
|
formatTimestamp(timestamp) {
|
|
1262
1262
|
return timestamp.toLocaleString();
|
|
1263
1263
|
}
|
|
@@ -1326,185 +1326,167 @@ export class ExecutionMonitoringComponent {
|
|
|
1326
1326
|
// Emit state change when splitter changes
|
|
1327
1327
|
this.emitStateChange();
|
|
1328
1328
|
}
|
|
1329
|
-
static ɵfac = function ExecutionMonitoringComponent_Factory(t) { return new (t || ExecutionMonitoringComponent)(i0.ɵɵdirectiveInject(i1.AIInstrumentationService)); };
|
|
1330
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ExecutionMonitoringComponent, selectors: [["app-execution-monitoring"]], inputs: { initialState: "initialState" }, outputs: { openEntityRecord: "openEntityRecord", stateChange: "stateChange" }, decls:
|
|
1331
|
-
i0.ɵɵelementStart(0, "div", 0)
|
|
1332
|
-
i0.ɵɵ
|
|
1333
|
-
i0.ɵɵ
|
|
1329
|
+
static ɵfac = function ExecutionMonitoringComponent_Factory(t) { return new (t || ExecutionMonitoringComponent)(i0.ɵɵdirectiveInject(i1.AIInstrumentationService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
1330
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ExecutionMonitoringComponent, selectors: [["app-execution-monitoring"]], inputs: { initialState: "initialState" }, outputs: { openEntityRecord: "openEntityRecord", stateChange: "stateChange" }, decls: 81, vars: 50, consts: [[1, "execution-monitoring"], [1, "loading-overlay"], [1, "monitoring-header"], [1, "monitoring-title"], [1, "fa-solid", "fa-chart-line"], [1, "monitoring-controls"], [1, "time-range-control"], [3, "ngModelChange", "change", "ngModel", "disabled"], ["value", "1h"], ["value", "6h"], ["value", "24h"], ["value", "7d"], ["value", "30d"], [1, "refresh-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-refresh"], [1, "kpi-dashboard"], [1, "kpi-grid"], [3, "data", "clickable"], ["orientation", "vertical", 1, "dashboard-splitter", 3, "layoutChange"], ["size", "45%", 3, "resizable", "collapsible"], ["orientation", "horizontal", 3, "layoutChange"], ["size", "30%", 3, "resizable", "collapsible", "collapsed"], [1, "dashboard-section", "system-status"], [1, "status-container"], [1, "chart-header"], [1, "chart-title"], [1, "fa-solid", "fa-heartbeat"], [1, "status-metrics"], [3, "resizable", "collapsible"], [1, "dashboard-section", "drill-down-container"], [1, "drill-down-tabs"], [1, "tab-header"], [1, "tab-item", 3, "active"], [1, "tab-content"], [1, "tab-pane", "trends-chart"], [1, "tab-pane", "executions-drill-down"], [1, "tab-pane", "model-detail"], ["size", "50%", 3, "resizable", "collapsible"], [1, "dashboard-section", "performance-matrix"], ["title", "Agent vs Model Performance", 3, "data", "config"], [1, "dashboard-section", "analysis-panels"], [1, "analysis-panel"], [1, "panel-header", 3, "click"], [1, "panel-title"], [1, "fa-solid", "fa-dollar-sign"], [1, "fa-solid", "panel-toggle-icon"], [1, "panel-content"], [1, "fa-solid", "fa-chart-pie"], [1, "fa-solid", "fa-bolt"], [1, "panel-content", "live-executions-panel"], [1, "execution-modal"], [1, "loading-content"], [1, "fa-solid", "fa-spinner", "fa-spin", "fa-3x"], [3, "click", "data"], [1, "status-metric"], [1, "status-icon", "status-icon--success"], [1, "fa-solid", "fa-check"], [1, "status-info"], [1, "status-label"], [1, "status-value"], [1, "status-subtitle"], [1, "status-icon", "status-icon--warning"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "status-icon", "status-icon--info"], [1, "fa-solid", "fa-clock"], [1, "status-icon", "status-icon--primary"], [1, "tab-item", 3, "click"], [1, "tab-title"], ["title", "Close tab", 1, "tab-close"], ["title", "Close tab", 1, "tab-close", 3, "click"], [1, "fa-solid", "fa-times"], ["title", "Execution Trends", 3, "dataPointClick", "timeRangeChange", "data", "config"], [1, "drill-down-header"], [1, "fa-solid", "fa-list"], [1, "drill-down-meta"], [1, "timestamp"], [1, "metric-badge"], [1, "loading-spinner"], [1, "executions-table"], [1, "no-data"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "table-header"], [1, "header-cell"], [1, "table-row"], [1, "table-row", 3, "click"], [1, "table-cell"], [1, "type-badge"], [1, "status-badge"], [1, "fa-solid", "fa-inbox"], [1, "fa-solid", "fa-microchip"], [1, "model-details"], [1, "model-info-grid"], [1, "info-item"], [1, "status-indicator"], [1, "model-description"], [1, "cost-bars"], [1, "cost-bar-item"], [1, "cost-bar-info"], [1, "model-name"], [1, "cost-value"], [1, "cost-bar-container"], [1, "cost-bar"], [1, "token-info"], [1, "efficiency-items"], [1, "efficiency-item"], [1, "efficiency-header"], [1, "efficiency-ratio"], [1, "token-breakdown"], [1, "token-bar"], [1, "token-segment", "token-segment--input"], [1, "token-segment", "token-segment--output"], [1, "token-labels"], [1, "input-label"], [1, "output-label"], [1, "cost-per-token"], [3, "executionClick", "executions"], [1, "execution-modal", 3, "click"], [1, "execution-modal-content", 3, "click"], [1, "execution-modal-header"], [1, "modal-header-actions"], [1, "open-record-btn", 3, "click"], [1, "fa-solid", "fa-external-link-alt"], [1, "close-btn", 3, "click"], [1, "execution-modal-body"], [1, "execution-details"], [1, "loading-details"], [1, "detail-section"], [1, "detail-grid"], [1, "detail-item"], [1, "error-message"], [1, "child-executions"], [1, "child-execution"], [1, "child-info"], [1, "child-name"], [1, "child-type"], [1, "child-status"], [1, "child-metrics"], [1, "spinner"]], template: function ExecutionMonitoringComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1331
|
+
i0.ɵɵelementStart(0, "div", 0);
|
|
1332
|
+
i0.ɵɵtemplate(1, ExecutionMonitoringComponent_Conditional_1_Template, 5, 0, "div", 1);
|
|
1333
|
+
i0.ɵɵelementStart(2, "div", 2)(3, "h2", 3);
|
|
1334
|
+
i0.ɵɵelement(4, "i", 4);
|
|
1335
|
+
i0.ɵɵtext(5, " AI Execution Monitoring ");
|
|
1334
1336
|
i0.ɵɵelementEnd();
|
|
1335
|
-
i0.ɵɵelementStart(
|
|
1336
|
-
i0.ɵɵtext(
|
|
1337
|
+
i0.ɵɵelementStart(6, "div", 5)(7, "div", 6)(8, "label");
|
|
1338
|
+
i0.ɵɵtext(9, "Time Range:");
|
|
1337
1339
|
i0.ɵɵelementEnd();
|
|
1338
|
-
i0.ɵɵelementStart(
|
|
1339
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
1340
|
-
i0.ɵɵlistener("change", function
|
|
1341
|
-
i0.ɵɵelementStart(
|
|
1342
|
-
i0.ɵɵtext(
|
|
1340
|
+
i0.ɵɵelementStart(10, "select", 7);
|
|
1341
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ExecutionMonitoringComponent_Template_select_ngModelChange_10_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.selectedTimeRange, $event) || (ctx.selectedTimeRange = $event); return $event; });
|
|
1342
|
+
i0.ɵɵlistener("change", function ExecutionMonitoringComponent_Template_select_change_10_listener() { return ctx.onTimeRangeChange(); });
|
|
1343
|
+
i0.ɵɵelementStart(11, "option", 8);
|
|
1344
|
+
i0.ɵɵtext(12, "Last Hour");
|
|
1343
1345
|
i0.ɵɵelementEnd();
|
|
1344
|
-
i0.ɵɵelementStart(
|
|
1345
|
-
i0.ɵɵtext(
|
|
1346
|
+
i0.ɵɵelementStart(13, "option", 9);
|
|
1347
|
+
i0.ɵɵtext(14, "Last 6 Hours");
|
|
1346
1348
|
i0.ɵɵelementEnd();
|
|
1347
|
-
i0.ɵɵelementStart(
|
|
1348
|
-
i0.ɵɵtext(
|
|
1349
|
+
i0.ɵɵelementStart(15, "option", 10);
|
|
1350
|
+
i0.ɵɵtext(16, "Last 24 Hours");
|
|
1349
1351
|
i0.ɵɵelementEnd();
|
|
1350
|
-
i0.ɵɵelementStart(
|
|
1351
|
-
i0.ɵɵtext(
|
|
1352
|
+
i0.ɵɵelementStart(17, "option", 11);
|
|
1353
|
+
i0.ɵɵtext(18, "Last 7 Days");
|
|
1352
1354
|
i0.ɵɵelementEnd();
|
|
1353
|
-
i0.ɵɵelementStart(
|
|
1354
|
-
i0.ɵɵtext(
|
|
1355
|
+
i0.ɵɵelementStart(19, "option", 12);
|
|
1356
|
+
i0.ɵɵtext(20, "Last 30 Days");
|
|
1355
1357
|
i0.ɵɵelementEnd()()();
|
|
1356
|
-
i0.ɵɵelementStart(
|
|
1357
|
-
i0.ɵɵ
|
|
1358
|
-
i0.ɵɵ
|
|
1359
|
-
i0.ɵɵ
|
|
1360
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ExecutionMonitoringComponent_Template_select_ngModelChange_23_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.selectedTimeRange, $event) || (ctx.selectedTimeRange = $event); return $event; });
|
|
1361
|
-
i0.ɵɵlistener("change", function ExecutionMonitoringComponent_Template_select_change_23_listener() { return ctx.onTimeRangeChange(); });
|
|
1362
|
-
i0.ɵɵelementStart(24, "option", 9);
|
|
1363
|
-
i0.ɵɵtext(25, "Last Hour");
|
|
1364
|
-
i0.ɵɵelementEnd();
|
|
1365
|
-
i0.ɵɵelementStart(26, "option", 10);
|
|
1366
|
-
i0.ɵɵtext(27, "Last 6 Hours");
|
|
1367
|
-
i0.ɵɵelementEnd();
|
|
1368
|
-
i0.ɵɵelementStart(28, "option", 11);
|
|
1369
|
-
i0.ɵɵtext(29, "Last 24 Hours");
|
|
1370
|
-
i0.ɵɵelementEnd();
|
|
1371
|
-
i0.ɵɵelementStart(30, "option", 12);
|
|
1372
|
-
i0.ɵɵtext(31, "Last 7 Days");
|
|
1373
|
-
i0.ɵɵelementEnd();
|
|
1374
|
-
i0.ɵɵelementStart(32, "option", 13);
|
|
1375
|
-
i0.ɵɵtext(33, "Last 30 Days");
|
|
1376
|
-
i0.ɵɵelementEnd()()();
|
|
1377
|
-
i0.ɵɵelementStart(34, "button", 14);
|
|
1378
|
-
i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Template_button_click_34_listener() { return ctx.refreshData(); });
|
|
1379
|
-
i0.ɵɵelement(35, "i", 15);
|
|
1380
|
-
i0.ɵɵtext(36, " Refresh ");
|
|
1358
|
+
i0.ɵɵelementStart(21, "button", 13);
|
|
1359
|
+
i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Template_button_click_21_listener() { return ctx.refreshData(); });
|
|
1360
|
+
i0.ɵɵelement(22, "i", 14);
|
|
1361
|
+
i0.ɵɵtext(23, " Refresh ");
|
|
1381
1362
|
i0.ɵɵelementEnd()()();
|
|
1382
|
-
i0.ɵɵelementStart(
|
|
1383
|
-
i0.ɵɵrepeaterCreate(
|
|
1384
|
-
i0.ɵɵpipe(
|
|
1363
|
+
i0.ɵɵelementStart(24, "div", 15)(25, "div", 16);
|
|
1364
|
+
i0.ɵɵrepeaterCreate(26, ExecutionMonitoringComponent_For_27_Template, 1, 3, "app-kpi-card", 17, _forTrack0);
|
|
1365
|
+
i0.ɵɵpipe(28, "async");
|
|
1385
1366
|
i0.ɵɵelementEnd()();
|
|
1386
|
-
i0.ɵɵelementStart(
|
|
1387
|
-
i0.ɵɵlistener("layoutChange", function
|
|
1388
|
-
i0.ɵɵelementStart(
|
|
1389
|
-
i0.ɵɵlistener("layoutChange", function
|
|
1390
|
-
i0.ɵɵelementStart(
|
|
1391
|
-
i0.ɵɵelement(
|
|
1392
|
-
i0.ɵɵtext(
|
|
1367
|
+
i0.ɵɵelementStart(29, "kendo-splitter", 18);
|
|
1368
|
+
i0.ɵɵlistener("layoutChange", function ExecutionMonitoringComponent_Template_kendo_splitter_layoutChange_29_listener($event) { return ctx.onSplitterLayoutChange($event); });
|
|
1369
|
+
i0.ɵɵelementStart(30, "kendo-splitter-pane", 19)(31, "kendo-splitter", 20);
|
|
1370
|
+
i0.ɵɵlistener("layoutChange", function ExecutionMonitoringComponent_Template_kendo_splitter_layoutChange_31_listener($event) { return ctx.onSplitterLayoutChange($event); });
|
|
1371
|
+
i0.ɵɵelementStart(32, "kendo-splitter-pane", 21)(33, "div", 22)(34, "div", 23)(35, "div", 24)(36, "h4", 25);
|
|
1372
|
+
i0.ɵɵelement(37, "i", 26);
|
|
1373
|
+
i0.ɵɵtext(38, " System Health ");
|
|
1393
1374
|
i0.ɵɵelementEnd()();
|
|
1394
|
-
i0.ɵɵtemplate(
|
|
1395
|
-
i0.ɵɵpipe(
|
|
1375
|
+
i0.ɵɵtemplate(39, ExecutionMonitoringComponent_Conditional_39_Template, 41, 6, "div", 27);
|
|
1376
|
+
i0.ɵɵpipe(40, "async");
|
|
1396
1377
|
i0.ɵɵelementEnd()()();
|
|
1397
|
-
i0.ɵɵelementStart(
|
|
1398
|
-
i0.ɵɵrepeaterCreate(
|
|
1378
|
+
i0.ɵɵelementStart(41, "kendo-splitter-pane", 28)(42, "div", 29)(43, "div", 30)(44, "div", 31);
|
|
1379
|
+
i0.ɵɵrepeaterCreate(45, ExecutionMonitoringComponent_For_46_Template, 4, 4, "div", 32, _forTrack1);
|
|
1399
1380
|
i0.ɵɵelementEnd();
|
|
1400
|
-
i0.ɵɵelementStart(
|
|
1401
|
-
i0.ɵɵtemplate(
|
|
1381
|
+
i0.ɵɵelementStart(47, "div", 33);
|
|
1382
|
+
i0.ɵɵtemplate(48, ExecutionMonitoringComponent_Conditional_48_Template, 3, 5, "div", 34)(49, ExecutionMonitoringComponent_Conditional_49_Template, 11, 4, "div", 35)(50, ExecutionMonitoringComponent_Conditional_50_Template, 7, 2, "div", 36);
|
|
1402
1383
|
i0.ɵɵelementEnd()()()()()();
|
|
1403
|
-
i0.ɵɵelementStart(
|
|
1404
|
-
i0.ɵɵlistener("layoutChange", function
|
|
1405
|
-
i0.ɵɵelementStart(
|
|
1406
|
-
i0.ɵɵelement(
|
|
1407
|
-
i0.ɵɵpipe(
|
|
1384
|
+
i0.ɵɵelementStart(51, "kendo-splitter-pane", 28)(52, "kendo-splitter", 20);
|
|
1385
|
+
i0.ɵɵlistener("layoutChange", function ExecutionMonitoringComponent_Template_kendo_splitter_layoutChange_52_listener($event) { return ctx.onSplitterLayoutChange($event); });
|
|
1386
|
+
i0.ɵɵelementStart(53, "kendo-splitter-pane", 37)(54, "div", 38);
|
|
1387
|
+
i0.ɵɵelement(55, "app-performance-heatmap", 39);
|
|
1388
|
+
i0.ɵɵpipe(56, "async");
|
|
1408
1389
|
i0.ɵɵelementEnd()();
|
|
1409
|
-
i0.ɵɵelementStart(
|
|
1410
|
-
i0.ɵɵlistener("click", function
|
|
1411
|
-
i0.ɵɵelementStart(
|
|
1412
|
-
i0.ɵɵelement(
|
|
1413
|
-
i0.ɵɵtext(
|
|
1390
|
+
i0.ɵɵelementStart(57, "kendo-splitter-pane", 28)(58, "div", 40)(59, "div", 41)(60, "div", 42);
|
|
1391
|
+
i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Template_div_click_60_listener() { return ctx.togglePanel("cost"); });
|
|
1392
|
+
i0.ɵɵelementStart(61, "span", 43);
|
|
1393
|
+
i0.ɵɵelement(62, "i", 44);
|
|
1394
|
+
i0.ɵɵtext(63, " Cost Analysis ");
|
|
1414
1395
|
i0.ɵɵelementEnd();
|
|
1415
|
-
i0.ɵɵelement(
|
|
1396
|
+
i0.ɵɵelement(64, "i", 45);
|
|
1416
1397
|
i0.ɵɵelementEnd();
|
|
1417
|
-
i0.ɵɵtemplate(
|
|
1398
|
+
i0.ɵɵtemplate(65, ExecutionMonitoringComponent_Conditional_65_Template, 3, 3, "div", 46);
|
|
1418
1399
|
i0.ɵɵelementEnd();
|
|
1419
|
-
i0.ɵɵelementStart(
|
|
1420
|
-
i0.ɵɵlistener("click", function
|
|
1421
|
-
i0.ɵɵelementStart(
|
|
1422
|
-
i0.ɵɵelement(
|
|
1423
|
-
i0.ɵɵtext(
|
|
1400
|
+
i0.ɵɵelementStart(66, "div", 41)(67, "div", 42);
|
|
1401
|
+
i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Template_div_click_67_listener() { return ctx.togglePanel("efficiency"); });
|
|
1402
|
+
i0.ɵɵelementStart(68, "span", 43);
|
|
1403
|
+
i0.ɵɵelement(69, "i", 47);
|
|
1404
|
+
i0.ɵɵtext(70, " Token Efficiency ");
|
|
1424
1405
|
i0.ɵɵelementEnd();
|
|
1425
|
-
i0.ɵɵelement(
|
|
1406
|
+
i0.ɵɵelement(71, "i", 45);
|
|
1426
1407
|
i0.ɵɵelementEnd();
|
|
1427
|
-
i0.ɵɵtemplate(
|
|
1408
|
+
i0.ɵɵtemplate(72, ExecutionMonitoringComponent_Conditional_72_Template, 3, 3, "div", 46);
|
|
1428
1409
|
i0.ɵɵelementEnd();
|
|
1429
|
-
i0.ɵɵelementStart(
|
|
1430
|
-
i0.ɵɵlistener("click", function
|
|
1431
|
-
i0.ɵɵelementStart(
|
|
1432
|
-
i0.ɵɵelement(
|
|
1433
|
-
i0.ɵɵtext(
|
|
1410
|
+
i0.ɵɵelementStart(73, "div", 41)(74, "div", 42);
|
|
1411
|
+
i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Template_div_click_74_listener() { return ctx.togglePanel("executions"); });
|
|
1412
|
+
i0.ɵɵelementStart(75, "span", 43);
|
|
1413
|
+
i0.ɵɵelement(76, "i", 48);
|
|
1414
|
+
i0.ɵɵtext(77, " Live Executions ");
|
|
1434
1415
|
i0.ɵɵelementEnd();
|
|
1435
|
-
i0.ɵɵelement(
|
|
1416
|
+
i0.ɵɵelement(78, "i", 45);
|
|
1436
1417
|
i0.ɵɵelementEnd();
|
|
1437
|
-
i0.ɵɵtemplate(
|
|
1418
|
+
i0.ɵɵtemplate(79, ExecutionMonitoringComponent_Conditional_79_Template, 3, 4, "div", 49);
|
|
1438
1419
|
i0.ɵɵelementEnd()()()()()();
|
|
1439
|
-
i0.ɵɵtemplate(
|
|
1420
|
+
i0.ɵɵtemplate(80, ExecutionMonitoringComponent_Conditional_80_Template, 14, 2, "div", 50);
|
|
1440
1421
|
i0.ɵɵelementEnd();
|
|
1441
1422
|
} if (rf & 2) {
|
|
1442
|
-
let
|
|
1443
|
-
let
|
|
1444
|
-
i0.ɵɵ
|
|
1445
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx.refreshInterval);
|
|
1423
|
+
let tmp_12_0;
|
|
1424
|
+
let tmp_23_0;
|
|
1425
|
+
i0.ɵɵclassProp("loading", ctx.isLoading);
|
|
1446
1426
|
i0.ɵɵadvance();
|
|
1447
|
-
i0.ɵɵ
|
|
1448
|
-
i0.ɵɵadvance(
|
|
1449
|
-
i0.ɵɵproperty("value", 10000);
|
|
1450
|
-
i0.ɵɵadvance(2);
|
|
1451
|
-
i0.ɵɵproperty("value", 30000);
|
|
1452
|
-
i0.ɵɵadvance(2);
|
|
1453
|
-
i0.ɵɵproperty("value", 60000);
|
|
1454
|
-
i0.ɵɵadvance(2);
|
|
1455
|
-
i0.ɵɵproperty("value", 300000);
|
|
1456
|
-
i0.ɵɵadvance(5);
|
|
1427
|
+
i0.ɵɵconditional(ctx.isLoading ? 1 : -1);
|
|
1428
|
+
i0.ɵɵadvance(9);
|
|
1457
1429
|
i0.ɵɵtwoWayProperty("ngModel", ctx.selectedTimeRange);
|
|
1430
|
+
i0.ɵɵproperty("disabled", ctx.isLoading);
|
|
1458
1431
|
i0.ɵɵadvance(11);
|
|
1459
1432
|
i0.ɵɵproperty("disabled", ctx.isLoading);
|
|
1460
1433
|
i0.ɵɵadvance();
|
|
1461
1434
|
i0.ɵɵclassProp("spinning", ctx.isLoading);
|
|
1462
1435
|
i0.ɵɵadvance(4);
|
|
1463
|
-
i0.ɵɵrepeater(i0.ɵɵpipeBind1(
|
|
1436
|
+
i0.ɵɵrepeater(i0.ɵɵpipeBind1(28, 43, ctx.kpiCards$));
|
|
1464
1437
|
i0.ɵɵadvance(4);
|
|
1465
1438
|
i0.ɵɵproperty("resizable", true)("collapsible", false);
|
|
1466
1439
|
i0.ɵɵadvance(2);
|
|
1467
1440
|
i0.ɵɵproperty("resizable", true)("collapsible", true)("collapsed", false);
|
|
1468
1441
|
i0.ɵɵadvance(7);
|
|
1469
|
-
i0.ɵɵconditional((
|
|
1442
|
+
i0.ɵɵconditional((tmp_12_0 = i0.ɵɵpipeBind1(40, 45, ctx.kpis$)) ? 39 : -1, tmp_12_0);
|
|
1470
1443
|
i0.ɵɵadvance(2);
|
|
1471
1444
|
i0.ɵɵproperty("resizable", true)("collapsible", false);
|
|
1472
1445
|
i0.ɵɵadvance(4);
|
|
1473
1446
|
i0.ɵɵrepeater(ctx.drillDownTabs);
|
|
1474
1447
|
i0.ɵɵadvance(3);
|
|
1475
|
-
i0.ɵɵconditional((ctx.activeTab == null ? null : ctx.activeTab.type) === "chart" ?
|
|
1448
|
+
i0.ɵɵconditional((ctx.activeTab == null ? null : ctx.activeTab.type) === "chart" ? 48 : -1);
|
|
1476
1449
|
i0.ɵɵadvance();
|
|
1477
|
-
i0.ɵɵconditional((ctx.activeTab == null ? null : ctx.activeTab.type) === "executions" ?
|
|
1450
|
+
i0.ɵɵconditional((ctx.activeTab == null ? null : ctx.activeTab.type) === "executions" ? 49 : -1);
|
|
1478
1451
|
i0.ɵɵadvance();
|
|
1479
|
-
i0.ɵɵconditional((ctx.activeTab == null ? null : ctx.activeTab.type) === "model-detail" ?
|
|
1452
|
+
i0.ɵɵconditional((ctx.activeTab == null ? null : ctx.activeTab.type) === "model-detail" ? 50 : -1);
|
|
1480
1453
|
i0.ɵɵadvance();
|
|
1481
1454
|
i0.ɵɵproperty("resizable", true)("collapsible", false);
|
|
1482
1455
|
i0.ɵɵadvance(2);
|
|
1483
1456
|
i0.ɵɵproperty("resizable", true)("collapsible", false);
|
|
1484
1457
|
i0.ɵɵadvance(2);
|
|
1485
|
-
i0.ɵɵproperty("data", (
|
|
1458
|
+
i0.ɵɵproperty("data", (tmp_23_0 = i0.ɵɵpipeBind1(56, 47, ctx.performanceMatrix$)) !== null && tmp_23_0 !== undefined ? tmp_23_0 : i0.ɵɵpureFunction0(49, _c0))("config", ctx.heatmapConfig);
|
|
1486
1459
|
i0.ɵɵadvance(2);
|
|
1487
1460
|
i0.ɵɵproperty("resizable", true)("collapsible", false);
|
|
1488
1461
|
i0.ɵɵadvance(7);
|
|
1489
1462
|
i0.ɵɵclassProp("fa-chevron-down", !ctx.panelStates.cost)("fa-chevron-up", ctx.panelStates.cost);
|
|
1490
1463
|
i0.ɵɵadvance();
|
|
1491
|
-
i0.ɵɵconditional(ctx.panelStates.cost ?
|
|
1464
|
+
i0.ɵɵconditional(ctx.panelStates.cost ? 65 : -1);
|
|
1492
1465
|
i0.ɵɵadvance(6);
|
|
1493
1466
|
i0.ɵɵclassProp("fa-chevron-down", !ctx.panelStates.efficiency)("fa-chevron-up", ctx.panelStates.efficiency);
|
|
1494
1467
|
i0.ɵɵadvance();
|
|
1495
|
-
i0.ɵɵconditional(ctx.panelStates.efficiency ?
|
|
1468
|
+
i0.ɵɵconditional(ctx.panelStates.efficiency ? 72 : -1);
|
|
1496
1469
|
i0.ɵɵadvance(6);
|
|
1497
1470
|
i0.ɵɵclassProp("fa-chevron-down", !ctx.panelStates.executions)("fa-chevron-up", ctx.panelStates.executions);
|
|
1498
1471
|
i0.ɵɵadvance();
|
|
1499
|
-
i0.ɵɵconditional(ctx.panelStates.executions ?
|
|
1472
|
+
i0.ɵɵconditional(ctx.panelStates.executions ? 79 : -1);
|
|
1500
1473
|
i0.ɵɵadvance();
|
|
1501
|
-
i0.ɵɵconditional(ctx.selectedExecution ?
|
|
1502
|
-
} }, dependencies: [i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.SelectControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.SplitterComponent, i3.SplitterPaneComponent, i4.KPICardComponent, i5.LiveExecutionWidgetComponent, i6.TimeSeriesChartComponent, i7.PerformanceHeatmapComponent, i8.AsyncPipe, i8.TitleCasePipe, i8.DatePipe], styles: [".execution-monitoring[_ngcontent-%COMP%] {\n padding: 20px;\n background: #f8f9fa;\n min-height: 100vh;\n }\n\n .monitoring-header[_ngcontent-%COMP%] {\n background: white;\n padding: 20px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n margin-bottom: 20px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n }\n\n .monitoring-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #333;\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .monitoring-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #2196f3;\n }\n\n .monitoring-controls[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n align-items: center;\n flex-wrap: wrap;\n }\n\n .refresh-control[_ngcontent-%COMP%], .time-range-control[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n }\n\n .refresh-control[_ngcontent-%COMP%] label[_ngcontent-%COMP%], .time-range-control[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n color: #666;\n font-weight: 500;\n }\n\n .refresh-control[_ngcontent-%COMP%] select[_ngcontent-%COMP%], .time-range-control[_ngcontent-%COMP%] select[_ngcontent-%COMP%] {\n padding: 6px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 12px;\n background: white;\n }\n\n .refresh-btn[_ngcontent-%COMP%] {\n background: #2196f3;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: background 0.2s ease;\n }\n\n .refresh-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #1976d2;\n }\n\n .refresh-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .refresh-btn[_ngcontent-%COMP%] i.spinning[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_spin 1s linear infinite;\n }\n\n @keyframes _ngcontent-%COMP%_spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .kpi-dashboard[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n }\n\n .kpi-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\n gap: 16px;\n }\n\n .dashboard-splitter[_ngcontent-%COMP%] {\n height: calc(100vh - 550px); \n\n min-height: 600px;\n margin-bottom: 20px;\n }\n\n .dashboard-section[_ngcontent-%COMP%] {\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n \n\n [_nghost-%COMP%] .k-splitter-pane {\n overflow: hidden;\n }\n\n [_nghost-%COMP%] .k-splitter .k-splitter-pane {\n padding: 10px;\n }\n\n [_nghost-%COMP%] .k-splitter-horizontal > .k-splitter-pane {\n padding: 10px 5px;\n }\n\n [_nghost-%COMP%] .k-splitter-vertical > .k-splitter-pane {\n padding: 5px 10px;\n }\n\n \n\n .cost-chart-container[_ngcontent-%COMP%], .efficiency-chart-container[_ngcontent-%COMP%], .status-container[_ngcontent-%COMP%] {\n padding: 20px;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .chart-header[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n }\n\n .chart-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .chart-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #2196f3;\n }\n\n .cost-bars[_ngcontent-%COMP%], .efficiency-items[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .cost-bar-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 0;\n border-bottom: 1px solid #f0f0f0;\n }\n\n .cost-bar-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n }\n\n .cost-bar-info[_ngcontent-%COMP%] {\n min-width: 120px;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .model-name[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 500;\n color: #333;\n }\n\n .cost-value[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #ff9800;\n font-weight: 600;\n }\n\n .cost-bar-container[_ngcontent-%COMP%] {\n flex: 1;\n height: 8px;\n background: #f0f0f0;\n border-radius: 4px;\n overflow: hidden;\n }\n\n .cost-bar[_ngcontent-%COMP%] {\n height: 100%;\n background: linear-gradient(90deg, #ff9800, #f57c00);\n border-radius: 4px;\n transition: width 0.3s ease;\n }\n\n .token-info[_ngcontent-%COMP%] {\n font-size: 10px;\n color: #666;\n min-width: 80px;\n text-align: right;\n }\n\n \n\n .efficiency-item[_ngcontent-%COMP%] {\n padding: 12px 0;\n border-bottom: 1px solid #f0f0f0;\n }\n\n .efficiency-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n }\n\n .efficiency-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n }\n\n .efficiency-ratio[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #2196f3;\n font-weight: 600;\n }\n\n .token-breakdown[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .token-bar[_ngcontent-%COMP%] {\n height: 6px;\n background: #f0f0f0;\n border-radius: 3px;\n overflow: hidden;\n display: flex;\n }\n\n .token-segment[_ngcontent-%COMP%] {\n height: 100%;\n }\n\n .token-segment--input[_ngcontent-%COMP%] {\n background: #4caf50;\n }\n\n .token-segment--output[_ngcontent-%COMP%] {\n background: #2196f3;\n }\n\n .token-labels[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n font-size: 10px;\n color: #666;\n }\n\n .input-label[_ngcontent-%COMP%] {\n color: #4caf50;\n }\n\n .output-label[_ngcontent-%COMP%] {\n color: #2196f3;\n }\n\n .cost-per-token[_ngcontent-%COMP%] {\n font-size: 10px;\n color: #999;\n margin-top: 4px;\n }\n\n \n\n .status-metrics[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n }\n\n .status-metric[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 6px;\n }\n\n .status-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .status-icon--success[_ngcontent-%COMP%] {\n background: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n }\n\n .status-icon--warning[_ngcontent-%COMP%] {\n background: rgba(255, 152, 0, 0.1);\n color: #ff9800;\n }\n\n .status-icon--info[_ngcontent-%COMP%] {\n background: rgba(33, 150, 243, 0.1);\n color: #2196f3;\n }\n\n .status-icon--primary[_ngcontent-%COMP%] {\n background: rgba(156, 39, 176, 0.1);\n color: #9c27b0;\n }\n\n .status-info[_ngcontent-%COMP%] {\n flex: 1;\n }\n\n .status-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #666;\n font-weight: 500;\n }\n\n .status-value[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 700;\n color: #333;\n margin: 2px 0;\n }\n\n .status-subtitle[_ngcontent-%COMP%] {\n font-size: 10px;\n color: #999;\n }\n\n \n\n .execution-modal[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n padding: 20px;\n }\n\n .execution-modal-content[_ngcontent-%COMP%] {\n background: white;\n border-radius: 8px;\n max-width: 800px;\n width: 100%;\n max-height: 80vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .execution-modal-header[_ngcontent-%COMP%] {\n padding: 20px;\n border-bottom: 1px solid #f0f0f0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .execution-modal-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #333;\n }\n\n .modal-header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n align-items: center;\n }\n\n .open-record-btn[_ngcontent-%COMP%] {\n background: #2196f3;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s ease;\n }\n\n .open-record-btn[_ngcontent-%COMP%]:hover {\n background: #1976d2;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.3);\n }\n\n .open-record-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .close-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n font-size: 16px;\n color: #999;\n cursor: pointer;\n padding: 4px;\n }\n\n .close-btn[_ngcontent-%COMP%]:hover {\n color: #333;\n }\n\n .execution-modal-body[_ngcontent-%COMP%] {\n padding: 20px;\n overflow-y: auto;\n flex: 1;\n }\n\n .execution-details[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n\n .detail-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n border-bottom: 1px solid #f0f0f0;\n padding-bottom: 6px;\n }\n\n .detail-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n }\n\n .detail-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .detail-item[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #666;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .detail-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #333;\n }\n\n .status-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 10px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n .status-badge--completed[_ngcontent-%COMP%] {\n background: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n }\n\n .status-badge--running[_ngcontent-%COMP%] {\n background: rgba(33, 150, 243, 0.1);\n color: #2196f3;\n }\n\n .status-badge--failed[_ngcontent-%COMP%] {\n background: rgba(244, 67, 54, 0.1);\n color: #f44336;\n }\n\n .error-message[_ngcontent-%COMP%] {\n background: #fff3e0;\n border: 1px solid #ffcc02;\n border-radius: 4px;\n padding: 12px;\n font-size: 12px;\n color: #e65100;\n font-family: monospace;\n }\n\n .child-executions[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .child-execution[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border-radius: 4px;\n padding: 12px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .child-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .child-name[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 500;\n color: #333;\n }\n\n .child-type[_ngcontent-%COMP%] {\n font-size: 10px;\n background: #e0e0e0;\n padding: 2px 6px;\n border-radius: 3px;\n color: #666;\n }\n\n .child-status[_ngcontent-%COMP%] {\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 3px;\n }\n\n .child-metrics[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n font-size: 11px;\n color: #666;\n }\n\n .loading-details[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n gap: 12px;\n }\n\n .spinner[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: 3px solid #f3f3f3;\n border-top: 3px solid #2196f3;\n border-radius: 50%;\n animation: _ngcontent-%COMP%_spin 1s linear infinite;\n }\n\n \n\n .drill-down-container[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .drill-down-tabs[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .tab-header[_ngcontent-%COMP%] {\n display: flex;\n border-bottom: 1px solid #e0e0e0;\n background: #f8f9fa;\n min-height: 40px;\n overflow-x: auto;\n }\n\n .tab-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: #f8f9fa;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n color: #666;\n white-space: nowrap;\n transition: all 0.2s ease;\n min-width: 120px;\n justify-content: space-between;\n }\n\n .tab-item[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n color: #333;\n }\n\n .tab-item.active[_ngcontent-%COMP%] {\n background: white;\n color: #2196f3;\n border-bottom-color: #2196f3;\n }\n\n .tab-title[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .tab-close[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: #999;\n cursor: pointer;\n padding: 2px;\n border-radius: 2px;\n font-size: 10px;\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n }\n\n .tab-close[_ngcontent-%COMP%]:hover {\n background: rgba(0, 0, 0, 0.1);\n color: #333;\n }\n\n .tab-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .tab-pane[_ngcontent-%COMP%] {\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .trends-chart[_ngcontent-%COMP%] {\n padding: 0;\n }\n\n .trends-chart[_ngcontent-%COMP%] app-time-series-chart[_ngcontent-%COMP%] {\n height: 100%;\n display: block;\n overflow: hidden;\n }\n\n \n\n .tab-pane.trends-chart[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n \n\n .executions-drill-down[_ngcontent-%COMP%] {\n padding: 20px;\n overflow-y: auto;\n }\n\n .drill-down-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n padding-bottom: 12px;\n border-bottom: 1px solid #e0e0e0;\n }\n\n .drill-down-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .drill-down-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n align-items: center;\n font-size: 12px;\n }\n\n .timestamp[_ngcontent-%COMP%] {\n color: #666;\n background: #f0f0f0;\n padding: 4px 8px;\n border-radius: 4px;\n }\n\n .metric-badge[_ngcontent-%COMP%] {\n background: #2196f3;\n color: white;\n padding: 4px 8px;\n border-radius: 4px;\n font-weight: 500;\n }\n\n .loading-spinner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 40px;\n color: #666;\n gap: 12px;\n }\n\n .executions-table[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n overflow: hidden;\n }\n\n .table-header[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 80px 1fr 120px 100px 100px 80px 100px 120px;\n gap: 12px;\n background: #f8f9fa;\n padding: 12px 16px;\n font-size: 11px;\n font-weight: 600;\n color: #666;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .table-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 80px 1fr 120px 100px 100px 80px 100px 120px;\n gap: 12px;\n padding: 12px 16px;\n border-top: 1px solid #f0f0f0;\n cursor: pointer;\n transition: background 0.2s ease;\n align-items: center;\n }\n\n .table-row[_ngcontent-%COMP%]:hover {\n background: #f8f9fa;\n }\n\n .table-cell[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #333;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .type-badge[_ngcontent-%COMP%] {\n background: #e9ecef;\n color: #666;\n padding: 2px 6px;\n border-radius: 3px;\n font-size: 10px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n .type-badge--prompt[_ngcontent-%COMP%] {\n background: rgba(33, 150, 243, 0.1);\n color: #2196f3;\n }\n\n .type-badge--agent[_ngcontent-%COMP%] {\n background: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n }\n\n .no-data[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n color: #999;\n gap: 16px;\n }\n\n .no-data[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n color: #ddd;\n }\n\n .no-data[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n }\n\n \n\n .model-detail[_ngcontent-%COMP%] {\n padding: 20px;\n overflow-y: auto;\n }\n\n .model-details[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n .model-info-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 16px;\n }\n\n .info-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 16px;\n background: #f8f9fa;\n border-radius: 6px;\n }\n\n .info-item[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #666;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin: 0;\n }\n\n .info-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #333;\n font-weight: 500;\n }\n\n .status-indicator[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n }\n\n .status-indicator.active[_ngcontent-%COMP%] {\n color: #4caf50;\n }\n\n .status-indicator.active[_ngcontent-%COMP%]::before {\n content: '';\n width: 6px;\n height: 6px;\n background: #4caf50;\n border-radius: 50%;\n }\n\n .model-description[_ngcontent-%COMP%] {\n padding: 20px;\n background: #f8f9fa;\n border-radius: 8px;\n }\n\n .model-description[_ngcontent-%COMP%] h5[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n }\n\n .model-description[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: #666;\n line-height: 1.5;\n }\n\n \n\n .clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n\n .clickable[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n }\n\n \n\n .analysis-panels[_ngcontent-%COMP%] {\n padding: 10px;\n height: 100%;\n overflow-y: auto;\n background: #f8f9fa;\n }\n\n .analysis-panel[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n background: white;\n overflow: hidden;\n }\n\n .analysis-panel[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n }\n\n .panel-header[_ngcontent-%COMP%] {\n padding: 12px 16px;\n background: #f8f9fa;\n border-bottom: 1px solid #e0e0e0;\n cursor: pointer;\n display: flex;\n justify-content: space-between;\n align-items: center;\n transition: background 0.2s ease;\n }\n\n .panel-header[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n }\n\n .panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: #333;\n font-size: 14px;\n }\n\n .panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #2196f3;\n width: 16px;\n }\n\n .panel-toggle-icon[_ngcontent-%COMP%] {\n color: #666;\n font-size: 12px;\n transition: transform 0.2s ease;\n }\n\n .panel-content[_ngcontent-%COMP%] {\n padding: 16px;\n border-top: 1px solid #f0f0f0;\n animation: _ngcontent-%COMP%_slideDown 0.2s ease-out;\n }\n\n @keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n max-height: 0;\n }\n to {\n opacity: 1;\n max-height: 500px;\n }\n }\n\n .live-executions-panel[_ngcontent-%COMP%] {\n padding: 0;\n }\n\n .live-executions-panel[_ngcontent-%COMP%] app-live-execution-widget[_ngcontent-%COMP%] {\n height: 300px;\n display: block;\n }\n\n \n\n @media (max-width: 1200px) {\n .dashboard-splitter[_ngcontent-%COMP%] {\n height: calc(100vh - 270px); \n\n margin-bottom: 20px;\n }\n \n .table-header[_ngcontent-%COMP%], \n .table-row[_ngcontent-%COMP%] {\n grid-template-columns: 60px 1fr 100px 80px 80px 60px 80px 100px;\n gap: 8px;\n }\n \n .model-info-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n \n .analysis-panels[_ngcontent-%COMP%] {\n padding: 8px;\n }\n \n .analysis-panel[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n }\n }\n\n @media (max-width: 768px) {\n .execution-monitoring[_ngcontent-%COMP%] {\n padding: 12px;\n }\n \n .monitoring-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n }\n \n .monitoring-controls[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: flex-start;\n }\n \n .dashboard-splitter[_ngcontent-%COMP%] {\n height: calc(100vh - 270px); \n\n min-height: 400px;\n margin-bottom: 20px;\n }\n \n .kpi-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n }\n\n \n\n [_nghost-%COMP%] .k-splitter .k-splitter-pane {\n padding: 5px;\n }\n\n [_nghost-%COMP%] .k-splitter-horizontal > .k-splitter-pane {\n padding: 5px 2px;\n }\n\n [_nghost-%COMP%] .k-splitter-vertical > .k-splitter-pane {\n padding: 2px 5px;\n }\n \n .tab-header[_ngcontent-%COMP%] {\n overflow-x: auto;\n }\n \n .tab-item[_ngcontent-%COMP%] {\n min-width: 100px;\n padding: 6px 12px;\n }\n \n .table-header[_ngcontent-%COMP%], \n .table-row[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 4px;\n text-align: left;\n }\n \n .table-row[_ngcontent-%COMP%] {\n display: block;\n padding: 16px;\n }\n \n .table-cell[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 8px;\n }\n \n .table-cell[_ngcontent-%COMP%]:before {\n content: attr(data-label) ': ';\n font-weight: 600;\n color: #666;\n font-size: 11px;\n text-transform: uppercase;\n }\n \n .executions-drill-down[_ngcontent-%COMP%], \n .model-detail[_ngcontent-%COMP%] {\n padding: 12px;\n }\n \n .panel-content[_ngcontent-%COMP%] {\n padding: 12px;\n }\n \n .panel-header[_ngcontent-%COMP%] {\n padding: 10px 12px;\n }\n \n .panel-title[_ngcontent-%COMP%] {\n font-size: 13px;\n }\n }"] });
|
|
1474
|
+
i0.ɵɵconditional(ctx.selectedExecution ? 80 : -1);
|
|
1475
|
+
} }, dependencies: [i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.SelectControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.SplitterComponent, i3.SplitterPaneComponent, i4.KPICardComponent, i5.LiveExecutionWidgetComponent, i6.TimeSeriesChartComponent, i7.PerformanceHeatmapComponent, i8.AsyncPipe, i8.TitleCasePipe, i8.DatePipe], styles: [".execution-monitoring[_ngcontent-%COMP%] {\n padding: 20px;\n background: #f8f9fa;\n min-height: 100vh;\n position: relative;\n }\n \n .execution-monitoring.loading[_ngcontent-%COMP%] {\n overflow: hidden;\n }\n \n \n\n .loading-overlay[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.5);\n z-index: 999;\n display: flex;\n align-items: center;\n justify-content: center;\n backdrop-filter: blur(1px);\n }\n \n .loading-content[_ngcontent-%COMP%] {\n text-align: center;\n padding: 40px;\n background: white;\n border-radius: 12px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);\n }\n \n .loading-content[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #2196f3;\n margin-bottom: 20px;\n display: block;\n }\n \n .loading-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n color: #666;\n font-weight: 500;\n }\n\n .monitoring-header[_ngcontent-%COMP%] {\n background: white;\n padding: 20px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n margin-bottom: 20px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n }\n\n .monitoring-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #333;\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .monitoring-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #2196f3;\n }\n\n .monitoring-controls[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n align-items: center;\n flex-wrap: wrap;\n }\n\n .time-range-control[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n }\n\n .time-range-control[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n color: #666;\n font-weight: 500;\n }\n\n .time-range-control[_ngcontent-%COMP%] select[_ngcontent-%COMP%] {\n padding: 6px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 12px;\n background: white;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n \n .time-range-control[_ngcontent-%COMP%] select[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n background: #f5f5f5;\n }\n\n .refresh-btn[_ngcontent-%COMP%] {\n background: #2196f3;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: background 0.2s ease;\n }\n\n .refresh-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #1976d2;\n }\n\n .refresh-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n background: #e0e0e0;\n }\n\n .refresh-btn[_ngcontent-%COMP%] i.spinning[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_spin 1s linear infinite;\n }\n\n @keyframes _ngcontent-%COMP%_spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .kpi-dashboard[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n }\n\n .kpi-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\n gap: 16px;\n }\n\n .dashboard-splitter[_ngcontent-%COMP%] {\n height: calc(100vh - 550px); \n\n min-height: 600px;\n margin-bottom: 20px;\n }\n\n .dashboard-section[_ngcontent-%COMP%] {\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n \n\n [_nghost-%COMP%] .k-splitter-pane {\n overflow: hidden;\n }\n\n [_nghost-%COMP%] .k-splitter .k-splitter-pane {\n padding: 10px;\n }\n\n [_nghost-%COMP%] .k-splitter-horizontal > .k-splitter-pane {\n padding: 10px 5px;\n }\n\n [_nghost-%COMP%] .k-splitter-vertical > .k-splitter-pane {\n padding: 5px 10px;\n }\n\n \n\n .cost-chart-container[_ngcontent-%COMP%], .efficiency-chart-container[_ngcontent-%COMP%], .status-container[_ngcontent-%COMP%] {\n padding: 20px;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .chart-header[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n }\n\n .chart-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .chart-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #2196f3;\n }\n\n .cost-bars[_ngcontent-%COMP%], .efficiency-items[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .cost-bar-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 0;\n border-bottom: 1px solid #f0f0f0;\n }\n\n .cost-bar-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n }\n\n .cost-bar-info[_ngcontent-%COMP%] {\n min-width: 120px;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .model-name[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 500;\n color: #333;\n }\n\n .cost-value[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #ff9800;\n font-weight: 600;\n }\n\n .cost-bar-container[_ngcontent-%COMP%] {\n flex: 1;\n height: 8px;\n background: #f0f0f0;\n border-radius: 4px;\n overflow: hidden;\n }\n\n .cost-bar[_ngcontent-%COMP%] {\n height: 100%;\n background: linear-gradient(90deg, #ff9800, #f57c00);\n border-radius: 4px;\n transition: width 0.3s ease;\n }\n\n .token-info[_ngcontent-%COMP%] {\n font-size: 10px;\n color: #666;\n min-width: 80px;\n text-align: right;\n }\n\n \n\n .efficiency-item[_ngcontent-%COMP%] {\n padding: 12px 0;\n border-bottom: 1px solid #f0f0f0;\n }\n\n .efficiency-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n }\n\n .efficiency-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n }\n\n .efficiency-ratio[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #2196f3;\n font-weight: 600;\n }\n\n .token-breakdown[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .token-bar[_ngcontent-%COMP%] {\n height: 6px;\n background: #f0f0f0;\n border-radius: 3px;\n overflow: hidden;\n display: flex;\n }\n\n .token-segment[_ngcontent-%COMP%] {\n height: 100%;\n }\n\n .token-segment--input[_ngcontent-%COMP%] {\n background: #4caf50;\n }\n\n .token-segment--output[_ngcontent-%COMP%] {\n background: #2196f3;\n }\n\n .token-labels[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n font-size: 10px;\n color: #666;\n }\n\n .input-label[_ngcontent-%COMP%] {\n color: #4caf50;\n }\n\n .output-label[_ngcontent-%COMP%] {\n color: #2196f3;\n }\n\n .cost-per-token[_ngcontent-%COMP%] {\n font-size: 10px;\n color: #999;\n margin-top: 4px;\n }\n\n \n\n .status-metrics[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n }\n\n .status-metric[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 6px;\n }\n\n .status-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .status-icon--success[_ngcontent-%COMP%] {\n background: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n }\n\n .status-icon--warning[_ngcontent-%COMP%] {\n background: rgba(255, 152, 0, 0.1);\n color: #ff9800;\n }\n\n .status-icon--info[_ngcontent-%COMP%] {\n background: rgba(33, 150, 243, 0.1);\n color: #2196f3;\n }\n\n .status-icon--primary[_ngcontent-%COMP%] {\n background: rgba(156, 39, 176, 0.1);\n color: #9c27b0;\n }\n\n .status-info[_ngcontent-%COMP%] {\n flex: 1;\n }\n\n .status-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #666;\n font-weight: 500;\n }\n\n .status-value[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 700;\n color: #333;\n margin: 2px 0;\n }\n\n .status-subtitle[_ngcontent-%COMP%] {\n font-size: 10px;\n color: #999;\n }\n\n \n\n .execution-modal[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n padding: 20px;\n }\n\n .execution-modal-content[_ngcontent-%COMP%] {\n background: white;\n border-radius: 8px;\n max-width: 800px;\n width: 100%;\n max-height: 80vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .execution-modal-header[_ngcontent-%COMP%] {\n padding: 20px;\n border-bottom: 1px solid #f0f0f0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .execution-modal-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #333;\n }\n\n .modal-header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n align-items: center;\n }\n\n .open-record-btn[_ngcontent-%COMP%] {\n background: #2196f3;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s ease;\n }\n\n .open-record-btn[_ngcontent-%COMP%]:hover {\n background: #1976d2;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.3);\n }\n\n .open-record-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .close-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n font-size: 16px;\n color: #999;\n cursor: pointer;\n padding: 4px;\n }\n\n .close-btn[_ngcontent-%COMP%]:hover {\n color: #333;\n }\n\n .execution-modal-body[_ngcontent-%COMP%] {\n padding: 20px;\n overflow-y: auto;\n flex: 1;\n }\n\n .execution-details[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n\n .detail-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n border-bottom: 1px solid #f0f0f0;\n padding-bottom: 6px;\n }\n\n .detail-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n }\n\n .detail-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .detail-item[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #666;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .detail-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #333;\n }\n\n .status-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 10px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n .status-badge--completed[_ngcontent-%COMP%] {\n background: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n }\n\n .status-badge--running[_ngcontent-%COMP%] {\n background: rgba(33, 150, 243, 0.1);\n color: #2196f3;\n }\n\n .status-badge--failed[_ngcontent-%COMP%] {\n background: rgba(244, 67, 54, 0.1);\n color: #f44336;\n }\n\n .error-message[_ngcontent-%COMP%] {\n background: #fff3e0;\n border: 1px solid #ffcc02;\n border-radius: 4px;\n padding: 12px;\n font-size: 12px;\n color: #e65100;\n font-family: monospace;\n }\n\n .child-executions[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .child-execution[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border-radius: 4px;\n padding: 12px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .child-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .child-name[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 500;\n color: #333;\n }\n\n .child-type[_ngcontent-%COMP%] {\n font-size: 10px;\n background: #e0e0e0;\n padding: 2px 6px;\n border-radius: 3px;\n color: #666;\n }\n\n .child-status[_ngcontent-%COMP%] {\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 3px;\n }\n\n .child-metrics[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n font-size: 11px;\n color: #666;\n }\n\n .loading-details[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n gap: 12px;\n }\n\n .spinner[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: 3px solid #f3f3f3;\n border-top: 3px solid #2196f3;\n border-radius: 50%;\n animation: _ngcontent-%COMP%_spin 1s linear infinite;\n }\n\n \n\n .drill-down-container[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .drill-down-tabs[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .tab-header[_ngcontent-%COMP%] {\n display: flex;\n border-bottom: 1px solid #e0e0e0;\n background: #f8f9fa;\n min-height: 40px;\n overflow-x: auto;\n }\n\n .tab-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: #f8f9fa;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n color: #666;\n white-space: nowrap;\n transition: all 0.2s ease;\n min-width: 120px;\n justify-content: space-between;\n }\n\n .tab-item[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n color: #333;\n }\n\n .tab-item.active[_ngcontent-%COMP%] {\n background: white;\n color: #2196f3;\n border-bottom-color: #2196f3;\n }\n\n .tab-title[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .tab-close[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: #999;\n cursor: pointer;\n padding: 2px;\n border-radius: 2px;\n font-size: 10px;\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n }\n\n .tab-close[_ngcontent-%COMP%]:hover {\n background: rgba(0, 0, 0, 0.1);\n color: #333;\n }\n\n .tab-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .tab-pane[_ngcontent-%COMP%] {\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .trends-chart[_ngcontent-%COMP%] {\n padding: 0;\n }\n\n .trends-chart[_ngcontent-%COMP%] app-time-series-chart[_ngcontent-%COMP%] {\n height: 100%;\n display: block;\n overflow: hidden;\n }\n\n \n\n .tab-pane.trends-chart[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n \n\n .executions-drill-down[_ngcontent-%COMP%] {\n padding: 20px;\n overflow-y: auto;\n }\n\n .drill-down-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n padding-bottom: 12px;\n border-bottom: 1px solid #e0e0e0;\n }\n\n .drill-down-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .drill-down-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n align-items: center;\n font-size: 12px;\n }\n\n .timestamp[_ngcontent-%COMP%] {\n color: #666;\n background: #f0f0f0;\n padding: 4px 8px;\n border-radius: 4px;\n }\n\n .metric-badge[_ngcontent-%COMP%] {\n background: #2196f3;\n color: white;\n padding: 4px 8px;\n border-radius: 4px;\n font-weight: 500;\n }\n\n .loading-spinner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 40px;\n color: #666;\n gap: 12px;\n }\n\n .executions-table[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n overflow: hidden;\n }\n\n .table-header[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 80px 1fr 120px 100px 100px 80px 100px 120px;\n gap: 12px;\n background: #f8f9fa;\n padding: 12px 16px;\n font-size: 11px;\n font-weight: 600;\n color: #666;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .table-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 80px 1fr 120px 100px 100px 80px 100px 120px;\n gap: 12px;\n padding: 12px 16px;\n border-top: 1px solid #f0f0f0;\n cursor: pointer;\n transition: background 0.2s ease;\n align-items: center;\n }\n\n .table-row[_ngcontent-%COMP%]:hover {\n background: #f8f9fa;\n }\n\n .table-cell[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #333;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .type-badge[_ngcontent-%COMP%] {\n background: #e9ecef;\n color: #666;\n padding: 2px 6px;\n border-radius: 3px;\n font-size: 10px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n .type-badge--prompt[_ngcontent-%COMP%] {\n background: rgba(33, 150, 243, 0.1);\n color: #2196f3;\n }\n\n .type-badge--agent[_ngcontent-%COMP%] {\n background: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n }\n\n .no-data[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n color: #999;\n gap: 16px;\n }\n\n .no-data[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n color: #ddd;\n }\n\n .no-data[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n }\n\n \n\n .model-detail[_ngcontent-%COMP%] {\n padding: 20px;\n overflow-y: auto;\n }\n\n .model-details[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n .model-info-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 16px;\n }\n\n .info-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 16px;\n background: #f8f9fa;\n border-radius: 6px;\n }\n\n .info-item[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #666;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin: 0;\n }\n\n .info-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #333;\n font-weight: 500;\n }\n\n .status-indicator[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n }\n\n .status-indicator.active[_ngcontent-%COMP%] {\n color: #4caf50;\n }\n\n .status-indicator.active[_ngcontent-%COMP%]::before {\n content: '';\n width: 6px;\n height: 6px;\n background: #4caf50;\n border-radius: 50%;\n }\n\n .model-description[_ngcontent-%COMP%] {\n padding: 20px;\n background: #f8f9fa;\n border-radius: 8px;\n }\n\n .model-description[_ngcontent-%COMP%] h5[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n }\n\n .model-description[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: #666;\n line-height: 1.5;\n }\n\n \n\n .clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n\n .clickable[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n }\n\n \n\n .analysis-panels[_ngcontent-%COMP%] {\n padding: 10px;\n height: 100%;\n overflow-y: auto;\n background: #f8f9fa;\n }\n\n .analysis-panel[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n background: white;\n overflow: hidden;\n }\n\n .analysis-panel[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n }\n\n .panel-header[_ngcontent-%COMP%] {\n padding: 12px 16px;\n background: #f8f9fa;\n border-bottom: 1px solid #e0e0e0;\n cursor: pointer;\n display: flex;\n justify-content: space-between;\n align-items: center;\n transition: background 0.2s ease;\n }\n\n .panel-header[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n }\n\n .panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: #333;\n font-size: 14px;\n }\n\n .panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #2196f3;\n width: 16px;\n }\n\n .panel-toggle-icon[_ngcontent-%COMP%] {\n color: #666;\n font-size: 12px;\n transition: transform 0.2s ease;\n }\n\n .panel-content[_ngcontent-%COMP%] {\n padding: 16px;\n border-top: 1px solid #f0f0f0;\n animation: _ngcontent-%COMP%_slideDown 0.2s ease-out;\n }\n\n @keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n max-height: 0;\n }\n to {\n opacity: 1;\n max-height: 500px;\n }\n }\n\n .live-executions-panel[_ngcontent-%COMP%] {\n padding: 0;\n }\n\n .live-executions-panel[_ngcontent-%COMP%] app-live-execution-widget[_ngcontent-%COMP%] {\n height: 300px;\n display: block;\n }\n\n \n\n @media (max-width: 1200px) {\n .dashboard-splitter[_ngcontent-%COMP%] {\n height: calc(100vh - 270px); \n\n margin-bottom: 20px;\n }\n \n .table-header[_ngcontent-%COMP%], \n .table-row[_ngcontent-%COMP%] {\n grid-template-columns: 60px 1fr 100px 80px 80px 60px 80px 100px;\n gap: 8px;\n }\n \n .model-info-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n \n .analysis-panels[_ngcontent-%COMP%] {\n padding: 8px;\n }\n \n .analysis-panel[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n }\n }\n\n @media (max-width: 768px) {\n .execution-monitoring[_ngcontent-%COMP%] {\n padding: 12px;\n }\n \n .monitoring-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n }\n \n .monitoring-controls[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: flex-start;\n }\n \n .dashboard-splitter[_ngcontent-%COMP%] {\n height: calc(100vh - 270px); \n\n min-height: 400px;\n margin-bottom: 20px;\n }\n \n .kpi-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n }\n\n \n\n [_nghost-%COMP%] .k-splitter .k-splitter-pane {\n padding: 5px;\n }\n\n [_nghost-%COMP%] .k-splitter-horizontal > .k-splitter-pane {\n padding: 5px 2px;\n }\n\n [_nghost-%COMP%] .k-splitter-vertical > .k-splitter-pane {\n padding: 2px 5px;\n }\n \n .tab-header[_ngcontent-%COMP%] {\n overflow-x: auto;\n }\n \n .tab-item[_ngcontent-%COMP%] {\n min-width: 100px;\n padding: 6px 12px;\n }\n \n .table-header[_ngcontent-%COMP%], \n .table-row[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 4px;\n text-align: left;\n }\n \n .table-row[_ngcontent-%COMP%] {\n display: block;\n padding: 16px;\n }\n \n .table-cell[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 8px;\n }\n \n .table-cell[_ngcontent-%COMP%]:before {\n content: attr(data-label) ': ';\n font-weight: 600;\n color: #666;\n font-size: 11px;\n text-transform: uppercase;\n }\n \n .executions-drill-down[_ngcontent-%COMP%], \n .model-detail[_ngcontent-%COMP%] {\n padding: 12px;\n }\n \n .panel-content[_ngcontent-%COMP%] {\n padding: 12px;\n }\n \n .panel-header[_ngcontent-%COMP%] {\n padding: 10px 12px;\n }\n \n .panel-title[_ngcontent-%COMP%] {\n font-size: 13px;\n }\n }"], changeDetection: 0 });
|
|
1503
1476
|
}
|
|
1504
1477
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ExecutionMonitoringComponent, [{
|
|
1505
1478
|
type: Component,
|
|
1506
|
-
args: [{ selector: 'app-execution-monitoring', template: `
|
|
1507
|
-
<div class="execution-monitoring">
|
|
1479
|
+
args: [{ selector: 'app-execution-monitoring', changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
1480
|
+
<div class="execution-monitoring" [class.loading]="isLoading">
|
|
1481
|
+
<!-- Loading Overlay -->
|
|
1482
|
+
@if (isLoading) {
|
|
1483
|
+
<div class="loading-overlay">
|
|
1484
|
+
<div class="loading-content">
|
|
1485
|
+
<i class="fa-solid fa-spinner fa-spin fa-3x"></i>
|
|
1486
|
+
<p>Loading dashboard data...</p>
|
|
1487
|
+
</div>
|
|
1488
|
+
</div>
|
|
1489
|
+
}
|
|
1508
1490
|
<!-- Header Controls -->
|
|
1509
1491
|
<div class="monitoring-header">
|
|
1510
1492
|
<h2 class="monitoring-title">
|
|
@@ -1513,20 +1495,9 @@ export class ExecutionMonitoringComponent {
|
|
|
1513
1495
|
</h2>
|
|
1514
1496
|
|
|
1515
1497
|
<div class="monitoring-controls">
|
|
1516
|
-
<div class="refresh-control">
|
|
1517
|
-
<label>Refresh:</label>
|
|
1518
|
-
<select [(ngModel)]="refreshInterval" (change)="onRefreshIntervalChange()">
|
|
1519
|
-
<option [value]="0">Manual</option>
|
|
1520
|
-
<option [value]="10000">10s</option>
|
|
1521
|
-
<option [value]="30000">30s</option>
|
|
1522
|
-
<option [value]="60000">1m</option>
|
|
1523
|
-
<option [value]="300000">5m</option>
|
|
1524
|
-
</select>
|
|
1525
|
-
</div>
|
|
1526
|
-
|
|
1527
1498
|
<div class="time-range-control">
|
|
1528
1499
|
<label>Time Range:</label>
|
|
1529
|
-
<select [(ngModel)]="selectedTimeRange" (change)="onTimeRangeChange()">
|
|
1500
|
+
<select [(ngModel)]="selectedTimeRange" (change)="onTimeRangeChange()" [disabled]="isLoading">
|
|
1530
1501
|
<option value="1h">Last Hour</option>
|
|
1531
1502
|
<option value="6h">Last 6 Hours</option>
|
|
1532
1503
|
<option value="24h">Last 24 Hours</option>
|
|
@@ -2030,13 +2001,13 @@ export class ExecutionMonitoringComponent {
|
|
|
2030
2001
|
</div>
|
|
2031
2002
|
}
|
|
2032
2003
|
</div>
|
|
2033
|
-
`, styles: ["\n .execution-monitoring {\n padding: 20px;\n background: #f8f9fa;\n min-height: 100vh;\n }\n\n .monitoring-header {\n background: white;\n padding: 20px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n margin-bottom: 20px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n }\n\n .monitoring-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #333;\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .monitoring-title i {\n color: #2196f3;\n }\n\n .monitoring-controls {\n display: flex;\n gap: 16px;\n align-items: center;\n flex-wrap: wrap;\n }\n\n .refresh-control, .time-range-control {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n }\n\n .refresh-control label, .time-range-control label {\n color: #666;\n font-weight: 500;\n }\n\n .refresh-control select, .time-range-control select {\n padding: 6px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 12px;\n background: white;\n }\n\n .refresh-btn {\n background: #2196f3;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: background 0.2s ease;\n }\n\n .refresh-btn:hover:not(:disabled) {\n background: #1976d2;\n }\n\n .refresh-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .refresh-btn i.spinning {\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .kpi-dashboard {\n margin-bottom: 20px;\n }\n\n .kpi-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\n gap: 16px;\n }\n\n .dashboard-splitter {\n height: calc(100vh - 550px); /* Increased to account for headers and margins */\n min-height: 600px;\n margin-bottom: 20px;\n }\n\n .dashboard-section {\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n /* Ensure splitter panes take full height */\n :host ::ng-deep .k-splitter-pane {\n overflow: hidden;\n }\n\n :host ::ng-deep .k-splitter .k-splitter-pane {\n padding: 10px;\n }\n\n :host ::ng-deep .k-splitter-horizontal > .k-splitter-pane {\n padding: 10px 5px;\n }\n\n :host ::ng-deep .k-splitter-vertical > .k-splitter-pane {\n padding: 5px 10px;\n }\n\n /* Cost Analysis Styles */\n .cost-chart-container, .efficiency-chart-container, .status-container {\n padding: 20px;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .chart-header {\n margin-bottom: 16px;\n }\n\n .chart-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .chart-title i {\n color: #2196f3;\n }\n\n .cost-bars, .efficiency-items {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .cost-bar-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 0;\n border-bottom: 1px solid #f0f0f0;\n }\n\n .cost-bar-item:last-child {\n border-bottom: none;\n }\n\n .cost-bar-info {\n min-width: 120px;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .model-name {\n font-size: 12px;\n font-weight: 500;\n color: #333;\n }\n\n .cost-value {\n font-size: 11px;\n color: #ff9800;\n font-weight: 600;\n }\n\n .cost-bar-container {\n flex: 1;\n height: 8px;\n background: #f0f0f0;\n border-radius: 4px;\n overflow: hidden;\n }\n\n .cost-bar {\n height: 100%;\n background: linear-gradient(90deg, #ff9800, #f57c00);\n border-radius: 4px;\n transition: width 0.3s ease;\n }\n\n .token-info {\n font-size: 10px;\n color: #666;\n min-width: 80px;\n text-align: right;\n }\n\n /* Token Efficiency Styles */\n .efficiency-item {\n padding: 12px 0;\n border-bottom: 1px solid #f0f0f0;\n }\n\n .efficiency-item:last-child {\n border-bottom: none;\n }\n\n .efficiency-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n }\n\n .efficiency-ratio {\n font-size: 11px;\n color: #2196f3;\n font-weight: 600;\n }\n\n .token-breakdown {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .token-bar {\n height: 6px;\n background: #f0f0f0;\n border-radius: 3px;\n overflow: hidden;\n display: flex;\n }\n\n .token-segment {\n height: 100%;\n }\n\n .token-segment--input {\n background: #4caf50;\n }\n\n .token-segment--output {\n background: #2196f3;\n }\n\n .token-labels {\n display: flex;\n justify-content: space-between;\n font-size: 10px;\n color: #666;\n }\n\n .input-label {\n color: #4caf50;\n }\n\n .output-label {\n color: #2196f3;\n }\n\n .cost-per-token {\n font-size: 10px;\n color: #999;\n margin-top: 4px;\n }\n\n /* System Status Styles */\n .status-metrics {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n }\n\n .status-metric {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 6px;\n }\n\n .status-icon {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .status-icon--success {\n background: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n }\n\n .status-icon--warning {\n background: rgba(255, 152, 0, 0.1);\n color: #ff9800;\n }\n\n .status-icon--info {\n background: rgba(33, 150, 243, 0.1);\n color: #2196f3;\n }\n\n .status-icon--primary {\n background: rgba(156, 39, 176, 0.1);\n color: #9c27b0;\n }\n\n .status-info {\n flex: 1;\n }\n\n .status-label {\n font-size: 12px;\n color: #666;\n font-weight: 500;\n }\n\n .status-value {\n font-size: 18px;\n font-weight: 700;\n color: #333;\n margin: 2px 0;\n }\n\n .status-subtitle {\n font-size: 10px;\n color: #999;\n }\n\n /* Execution Modal Styles */\n .execution-modal {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n padding: 20px;\n }\n\n .execution-modal-content {\n background: white;\n border-radius: 8px;\n max-width: 800px;\n width: 100%;\n max-height: 80vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .execution-modal-header {\n padding: 20px;\n border-bottom: 1px solid #f0f0f0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .execution-modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #333;\n }\n\n .modal-header-actions {\n display: flex;\n gap: 12px;\n align-items: center;\n }\n\n .open-record-btn {\n background: #2196f3;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s ease;\n }\n\n .open-record-btn:hover {\n background: #1976d2;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.3);\n }\n\n .open-record-btn i {\n font-size: 12px;\n }\n\n .close-btn {\n background: none;\n border: none;\n font-size: 16px;\n color: #999;\n cursor: pointer;\n padding: 4px;\n }\n\n .close-btn:hover {\n color: #333;\n }\n\n .execution-modal-body {\n padding: 20px;\n overflow-y: auto;\n flex: 1;\n }\n\n .execution-details {\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n\n .detail-section h4 {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n border-bottom: 1px solid #f0f0f0;\n padding-bottom: 6px;\n }\n\n .detail-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n }\n\n .detail-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .detail-item label {\n font-size: 11px;\n color: #666;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .detail-item span {\n font-size: 13px;\n color: #333;\n }\n\n .status-badge {\n display: inline-block;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 10px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n .status-badge--completed {\n background: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n }\n\n .status-badge--running {\n background: rgba(33, 150, 243, 0.1);\n color: #2196f3;\n }\n\n .status-badge--failed {\n background: rgba(244, 67, 54, 0.1);\n color: #f44336;\n }\n\n .error-message {\n background: #fff3e0;\n border: 1px solid #ffcc02;\n border-radius: 4px;\n padding: 12px;\n font-size: 12px;\n color: #e65100;\n font-family: monospace;\n }\n\n .child-executions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .child-execution {\n background: #f8f9fa;\n border-radius: 4px;\n padding: 12px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .child-info {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .child-name {\n font-size: 12px;\n font-weight: 500;\n color: #333;\n }\n\n .child-type {\n font-size: 10px;\n background: #e0e0e0;\n padding: 2px 6px;\n border-radius: 3px;\n color: #666;\n }\n\n .child-status {\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 3px;\n }\n\n .child-metrics {\n display: flex;\n gap: 12px;\n font-size: 11px;\n color: #666;\n }\n\n .loading-details {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n gap: 12px;\n }\n\n .spinner {\n width: 32px;\n height: 32px;\n border: 3px solid #f3f3f3;\n border-top: 3px solid #2196f3;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n /* Drill-down Tab Styles */\n .drill-down-container {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .drill-down-tabs {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .tab-header {\n display: flex;\n border-bottom: 1px solid #e0e0e0;\n background: #f8f9fa;\n min-height: 40px;\n overflow-x: auto;\n }\n\n .tab-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: #f8f9fa;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n color: #666;\n white-space: nowrap;\n transition: all 0.2s ease;\n min-width: 120px;\n justify-content: space-between;\n }\n\n .tab-item:hover {\n background: #e9ecef;\n color: #333;\n }\n\n .tab-item.active {\n background: white;\n color: #2196f3;\n border-bottom-color: #2196f3;\n }\n\n .tab-title {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .tab-close {\n background: none;\n border: none;\n color: #999;\n cursor: pointer;\n padding: 2px;\n border-radius: 2px;\n font-size: 10px;\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n }\n\n .tab-close:hover {\n background: rgba(0, 0, 0, 0.1);\n color: #333;\n }\n\n .tab-content {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .tab-pane {\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .trends-chart {\n padding: 0;\n }\n\n .trends-chart app-time-series-chart {\n height: 100%;\n display: block;\n overflow: hidden;\n }\n\n /* Ensure chart fits within tab pane */\n .tab-pane.trends-chart {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n /* Drill-down specific styles */\n .executions-drill-down {\n padding: 20px;\n overflow-y: auto;\n }\n\n .drill-down-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n padding-bottom: 12px;\n border-bottom: 1px solid #e0e0e0;\n }\n\n .drill-down-header h4 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .drill-down-meta {\n display: flex;\n gap: 12px;\n align-items: center;\n font-size: 12px;\n }\n\n .timestamp {\n color: #666;\n background: #f0f0f0;\n padding: 4px 8px;\n border-radius: 4px;\n }\n\n .metric-badge {\n background: #2196f3;\n color: white;\n padding: 4px 8px;\n border-radius: 4px;\n font-weight: 500;\n }\n\n .loading-spinner {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 40px;\n color: #666;\n gap: 12px;\n }\n\n .executions-table {\n display: flex;\n flex-direction: column;\n gap: 0;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n overflow: hidden;\n }\n\n .table-header {\n display: grid;\n grid-template-columns: 80px 1fr 120px 100px 100px 80px 100px 120px;\n gap: 12px;\n background: #f8f9fa;\n padding: 12px 16px;\n font-size: 11px;\n font-weight: 600;\n color: #666;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .table-row {\n display: grid;\n grid-template-columns: 80px 1fr 120px 100px 100px 80px 100px 120px;\n gap: 12px;\n padding: 12px 16px;\n border-top: 1px solid #f0f0f0;\n cursor: pointer;\n transition: background 0.2s ease;\n align-items: center;\n }\n\n .table-row:hover {\n background: #f8f9fa;\n }\n\n .table-cell {\n font-size: 12px;\n color: #333;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .type-badge {\n background: #e9ecef;\n color: #666;\n padding: 2px 6px;\n border-radius: 3px;\n font-size: 10px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n .type-badge--prompt {\n background: rgba(33, 150, 243, 0.1);\n color: #2196f3;\n }\n\n .type-badge--agent {\n background: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n }\n\n .no-data {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n color: #999;\n gap: 16px;\n }\n\n .no-data i {\n font-size: 48px;\n color: #ddd;\n }\n\n .no-data p {\n margin: 0;\n font-size: 14px;\n }\n\n /* Model detail styles */\n .model-detail {\n padding: 20px;\n overflow-y: auto;\n }\n\n .model-details {\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n .model-info-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 16px;\n }\n\n .info-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 16px;\n background: #f8f9fa;\n border-radius: 6px;\n }\n\n .info-item label {\n font-size: 11px;\n color: #666;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin: 0;\n }\n\n .info-item span {\n font-size: 14px;\n color: #333;\n font-weight: 500;\n }\n\n .status-indicator {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n }\n\n .status-indicator.active {\n color: #4caf50;\n }\n\n .status-indicator.active::before {\n content: '';\n width: 6px;\n height: 6px;\n background: #4caf50;\n border-radius: 50%;\n }\n\n .model-description {\n padding: 20px;\n background: #f8f9fa;\n border-radius: 8px;\n }\n\n .model-description h5 {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n }\n\n .model-description p {\n margin: 0;\n font-size: 13px;\n color: #666;\n line-height: 1.5;\n }\n\n /* Clickable KPI cards */\n .clickable {\n cursor: pointer;\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n\n .clickable:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n }\n\n /* Collapsible Panel Styles */\n .analysis-panels {\n padding: 10px;\n height: 100%;\n overflow-y: auto;\n background: #f8f9fa;\n }\n\n .analysis-panel {\n margin-bottom: 12px;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n background: white;\n overflow: hidden;\n }\n\n .analysis-panel:last-child {\n margin-bottom: 0;\n }\n\n .panel-header {\n padding: 12px 16px;\n background: #f8f9fa;\n border-bottom: 1px solid #e0e0e0;\n cursor: pointer;\n display: flex;\n justify-content: space-between;\n align-items: center;\n transition: background 0.2s ease;\n }\n\n .panel-header:hover {\n background: #e9ecef;\n }\n\n .panel-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: #333;\n font-size: 14px;\n }\n\n .panel-title i {\n color: #2196f3;\n width: 16px;\n }\n\n .panel-toggle-icon {\n color: #666;\n font-size: 12px;\n transition: transform 0.2s ease;\n }\n\n .panel-content {\n padding: 16px;\n border-top: 1px solid #f0f0f0;\n animation: slideDown 0.2s ease-out;\n }\n\n @keyframes slideDown {\n from {\n opacity: 0;\n max-height: 0;\n }\n to {\n opacity: 1;\n max-height: 500px;\n }\n }\n\n .live-executions-panel {\n padding: 0;\n }\n\n .live-executions-panel app-live-execution-widget {\n height: 300px;\n display: block;\n }\n\n /* Responsive Design */\n @media (max-width: 1200px) {\n .dashboard-splitter {\n height: calc(100vh - 270px); /* Consistent with main height */\n margin-bottom: 20px;\n }\n \n .table-header,\n .table-row {\n grid-template-columns: 60px 1fr 100px 80px 80px 60px 80px 100px;\n gap: 8px;\n }\n \n .model-info-grid {\n grid-template-columns: 1fr;\n }\n \n .analysis-panels {\n padding: 8px;\n }\n \n .analysis-panel {\n margin-bottom: 8px;\n }\n }\n\n @media (max-width: 768px) {\n .execution-monitoring {\n padding: 12px;\n }\n \n .monitoring-header {\n flex-direction: column;\n align-items: flex-start;\n }\n \n .monitoring-controls {\n width: 100%;\n justify-content: flex-start;\n }\n \n .dashboard-splitter {\n height: calc(100vh - 270px); /* Consistent with main height */\n min-height: 400px;\n margin-bottom: 20px;\n }\n \n .kpi-grid {\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n }\n\n /* Reduce padding on smaller screens */\n :host ::ng-deep .k-splitter .k-splitter-pane {\n padding: 5px;\n }\n\n :host ::ng-deep .k-splitter-horizontal > .k-splitter-pane {\n padding: 5px 2px;\n }\n\n :host ::ng-deep .k-splitter-vertical > .k-splitter-pane {\n padding: 2px 5px;\n }\n \n .tab-header {\n overflow-x: auto;\n }\n \n .tab-item {\n min-width: 100px;\n padding: 6px 12px;\n }\n \n .table-header,\n .table-row {\n grid-template-columns: 1fr;\n gap: 4px;\n text-align: left;\n }\n \n .table-row {\n display: block;\n padding: 16px;\n }\n \n .table-cell {\n display: block;\n margin-bottom: 8px;\n }\n \n .table-cell:before {\n content: attr(data-label) ': ';\n font-weight: 600;\n color: #666;\n font-size: 11px;\n text-transform: uppercase;\n }\n \n .executions-drill-down,\n .model-detail {\n padding: 12px;\n }\n \n .panel-content {\n padding: 12px;\n }\n \n .panel-header {\n padding: 10px 12px;\n }\n \n .panel-title {\n font-size: 13px;\n }\n }\n "] }]
|
|
2034
|
-
}], () => [{ type: i1.AIInstrumentationService }], { initialState: [{
|
|
2004
|
+
`, styles: ["\n .execution-monitoring {\n padding: 20px;\n background: #f8f9fa;\n min-height: 100vh;\n position: relative;\n }\n \n .execution-monitoring.loading {\n overflow: hidden;\n }\n \n /* Loading Overlay */\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.5);\n z-index: 999;\n display: flex;\n align-items: center;\n justify-content: center;\n backdrop-filter: blur(1px);\n }\n \n .loading-content {\n text-align: center;\n padding: 40px;\n background: white;\n border-radius: 12px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);\n }\n \n .loading-content i {\n color: #2196f3;\n margin-bottom: 20px;\n display: block;\n }\n \n .loading-content p {\n margin: 0;\n font-size: 16px;\n color: #666;\n font-weight: 500;\n }\n\n .monitoring-header {\n background: white;\n padding: 20px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n margin-bottom: 20px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n }\n\n .monitoring-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #333;\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .monitoring-title i {\n color: #2196f3;\n }\n\n .monitoring-controls {\n display: flex;\n gap: 16px;\n align-items: center;\n flex-wrap: wrap;\n }\n\n .time-range-control {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n }\n\n .time-range-control label {\n color: #666;\n font-weight: 500;\n }\n\n .time-range-control select {\n padding: 6px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 12px;\n background: white;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n \n .time-range-control select:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n background: #f5f5f5;\n }\n\n .refresh-btn {\n background: #2196f3;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: background 0.2s ease;\n }\n\n .refresh-btn:hover:not(:disabled) {\n background: #1976d2;\n }\n\n .refresh-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n background: #e0e0e0;\n }\n\n .refresh-btn i.spinning {\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .kpi-dashboard {\n margin-bottom: 20px;\n }\n\n .kpi-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\n gap: 16px;\n }\n\n .dashboard-splitter {\n height: calc(100vh - 550px); /* Increased to account for headers and margins */\n min-height: 600px;\n margin-bottom: 20px;\n }\n\n .dashboard-section {\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n /* Ensure splitter panes take full height */\n :host ::ng-deep .k-splitter-pane {\n overflow: hidden;\n }\n\n :host ::ng-deep .k-splitter .k-splitter-pane {\n padding: 10px;\n }\n\n :host ::ng-deep .k-splitter-horizontal > .k-splitter-pane {\n padding: 10px 5px;\n }\n\n :host ::ng-deep .k-splitter-vertical > .k-splitter-pane {\n padding: 5px 10px;\n }\n\n /* Cost Analysis Styles */\n .cost-chart-container, .efficiency-chart-container, .status-container {\n padding: 20px;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .chart-header {\n margin-bottom: 16px;\n }\n\n .chart-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .chart-title i {\n color: #2196f3;\n }\n\n .cost-bars, .efficiency-items {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .cost-bar-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 0;\n border-bottom: 1px solid #f0f0f0;\n }\n\n .cost-bar-item:last-child {\n border-bottom: none;\n }\n\n .cost-bar-info {\n min-width: 120px;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .model-name {\n font-size: 12px;\n font-weight: 500;\n color: #333;\n }\n\n .cost-value {\n font-size: 11px;\n color: #ff9800;\n font-weight: 600;\n }\n\n .cost-bar-container {\n flex: 1;\n height: 8px;\n background: #f0f0f0;\n border-radius: 4px;\n overflow: hidden;\n }\n\n .cost-bar {\n height: 100%;\n background: linear-gradient(90deg, #ff9800, #f57c00);\n border-radius: 4px;\n transition: width 0.3s ease;\n }\n\n .token-info {\n font-size: 10px;\n color: #666;\n min-width: 80px;\n text-align: right;\n }\n\n /* Token Efficiency Styles */\n .efficiency-item {\n padding: 12px 0;\n border-bottom: 1px solid #f0f0f0;\n }\n\n .efficiency-item:last-child {\n border-bottom: none;\n }\n\n .efficiency-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n }\n\n .efficiency-ratio {\n font-size: 11px;\n color: #2196f3;\n font-weight: 600;\n }\n\n .token-breakdown {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .token-bar {\n height: 6px;\n background: #f0f0f0;\n border-radius: 3px;\n overflow: hidden;\n display: flex;\n }\n\n .token-segment {\n height: 100%;\n }\n\n .token-segment--input {\n background: #4caf50;\n }\n\n .token-segment--output {\n background: #2196f3;\n }\n\n .token-labels {\n display: flex;\n justify-content: space-between;\n font-size: 10px;\n color: #666;\n }\n\n .input-label {\n color: #4caf50;\n }\n\n .output-label {\n color: #2196f3;\n }\n\n .cost-per-token {\n font-size: 10px;\n color: #999;\n margin-top: 4px;\n }\n\n /* System Status Styles */\n .status-metrics {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n }\n\n .status-metric {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 6px;\n }\n\n .status-icon {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .status-icon--success {\n background: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n }\n\n .status-icon--warning {\n background: rgba(255, 152, 0, 0.1);\n color: #ff9800;\n }\n\n .status-icon--info {\n background: rgba(33, 150, 243, 0.1);\n color: #2196f3;\n }\n\n .status-icon--primary {\n background: rgba(156, 39, 176, 0.1);\n color: #9c27b0;\n }\n\n .status-info {\n flex: 1;\n }\n\n .status-label {\n font-size: 12px;\n color: #666;\n font-weight: 500;\n }\n\n .status-value {\n font-size: 18px;\n font-weight: 700;\n color: #333;\n margin: 2px 0;\n }\n\n .status-subtitle {\n font-size: 10px;\n color: #999;\n }\n\n /* Execution Modal Styles */\n .execution-modal {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n padding: 20px;\n }\n\n .execution-modal-content {\n background: white;\n border-radius: 8px;\n max-width: 800px;\n width: 100%;\n max-height: 80vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .execution-modal-header {\n padding: 20px;\n border-bottom: 1px solid #f0f0f0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .execution-modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #333;\n }\n\n .modal-header-actions {\n display: flex;\n gap: 12px;\n align-items: center;\n }\n\n .open-record-btn {\n background: #2196f3;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s ease;\n }\n\n .open-record-btn:hover {\n background: #1976d2;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.3);\n }\n\n .open-record-btn i {\n font-size: 12px;\n }\n\n .close-btn {\n background: none;\n border: none;\n font-size: 16px;\n color: #999;\n cursor: pointer;\n padding: 4px;\n }\n\n .close-btn:hover {\n color: #333;\n }\n\n .execution-modal-body {\n padding: 20px;\n overflow-y: auto;\n flex: 1;\n }\n\n .execution-details {\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n\n .detail-section h4 {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n border-bottom: 1px solid #f0f0f0;\n padding-bottom: 6px;\n }\n\n .detail-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n }\n\n .detail-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .detail-item label {\n font-size: 11px;\n color: #666;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .detail-item span {\n font-size: 13px;\n color: #333;\n }\n\n .status-badge {\n display: inline-block;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 10px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n .status-badge--completed {\n background: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n }\n\n .status-badge--running {\n background: rgba(33, 150, 243, 0.1);\n color: #2196f3;\n }\n\n .status-badge--failed {\n background: rgba(244, 67, 54, 0.1);\n color: #f44336;\n }\n\n .error-message {\n background: #fff3e0;\n border: 1px solid #ffcc02;\n border-radius: 4px;\n padding: 12px;\n font-size: 12px;\n color: #e65100;\n font-family: monospace;\n }\n\n .child-executions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .child-execution {\n background: #f8f9fa;\n border-radius: 4px;\n padding: 12px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .child-info {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .child-name {\n font-size: 12px;\n font-weight: 500;\n color: #333;\n }\n\n .child-type {\n font-size: 10px;\n background: #e0e0e0;\n padding: 2px 6px;\n border-radius: 3px;\n color: #666;\n }\n\n .child-status {\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 3px;\n }\n\n .child-metrics {\n display: flex;\n gap: 12px;\n font-size: 11px;\n color: #666;\n }\n\n .loading-details {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n gap: 12px;\n }\n\n .spinner {\n width: 32px;\n height: 32px;\n border: 3px solid #f3f3f3;\n border-top: 3px solid #2196f3;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n /* Drill-down Tab Styles */\n .drill-down-container {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .drill-down-tabs {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .tab-header {\n display: flex;\n border-bottom: 1px solid #e0e0e0;\n background: #f8f9fa;\n min-height: 40px;\n overflow-x: auto;\n }\n\n .tab-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: #f8f9fa;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n color: #666;\n white-space: nowrap;\n transition: all 0.2s ease;\n min-width: 120px;\n justify-content: space-between;\n }\n\n .tab-item:hover {\n background: #e9ecef;\n color: #333;\n }\n\n .tab-item.active {\n background: white;\n color: #2196f3;\n border-bottom-color: #2196f3;\n }\n\n .tab-title {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .tab-close {\n background: none;\n border: none;\n color: #999;\n cursor: pointer;\n padding: 2px;\n border-radius: 2px;\n font-size: 10px;\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n }\n\n .tab-close:hover {\n background: rgba(0, 0, 0, 0.1);\n color: #333;\n }\n\n .tab-content {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .tab-pane {\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .trends-chart {\n padding: 0;\n }\n\n .trends-chart app-time-series-chart {\n height: 100%;\n display: block;\n overflow: hidden;\n }\n\n /* Ensure chart fits within tab pane */\n .tab-pane.trends-chart {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n /* Drill-down specific styles */\n .executions-drill-down {\n padding: 20px;\n overflow-y: auto;\n }\n\n .drill-down-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n padding-bottom: 12px;\n border-bottom: 1px solid #e0e0e0;\n }\n\n .drill-down-header h4 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .drill-down-meta {\n display: flex;\n gap: 12px;\n align-items: center;\n font-size: 12px;\n }\n\n .timestamp {\n color: #666;\n background: #f0f0f0;\n padding: 4px 8px;\n border-radius: 4px;\n }\n\n .metric-badge {\n background: #2196f3;\n color: white;\n padding: 4px 8px;\n border-radius: 4px;\n font-weight: 500;\n }\n\n .loading-spinner {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 40px;\n color: #666;\n gap: 12px;\n }\n\n .executions-table {\n display: flex;\n flex-direction: column;\n gap: 0;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n overflow: hidden;\n }\n\n .table-header {\n display: grid;\n grid-template-columns: 80px 1fr 120px 100px 100px 80px 100px 120px;\n gap: 12px;\n background: #f8f9fa;\n padding: 12px 16px;\n font-size: 11px;\n font-weight: 600;\n color: #666;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .table-row {\n display: grid;\n grid-template-columns: 80px 1fr 120px 100px 100px 80px 100px 120px;\n gap: 12px;\n padding: 12px 16px;\n border-top: 1px solid #f0f0f0;\n cursor: pointer;\n transition: background 0.2s ease;\n align-items: center;\n }\n\n .table-row:hover {\n background: #f8f9fa;\n }\n\n .table-cell {\n font-size: 12px;\n color: #333;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .type-badge {\n background: #e9ecef;\n color: #666;\n padding: 2px 6px;\n border-radius: 3px;\n font-size: 10px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n .type-badge--prompt {\n background: rgba(33, 150, 243, 0.1);\n color: #2196f3;\n }\n\n .type-badge--agent {\n background: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n }\n\n .no-data {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n color: #999;\n gap: 16px;\n }\n\n .no-data i {\n font-size: 48px;\n color: #ddd;\n }\n\n .no-data p {\n margin: 0;\n font-size: 14px;\n }\n\n /* Model detail styles */\n .model-detail {\n padding: 20px;\n overflow-y: auto;\n }\n\n .model-details {\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n .model-info-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 16px;\n }\n\n .info-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 16px;\n background: #f8f9fa;\n border-radius: 6px;\n }\n\n .info-item label {\n font-size: 11px;\n color: #666;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin: 0;\n }\n\n .info-item span {\n font-size: 14px;\n color: #333;\n font-weight: 500;\n }\n\n .status-indicator {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n }\n\n .status-indicator.active {\n color: #4caf50;\n }\n\n .status-indicator.active::before {\n content: '';\n width: 6px;\n height: 6px;\n background: #4caf50;\n border-radius: 50%;\n }\n\n .model-description {\n padding: 20px;\n background: #f8f9fa;\n border-radius: 8px;\n }\n\n .model-description h5 {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n }\n\n .model-description p {\n margin: 0;\n font-size: 13px;\n color: #666;\n line-height: 1.5;\n }\n\n /* Clickable KPI cards */\n .clickable {\n cursor: pointer;\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n\n .clickable:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n }\n\n /* Collapsible Panel Styles */\n .analysis-panels {\n padding: 10px;\n height: 100%;\n overflow-y: auto;\n background: #f8f9fa;\n }\n\n .analysis-panel {\n margin-bottom: 12px;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n background: white;\n overflow: hidden;\n }\n\n .analysis-panel:last-child {\n margin-bottom: 0;\n }\n\n .panel-header {\n padding: 12px 16px;\n background: #f8f9fa;\n border-bottom: 1px solid #e0e0e0;\n cursor: pointer;\n display: flex;\n justify-content: space-between;\n align-items: center;\n transition: background 0.2s ease;\n }\n\n .panel-header:hover {\n background: #e9ecef;\n }\n\n .panel-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: #333;\n font-size: 14px;\n }\n\n .panel-title i {\n color: #2196f3;\n width: 16px;\n }\n\n .panel-toggle-icon {\n color: #666;\n font-size: 12px;\n transition: transform 0.2s ease;\n }\n\n .panel-content {\n padding: 16px;\n border-top: 1px solid #f0f0f0;\n animation: slideDown 0.2s ease-out;\n }\n\n @keyframes slideDown {\n from {\n opacity: 0;\n max-height: 0;\n }\n to {\n opacity: 1;\n max-height: 500px;\n }\n }\n\n .live-executions-panel {\n padding: 0;\n }\n\n .live-executions-panel app-live-execution-widget {\n height: 300px;\n display: block;\n }\n\n /* Responsive Design */\n @media (max-width: 1200px) {\n .dashboard-splitter {\n height: calc(100vh - 270px); /* Consistent with main height */\n margin-bottom: 20px;\n }\n \n .table-header,\n .table-row {\n grid-template-columns: 60px 1fr 100px 80px 80px 60px 80px 100px;\n gap: 8px;\n }\n \n .model-info-grid {\n grid-template-columns: 1fr;\n }\n \n .analysis-panels {\n padding: 8px;\n }\n \n .analysis-panel {\n margin-bottom: 8px;\n }\n }\n\n @media (max-width: 768px) {\n .execution-monitoring {\n padding: 12px;\n }\n \n .monitoring-header {\n flex-direction: column;\n align-items: flex-start;\n }\n \n .monitoring-controls {\n width: 100%;\n justify-content: flex-start;\n }\n \n .dashboard-splitter {\n height: calc(100vh - 270px); /* Consistent with main height */\n min-height: 400px;\n margin-bottom: 20px;\n }\n \n .kpi-grid {\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n }\n\n /* Reduce padding on smaller screens */\n :host ::ng-deep .k-splitter .k-splitter-pane {\n padding: 5px;\n }\n\n :host ::ng-deep .k-splitter-horizontal > .k-splitter-pane {\n padding: 5px 2px;\n }\n\n :host ::ng-deep .k-splitter-vertical > .k-splitter-pane {\n padding: 2px 5px;\n }\n \n .tab-header {\n overflow-x: auto;\n }\n \n .tab-item {\n min-width: 100px;\n padding: 6px 12px;\n }\n \n .table-header,\n .table-row {\n grid-template-columns: 1fr;\n gap: 4px;\n text-align: left;\n }\n \n .table-row {\n display: block;\n padding: 16px;\n }\n \n .table-cell {\n display: block;\n margin-bottom: 8px;\n }\n \n .table-cell:before {\n content: attr(data-label) ': ';\n font-weight: 600;\n color: #666;\n font-size: 11px;\n text-transform: uppercase;\n }\n \n .executions-drill-down,\n .model-detail {\n padding: 12px;\n }\n \n .panel-content {\n padding: 12px;\n }\n \n .panel-header {\n padding: 10px 12px;\n }\n \n .panel-title {\n font-size: 13px;\n }\n }\n "] }]
|
|
2005
|
+
}], () => [{ type: i1.AIInstrumentationService }, { type: i0.ChangeDetectorRef }], { initialState: [{
|
|
2035
2006
|
type: Input
|
|
2036
2007
|
}], openEntityRecord: [{
|
|
2037
2008
|
type: Output
|
|
2038
2009
|
}], stateChange: [{
|
|
2039
2010
|
type: Output
|
|
2040
2011
|
}] }); })();
|
|
2041
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ExecutionMonitoringComponent, { className: "ExecutionMonitoringComponent", filePath: "src/AI/components/execution-monitoring.component.ts", lineNumber:
|
|
2012
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ExecutionMonitoringComponent, { className: "ExecutionMonitoringComponent", filePath: "src/AI/components/execution-monitoring.component.ts", lineNumber: 1772 }); })();
|
|
2042
2013
|
//# sourceMappingURL=execution-monitoring.component.js.map
|