@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.
Files changed (69) hide show
  1. package/dist/AI/ai-dashboard.component.d.ts +4 -0
  2. package/dist/AI/ai-dashboard.component.d.ts.map +1 -1
  3. package/dist/AI/ai-dashboard.component.js +71 -23
  4. package/dist/AI/ai-dashboard.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-configuration.component.d.ts +18 -8
  6. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  7. package/dist/AI/components/agents/agent-configuration.component.js +338 -130
  8. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  9. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  10. package/dist/AI/components/agents/agent-editor.component.js +0 -5
  11. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  12. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +16 -1
  13. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
  14. package/dist/AI/components/agents/agent-filter-panel.component.js +124 -14
  15. package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
  16. package/dist/AI/components/charts/time-series-chart.component.d.ts +2 -0
  17. package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -1
  18. package/dist/AI/components/charts/time-series-chart.component.js +56 -2
  19. package/dist/AI/components/charts/time-series-chart.component.js.map +1 -1
  20. package/dist/AI/components/execution-monitoring.component.d.ts +4 -7
  21. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  22. package/dist/AI/components/execution-monitoring.component.js +339 -368
  23. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  24. package/dist/AI/components/models/model-management-v2.component.d.ts +92 -0
  25. package/dist/AI/components/models/model-management-v2.component.d.ts.map +1 -0
  26. package/dist/AI/components/models/model-management-v2.component.js +1004 -0
  27. package/dist/AI/components/models/model-management-v2.component.js.map +1 -0
  28. package/dist/AI/components/prompts/prompt-management-v2.component.d.ts +66 -0
  29. package/dist/AI/components/prompts/prompt-management-v2.component.d.ts.map +1 -0
  30. package/dist/AI/components/prompts/prompt-management-v2.component.js +719 -0
  31. package/dist/AI/components/prompts/prompt-management-v2.component.js.map +1 -0
  32. package/dist/AI/services/ai-instrumentation.service.d.ts +7 -6
  33. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  34. package/dist/AI/services/ai-instrumentation.service.js +141 -147
  35. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  36. package/dist/Actions/actions-management-dashboard.component.js +8 -8
  37. package/dist/Actions/actions-management-dashboard.component.js.map +1 -1
  38. package/dist/Actions/components/actions-list-view.component.d.ts +0 -2
  39. package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -1
  40. package/dist/Actions/components/actions-list-view.component.js +37 -37
  41. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  42. package/dist/Actions/components/actions-overview.component.d.ts +7 -4
  43. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  44. package/dist/Actions/components/actions-overview.component.js +147 -90
  45. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  46. package/dist/Actions/components/categories-list-view.component.d.ts +23 -2
  47. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  48. package/dist/Actions/components/categories-list-view.component.js +283 -17
  49. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  50. package/dist/Actions/components/execution-monitoring.component.d.ts +0 -2
  51. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
  52. package/dist/Actions/components/execution-monitoring.component.js +25 -37
  53. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  54. package/dist/module.d.ts +3 -3
  55. package/dist/module.js +6 -6
  56. package/dist/module.js.map +1 -1
  57. package/dist/public-api.d.ts +1 -0
  58. package/dist/public-api.d.ts.map +1 -1
  59. package/dist/public-api.js +1 -0
  60. package/dist/public-api.js.map +1 -1
  61. package/package.json +7 -6
  62. package/dist/AI/components/models/model-management.component.d.ts +0 -73
  63. package/dist/AI/components/models/model-management.component.d.ts.map +0 -1
  64. package/dist/AI/components/models/model-management.component.js +0 -643
  65. package/dist/AI/components/models/model-management.component.js.map +0 -1
  66. package/dist/AI/components/prompts/prompt-management.component.d.ts +0 -118
  67. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +0 -1
  68. package/dist/AI/components/prompts/prompt-management.component.js +0 -1351
  69. 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 ExecutionMonitoringComponent_For_40_Template(rf, ctx) { if (rf & 1) {
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", 52);
21
- i0.ɵɵlistener("click", function ExecutionMonitoringComponent_For_40_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)); });
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 ExecutionMonitoringComponent_Conditional_52_Template(rf, ctx) { if (rf & 1) {
30
- i0.ɵɵelementStart(0, "div", 28)(1, "div", 53)(2, "div", 54);
31
- i0.ɵɵelement(3, "i", 55);
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", 56)(5, "div", 57);
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", 58);
43
+ i0.ɵɵelementStart(7, "div", 59);
37
44
  i0.ɵɵtext(8);
38
45
  i0.ɵɵelementEnd();
39
- i0.ɵɵelementStart(9, "div", 59);
46
+ i0.ɵɵelementStart(9, "div", 60);
40
47
  i0.ɵɵtext(10);
41
48
  i0.ɵɵelementEnd()()();
42
- i0.ɵɵelementStart(11, "div", 53)(12, "div", 60);
43
- i0.ɵɵelement(13, "i", 61);
49
+ i0.ɵɵelementStart(11, "div", 54)(12, "div", 61);
50
+ i0.ɵɵelement(13, "i", 62);
44
51
  i0.ɵɵelementEnd();
45
- i0.ɵɵelementStart(14, "div", 56)(15, "div", 57);
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", 58);
55
+ i0.ɵɵelementStart(17, "div", 59);
49
56
  i0.ɵɵtext(18);
50
57
  i0.ɵɵelementEnd();
51
- i0.ɵɵelementStart(19, "div", 59);
58
+ i0.ɵɵelementStart(19, "div", 60);
52
59
  i0.ɵɵtext(20);
53
60
  i0.ɵɵelementEnd()()();
54
- i0.ɵɵelementStart(21, "div", 53)(22, "div", 62);
55
- i0.ɵɵelement(23, "i", 63);
61
+ i0.ɵɵelementStart(21, "div", 54)(22, "div", 63);
62
+ i0.ɵɵelement(23, "i", 64);
56
63
  i0.ɵɵelementEnd();
57
- i0.ɵɵelementStart(24, "div", 56)(25, "div", 57);
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", 58);
67
+ i0.ɵɵelementStart(27, "div", 59);
61
68
  i0.ɵɵtext(28);
62
69
  i0.ɵɵelementEnd();
63
- i0.ɵɵelementStart(29, "div", 59);
70
+ i0.ɵɵelementStart(29, "div", 60);
64
71
  i0.ɵɵtext(30, "Across all models");
65
72
  i0.ɵɵelementEnd()()();
66
- i0.ɵɵelementStart(31, "div", 53)(32, "div", 64);
67
- i0.ɵɵelement(33, "i", 49);
73
+ i0.ɵɵelementStart(31, "div", 54)(32, "div", 65);
74
+ i0.ɵɵelement(33, "i", 48);
68
75
  i0.ɵɵelementEnd();
69
- i0.ɵɵelementStart(34, "div", 56)(35, "div", 57);
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", 58);
79
+ i0.ɵɵelementStart(37, "div", 59);
73
80
  i0.ɵɵtext(38);
74
81
  i0.ɵɵelementEnd();
75
- i0.ɵɵelementStart(39, "div", 59);
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 ExecutionMonitoringComponent_For_59_Conditional_3_Template(rf, ctx) { if (rf & 1) {
101
+ function ExecutionMonitoringComponent_For_46_Conditional_3_Template(rf, ctx) { if (rf & 1) {
95
102
  const _r7 = i0.ɵɵgetCurrentView();
96
- i0.ɵɵelementStart(0, "button", 68);
97
- i0.ɵɵlistener("click", function ExecutionMonitoringComponent_For_59_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)); });
98
- i0.ɵɵelement(1, "i", 69);
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 ExecutionMonitoringComponent_For_59_Template(rf, ctx) { if (rf & 1) {
108
+ function ExecutionMonitoringComponent_For_46_Template(rf, ctx) { if (rf & 1) {
102
109
  const _r5 = i0.ɵɵgetCurrentView();
103
- i0.ɵɵelementStart(0, "div", 65);
104
- i0.ɵɵlistener("click", function ExecutionMonitoringComponent_For_59_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)); });
105
- i0.ɵɵelementStart(1, "span", 66);
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, ExecutionMonitoringComponent_For_59_Conditional_3_Template, 2, 0, "button", 67);
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 ExecutionMonitoringComponent_Conditional_61_Template(rf, ctx) { if (rf & 1) {
126
+ function ExecutionMonitoringComponent_Conditional_48_Template(rf, ctx) { if (rf & 1) {
120
127
  const _r8 = i0.ɵɵgetCurrentView();
121
- i0.ɵɵelementStart(0, "div", 35)(1, "app-time-series-chart", 70);
128
+ i0.ɵɵelementStart(0, "div", 34)(1, "app-time-series-chart", 71);
122
129
  i0.ɵɵpipe(2, "async");
123
- i0.ɵɵlistener("dataPointClick", function ExecutionMonitoringComponent_Conditional_61_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_61_Template_app_time_series_chart_timeRangeChange_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onChartTimeRangeChange($event)); });
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 ExecutionMonitoringComponent_Conditional_62_Conditional_6_Template(rf, ctx) { if (rf & 1) {
132
- i0.ɵɵelementStart(0, "span", 74);
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 ExecutionMonitoringComponent_Conditional_62_Conditional_7_Template(rf, ctx) { if (rf & 1) {
141
- i0.ɵɵelementStart(0, "span", 75);
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 ExecutionMonitoringComponent_Conditional_62_Conditional_8_Template(rf, ctx) { if (rf & 1) {
150
- i0.ɵɵelementStart(0, "div", 76);
151
- i0.ɵɵelement(1, "i", 79);
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 ExecutionMonitoringComponent_Conditional_62_Conditional_9_For_19_Template(rf, ctx) { if (rf & 1) {
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", 83);
158
- i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Conditional_62_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)); });
159
- i0.ɵɵelementStart(1, "div", 84)(2, "span", 85);
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", 84);
169
+ i0.ɵɵelementStart(4, "div", 85);
163
170
  i0.ɵɵtext(5);
164
171
  i0.ɵɵelementEnd();
165
- i0.ɵɵelementStart(6, "div", 84);
172
+ i0.ɵɵelementStart(6, "div", 85);
166
173
  i0.ɵɵtext(7);
167
174
  i0.ɵɵelementEnd();
168
- i0.ɵɵelementStart(8, "div", 84)(9, "span", 86);
175
+ i0.ɵɵelementStart(8, "div", 85)(9, "span", 87);
169
176
  i0.ɵɵtext(10);
170
177
  i0.ɵɵelementEnd()();
171
- i0.ɵɵelementStart(11, "div", 84);
178
+ i0.ɵɵelementStart(11, "div", 85);
172
179
  i0.ɵɵtext(12);
173
180
  i0.ɵɵelementEnd();
174
- i0.ɵɵelementStart(13, "div", 84);
181
+ i0.ɵɵelementStart(13, "div", 85);
175
182
  i0.ɵɵtext(14);
176
183
  i0.ɵɵelementEnd();
177
- i0.ɵɵelementStart(15, "div", 84);
184
+ i0.ɵɵelementStart(15, "div", 85);
178
185
  i0.ɵɵtext(16);
179
186
  i0.ɵɵelementEnd();
180
- i0.ɵɵelementStart(17, "div", 84);
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 ExecutionMonitoringComponent_Conditional_62_Conditional_9_Template(rf, ctx) { if (rf & 1) {
208
- i0.ɵɵelementStart(0, "div", 77)(1, "div", 80)(2, "div", 81);
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", 81);
218
+ i0.ɵɵelementStart(4, "div", 82);
212
219
  i0.ɵɵtext(5, "Name");
213
220
  i0.ɵɵelementEnd();
214
- i0.ɵɵelementStart(6, "div", 81);
221
+ i0.ɵɵelementStart(6, "div", 82);
215
222
  i0.ɵɵtext(7, "Model");
216
223
  i0.ɵɵelementEnd();
217
- i0.ɵɵelementStart(8, "div", 81);
224
+ i0.ɵɵelementStart(8, "div", 82);
218
225
  i0.ɵɵtext(9, "Status");
219
226
  i0.ɵɵelementEnd();
220
- i0.ɵɵelementStart(10, "div", 81);
227
+ i0.ɵɵelementStart(10, "div", 82);
221
228
  i0.ɵɵtext(11, "Duration");
222
229
  i0.ɵɵelementEnd();
223
- i0.ɵɵelementStart(12, "div", 81);
230
+ i0.ɵɵelementStart(12, "div", 82);
224
231
  i0.ɵɵtext(13, "Cost");
225
232
  i0.ɵɵelementEnd();
226
- i0.ɵɵelementStart(14, "div", 81);
233
+ i0.ɵɵelementStart(14, "div", 82);
227
234
  i0.ɵɵtext(15, "Tokens");
228
235
  i0.ɵɵelementEnd();
229
- i0.ɵɵelementStart(16, "div", 81);
236
+ i0.ɵɵelementStart(16, "div", 82);
230
237
  i0.ɵɵtext(17, "Time");
231
238
  i0.ɵɵelementEnd()();
232
- i0.ɵɵrepeaterCreate(18, ExecutionMonitoringComponent_Conditional_62_Conditional_9_For_19_Template, 19, 12, "div", 82, _forTrack1);
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 ExecutionMonitoringComponent_Conditional_62_Conditional_10_Template(rf, ctx) { if (rf & 1) {
240
- i0.ɵɵelementStart(0, "div", 78);
241
- i0.ɵɵelement(1, "i", 87);
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 ExecutionMonitoringComponent_Conditional_62_Template(rf, ctx) { if (rf & 1) {
247
- i0.ɵɵelementStart(0, "div", 36)(1, "div", 71)(2, "h4");
248
- i0.ɵɵelement(3, "i", 72);
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", 73);
252
- i0.ɵɵtemplate(6, ExecutionMonitoringComponent_Conditional_62_Conditional_6_Template, 2, 1, "span", 74)(7, ExecutionMonitoringComponent_Conditional_62_Conditional_7_Template, 2, 1, "span", 75);
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, ExecutionMonitoringComponent_Conditional_62_Conditional_8_Template, 3, 0, "div", 76)(9, ExecutionMonitoringComponent_Conditional_62_Conditional_9_Template, 20, 0, "div", 77)(10, ExecutionMonitoringComponent_Conditional_62_Conditional_10_Template, 4, 0, "div", 78);
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 ExecutionMonitoringComponent_Conditional_63_Conditional_5_Template(rf, ctx) { if (rf & 1) {
268
- i0.ɵɵelementStart(0, "div", 76);
269
- i0.ɵɵelement(1, "i", 79);
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 ExecutionMonitoringComponent_Conditional_63_Conditional_6_Conditional_32_Template(rf, ctx) { if (rf & 1) {
274
- i0.ɵɵelementStart(0, "div", 93)(1, "h5");
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 ExecutionMonitoringComponent_Conditional_63_Conditional_6_Template(rf, ctx) { if (rf & 1) {
286
- i0.ɵɵelementStart(0, "div", 89)(1, "div", 90)(2, "div", 91)(3, "label");
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", 91)(8, "label");
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", 91)(13, "label");
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", 91)(18, "label");
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", 91)(23, "label");
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", 91)(28, "label");
323
+ i0.ɵɵelementStart(27, "div", 92)(28, "label");
317
324
  i0.ɵɵtext(29, "Active:");
318
325
  i0.ɵɵelementEnd();
319
- i0.ɵɵelementStart(30, "span", 92);
326
+ i0.ɵɵelementStart(30, "span", 93);
320
327
  i0.ɵɵtext(31);
321
328
  i0.ɵɵelementEnd()()();
322
- i0.ɵɵtemplate(32, ExecutionMonitoringComponent_Conditional_63_Conditional_6_Conditional_32_Template, 5, 1, "div", 93);
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 ExecutionMonitoringComponent_Conditional_63_Template(rf, ctx) { if (rf & 1) {
344
- i0.ɵɵelementStart(0, "div", 37)(1, "div", 71)(2, "h4");
345
- i0.ɵɵelement(3, "i", 88);
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, ExecutionMonitoringComponent_Conditional_63_Conditional_5_Template, 3, 0, "div", 76)(6, ExecutionMonitoringComponent_Conditional_63_Conditional_6_Template, 33, 9, "div", 89);
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 ExecutionMonitoringComponent_Conditional_78_Conditional_1_For_2_Template(rf, ctx) { if (rf & 1) {
358
- i0.ɵɵelementStart(0, "div", 95)(1, "div", 96)(2, "span", 97);
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", 98);
368
+ i0.ɵɵelementStart(4, "span", 99);
362
369
  i0.ɵɵtext(5);
363
370
  i0.ɵɵelementEnd()();
364
- i0.ɵɵelementStart(6, "div", 99);
365
- i0.ɵɵelement(7, "div", 100);
371
+ i0.ɵɵelementStart(6, "div", 100);
372
+ i0.ɵɵelement(7, "div", 101);
366
373
  i0.ɵɵelementEnd();
367
- i0.ɵɵelementStart(8, "div", 101);
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 ExecutionMonitoringComponent_Conditional_78_Conditional_1_Template(rf, ctx) { if (rf & 1) {
384
- i0.ɵɵelementStart(0, "div", 94);
385
- i0.ɵɵrepeaterCreate(1, ExecutionMonitoringComponent_Conditional_78_Conditional_1_For_2_Template, 10, 5, "div", 95, _forTrack2);
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 ExecutionMonitoringComponent_Conditional_78_Template(rf, ctx) { if (rf & 1) {
392
- i0.ɵɵelementStart(0, "div", 47);
393
- i0.ɵɵtemplate(1, ExecutionMonitoringComponent_Conditional_78_Conditional_1_Template, 3, 0, "div", 94);
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 ExecutionMonitoringComponent_Conditional_85_Conditional_1_For_2_Template(rf, ctx) { if (rf & 1) {
403
- i0.ɵɵelementStart(0, "div", 103)(1, "div", 104)(2, "span", 97);
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", 105);
413
+ i0.ɵɵelementStart(4, "span", 106);
407
414
  i0.ɵɵtext(5);
408
415
  i0.ɵɵelementEnd()();
409
- i0.ɵɵelementStart(6, "div", 106)(7, "div", 107);
410
- i0.ɵɵelement(8, "div", 108)(9, "div", 109);
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", 110)(11, "span", 111);
419
+ i0.ɵɵelementStart(10, "div", 111)(11, "span", 112);
413
420
  i0.ɵɵtext(12);
414
421
  i0.ɵɵelementEnd();
415
- i0.ɵɵelementStart(13, "span", 112);
422
+ i0.ɵɵelementStart(13, "span", 113);
416
423
  i0.ɵɵtext(14);
417
424
  i0.ɵɵelementEnd()()();
418
- i0.ɵɵelementStart(15, "div", 113);
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 ExecutionMonitoringComponent_Conditional_85_Conditional_1_Template(rf, ctx) { if (rf & 1) {
440
- i0.ɵɵelementStart(0, "div", 102);
441
- i0.ɵɵrepeaterCreate(1, ExecutionMonitoringComponent_Conditional_85_Conditional_1_For_2_Template, 17, 9, "div", 103, _forTrack2);
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 ExecutionMonitoringComponent_Conditional_85_Template(rf, ctx) { if (rf & 1) {
448
- i0.ɵɵelementStart(0, "div", 47);
449
- i0.ɵɵtemplate(1, ExecutionMonitoringComponent_Conditional_85_Conditional_1_Template, 3, 0, "div", 102);
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 ExecutionMonitoringComponent_Conditional_92_Template(rf, ctx) { if (rf & 1) {
465
+ function ExecutionMonitoringComponent_Conditional_79_Template(rf, ctx) { if (rf & 1) {
459
466
  const _r14 = i0.ɵɵgetCurrentView();
460
- i0.ɵɵelementStart(0, "div", 50)(1, "app-live-execution-widget", 114);
467
+ i0.ɵɵelementStart(0, "div", 49)(1, "app-live-execution-widget", 115);
461
468
  i0.ɵɵpipe(2, "async");
462
- i0.ɵɵlistener("executionClick", function ExecutionMonitoringComponent_Conditional_92_Template_app_live_execution_widget_executionClick_1_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onExecutionClick($event)); });
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 ExecutionMonitoringComponent_Conditional_93_Conditional_12_Conditional_28_Template(rf, ctx) { if (rf & 1) {
471
- i0.ɵɵelementStart(0, "div", 127)(1, "label");
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 ExecutionMonitoringComponent_Conditional_93_Conditional_12_Conditional_48_Template(rf, ctx) { if (rf & 1) {
484
- i0.ɵɵelementStart(0, "div", 127)(1, "label");
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 ExecutionMonitoringComponent_Conditional_93_Conditional_12_Conditional_49_Template(rf, ctx) { if (rf & 1) {
496
- i0.ɵɵelementStart(0, "div", 125)(1, "h4");
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", 128);
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 ExecutionMonitoringComponent_Conditional_93_Conditional_12_Conditional_50_For_5_Template(rf, ctx) { if (rf & 1) {
508
- i0.ɵɵelementStart(0, "div", 130)(1, "div", 131)(2, "span", 132);
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", 133);
518
+ i0.ɵɵelementStart(4, "span", 134);
512
519
  i0.ɵɵtext(5);
513
520
  i0.ɵɵelementEnd();
514
- i0.ɵɵelementStart(6, "span", 134);
521
+ i0.ɵɵelementStart(6, "span", 135);
515
522
  i0.ɵɵtext(7);
516
523
  i0.ɵɵelementEnd()();
517
- i0.ɵɵelementStart(8, "div", 135)(9, "span");
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 ExecutionMonitoringComponent_Conditional_93_Conditional_12_Conditional_50_Template(rf, ctx) { if (rf & 1) {
540
- i0.ɵɵelementStart(0, "div", 125)(1, "h4");
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", 129);
544
- i0.ɵɵrepeaterCreate(4, ExecutionMonitoringComponent_Conditional_93_Conditional_12_Conditional_50_For_5_Template, 13, 7, "div", 130, _forTrack1);
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 ExecutionMonitoringComponent_Conditional_93_Conditional_12_Template(rf, ctx) { if (rf & 1) {
554
- i0.ɵɵelementStart(0, "div", 123)(1, "div", 125)(2, "h4");
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", 126)(5, "div", 127)(6, "label");
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", 127)(12, "label");
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", 127)(17, "label");
577
+ i0.ɵɵelementStart(16, "div", 128)(17, "label");
571
578
  i0.ɵɵtext(18, "Status:");
572
579
  i0.ɵɵelementEnd();
573
- i0.ɵɵelementStart(19, "span", 86);
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", 127)(23, "label");
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, ExecutionMonitoringComponent_Conditional_93_Conditional_12_Conditional_28_Template, 6, 4, "div", 127);
585
- i0.ɵɵelementStart(29, "div", 127)(30, "label");
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", 125)(35, "h4");
598
+ i0.ɵɵelementStart(34, "div", 126)(35, "h4");
592
599
  i0.ɵɵtext(36, "Resource Usage");
593
600
  i0.ɵɵelementEnd();
594
- i0.ɵɵelementStart(37, "div", 126)(38, "div", 127)(39, "label");
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", 127)(44, "label");
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, ExecutionMonitoringComponent_Conditional_93_Conditional_12_Conditional_48_Template, 5, 1, "div", 127);
613
+ i0.ɵɵtemplate(48, ExecutionMonitoringComponent_Conditional_80_Conditional_12_Conditional_48_Template, 5, 1, "div", 128);
607
614
  i0.ɵɵelementEnd()();
608
- i0.ɵɵtemplate(49, ExecutionMonitoringComponent_Conditional_93_Conditional_12_Conditional_49_Template, 5, 1, "div", 125)(50, ExecutionMonitoringComponent_Conditional_93_Conditional_12_Conditional_50_Template, 6, 1, "div", 125);
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 ExecutionMonitoringComponent_Conditional_93_Conditional_13_Template(rf, ctx) { if (rf & 1) {
638
- i0.ɵɵelementStart(0, "div", 124);
639
- i0.ɵɵelement(1, "div", 136);
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 ExecutionMonitoringComponent_Conditional_93_Template(rf, ctx) { if (rf & 1) {
651
+ function ExecutionMonitoringComponent_Conditional_80_Template(rf, ctx) { if (rf & 1) {
645
652
  const _r15 = i0.ɵɵgetCurrentView();
646
- i0.ɵɵelementStart(0, "div", 115);
647
- i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Conditional_93_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeExecutionModal()); });
648
- i0.ɵɵelementStart(1, "div", 116);
649
- i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Conditional_93_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r15); return i0.ɵɵresetView($event.stopPropagation()); });
650
- i0.ɵɵelementStart(2, "div", 117)(3, "h3");
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", 118)(6, "button", 119);
654
- i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Conditional_93_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.openFullRecord()); });
655
- i0.ɵɵelement(7, "i", 120);
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", 121);
659
- i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Conditional_93_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeExecutionModal()); });
660
- i0.ɵɵelement(10, "i", 69);
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", 122);
663
- i0.ɵɵtemplate(12, ExecutionMonitoringComponent_Conditional_93_Conditional_12_Template, 51, 20, "div", 123)(13, ExecutionMonitoringComponent_Conditional_93_Conditional_13_Template, 4, 0, "div", 124);
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: this.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
- if (state.refreshInterval !== undefined) {
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 (range) {
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
- this.instrumentationService.setDateRange(start, now);
914
+ return { start, end: now };
902
915
  }
903
916
  refreshData() {
904
- this.isLoading = true;
905
- // Force refresh by temporarily setting interval to 0 and back
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
- // Create time window around the clicked point (±30 minutes)
1115
- const startTime = new Date(tab.timestamp.getTime() - 30 * 60 * 1000);
1116
- const endTime = new Date(tab.timestamp.getTime() + 30 * 60 * 1000);
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: await this.getPromptName(run.PromptID),
1143
- model: run.ModelID ? await this.getModelName(run.ModelID) : undefined,
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: await this.getAgentName(run.AgentID),
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: 94, vars: 52, consts: [[1, "execution-monitoring"], [1, "monitoring-header"], [1, "monitoring-title"], [1, "fa-solid", "fa-chart-line"], [1, "monitoring-controls"], [1, "refresh-control"], [3, "ngModelChange", "change", "ngModel"], [3, "value"], [1, "time-range-control"], ["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"], [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)(1, "div", 1)(2, "h2", 2);
1332
- i0.ɵɵelement(3, "i", 3);
1333
- i0.ɵɵtext(4, " AI Execution Monitoring ");
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(5, "div", 4)(6, "div", 5)(7, "label");
1336
- i0.ɵɵtext(8, "Refresh:");
1337
+ i0.ɵɵelementStart(6, "div", 5)(7, "div", 6)(8, "label");
1338
+ i0.ɵɵtext(9, "Time Range:");
1337
1339
  i0.ɵɵelementEnd();
1338
- i0.ɵɵelementStart(9, "select", 6);
1339
- i0.ɵɵtwoWayListener("ngModelChange", function ExecutionMonitoringComponent_Template_select_ngModelChange_9_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.refreshInterval, $event) || (ctx.refreshInterval = $event); return $event; });
1340
- i0.ɵɵlistener("change", function ExecutionMonitoringComponent_Template_select_change_9_listener() { return ctx.onRefreshIntervalChange(); });
1341
- i0.ɵɵelementStart(10, "option", 7);
1342
- i0.ɵɵtext(11, "Manual");
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(12, "option", 7);
1345
- i0.ɵɵtext(13, "10s");
1346
+ i0.ɵɵelementStart(13, "option", 9);
1347
+ i0.ɵɵtext(14, "Last 6 Hours");
1346
1348
  i0.ɵɵelementEnd();
1347
- i0.ɵɵelementStart(14, "option", 7);
1348
- i0.ɵɵtext(15, "30s");
1349
+ i0.ɵɵelementStart(15, "option", 10);
1350
+ i0.ɵɵtext(16, "Last 24 Hours");
1349
1351
  i0.ɵɵelementEnd();
1350
- i0.ɵɵelementStart(16, "option", 7);
1351
- i0.ɵɵtext(17, "1m");
1352
+ i0.ɵɵelementStart(17, "option", 11);
1353
+ i0.ɵɵtext(18, "Last 7 Days");
1352
1354
  i0.ɵɵelementEnd();
1353
- i0.ɵɵelementStart(18, "option", 7);
1354
- i0.ɵɵtext(19, "5m");
1355
+ i0.ɵɵelementStart(19, "option", 12);
1356
+ i0.ɵɵtext(20, "Last 30 Days");
1355
1357
  i0.ɵɵelementEnd()()();
1356
- i0.ɵɵelementStart(20, "div", 8)(21, "label");
1357
- i0.ɵɵtext(22, "Time Range:");
1358
- i0.ɵɵelementEnd();
1359
- i0.ɵɵelementStart(23, "select", 6);
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(37, "div", 16)(38, "div", 17);
1383
- i0.ɵɵrepeaterCreate(39, ExecutionMonitoringComponent_For_40_Template, 1, 3, "app-kpi-card", 18, _forTrack0);
1384
- i0.ɵɵpipe(41, "async");
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(42, "kendo-splitter", 19);
1387
- i0.ɵɵlistener("layoutChange", function ExecutionMonitoringComponent_Template_kendo_splitter_layoutChange_42_listener($event) { return ctx.onSplitterLayoutChange($event); });
1388
- i0.ɵɵelementStart(43, "kendo-splitter-pane", 20)(44, "kendo-splitter", 21);
1389
- i0.ɵɵlistener("layoutChange", function ExecutionMonitoringComponent_Template_kendo_splitter_layoutChange_44_listener($event) { return ctx.onSplitterLayoutChange($event); });
1390
- i0.ɵɵelementStart(45, "kendo-splitter-pane", 22)(46, "div", 23)(47, "div", 24)(48, "div", 25)(49, "h4", 26);
1391
- i0.ɵɵelement(50, "i", 27);
1392
- i0.ɵɵtext(51, " System Health ");
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(52, ExecutionMonitoringComponent_Conditional_52_Template, 41, 6, "div", 28);
1395
- i0.ɵɵpipe(53, "async");
1375
+ i0.ɵɵtemplate(39, ExecutionMonitoringComponent_Conditional_39_Template, 41, 6, "div", 27);
1376
+ i0.ɵɵpipe(40, "async");
1396
1377
  i0.ɵɵelementEnd()()();
1397
- i0.ɵɵelementStart(54, "kendo-splitter-pane", 29)(55, "div", 30)(56, "div", 31)(57, "div", 32);
1398
- i0.ɵɵrepeaterCreate(58, ExecutionMonitoringComponent_For_59_Template, 4, 4, "div", 33, _forTrack1);
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(60, "div", 34);
1401
- i0.ɵɵtemplate(61, ExecutionMonitoringComponent_Conditional_61_Template, 3, 5, "div", 35)(62, ExecutionMonitoringComponent_Conditional_62_Template, 11, 4, "div", 36)(63, ExecutionMonitoringComponent_Conditional_63_Template, 7, 2, "div", 37);
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(64, "kendo-splitter-pane", 29)(65, "kendo-splitter", 21);
1404
- i0.ɵɵlistener("layoutChange", function ExecutionMonitoringComponent_Template_kendo_splitter_layoutChange_65_listener($event) { return ctx.onSplitterLayoutChange($event); });
1405
- i0.ɵɵelementStart(66, "kendo-splitter-pane", 38)(67, "div", 39);
1406
- i0.ɵɵelement(68, "app-performance-heatmap", 40);
1407
- i0.ɵɵpipe(69, "async");
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(70, "kendo-splitter-pane", 29)(71, "div", 41)(72, "div", 42)(73, "div", 43);
1410
- i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Template_div_click_73_listener() { return ctx.togglePanel("cost"); });
1411
- i0.ɵɵelementStart(74, "span", 44);
1412
- i0.ɵɵelement(75, "i", 45);
1413
- i0.ɵɵtext(76, " Cost Analysis ");
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(77, "i", 46);
1396
+ i0.ɵɵelement(64, "i", 45);
1416
1397
  i0.ɵɵelementEnd();
1417
- i0.ɵɵtemplate(78, ExecutionMonitoringComponent_Conditional_78_Template, 3, 3, "div", 47);
1398
+ i0.ɵɵtemplate(65, ExecutionMonitoringComponent_Conditional_65_Template, 3, 3, "div", 46);
1418
1399
  i0.ɵɵelementEnd();
1419
- i0.ɵɵelementStart(79, "div", 42)(80, "div", 43);
1420
- i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Template_div_click_80_listener() { return ctx.togglePanel("efficiency"); });
1421
- i0.ɵɵelementStart(81, "span", 44);
1422
- i0.ɵɵelement(82, "i", 48);
1423
- i0.ɵɵtext(83, " Token Efficiency ");
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(84, "i", 46);
1406
+ i0.ɵɵelement(71, "i", 45);
1426
1407
  i0.ɵɵelementEnd();
1427
- i0.ɵɵtemplate(85, ExecutionMonitoringComponent_Conditional_85_Template, 3, 3, "div", 47);
1408
+ i0.ɵɵtemplate(72, ExecutionMonitoringComponent_Conditional_72_Template, 3, 3, "div", 46);
1428
1409
  i0.ɵɵelementEnd();
1429
- i0.ɵɵelementStart(86, "div", 42)(87, "div", 43);
1430
- i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Template_div_click_87_listener() { return ctx.togglePanel("executions"); });
1431
- i0.ɵɵelementStart(88, "span", 44);
1432
- i0.ɵɵelement(89, "i", 49);
1433
- i0.ɵɵtext(90, " Live Executions ");
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(91, "i", 46);
1416
+ i0.ɵɵelement(78, "i", 45);
1436
1417
  i0.ɵɵelementEnd();
1437
- i0.ɵɵtemplate(92, ExecutionMonitoringComponent_Conditional_92_Template, 3, 4, "div", 50);
1418
+ i0.ɵɵtemplate(79, ExecutionMonitoringComponent_Conditional_79_Template, 3, 4, "div", 49);
1438
1419
  i0.ɵɵelementEnd()()()()()();
1439
- i0.ɵɵtemplate(93, ExecutionMonitoringComponent_Conditional_93_Template, 14, 2, "div", 51);
1420
+ i0.ɵɵtemplate(80, ExecutionMonitoringComponent_Conditional_80_Template, 14, 2, "div", 50);
1440
1421
  i0.ɵɵelementEnd();
1441
1422
  } if (rf & 2) {
1442
- let tmp_15_0;
1443
- let tmp_26_0;
1444
- i0.ɵɵadvance(9);
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.ɵɵproperty("value", 0);
1448
- i0.ɵɵadvance(2);
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(41, 45, ctx.kpiCards$));
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((tmp_15_0 = i0.ɵɵpipeBind1(53, 47, ctx.kpis$)) ? 52 : -1, tmp_15_0);
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" ? 61 : -1);
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" ? 62 : -1);
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" ? 63 : -1);
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", (tmp_26_0 = i0.ɵɵpipeBind1(69, 49, ctx.performanceMatrix$)) !== null && tmp_26_0 !== undefined ? tmp_26_0 : i0.ɵɵpureFunction0(51, _c0))("config", ctx.heatmapConfig);
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 ? 78 : -1);
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 ? 85 : -1);
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 ? 92 : -1);
1472
+ i0.ɵɵconditional(ctx.panelStates.executions ? 79 : -1);
1500
1473
  i0.ɵɵadvance();
1501
- i0.ɵɵconditional(ctx.selectedExecution ? 93 : -1);
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: 1723 }); })();
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