@memberjunction/ng-core-entity-forms 5.22.0 → 5.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts +4 -5
- package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/add-action-dialog.component.js +55 -59
- package/dist/lib/custom/AIAgents/add-action-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js +0 -1
- package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts +4 -5
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +54 -71
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js +1053 -1096
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts +2 -3
- package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-management.service.js +39 -82
- package/dist/lib/custom/AIAgents/ai-agent-management.service.js.map +1 -1
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts +4 -5
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +28 -31
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts +4 -5
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +15 -14
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts +4 -7
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +77 -124
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts +2 -2
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.js +10 -11
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.js.map +1 -1
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts +4 -5
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +18 -18
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts +4 -5
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +59 -80
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +4 -5
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +23 -24
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +862 -906
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +4 -5
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +448 -499
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts +2 -2
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js +6 -11
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js.map +1 -1
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts +4 -5
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +16 -15
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-execution-log-form.component.js +160 -166
- package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.js +93 -94
- package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.js +2 -2
- package/dist/lib/custom/Lists/list-form.component.js +61 -63
- package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-category-dialog.component.js +33 -59
- package/dist/lib/custom/Queries/query-category-dialog.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.js +354 -360
- package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-run-dialog.component.js +62 -71
- package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
- package/dist/lib/custom/Templates/template-param-dialog.component.js +128 -124
- package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
- package/dist/lib/custom/Templates/template-params-grid.component.d.ts +45 -22
- package/dist/lib/custom/Templates/template-params-grid.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/template-params-grid.component.js +380 -384
- package/dist/lib/custom/Templates/template-params-grid.component.js.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.js +34 -36
- package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.js +8 -9
- package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-feedback-form.component.js +4 -4
- package/dist/lib/custom/Tests/test-run-feedback-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.js +7 -7
- package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.js +6 -7
- package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.js +6 -7
- package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +381 -409
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +74 -63
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js +10 -10
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +352 -332
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
- package/dist/lib/custom/custom-forms.module.d.ts +22 -27
- package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
- package/dist/lib/custom/custom-forms.module.js +51 -81
- package/dist/lib/custom/custom-forms.module.js.map +1 -1
- package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts +4 -5
- package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/shared/entity-selector-dialog.component.js +59 -66
- package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +176 -156
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentClientTool/mjaiagentclienttool.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAIAgentClientTool/mjaiagentclienttool.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentClientTool/mjaiagentclienttool.form.component.js +65 -0
- package/dist/lib/generated/Entities/MJAIAgentClientTool/mjaiagentclienttool.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAIClientToolDefinition/mjaiclienttooldefinition.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAIClientToolDefinition/mjaiclienttooldefinition.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAIClientToolDefinition/mjaiclienttooldefinition.form.component.js +89 -0
- package/dist/lib/generated/Entities/MJAIClientToolDefinition/mjaiclienttooldefinition.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js +80 -44
- package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentItemTag/mjcontentitemtag.form.component.js +11 -8
- package/dist/lib/generated/Entities/MJContentItemTag/mjcontentitemtag.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js +39 -24
- package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.js +35 -17
- package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJDuplicateRunDetail/mjduplicaterundetail.form.component.js +15 -13
- package/dist/lib/generated/Entities/MJDuplicateRunDetail/mjduplicaterundetail.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJDuplicateRunDetailMatch/mjduplicaterundetailmatch.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJDuplicateRunDetailMatch/mjduplicaterundetailmatch.form.component.js +7 -9
- package/dist/lib/generated/Entities/MJDuplicateRunDetailMatch/mjduplicaterundetailmatch.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js +21 -9
- package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJVectorIndex/mjvectorindex.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJVectorIndex/mjvectorindex.form.component.js +41 -5
- package/dist/lib/generated/Entities/MJVectorIndex/mjvectorindex.form.component.js.map +1 -1
- package/dist/lib/generated/generated-forms.module.d.ts +280 -279
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
- package/dist/lib/generated/generated-forms.module.js +102 -142
- package/dist/lib/generated/generated-forms.module.js.map +1 -1
- package/dist/lib/shared/components/template-editor.component.js +14 -15
- package/dist/lib/shared/components/template-editor.component.js.map +1 -1
- package/package.json +34 -41
|
@@ -6,8 +6,7 @@ import * as d3 from 'd3';
|
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
import * as i1 from "./ai-agent-run-cost.service";
|
|
8
8
|
import * as i2 from "@angular/common";
|
|
9
|
-
import * as i3 from "@
|
|
10
|
-
import * as i4 from "@progress/kendo-angular-buttons";
|
|
9
|
+
import * as i3 from "@memberjunction/ng-ui-components";
|
|
11
10
|
const _c0 = ["modelDistributionChart"];
|
|
12
11
|
const _c1 = ["executionTimeChart"];
|
|
13
12
|
const _c2 = ["costByVendorChart"];
|
|
@@ -41,211 +40,135 @@ function AIAgentRunAnalyticsComponent_Conditional_2_Template(rf, ctx) { if (rf &
|
|
|
41
40
|
i0.ɵɵadvance(3);
|
|
42
41
|
i0.ɵɵtextInterpolate(ctx_r1.error);
|
|
43
42
|
} }
|
|
44
|
-
function
|
|
45
|
-
i0.ɵɵelement(0, "i",
|
|
43
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_2_Template(rf, ctx) { if (rf & 1) {
|
|
44
|
+
i0.ɵɵelement(0, "i", 63);
|
|
46
45
|
i0.ɵɵtext(1, " Overview ");
|
|
47
46
|
} }
|
|
48
|
-
function
|
|
49
|
-
i0.ɵɵelementStart(0, "span",
|
|
47
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
48
|
+
i0.ɵɵelementStart(0, "span", 27);
|
|
50
49
|
i0.ɵɵtext(1);
|
|
51
50
|
i0.ɵɵelementEnd();
|
|
52
51
|
} if (rf & 2) {
|
|
53
|
-
const ctx_r1 = i0.ɵɵnextContext(
|
|
52
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
54
53
|
i0.ɵɵadvance();
|
|
55
54
|
i0.ɵɵtextInterpolate1("", ctx_r1.promptMetrics.statusBreakdown.failed, " failed");
|
|
56
55
|
} }
|
|
57
|
-
function
|
|
58
|
-
i0.ɵɵelementStart(0, "span",
|
|
56
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_27_Template(rf, ctx) { if (rf & 1) {
|
|
57
|
+
i0.ɵɵelementStart(0, "span", 27);
|
|
59
58
|
i0.ɵɵtext(1);
|
|
60
59
|
i0.ɵɵelementEnd();
|
|
61
|
-
} if (rf & 2) {
|
|
62
|
-
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
63
|
-
i0.ɵɵadvance();
|
|
64
|
-
i0.ɵɵtextInterpolate1("", ctx_r1.actionMetrics.statusBreakdown.failed, " failed");
|
|
65
|
-
} }
|
|
66
|
-
function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_4_Template(rf, ctx) { if (rf & 1) {
|
|
67
|
-
i0.ɵɵelementStart(0, "div", 22)(1, "div", 23)(2, "div", 24);
|
|
68
|
-
i0.ɵɵelement(3, "i", 25);
|
|
69
|
-
i0.ɵɵelementEnd();
|
|
70
|
-
i0.ɵɵelementStart(4, "div", 26)(5, "h3");
|
|
71
|
-
i0.ɵɵtext(6, "Total Prompts");
|
|
72
|
-
i0.ɵɵelementEnd();
|
|
73
|
-
i0.ɵɵelementStart(7, "div", 27);
|
|
74
|
-
i0.ɵɵtext(8);
|
|
75
|
-
i0.ɵɵelementEnd();
|
|
76
|
-
i0.ɵɵelementStart(9, "div", 28)(10, "span", 29);
|
|
77
|
-
i0.ɵɵtext(11);
|
|
78
|
-
i0.ɵɵelementEnd();
|
|
79
|
-
i0.ɵɵconditionalCreate(12, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_4_Conditional_12_Template, 2, 1, "span", 30);
|
|
80
|
-
i0.ɵɵelementEnd()()();
|
|
81
|
-
i0.ɵɵelementStart(13, "div", 23)(14, "div", 31);
|
|
82
|
-
i0.ɵɵelement(15, "i", 32);
|
|
83
|
-
i0.ɵɵelementEnd();
|
|
84
|
-
i0.ɵɵelementStart(16, "div", 26)(17, "h3");
|
|
85
|
-
i0.ɵɵtext(18, "Total Actions");
|
|
86
|
-
i0.ɵɵelementEnd();
|
|
87
|
-
i0.ɵɵelementStart(19, "div", 27);
|
|
88
|
-
i0.ɵɵtext(20);
|
|
89
|
-
i0.ɵɵelementEnd();
|
|
90
|
-
i0.ɵɵelementStart(21, "div", 28)(22, "span", 29);
|
|
91
|
-
i0.ɵɵtext(23);
|
|
92
|
-
i0.ɵɵelementEnd();
|
|
93
|
-
i0.ɵɵconditionalCreate(24, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_4_Conditional_24_Template, 2, 1, "span", 30);
|
|
94
|
-
i0.ɵɵelementEnd()()();
|
|
95
|
-
i0.ɵɵelementStart(25, "div", 23)(26, "div", 33);
|
|
96
|
-
i0.ɵɵelement(27, "i", 34);
|
|
97
|
-
i0.ɵɵelementEnd();
|
|
98
|
-
i0.ɵɵelementStart(28, "div", 26)(29, "h3");
|
|
99
|
-
i0.ɵɵtext(30, "Total Cost");
|
|
100
|
-
i0.ɵɵelementEnd();
|
|
101
|
-
i0.ɵɵelementStart(31, "div", 27);
|
|
102
|
-
i0.ɵɵtext(32);
|
|
103
|
-
i0.ɵɵelementEnd();
|
|
104
|
-
i0.ɵɵelementStart(33, "div", 28)(34, "span");
|
|
105
|
-
i0.ɵɵtext(35);
|
|
106
|
-
i0.ɵɵelementEnd()()()();
|
|
107
|
-
i0.ɵɵelementStart(36, "div", 23)(37, "div", 35);
|
|
108
|
-
i0.ɵɵelement(38, "i", 36);
|
|
109
|
-
i0.ɵɵelementEnd();
|
|
110
|
-
i0.ɵɵelementStart(39, "div", 26)(40, "h3");
|
|
111
|
-
i0.ɵɵtext(41, "Execution Time");
|
|
112
|
-
i0.ɵɵelementEnd();
|
|
113
|
-
i0.ɵɵelementStart(42, "div", 27);
|
|
114
|
-
i0.ɵɵtext(43);
|
|
115
|
-
i0.ɵɵelementEnd();
|
|
116
|
-
i0.ɵɵelementStart(44, "div", 28)(45, "span");
|
|
117
|
-
i0.ɵɵtext(46);
|
|
118
|
-
i0.ɵɵelementEnd()()()()();
|
|
119
60
|
} if (rf & 2) {
|
|
120
61
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
121
|
-
i0.ɵɵadvance(8);
|
|
122
|
-
i0.ɵɵtextInterpolate(ctx_r1.promptMetrics.totalCount);
|
|
123
|
-
i0.ɵɵadvance(3);
|
|
124
|
-
i0.ɵɵtextInterpolate1("", ctx_r1.promptMetrics.statusBreakdown.success, " successful");
|
|
125
|
-
i0.ɵɵadvance();
|
|
126
|
-
i0.ɵɵconditional(ctx_r1.promptMetrics.statusBreakdown.failed > 0 ? 12 : -1);
|
|
127
|
-
i0.ɵɵadvance(8);
|
|
128
|
-
i0.ɵɵtextInterpolate(ctx_r1.actionMetrics.totalCount);
|
|
129
|
-
i0.ɵɵadvance(3);
|
|
130
|
-
i0.ɵɵtextInterpolate1("", ctx_r1.actionMetrics.statusBreakdown.success, " successful");
|
|
131
62
|
i0.ɵɵadvance();
|
|
132
|
-
i0.ɵɵ
|
|
133
|
-
i0.ɵɵadvance(8);
|
|
134
|
-
i0.ɵɵtextInterpolate(ctx_r1.formatCost(ctx_r1.promptMetrics.costBreakdown.totalCost));
|
|
135
|
-
i0.ɵɵadvance(3);
|
|
136
|
-
i0.ɵɵtextInterpolate1("", ctx_r1.promptMetrics.tokenUsage.totalInput + ctx_r1.promptMetrics.tokenUsage.totalOutput, " tokens");
|
|
137
|
-
i0.ɵɵadvance(8);
|
|
138
|
-
i0.ɵɵtextInterpolate(ctx_r1.formatDuration(ctx_r1.promptMetrics.totalExecutionTime + ctx_r1.actionMetrics.totalExecutionTime));
|
|
139
|
-
i0.ɵɵadvance(3);
|
|
140
|
-
i0.ɵɵtextInterpolate1("", ctx_r1.timelineMetrics.totalSteps, " total steps");
|
|
63
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.actionMetrics.statusBreakdown.failed, " failed");
|
|
141
64
|
} }
|
|
142
|
-
function
|
|
143
|
-
i0.ɵɵelement(0, "i",
|
|
65
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_51_Template(rf, ctx) { if (rf & 1) {
|
|
66
|
+
i0.ɵɵelement(0, "i", 22);
|
|
144
67
|
i0.ɵɵtext(1, " Prompt Analytics ");
|
|
145
68
|
} }
|
|
146
|
-
function
|
|
69
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_53_Template(rf, ctx) { if (rf & 1) {
|
|
147
70
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
148
|
-
i0.ɵɵelementStart(0, "div",
|
|
149
|
-
i0.ɵɵlistener("click", function
|
|
150
|
-
i0.ɵɵelement(2, "i",
|
|
71
|
+
i0.ɵɵelementStart(0, "div", 35)(1, "button", 40);
|
|
72
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_53_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleViewMode()); });
|
|
73
|
+
i0.ɵɵelement(2, "i", 41);
|
|
151
74
|
i0.ɵɵtext(3);
|
|
152
75
|
i0.ɵɵelementEnd()();
|
|
153
76
|
} if (rf & 2) {
|
|
154
|
-
const ctx_r1 = i0.ɵɵnextContext(
|
|
77
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
155
78
|
i0.ɵɵadvance(2);
|
|
156
79
|
i0.ɵɵproperty("ngClass", ctx_r1.viewMode === "grid" ? "fa-expand-arrows-alt" : "fa-compress-arrows-alt");
|
|
157
80
|
i0.ɵɵadvance();
|
|
158
81
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.viewMode === "grid" ? "Expand All" : "Collapse All", " ");
|
|
159
82
|
} }
|
|
160
|
-
function
|
|
161
|
-
i0.ɵɵelementStart(0, "div",
|
|
162
|
-
i0.ɵɵelement(1, "i",
|
|
83
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_54_Template(rf, ctx) { if (rf & 1) {
|
|
84
|
+
i0.ɵɵelementStart(0, "div", 36);
|
|
85
|
+
i0.ɵɵelement(1, "i", 64);
|
|
163
86
|
i0.ɵɵelementStart(2, "p");
|
|
164
87
|
i0.ɵɵtext(3, "No prompt executions found in this agent run.");
|
|
165
88
|
i0.ɵɵelementEnd();
|
|
166
|
-
i0.ɵɵelementStart(4, "p",
|
|
89
|
+
i0.ɵɵelementStart(4, "p", 65);
|
|
167
90
|
i0.ɵɵtext(5, "This agent run may have only executed actions without any AI prompts.");
|
|
168
91
|
i0.ɵɵelementEnd()();
|
|
169
92
|
} }
|
|
170
|
-
function
|
|
171
|
-
i0.ɵɵelementStart(0, "div",
|
|
172
|
-
i0.ɵɵelement(1, "span",
|
|
173
|
-
i0.ɵɵelementStart(2, "span",
|
|
93
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_55_Conditional_12_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
94
|
+
i0.ɵɵelementStart(0, "div", 74);
|
|
95
|
+
i0.ɵɵelement(1, "span", 75);
|
|
96
|
+
i0.ɵɵelementStart(2, "span", 76);
|
|
174
97
|
i0.ɵɵtext(3);
|
|
175
98
|
i0.ɵɵelementEnd()();
|
|
176
99
|
} if (rf & 2) {
|
|
177
100
|
const item_r6 = ctx.$implicit;
|
|
178
|
-
const ctx_r1 = i0.ɵɵnextContext(
|
|
101
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
179
102
|
i0.ɵɵadvance();
|
|
180
103
|
i0.ɵɵstyleProp("background-color", ctx_r1.getModelColor(item_r6.key));
|
|
181
104
|
i0.ɵɵadvance(2);
|
|
182
105
|
i0.ɵɵtextInterpolate3("", item_r6.key, ": ", item_r6.value.count, " (", (item_r6.value.count / ctx_r1.promptMetrics.totalCount * 100).toFixed(1), "%)");
|
|
183
106
|
} }
|
|
184
|
-
function
|
|
185
|
-
i0.ɵɵelementStart(0, "div",
|
|
186
|
-
i0.ɵɵrepeaterCreate(1,
|
|
107
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_55_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
108
|
+
i0.ɵɵelementStart(0, "div", 68);
|
|
109
|
+
i0.ɵɵrepeaterCreate(1, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_55_Conditional_12_For_2_Template, 4, 5, "div", 74, i0.ɵɵcomponentInstance().trackByKey, true);
|
|
187
110
|
i0.ɵɵpipe(3, "keyvalue");
|
|
188
111
|
i0.ɵɵelementEnd();
|
|
189
112
|
} if (rf & 2) {
|
|
190
|
-
const ctx_r1 = i0.ɵɵnextContext(
|
|
113
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
191
114
|
i0.ɵɵadvance();
|
|
192
115
|
i0.ɵɵrepeater(i0.ɵɵpipeBind1(3, 0, ctx_r1.promptMetrics.byModel));
|
|
193
116
|
} }
|
|
194
|
-
function
|
|
117
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_55_Template(rf, ctx) { if (rf & 1) {
|
|
195
118
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
196
|
-
i0.ɵɵelementStart(0, "div",
|
|
197
|
-
i0.ɵɵlistener("click", function
|
|
119
|
+
i0.ɵɵelementStart(0, "div", 37)(1, "div", 43)(2, "div", 44);
|
|
120
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_55_Template_div_click_2_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("modelDistribution")); });
|
|
198
121
|
i0.ɵɵelementStart(3, "h3");
|
|
199
|
-
i0.ɵɵelement(4, "i",
|
|
122
|
+
i0.ɵɵelement(4, "i", 66);
|
|
200
123
|
i0.ɵɵtext(5, " Prompts by Model");
|
|
201
124
|
i0.ɵɵelementEnd();
|
|
202
|
-
i0.ɵɵelementStart(6, "button",
|
|
203
|
-
i0.ɵɵelement(7, "i",
|
|
125
|
+
i0.ɵɵelementStart(6, "button", 46);
|
|
126
|
+
i0.ɵɵelement(7, "i", 41);
|
|
204
127
|
i0.ɵɵelementEnd()();
|
|
205
|
-
i0.ɵɵelementStart(8, "div",
|
|
206
|
-
i0.ɵɵelement(10, "div",
|
|
207
|
-
i0.ɵɵconditionalCreate(12,
|
|
128
|
+
i0.ɵɵelementStart(8, "div", 47)(9, "div", 48);
|
|
129
|
+
i0.ɵɵelement(10, "div", 67, 2);
|
|
130
|
+
i0.ɵɵconditionalCreate(12, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_55_Conditional_12_Template, 4, 2, "div", 68);
|
|
208
131
|
i0.ɵɵelementEnd()()();
|
|
209
|
-
i0.ɵɵelementStart(13, "div",
|
|
210
|
-
i0.ɵɵlistener("click", function
|
|
132
|
+
i0.ɵɵelementStart(13, "div", 43)(14, "div", 44);
|
|
133
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_55_Template_div_click_14_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("executionTime")); });
|
|
211
134
|
i0.ɵɵelementStart(15, "h3");
|
|
212
|
-
i0.ɵɵelement(16, "i",
|
|
135
|
+
i0.ɵɵelement(16, "i", 33);
|
|
213
136
|
i0.ɵɵtext(17, " Average Execution Time by Vendor");
|
|
214
137
|
i0.ɵɵelementEnd();
|
|
215
|
-
i0.ɵɵelementStart(18, "button",
|
|
216
|
-
i0.ɵɵelement(19, "i",
|
|
138
|
+
i0.ɵɵelementStart(18, "button", 46);
|
|
139
|
+
i0.ɵɵelement(19, "i", 41);
|
|
217
140
|
i0.ɵɵelementEnd()();
|
|
218
|
-
i0.ɵɵelementStart(20, "div",
|
|
219
|
-
i0.ɵɵelement(22, "div",
|
|
141
|
+
i0.ɵɵelementStart(20, "div", 47)(21, "div", 48);
|
|
142
|
+
i0.ɵɵelement(22, "div", 69, 3);
|
|
220
143
|
i0.ɵɵelementEnd()()();
|
|
221
|
-
i0.ɵɵelementStart(24, "div",
|
|
222
|
-
i0.ɵɵlistener("click", function
|
|
144
|
+
i0.ɵɵelementStart(24, "div", 43)(25, "div", 44);
|
|
145
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_55_Template_div_click_25_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("costByVendor")); });
|
|
223
146
|
i0.ɵɵelementStart(26, "h3");
|
|
224
|
-
i0.ɵɵelement(27, "i",
|
|
147
|
+
i0.ɵɵelement(27, "i", 31);
|
|
225
148
|
i0.ɵɵtext(28, " Cost Distribution by Vendor");
|
|
226
149
|
i0.ɵɵelementEnd();
|
|
227
|
-
i0.ɵɵelementStart(29, "button",
|
|
228
|
-
i0.ɵɵelement(30, "i",
|
|
150
|
+
i0.ɵɵelementStart(29, "button", 46);
|
|
151
|
+
i0.ɵɵelement(30, "i", 41);
|
|
229
152
|
i0.ɵɵelementEnd()();
|
|
230
|
-
i0.ɵɵelementStart(31, "div",
|
|
231
|
-
i0.ɵɵelement(33, "div",
|
|
232
|
-
i0.ɵɵelementStart(35, "div",
|
|
153
|
+
i0.ɵɵelementStart(31, "div", 47)(32, "div", 48);
|
|
154
|
+
i0.ɵɵelement(33, "div", 70, 4);
|
|
155
|
+
i0.ɵɵelementStart(35, "div", 71);
|
|
233
156
|
i0.ɵɵtext(36);
|
|
234
157
|
i0.ɵɵelementEnd()()()();
|
|
235
|
-
i0.ɵɵelementStart(37, "div",
|
|
236
|
-
i0.ɵɵlistener("click", function
|
|
158
|
+
i0.ɵɵelementStart(37, "div", 43)(38, "div", 44);
|
|
159
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_55_Template_div_click_38_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("tokenUsage")); });
|
|
237
160
|
i0.ɵɵelementStart(39, "h3");
|
|
238
|
-
i0.ɵɵelement(40, "i",
|
|
161
|
+
i0.ɵɵelement(40, "i", 72);
|
|
239
162
|
i0.ɵɵtext(41, " Token Usage by Model");
|
|
240
163
|
i0.ɵɵelementEnd();
|
|
241
|
-
i0.ɵɵelementStart(42, "button",
|
|
242
|
-
i0.ɵɵelement(43, "i",
|
|
164
|
+
i0.ɵɵelementStart(42, "button", 46);
|
|
165
|
+
i0.ɵɵelement(43, "i", 41);
|
|
243
166
|
i0.ɵɵelementEnd()();
|
|
244
|
-
i0.ɵɵelementStart(44, "div",
|
|
245
|
-
i0.ɵɵelement(46, "div",
|
|
167
|
+
i0.ɵɵelementStart(44, "div", 47)(45, "div", 48);
|
|
168
|
+
i0.ɵɵelement(46, "div", 73, 5);
|
|
246
169
|
i0.ɵɵelementEnd()()()();
|
|
247
170
|
} if (rf & 2) {
|
|
248
|
-
const ctx_r1 = i0.ɵɵnextContext(
|
|
171
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
249
172
|
i0.ɵɵadvance();
|
|
250
173
|
i0.ɵɵclassProp("expanded", ctx_r1.expandedCharts["modelDistribution"]);
|
|
251
174
|
i0.ɵɵadvance(6);
|
|
@@ -267,58 +190,58 @@ function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_3_
|
|
|
267
190
|
i0.ɵɵadvance(6);
|
|
268
191
|
i0.ɵɵproperty("ngClass", ctx_r1.expandedCharts["tokenUsage"] ? "fa-compress" : "fa-expand");
|
|
269
192
|
} }
|
|
270
|
-
function
|
|
193
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_56_Template(rf, ctx) { if (rf & 1) {
|
|
271
194
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
272
|
-
i0.ɵɵelementStart(0, "div",
|
|
273
|
-
i0.ɵɵlistener("click", function
|
|
195
|
+
i0.ɵɵelementStart(0, "div", 38)(1, "div", 43)(2, "div", 44);
|
|
196
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_56_Template_div_click_2_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("promptTime")); });
|
|
274
197
|
i0.ɵɵelementStart(3, "h3");
|
|
275
|
-
i0.ɵɵelement(4, "i",
|
|
198
|
+
i0.ɵɵelement(4, "i", 77);
|
|
276
199
|
i0.ɵɵtext(5, " Average Execution Time by Prompt");
|
|
277
200
|
i0.ɵɵelementEnd();
|
|
278
|
-
i0.ɵɵelementStart(6, "button",
|
|
279
|
-
i0.ɵɵelement(7, "i",
|
|
201
|
+
i0.ɵɵelementStart(6, "button", 46);
|
|
202
|
+
i0.ɵɵelement(7, "i", 41);
|
|
280
203
|
i0.ɵɵelementEnd()();
|
|
281
|
-
i0.ɵɵelementStart(8, "div",
|
|
282
|
-
i0.ɵɵelement(10, "div",
|
|
204
|
+
i0.ɵɵelementStart(8, "div", 47)(9, "div", 48);
|
|
205
|
+
i0.ɵɵelement(10, "div", 78, 6);
|
|
283
206
|
i0.ɵɵelementEnd()()();
|
|
284
|
-
i0.ɵɵelementStart(12, "div",
|
|
285
|
-
i0.ɵɵlistener("click", function
|
|
207
|
+
i0.ɵɵelementStart(12, "div", 43)(13, "div", 44);
|
|
208
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_56_Template_div_click_13_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("promptToken")); });
|
|
286
209
|
i0.ɵɵelementStart(14, "h3");
|
|
287
|
-
i0.ɵɵelement(15, "i",
|
|
210
|
+
i0.ɵɵelement(15, "i", 79);
|
|
288
211
|
i0.ɵɵtext(16, " Token Usage by Prompt");
|
|
289
212
|
i0.ɵɵelementEnd();
|
|
290
|
-
i0.ɵɵelementStart(17, "button",
|
|
291
|
-
i0.ɵɵelement(18, "i",
|
|
213
|
+
i0.ɵɵelementStart(17, "button", 46);
|
|
214
|
+
i0.ɵɵelement(18, "i", 41);
|
|
292
215
|
i0.ɵɵelementEnd()();
|
|
293
|
-
i0.ɵɵelementStart(19, "div",
|
|
294
|
-
i0.ɵɵelement(21, "div",
|
|
216
|
+
i0.ɵɵelementStart(19, "div", 47)(20, "div", 48);
|
|
217
|
+
i0.ɵɵelement(21, "div", 80, 7);
|
|
295
218
|
i0.ɵɵelementEnd()()();
|
|
296
|
-
i0.ɵɵelementStart(23, "div",
|
|
297
|
-
i0.ɵɵlistener("click", function
|
|
219
|
+
i0.ɵɵelementStart(23, "div", 43)(24, "div", 44);
|
|
220
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_56_Template_div_click_24_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("promptCost")); });
|
|
298
221
|
i0.ɵɵelementStart(25, "h3");
|
|
299
|
-
i0.ɵɵelement(26, "i",
|
|
222
|
+
i0.ɵɵelement(26, "i", 66);
|
|
300
223
|
i0.ɵɵtext(27, " Cost Distribution by Prompt");
|
|
301
224
|
i0.ɵɵelementEnd();
|
|
302
|
-
i0.ɵɵelementStart(28, "button",
|
|
303
|
-
i0.ɵɵelement(29, "i",
|
|
225
|
+
i0.ɵɵelementStart(28, "button", 46);
|
|
226
|
+
i0.ɵɵelement(29, "i", 41);
|
|
304
227
|
i0.ɵɵelementEnd()();
|
|
305
|
-
i0.ɵɵelementStart(30, "div",
|
|
306
|
-
i0.ɵɵelement(32, "div",
|
|
228
|
+
i0.ɵɵelementStart(30, "div", 47)(31, "div", 48);
|
|
229
|
+
i0.ɵɵelement(32, "div", 81, 8);
|
|
307
230
|
i0.ɵɵelementEnd()()();
|
|
308
|
-
i0.ɵɵelementStart(34, "div",
|
|
309
|
-
i0.ɵɵlistener("click", function
|
|
231
|
+
i0.ɵɵelementStart(34, "div", 43)(35, "div", 44);
|
|
232
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_56_Template_div_click_35_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("promptCount")); });
|
|
310
233
|
i0.ɵɵelementStart(36, "h3");
|
|
311
|
-
i0.ɵɵelement(37, "i",
|
|
234
|
+
i0.ɵɵelement(37, "i", 82);
|
|
312
235
|
i0.ɵɵtext(38, " Prompt Execution Count");
|
|
313
236
|
i0.ɵɵelementEnd();
|
|
314
|
-
i0.ɵɵelementStart(39, "button",
|
|
315
|
-
i0.ɵɵelement(40, "i",
|
|
237
|
+
i0.ɵɵelementStart(39, "button", 46);
|
|
238
|
+
i0.ɵɵelement(40, "i", 41);
|
|
316
239
|
i0.ɵɵelementEnd()();
|
|
317
|
-
i0.ɵɵelementStart(41, "div",
|
|
318
|
-
i0.ɵɵelement(43, "div",
|
|
240
|
+
i0.ɵɵelementStart(41, "div", 47)(42, "div", 48);
|
|
241
|
+
i0.ɵɵelement(43, "div", 83, 9);
|
|
319
242
|
i0.ɵɵelementEnd()()()();
|
|
320
243
|
} if (rf & 2) {
|
|
321
|
-
const ctx_r1 = i0.ɵɵnextContext(
|
|
244
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
322
245
|
i0.ɵɵadvance();
|
|
323
246
|
i0.ɵɵclassProp("expanded", ctx_r1.expandedCharts["promptTime"]);
|
|
324
247
|
i0.ɵɵadvance(6);
|
|
@@ -336,7 +259,7 @@ function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_4_
|
|
|
336
259
|
i0.ɵɵadvance(6);
|
|
337
260
|
i0.ɵɵproperty("ngClass", ctx_r1.expandedCharts["promptCount"] ? "fa-compress" : "fa-expand");
|
|
338
261
|
} }
|
|
339
|
-
function
|
|
262
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_61_For_16_Template(rf, ctx) { if (rf & 1) {
|
|
340
263
|
i0.ɵɵelementStart(0, "tr")(1, "td");
|
|
341
264
|
i0.ɵɵtext(2);
|
|
342
265
|
i0.ɵɵelementEnd();
|
|
@@ -349,12 +272,12 @@ function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_9_
|
|
|
349
272
|
i0.ɵɵelementStart(7, "td");
|
|
350
273
|
i0.ɵɵtext(8);
|
|
351
274
|
i0.ɵɵelementEnd();
|
|
352
|
-
i0.ɵɵelementStart(9, "td")(10, "span",
|
|
275
|
+
i0.ɵɵelementStart(9, "td")(10, "span", 84);
|
|
353
276
|
i0.ɵɵtext(11);
|
|
354
277
|
i0.ɵɵelementEnd()()();
|
|
355
278
|
} if (rf & 2) {
|
|
356
279
|
const prompt_r8 = ctx.$implicit;
|
|
357
|
-
const ctx_r1 = i0.ɵɵnextContext(
|
|
280
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
358
281
|
i0.ɵɵadvance(2);
|
|
359
282
|
i0.ɵɵtextInterpolate(prompt_r8.key);
|
|
360
283
|
i0.ɵɵadvance(2);
|
|
@@ -366,8 +289,8 @@ function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_9_
|
|
|
366
289
|
i0.ɵɵadvance(3);
|
|
367
290
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.calculatePromptSuccessRate(prompt_r8.key), "% ");
|
|
368
291
|
} }
|
|
369
|
-
function
|
|
370
|
-
i0.ɵɵelementStart(0, "div",
|
|
292
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_61_Template(rf, ctx) { if (rf & 1) {
|
|
293
|
+
i0.ɵɵelementStart(0, "div", 42)(1, "table")(2, "thead")(3, "tr")(4, "th");
|
|
371
294
|
i0.ɵɵtext(5, "Prompt Name");
|
|
372
295
|
i0.ɵɵelementEnd();
|
|
373
296
|
i0.ɵɵelementStart(6, "th");
|
|
@@ -383,48 +306,19 @@ function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_9_
|
|
|
383
306
|
i0.ɵɵtext(13, "Success Rate");
|
|
384
307
|
i0.ɵɵelementEnd()()();
|
|
385
308
|
i0.ɵɵelementStart(14, "tbody");
|
|
386
|
-
i0.ɵɵrepeaterCreate(15,
|
|
309
|
+
i0.ɵɵrepeaterCreate(15, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_61_For_16_Template, 12, 5, "tr", null, i0.ɵɵcomponentInstance().trackByKey, true);
|
|
387
310
|
i0.ɵɵpipe(17, "keyvalue");
|
|
388
311
|
i0.ɵɵelementEnd()()();
|
|
389
312
|
} if (rf & 2) {
|
|
390
|
-
const ctx_r1 = i0.ɵɵnextContext(
|
|
313
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
391
314
|
i0.ɵɵadvance(15);
|
|
392
315
|
i0.ɵɵrepeater(i0.ɵɵpipeBind1(17, 0, ctx_r1.promptMetrics.byPrompt));
|
|
393
316
|
} }
|
|
394
|
-
function
|
|
395
|
-
|
|
396
|
-
i0.ɵɵelementStart(0, "div", 37);
|
|
397
|
-
i0.ɵɵconditionalCreate(1, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_1_Template, 4, 2, "div", 38);
|
|
398
|
-
i0.ɵɵconditionalCreate(2, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_2_Template, 6, 0, "div", 39);
|
|
399
|
-
i0.ɵɵconditionalCreate(3, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_3_Template, 48, 14, "div", 40);
|
|
400
|
-
i0.ɵɵconditionalCreate(4, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_4_Template, 45, 12, "div", 41);
|
|
401
|
-
i0.ɵɵelementStart(5, "div", 42)(6, "button", 43);
|
|
402
|
-
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.promptDetailsExpanded = !ctx_r1.promptDetailsExpanded); });
|
|
403
|
-
i0.ɵɵelement(7, "i", 44);
|
|
404
|
-
i0.ɵɵtext(8, " Detailed Prompt Metrics ");
|
|
405
|
-
i0.ɵɵelementEnd();
|
|
406
|
-
i0.ɵɵconditionalCreate(9, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_7_Conditional_9_Template, 18, 2, "div", 45);
|
|
407
|
-
i0.ɵɵelementEnd()();
|
|
408
|
-
} if (rf & 2) {
|
|
409
|
-
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
410
|
-
i0.ɵɵadvance();
|
|
411
|
-
i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount > 0 ? 1 : -1);
|
|
412
|
-
i0.ɵɵadvance();
|
|
413
|
-
i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount === 0 ? 2 : -1);
|
|
414
|
-
i0.ɵɵadvance();
|
|
415
|
-
i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount > 0 ? 3 : -1);
|
|
416
|
-
i0.ɵɵadvance();
|
|
417
|
-
i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount > 0 ? 4 : -1);
|
|
418
|
-
i0.ɵɵadvance(3);
|
|
419
|
-
i0.ɵɵproperty("ngClass", ctx_r1.promptDetailsExpanded ? "fa-chevron-up" : "fa-chevron-down");
|
|
420
|
-
i0.ɵɵadvance(2);
|
|
421
|
-
i0.ɵɵconditional(ctx_r1.promptDetailsExpanded ? 9 : -1);
|
|
422
|
-
} }
|
|
423
|
-
function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_9_Template(rf, ctx) { if (rf & 1) {
|
|
424
|
-
i0.ɵɵelement(0, "i", 32);
|
|
317
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_63_Template(rf, ctx) { if (rf & 1) {
|
|
318
|
+
i0.ɵɵelement(0, "i", 29);
|
|
425
319
|
i0.ɵɵtext(1, " Action Analytics ");
|
|
426
320
|
} }
|
|
427
|
-
function
|
|
321
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_92_For_16_Template(rf, ctx) { if (rf & 1) {
|
|
428
322
|
i0.ɵɵelementStart(0, "tr")(1, "td");
|
|
429
323
|
i0.ɵɵtext(2);
|
|
430
324
|
i0.ɵɵelementEnd();
|
|
@@ -434,30 +328,30 @@ function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Conditional_2
|
|
|
434
328
|
i0.ɵɵelementStart(5, "td");
|
|
435
329
|
i0.ɵɵtext(6);
|
|
436
330
|
i0.ɵɵelementEnd();
|
|
437
|
-
i0.ɵɵelementStart(7, "td")(8, "span",
|
|
331
|
+
i0.ɵɵelementStart(7, "td")(8, "span", 84);
|
|
438
332
|
i0.ɵɵtext(9);
|
|
439
333
|
i0.ɵɵelementEnd()();
|
|
440
334
|
i0.ɵɵelementStart(10, "td");
|
|
441
335
|
i0.ɵɵtext(11);
|
|
442
336
|
i0.ɵɵelementEnd()();
|
|
443
337
|
} if (rf & 2) {
|
|
444
|
-
const
|
|
445
|
-
const ctx_r1 = i0.ɵɵnextContext(
|
|
338
|
+
const action_r9 = ctx.$implicit;
|
|
339
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
446
340
|
i0.ɵɵadvance(2);
|
|
447
|
-
i0.ɵɵtextInterpolate(
|
|
341
|
+
i0.ɵɵtextInterpolate(action_r9.key);
|
|
448
342
|
i0.ɵɵadvance(2);
|
|
449
|
-
i0.ɵɵtextInterpolate(
|
|
343
|
+
i0.ɵɵtextInterpolate(action_r9.value.count);
|
|
450
344
|
i0.ɵɵadvance(2);
|
|
451
|
-
i0.ɵɵtextInterpolate(ctx_r1.formatDuration(
|
|
345
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatDuration(action_r9.value.avgTime));
|
|
452
346
|
i0.ɵɵadvance(2);
|
|
453
|
-
i0.ɵɵclassProp("high",
|
|
347
|
+
i0.ɵɵclassProp("high", action_r9.value.successRate > 0.9)("medium", action_r9.value.successRate > 0.7 && action_r9.value.successRate <= 0.9)("low", action_r9.value.successRate <= 0.7);
|
|
454
348
|
i0.ɵɵadvance();
|
|
455
|
-
i0.ɵɵtextInterpolate1(" ", (
|
|
349
|
+
i0.ɵɵtextInterpolate1(" ", (action_r9.value.successRate * 100).toFixed(1), "% ");
|
|
456
350
|
i0.ɵɵadvance(2);
|
|
457
|
-
i0.ɵɵtextInterpolate(ctx_r1.getActionType(
|
|
351
|
+
i0.ɵɵtextInterpolate(ctx_r1.getActionType(action_r9.key));
|
|
458
352
|
} }
|
|
459
|
-
function
|
|
460
|
-
i0.ɵɵelementStart(0, "div",
|
|
353
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_92_Template(rf, ctx) { if (rf & 1) {
|
|
354
|
+
i0.ɵɵelementStart(0, "div", 42)(1, "table")(2, "thead")(3, "tr")(4, "th");
|
|
461
355
|
i0.ɵɵtext(5, "Action Name");
|
|
462
356
|
i0.ɵɵelementEnd();
|
|
463
357
|
i0.ɵɵelementStart(6, "th");
|
|
@@ -473,112 +367,56 @@ function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Conditional_2
|
|
|
473
367
|
i0.ɵɵtext(13, "Type");
|
|
474
368
|
i0.ɵɵelementEnd()()();
|
|
475
369
|
i0.ɵɵelementStart(14, "tbody");
|
|
476
|
-
i0.ɵɵrepeaterCreate(15,
|
|
370
|
+
i0.ɵɵrepeaterCreate(15, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_92_For_16_Template, 12, 11, "tr", null, i0.ɵɵcomponentInstance().trackByKey, true);
|
|
477
371
|
i0.ɵɵpipe(17, "keyvalue");
|
|
478
372
|
i0.ɵɵelementEnd()()();
|
|
479
373
|
} if (rf & 2) {
|
|
480
|
-
const ctx_r1 = i0.ɵɵnextContext(
|
|
374
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
481
375
|
i0.ɵɵadvance(15);
|
|
482
376
|
i0.ɵɵrepeater(i0.ɵɵpipeBind1(17, 0, ctx_r1.actionMetrics.byAction));
|
|
483
377
|
} }
|
|
484
|
-
function
|
|
485
|
-
i0.ɵɵelementStart(0, "div",
|
|
378
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_94_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
379
|
+
i0.ɵɵelementStart(0, "div", 88)(1, "span", 89);
|
|
486
380
|
i0.ɵɵtext(2);
|
|
487
381
|
i0.ɵɵelementEnd();
|
|
488
|
-
i0.ɵɵelementStart(3, "span",
|
|
382
|
+
i0.ɵɵelementStart(3, "span", 90);
|
|
489
383
|
i0.ɵɵtext(4);
|
|
490
384
|
i0.ɵɵelementEnd()();
|
|
491
385
|
} if (rf & 2) {
|
|
492
|
-
const
|
|
386
|
+
const error_r10 = ctx.$implicit;
|
|
493
387
|
i0.ɵɵadvance(2);
|
|
494
|
-
i0.ɵɵtextInterpolate1("",
|
|
388
|
+
i0.ɵɵtextInterpolate1("", error_r10.count, "x");
|
|
495
389
|
i0.ɵɵadvance(2);
|
|
496
|
-
i0.ɵɵtextInterpolate(
|
|
390
|
+
i0.ɵɵtextInterpolate(error_r10.message);
|
|
497
391
|
} }
|
|
498
|
-
function
|
|
499
|
-
i0.ɵɵelementStart(0, "div",
|
|
500
|
-
i0.ɵɵelement(2, "i",
|
|
392
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_94_Template(rf, ctx) { if (rf & 1) {
|
|
393
|
+
i0.ɵɵelementStart(0, "div", 53)(1, "h3");
|
|
394
|
+
i0.ɵɵelement(2, "i", 85);
|
|
501
395
|
i0.ɵɵtext(3, " Common Errors ");
|
|
502
396
|
i0.ɵɵelementEnd();
|
|
503
|
-
i0.ɵɵelementStart(4, "p",
|
|
397
|
+
i0.ɵɵelementStart(4, "p", 86);
|
|
504
398
|
i0.ɵɵtext(5, " This section shows the most frequent error messages from failed actions, helping identify systemic issues that may need attention. ");
|
|
505
399
|
i0.ɵɵelementEnd();
|
|
506
|
-
i0.ɵɵelementStart(6, "div",
|
|
507
|
-
i0.ɵɵrepeaterCreate(7,
|
|
400
|
+
i0.ɵɵelementStart(6, "div", 87);
|
|
401
|
+
i0.ɵɵrepeaterCreate(7, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_94_For_8_Template, 5, 2, "div", 88, i0.ɵɵcomponentInstance().trackByErrorMessage, true);
|
|
508
402
|
i0.ɵɵelementEnd()();
|
|
509
403
|
} if (rf & 2) {
|
|
510
|
-
const ctx_r1 = i0.ɵɵnextContext(
|
|
404
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
511
405
|
i0.ɵɵadvance(7);
|
|
512
406
|
i0.ɵɵrepeater(ctx_r1.getTopErrors());
|
|
513
407
|
} }
|
|
514
|
-
function
|
|
515
|
-
i0.ɵɵelementStart(0, "div",
|
|
516
|
-
i0.ɵɵelement(1, "i",
|
|
408
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_95_Template(rf, ctx) { if (rf & 1) {
|
|
409
|
+
i0.ɵɵelementStart(0, "div", 54);
|
|
410
|
+
i0.ɵɵelement(1, "i", 91);
|
|
517
411
|
i0.ɵɵelementStart(2, "p");
|
|
518
412
|
i0.ɵɵtext(3, "No action errors detected in this run. All actions completed successfully!");
|
|
519
413
|
i0.ɵɵelementEnd()();
|
|
520
414
|
} }
|
|
521
|
-
function
|
|
522
|
-
|
|
523
|
-
i0.ɵɵelementStart(0, "div", 37)(1, "div", 40)(2, "div", 49)(3, "div", 50);
|
|
524
|
-
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Template_div_click_3_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("actionSuccess")); });
|
|
525
|
-
i0.ɵɵelementStart(4, "h3");
|
|
526
|
-
i0.ɵɵelement(5, "i", 73);
|
|
527
|
-
i0.ɵɵtext(6, " Action Success Rate");
|
|
528
|
-
i0.ɵɵelementEnd();
|
|
529
|
-
i0.ɵɵelementStart(7, "button", 52);
|
|
530
|
-
i0.ɵɵelement(8, "i", 44);
|
|
531
|
-
i0.ɵɵelementEnd()();
|
|
532
|
-
i0.ɵɵelementStart(9, "div", 53)(10, "div", 54);
|
|
533
|
-
i0.ɵɵelement(11, "div", 74, 8);
|
|
534
|
-
i0.ɵɵelementEnd()()();
|
|
535
|
-
i0.ɵɵelementStart(13, "div", 49)(14, "div", 50);
|
|
536
|
-
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Template_div_click_14_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("stepType")); });
|
|
537
|
-
i0.ɵɵelementStart(15, "h3");
|
|
538
|
-
i0.ɵɵelement(16, "i", 75);
|
|
539
|
-
i0.ɵɵtext(17, " Step Type Distribution");
|
|
540
|
-
i0.ɵɵelementEnd();
|
|
541
|
-
i0.ɵɵelementStart(18, "button", 52);
|
|
542
|
-
i0.ɵɵelement(19, "i", 44);
|
|
543
|
-
i0.ɵɵelementEnd()();
|
|
544
|
-
i0.ɵɵelementStart(20, "div", 53)(21, "div", 54);
|
|
545
|
-
i0.ɵɵelement(22, "div", 76, 9);
|
|
546
|
-
i0.ɵɵelementEnd()()()();
|
|
547
|
-
i0.ɵɵelementStart(24, "div", 42)(25, "button", 43);
|
|
548
|
-
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Template_button_click_25_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.actionDetailsExpanded = !ctx_r1.actionDetailsExpanded); });
|
|
549
|
-
i0.ɵɵelement(26, "i", 44);
|
|
550
|
-
i0.ɵɵtext(27, " Detailed Action Metrics ");
|
|
551
|
-
i0.ɵɵelementEnd();
|
|
552
|
-
i0.ɵɵconditionalCreate(28, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Conditional_28_Template, 18, 2, "div", 45);
|
|
553
|
-
i0.ɵɵelementEnd();
|
|
554
|
-
i0.ɵɵelementStart(29, "div", 77);
|
|
555
|
-
i0.ɵɵconditionalCreate(30, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Conditional_30_Template, 9, 0, "div", 78);
|
|
556
|
-
i0.ɵɵconditionalCreate(31, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_10_Conditional_31_Template, 4, 0, "div", 79);
|
|
557
|
-
i0.ɵɵelementEnd()();
|
|
558
|
-
} if (rf & 2) {
|
|
559
|
-
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
560
|
-
i0.ɵɵadvance(2);
|
|
561
|
-
i0.ɵɵclassProp("expanded", ctx_r1.expandedCharts["actionSuccess"]);
|
|
562
|
-
i0.ɵɵadvance(6);
|
|
563
|
-
i0.ɵɵproperty("ngClass", ctx_r1.expandedCharts["actionSuccess"] ? "fa-compress" : "fa-expand");
|
|
564
|
-
i0.ɵɵadvance(5);
|
|
565
|
-
i0.ɵɵclassProp("expanded", ctx_r1.expandedCharts["stepType"]);
|
|
566
|
-
i0.ɵɵadvance(6);
|
|
567
|
-
i0.ɵɵproperty("ngClass", ctx_r1.expandedCharts["stepType"] ? "fa-compress" : "fa-expand");
|
|
568
|
-
i0.ɵɵadvance(7);
|
|
569
|
-
i0.ɵɵproperty("ngClass", ctx_r1.actionDetailsExpanded ? "fa-chevron-up" : "fa-chevron-down");
|
|
570
|
-
i0.ɵɵadvance(2);
|
|
571
|
-
i0.ɵɵconditional(ctx_r1.actionDetailsExpanded ? 28 : -1);
|
|
572
|
-
i0.ɵɵadvance(2);
|
|
573
|
-
i0.ɵɵconditional(ctx_r1.actionMetrics.errorAnalysis.size > 0 ? 30 : -1);
|
|
574
|
-
i0.ɵɵadvance();
|
|
575
|
-
i0.ɵɵconditional(ctx_r1.actionMetrics.errorAnalysis.size === 0 ? 31 : -1);
|
|
576
|
-
} }
|
|
577
|
-
function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_12_Template(rf, ctx) { if (rf & 1) {
|
|
578
|
-
i0.ɵɵelement(0, "i", 87);
|
|
415
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_97_Template(rf, ctx) { if (rf & 1) {
|
|
416
|
+
i0.ɵɵelement(0, "i", 92);
|
|
579
417
|
i0.ɵɵtext(1, " Model Performance Comparison ");
|
|
580
418
|
} }
|
|
581
|
-
function
|
|
419
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_For_121_Template(rf, ctx) { if (rf & 1) {
|
|
582
420
|
i0.ɵɵelementStart(0, "tr")(1, "td");
|
|
583
421
|
i0.ɵɵtext(2);
|
|
584
422
|
i0.ɵɵelementEnd();
|
|
@@ -606,160 +444,294 @@ function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_13_For_23_Templa
|
|
|
606
444
|
i0.ɵɵpipe(18, "number");
|
|
607
445
|
i0.ɵɵelementEnd()();
|
|
608
446
|
} if (rf & 2) {
|
|
609
|
-
const
|
|
610
|
-
const ctx_r1 = i0.ɵɵnextContext(
|
|
447
|
+
const model_r11 = ctx.$implicit;
|
|
448
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
611
449
|
i0.ɵɵadvance(2);
|
|
612
|
-
i0.ɵɵtextInterpolate(
|
|
450
|
+
i0.ɵɵtextInterpolate(model_r11.name);
|
|
613
451
|
i0.ɵɵadvance(2);
|
|
614
|
-
i0.ɵɵtextInterpolate(
|
|
452
|
+
i0.ɵɵtextInterpolate(model_r11.vendor);
|
|
615
453
|
i0.ɵɵadvance(2);
|
|
616
|
-
i0.ɵɵtextInterpolate(
|
|
454
|
+
i0.ɵɵtextInterpolate(model_r11.count);
|
|
617
455
|
i0.ɵɵadvance(2);
|
|
618
|
-
i0.ɵɵtextInterpolate(ctx_r1.formatDuration(
|
|
456
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatDuration(model_r11.avgTime));
|
|
619
457
|
i0.ɵɵadvance(2);
|
|
620
|
-
i0.ɵɵtextInterpolate(ctx_r1.formatCost(
|
|
458
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatCost(model_r11.totalCost));
|
|
621
459
|
i0.ɵɵadvance(2);
|
|
622
|
-
i0.ɵɵtextInterpolate(ctx_r1.formatCost(
|
|
460
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatCost(model_r11.avgCost));
|
|
623
461
|
i0.ɵɵadvance(2);
|
|
624
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(15, 8,
|
|
462
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(15, 8, model_r11.inputTokens, "1.0-0"));
|
|
625
463
|
i0.ɵɵadvance(3);
|
|
626
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(18, 11,
|
|
627
|
-
} }
|
|
628
|
-
function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_13_Template(rf, ctx) { if (rf & 1) {
|
|
629
|
-
i0.ɵɵelementStart(0, "div", 37)(1, "div", 88)(2, "table")(3, "thead")(4, "tr")(5, "th");
|
|
630
|
-
i0.ɵɵtext(6, "Model");
|
|
631
|
-
i0.ɵɵelementEnd();
|
|
632
|
-
i0.ɵɵelementStart(7, "th");
|
|
633
|
-
i0.ɵɵtext(8, "Vendor");
|
|
634
|
-
i0.ɵɵelementEnd();
|
|
635
|
-
i0.ɵɵelementStart(9, "th");
|
|
636
|
-
i0.ɵɵtext(10, "Prompts");
|
|
637
|
-
i0.ɵɵelementEnd();
|
|
638
|
-
i0.ɵɵelementStart(11, "th");
|
|
639
|
-
i0.ɵɵtext(12, "Avg Time");
|
|
640
|
-
i0.ɵɵelementEnd();
|
|
641
|
-
i0.ɵɵelementStart(13, "th");
|
|
642
|
-
i0.ɵɵtext(14, "Total Cost");
|
|
643
|
-
i0.ɵɵelementEnd();
|
|
644
|
-
i0.ɵɵelementStart(15, "th");
|
|
645
|
-
i0.ɵɵtext(16, "Avg Cost/Prompt");
|
|
646
|
-
i0.ɵɵelementEnd();
|
|
647
|
-
i0.ɵɵelementStart(17, "th");
|
|
648
|
-
i0.ɵɵtext(18, "Input Tokens");
|
|
649
|
-
i0.ɵɵelementEnd();
|
|
650
|
-
i0.ɵɵelementStart(19, "th");
|
|
651
|
-
i0.ɵɵtext(20, "Output Tokens");
|
|
652
|
-
i0.ɵɵelementEnd()()();
|
|
653
|
-
i0.ɵɵelementStart(21, "tbody");
|
|
654
|
-
i0.ɵɵrepeaterCreate(22, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_13_For_23_Template, 19, 14, "tr", null, i0.ɵɵcomponentInstance().trackByModelName, true);
|
|
655
|
-
i0.ɵɵelementEnd()()()();
|
|
656
|
-
} if (rf & 2) {
|
|
657
|
-
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
658
|
-
i0.ɵɵadvance(22);
|
|
659
|
-
i0.ɵɵrepeater(ctx_r1.getModelPerformanceData());
|
|
464
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(18, 11, model_r11.outputTokens, "1.0-0"));
|
|
660
465
|
} }
|
|
661
|
-
function
|
|
662
|
-
i0.ɵɵelement(0, "i",
|
|
466
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_123_Template(rf, ctx) { if (rf & 1) {
|
|
467
|
+
i0.ɵɵelement(0, "i", 93);
|
|
663
468
|
i0.ɵɵtext(1, " Execution Timeline Analysis ");
|
|
664
469
|
} }
|
|
665
|
-
function
|
|
666
|
-
i0.ɵɵelementStart(0, "div",
|
|
667
|
-
i0.ɵɵelement(1, "i",
|
|
668
|
-
i0.ɵɵelementStart(2, "span",
|
|
470
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_For_151_Template(rf, ctx) { if (rf & 1) {
|
|
471
|
+
i0.ɵɵelementStart(0, "div", 62);
|
|
472
|
+
i0.ɵɵelement(1, "i", 41);
|
|
473
|
+
i0.ɵɵelementStart(2, "span", 94);
|
|
669
474
|
i0.ɵɵtext(3);
|
|
670
475
|
i0.ɵɵelementEnd();
|
|
671
|
-
i0.ɵɵelementStart(4, "span",
|
|
476
|
+
i0.ɵɵelementStart(4, "span", 95);
|
|
672
477
|
i0.ɵɵtext(5);
|
|
673
478
|
i0.ɵɵelementEnd();
|
|
674
|
-
i0.ɵɵelementStart(6, "span",
|
|
479
|
+
i0.ɵɵelementStart(6, "span", 96);
|
|
675
480
|
i0.ɵɵtext(7);
|
|
676
481
|
i0.ɵɵelementEnd()();
|
|
677
482
|
} if (rf & 2) {
|
|
678
|
-
const
|
|
679
|
-
const ctx_r1 = i0.ɵɵnextContext(
|
|
483
|
+
const type_r12 = ctx.$implicit;
|
|
484
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
680
485
|
i0.ɵɵadvance();
|
|
681
|
-
i0.ɵɵproperty("ngClass", ctx_r1.getStepTypeIcon(
|
|
486
|
+
i0.ɵɵproperty("ngClass", ctx_r1.getStepTypeIcon(type_r12.key));
|
|
682
487
|
i0.ɵɵadvance(2);
|
|
683
|
-
i0.ɵɵtextInterpolate(
|
|
488
|
+
i0.ɵɵtextInterpolate(type_r12.key);
|
|
684
489
|
i0.ɵɵadvance(2);
|
|
685
|
-
i0.ɵɵtextInterpolate(
|
|
490
|
+
i0.ɵɵtextInterpolate(type_r12.value);
|
|
686
491
|
i0.ɵɵadvance(2);
|
|
687
|
-
i0.ɵɵtextInterpolate1("(", (
|
|
492
|
+
i0.ɵɵtextInterpolate1("(", (type_r12.value / ctx_r1.timelineMetrics.totalSteps * 100).toFixed(1), "%)");
|
|
688
493
|
} }
|
|
689
|
-
function
|
|
690
|
-
|
|
691
|
-
i0.ɵɵ
|
|
494
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
495
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
496
|
+
i0.ɵɵelementStart(0, "div", 13)(1, "mj-accordion-panel", 17);
|
|
497
|
+
i0.ɵɵtemplate(2, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_2_Template, 2, 0, "ng-template", 18);
|
|
498
|
+
i0.ɵɵelementStart(3, "div", 19)(4, "div", 20)(5, "div", 21);
|
|
499
|
+
i0.ɵɵelement(6, "i", 22);
|
|
692
500
|
i0.ɵɵelementEnd();
|
|
693
|
-
i0.ɵɵelementStart(
|
|
694
|
-
i0.ɵɵtext(
|
|
695
|
-
i0.ɵɵelementEnd()();
|
|
696
|
-
i0.ɵɵelementStart(7, "div", 91)(8, "span", 92);
|
|
697
|
-
i0.ɵɵtext(9, "Parallel Executions");
|
|
501
|
+
i0.ɵɵelementStart(7, "div", 23)(8, "h3");
|
|
502
|
+
i0.ɵɵtext(9, "Total Prompts");
|
|
698
503
|
i0.ɵɵelementEnd();
|
|
699
|
-
i0.ɵɵelementStart(10, "
|
|
504
|
+
i0.ɵɵelementStart(10, "div", 24);
|
|
700
505
|
i0.ɵɵtext(11);
|
|
701
|
-
i0.ɵɵelementEnd()();
|
|
702
|
-
i0.ɵɵelementStart(12, "div", 91)(13, "span", 92);
|
|
703
|
-
i0.ɵɵtext(14, "Max Nesting Depth");
|
|
704
506
|
i0.ɵɵelementEnd();
|
|
705
|
-
i0.ɵɵelementStart(
|
|
706
|
-
i0.ɵɵtext(
|
|
507
|
+
i0.ɵɵelementStart(12, "div", 25)(13, "span", 26);
|
|
508
|
+
i0.ɵɵtext(14);
|
|
509
|
+
i0.ɵɵelementEnd();
|
|
510
|
+
i0.ɵɵconditionalCreate(15, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_15_Template, 2, 1, "span", 27);
|
|
511
|
+
i0.ɵɵelementEnd()()();
|
|
512
|
+
i0.ɵɵelementStart(16, "div", 20)(17, "div", 28);
|
|
513
|
+
i0.ɵɵelement(18, "i", 29);
|
|
514
|
+
i0.ɵɵelementEnd();
|
|
515
|
+
i0.ɵɵelementStart(19, "div", 23)(20, "h3");
|
|
516
|
+
i0.ɵɵtext(21, "Total Actions");
|
|
517
|
+
i0.ɵɵelementEnd();
|
|
518
|
+
i0.ɵɵelementStart(22, "div", 24);
|
|
519
|
+
i0.ɵɵtext(23);
|
|
520
|
+
i0.ɵɵelementEnd();
|
|
521
|
+
i0.ɵɵelementStart(24, "div", 25)(25, "span", 26);
|
|
522
|
+
i0.ɵɵtext(26);
|
|
523
|
+
i0.ɵɵelementEnd();
|
|
524
|
+
i0.ɵɵconditionalCreate(27, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_27_Template, 2, 1, "span", 27);
|
|
525
|
+
i0.ɵɵelementEnd()()();
|
|
526
|
+
i0.ɵɵelementStart(28, "div", 20)(29, "div", 30);
|
|
527
|
+
i0.ɵɵelement(30, "i", 31);
|
|
528
|
+
i0.ɵɵelementEnd();
|
|
529
|
+
i0.ɵɵelementStart(31, "div", 23)(32, "h3");
|
|
530
|
+
i0.ɵɵtext(33, "Total Cost");
|
|
531
|
+
i0.ɵɵelementEnd();
|
|
532
|
+
i0.ɵɵelementStart(34, "div", 24);
|
|
533
|
+
i0.ɵɵtext(35);
|
|
534
|
+
i0.ɵɵelementEnd();
|
|
535
|
+
i0.ɵɵelementStart(36, "div", 25)(37, "span");
|
|
536
|
+
i0.ɵɵtext(38);
|
|
537
|
+
i0.ɵɵelementEnd()()()();
|
|
538
|
+
i0.ɵɵelementStart(39, "div", 20)(40, "div", 32);
|
|
539
|
+
i0.ɵɵelement(41, "i", 33);
|
|
540
|
+
i0.ɵɵelementEnd();
|
|
541
|
+
i0.ɵɵelementStart(42, "div", 23)(43, "h3");
|
|
542
|
+
i0.ɵɵtext(44, "Execution Time");
|
|
543
|
+
i0.ɵɵelementEnd();
|
|
544
|
+
i0.ɵɵelementStart(45, "div", 24);
|
|
545
|
+
i0.ɵɵtext(46);
|
|
546
|
+
i0.ɵɵelementEnd();
|
|
547
|
+
i0.ɵɵelementStart(47, "div", 25)(48, "span");
|
|
548
|
+
i0.ɵɵtext(49);
|
|
549
|
+
i0.ɵɵelementEnd()()()()()();
|
|
550
|
+
i0.ɵɵelementStart(50, "mj-accordion-panel", 17);
|
|
551
|
+
i0.ɵɵtemplate(51, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_51_Template, 2, 0, "ng-template", 18);
|
|
552
|
+
i0.ɵɵelementStart(52, "div", 34);
|
|
553
|
+
i0.ɵɵconditionalCreate(53, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_53_Template, 4, 2, "div", 35);
|
|
554
|
+
i0.ɵɵconditionalCreate(54, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_54_Template, 6, 0, "div", 36);
|
|
555
|
+
i0.ɵɵconditionalCreate(55, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_55_Template, 48, 14, "div", 37);
|
|
556
|
+
i0.ɵɵconditionalCreate(56, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_56_Template, 45, 12, "div", 38);
|
|
557
|
+
i0.ɵɵelementStart(57, "div", 39)(58, "button", 40);
|
|
558
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Template_button_click_58_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.promptDetailsExpanded = !ctx_r1.promptDetailsExpanded); });
|
|
559
|
+
i0.ɵɵelement(59, "i", 41);
|
|
560
|
+
i0.ɵɵtext(60, " Detailed Prompt Metrics ");
|
|
561
|
+
i0.ɵɵelementEnd();
|
|
562
|
+
i0.ɵɵconditionalCreate(61, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_61_Template, 18, 2, "div", 42);
|
|
563
|
+
i0.ɵɵelementEnd()()();
|
|
564
|
+
i0.ɵɵelementStart(62, "mj-accordion-panel", 17);
|
|
565
|
+
i0.ɵɵtemplate(63, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_63_Template, 2, 0, "ng-template", 18);
|
|
566
|
+
i0.ɵɵelementStart(64, "div", 34)(65, "div", 37)(66, "div", 43)(67, "div", 44);
|
|
567
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Template_div_click_67_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("actionSuccess")); });
|
|
568
|
+
i0.ɵɵelementStart(68, "h3");
|
|
569
|
+
i0.ɵɵelement(69, "i", 45);
|
|
570
|
+
i0.ɵɵtext(70, " Action Success Rate");
|
|
571
|
+
i0.ɵɵelementEnd();
|
|
572
|
+
i0.ɵɵelementStart(71, "button", 46);
|
|
573
|
+
i0.ɵɵelement(72, "i", 41);
|
|
574
|
+
i0.ɵɵelementEnd()();
|
|
575
|
+
i0.ɵɵelementStart(73, "div", 47)(74, "div", 48);
|
|
576
|
+
i0.ɵɵelement(75, "div", 49, 0);
|
|
577
|
+
i0.ɵɵelementEnd()()();
|
|
578
|
+
i0.ɵɵelementStart(77, "div", 43)(78, "div", 44);
|
|
579
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Template_div_click_78_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("stepType")); });
|
|
580
|
+
i0.ɵɵelementStart(79, "h3");
|
|
581
|
+
i0.ɵɵelement(80, "i", 50);
|
|
582
|
+
i0.ɵɵtext(81, " Step Type Distribution");
|
|
583
|
+
i0.ɵɵelementEnd();
|
|
584
|
+
i0.ɵɵelementStart(82, "button", 46);
|
|
585
|
+
i0.ɵɵelement(83, "i", 41);
|
|
707
586
|
i0.ɵɵelementEnd()();
|
|
708
|
-
i0.ɵɵelementStart(
|
|
709
|
-
i0.ɵɵ
|
|
587
|
+
i0.ɵɵelementStart(84, "div", 47)(85, "div", 48);
|
|
588
|
+
i0.ɵɵelement(86, "div", 51, 1);
|
|
589
|
+
i0.ɵɵelementEnd()()()();
|
|
590
|
+
i0.ɵɵelementStart(88, "div", 39)(89, "button", 40);
|
|
591
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Template_button_click_89_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.actionDetailsExpanded = !ctx_r1.actionDetailsExpanded); });
|
|
592
|
+
i0.ɵɵelement(90, "i", 41);
|
|
593
|
+
i0.ɵɵtext(91, " Detailed Action Metrics ");
|
|
710
594
|
i0.ɵɵelementEnd();
|
|
711
|
-
i0.ɵɵ
|
|
712
|
-
i0.ɵɵ
|
|
595
|
+
i0.ɵɵconditionalCreate(92, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_92_Template, 18, 2, "div", 42);
|
|
596
|
+
i0.ɵɵelementEnd();
|
|
597
|
+
i0.ɵɵelementStart(93, "div", 52);
|
|
598
|
+
i0.ɵɵconditionalCreate(94, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_94_Template, 9, 0, "div", 53);
|
|
599
|
+
i0.ɵɵconditionalCreate(95, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_95_Template, 4, 0, "div", 54);
|
|
713
600
|
i0.ɵɵelementEnd()()();
|
|
714
|
-
i0.ɵɵelementStart(
|
|
715
|
-
i0.ɵɵ
|
|
601
|
+
i0.ɵɵelementStart(96, "mj-accordion-panel", 17);
|
|
602
|
+
i0.ɵɵtemplate(97, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_97_Template, 2, 0, "ng-template", 18);
|
|
603
|
+
i0.ɵɵelementStart(98, "div", 34)(99, "div", 55)(100, "table")(101, "thead")(102, "tr")(103, "th");
|
|
604
|
+
i0.ɵɵtext(104, "Model");
|
|
605
|
+
i0.ɵɵelementEnd();
|
|
606
|
+
i0.ɵɵelementStart(105, "th");
|
|
607
|
+
i0.ɵɵtext(106, "Vendor");
|
|
608
|
+
i0.ɵɵelementEnd();
|
|
609
|
+
i0.ɵɵelementStart(107, "th");
|
|
610
|
+
i0.ɵɵtext(108, "Prompts");
|
|
716
611
|
i0.ɵɵelementEnd();
|
|
717
|
-
i0.ɵɵelementStart(
|
|
718
|
-
i0.ɵɵ
|
|
719
|
-
i0.ɵɵ
|
|
612
|
+
i0.ɵɵelementStart(109, "th");
|
|
613
|
+
i0.ɵɵtext(110, "Avg Time");
|
|
614
|
+
i0.ɵɵelementEnd();
|
|
615
|
+
i0.ɵɵelementStart(111, "th");
|
|
616
|
+
i0.ɵɵtext(112, "Total Cost");
|
|
617
|
+
i0.ɵɵelementEnd();
|
|
618
|
+
i0.ɵɵelementStart(113, "th");
|
|
619
|
+
i0.ɵɵtext(114, "Avg Cost/Prompt");
|
|
620
|
+
i0.ɵɵelementEnd();
|
|
621
|
+
i0.ɵɵelementStart(115, "th");
|
|
622
|
+
i0.ɵɵtext(116, "Input Tokens");
|
|
623
|
+
i0.ɵɵelementEnd();
|
|
624
|
+
i0.ɵɵelementStart(117, "th");
|
|
625
|
+
i0.ɵɵtext(118, "Output Tokens");
|
|
720
626
|
i0.ɵɵelementEnd()()();
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
i0.ɵɵ
|
|
724
|
-
i0.ɵɵ
|
|
725
|
-
i0.ɵɵ
|
|
726
|
-
i0.ɵɵ
|
|
727
|
-
i0.ɵɵ
|
|
728
|
-
i0.ɵɵtextInterpolate(ctx_r1.timelineMetrics.deepestNesting);
|
|
729
|
-
i0.ɵɵadvance(5);
|
|
730
|
-
i0.ɵɵtextInterpolate(ctx_r1.subAgentRuns.length);
|
|
731
|
-
i0.ɵɵadvance(5);
|
|
732
|
-
i0.ɵɵrepeater(i0.ɵɵpipeBind1(28, 4, ctx_r1.timelineMetrics.stepsByType));
|
|
733
|
-
} }
|
|
734
|
-
function AIAgentRunAnalyticsComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
735
|
-
i0.ɵɵelementStart(0, "div", 13)(1, "kendo-panelbar", 17)(2, "kendo-panelbar-item", 18);
|
|
736
|
-
i0.ɵɵtemplate(3, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_3_Template, 2, 0, "ng-template", 19)(4, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_4_Template, 47, 10, "ng-template", 20);
|
|
627
|
+
i0.ɵɵelementStart(119, "tbody");
|
|
628
|
+
i0.ɵɵrepeaterCreate(120, AIAgentRunAnalyticsComponent_Conditional_3_For_121_Template, 19, 14, "tr", null, i0.ɵɵcomponentInstance().trackByModelName, true);
|
|
629
|
+
i0.ɵɵelementEnd()()()()();
|
|
630
|
+
i0.ɵɵelementStart(122, "mj-accordion-panel", 17);
|
|
631
|
+
i0.ɵɵtemplate(123, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_123_Template, 2, 0, "ng-template", 18);
|
|
632
|
+
i0.ɵɵelementStart(124, "div", 34)(125, "div", 56)(126, "div", 57)(127, "span", 58);
|
|
633
|
+
i0.ɵɵtext(128, "Total Steps");
|
|
737
634
|
i0.ɵɵelementEnd();
|
|
738
|
-
i0.ɵɵelementStart(
|
|
739
|
-
i0.ɵɵ
|
|
635
|
+
i0.ɵɵelementStart(129, "span", 59);
|
|
636
|
+
i0.ɵɵtext(130);
|
|
637
|
+
i0.ɵɵelementEnd()();
|
|
638
|
+
i0.ɵɵelementStart(131, "div", 57)(132, "span", 58);
|
|
639
|
+
i0.ɵɵtext(133, "Parallel Executions");
|
|
740
640
|
i0.ɵɵelementEnd();
|
|
741
|
-
i0.ɵɵelementStart(
|
|
742
|
-
i0.ɵɵ
|
|
641
|
+
i0.ɵɵelementStart(134, "span", 59);
|
|
642
|
+
i0.ɵɵtext(135);
|
|
643
|
+
i0.ɵɵelementEnd()();
|
|
644
|
+
i0.ɵɵelementStart(136, "div", 57)(137, "span", 58);
|
|
645
|
+
i0.ɵɵtext(138, "Max Nesting Depth");
|
|
743
646
|
i0.ɵɵelementEnd();
|
|
744
|
-
i0.ɵɵelementStart(
|
|
745
|
-
i0.ɵɵ
|
|
647
|
+
i0.ɵɵelementStart(139, "span", 59);
|
|
648
|
+
i0.ɵɵtext(140);
|
|
649
|
+
i0.ɵɵelementEnd()();
|
|
650
|
+
i0.ɵɵelementStart(141, "div", 57)(142, "span", 58);
|
|
651
|
+
i0.ɵɵtext(143, "Sub-Agent Runs");
|
|
746
652
|
i0.ɵɵelementEnd();
|
|
747
|
-
i0.ɵɵelementStart(
|
|
748
|
-
i0.ɵɵ
|
|
653
|
+
i0.ɵɵelementStart(144, "span", 59);
|
|
654
|
+
i0.ɵɵtext(145);
|
|
749
655
|
i0.ɵɵelementEnd()()();
|
|
656
|
+
i0.ɵɵelementStart(146, "div", 60)(147, "h3");
|
|
657
|
+
i0.ɵɵtext(148, "Steps by Type");
|
|
658
|
+
i0.ɵɵelementEnd();
|
|
659
|
+
i0.ɵɵelementStart(149, "div", 61);
|
|
660
|
+
i0.ɵɵrepeaterCreate(150, AIAgentRunAnalyticsComponent_Conditional_3_For_151_Template, 8, 4, "div", 62, i0.ɵɵcomponentInstance().trackByKey, true);
|
|
661
|
+
i0.ɵɵpipe(152, "keyvalue");
|
|
662
|
+
i0.ɵɵelementEnd()()()()();
|
|
750
663
|
} if (rf & 2) {
|
|
664
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
665
|
+
i0.ɵɵadvance();
|
|
666
|
+
i0.ɵɵproperty("Expanded", true);
|
|
667
|
+
i0.ɵɵadvance(10);
|
|
668
|
+
i0.ɵɵtextInterpolate(ctx_r1.promptMetrics.totalCount);
|
|
669
|
+
i0.ɵɵadvance(3);
|
|
670
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.promptMetrics.statusBreakdown.success, " successful");
|
|
751
671
|
i0.ɵɵadvance();
|
|
752
|
-
i0.ɵɵ
|
|
672
|
+
i0.ɵɵconditional(ctx_r1.promptMetrics.statusBreakdown.failed > 0 ? 15 : -1);
|
|
673
|
+
i0.ɵɵadvance(8);
|
|
674
|
+
i0.ɵɵtextInterpolate(ctx_r1.actionMetrics.totalCount);
|
|
675
|
+
i0.ɵɵadvance(3);
|
|
676
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.actionMetrics.statusBreakdown.success, " successful");
|
|
753
677
|
i0.ɵɵadvance();
|
|
754
|
-
i0.ɵɵ
|
|
678
|
+
i0.ɵɵconditional(ctx_r1.actionMetrics.statusBreakdown.failed > 0 ? 27 : -1);
|
|
679
|
+
i0.ɵɵadvance(8);
|
|
680
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatCost(ctx_r1.promptMetrics.costBreakdown.totalCost));
|
|
755
681
|
i0.ɵɵadvance(3);
|
|
756
|
-
i0.ɵɵ
|
|
682
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.promptMetrics.tokenUsage.totalInput + ctx_r1.promptMetrics.tokenUsage.totalOutput, " tokens");
|
|
683
|
+
i0.ɵɵadvance(8);
|
|
684
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatDuration(ctx_r1.promptMetrics.totalExecutionTime + ctx_r1.actionMetrics.totalExecutionTime));
|
|
757
685
|
i0.ɵɵadvance(3);
|
|
758
|
-
i0.ɵɵ
|
|
686
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.timelineMetrics.totalSteps, " total steps");
|
|
687
|
+
i0.ɵɵadvance();
|
|
688
|
+
i0.ɵɵproperty("Expanded", true);
|
|
759
689
|
i0.ɵɵadvance(3);
|
|
760
|
-
i0.ɵɵ
|
|
690
|
+
i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount > 0 ? 53 : -1);
|
|
691
|
+
i0.ɵɵadvance();
|
|
692
|
+
i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount === 0 ? 54 : -1);
|
|
693
|
+
i0.ɵɵadvance();
|
|
694
|
+
i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount > 0 ? 55 : -1);
|
|
695
|
+
i0.ɵɵadvance();
|
|
696
|
+
i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount > 0 ? 56 : -1);
|
|
761
697
|
i0.ɵɵadvance(3);
|
|
762
|
-
i0.ɵɵproperty("
|
|
698
|
+
i0.ɵɵproperty("ngClass", ctx_r1.promptDetailsExpanded ? "fa-chevron-up" : "fa-chevron-down");
|
|
699
|
+
i0.ɵɵadvance(2);
|
|
700
|
+
i0.ɵɵconditional(ctx_r1.promptDetailsExpanded ? 61 : -1);
|
|
701
|
+
i0.ɵɵadvance();
|
|
702
|
+
i0.ɵɵproperty("Expanded", true);
|
|
703
|
+
i0.ɵɵadvance(4);
|
|
704
|
+
i0.ɵɵclassProp("expanded", ctx_r1.expandedCharts["actionSuccess"]);
|
|
705
|
+
i0.ɵɵadvance(6);
|
|
706
|
+
i0.ɵɵproperty("ngClass", ctx_r1.expandedCharts["actionSuccess"] ? "fa-compress" : "fa-expand");
|
|
707
|
+
i0.ɵɵadvance(5);
|
|
708
|
+
i0.ɵɵclassProp("expanded", ctx_r1.expandedCharts["stepType"]);
|
|
709
|
+
i0.ɵɵadvance(6);
|
|
710
|
+
i0.ɵɵproperty("ngClass", ctx_r1.expandedCharts["stepType"] ? "fa-compress" : "fa-expand");
|
|
711
|
+
i0.ɵɵadvance(7);
|
|
712
|
+
i0.ɵɵproperty("ngClass", ctx_r1.actionDetailsExpanded ? "fa-chevron-up" : "fa-chevron-down");
|
|
713
|
+
i0.ɵɵadvance(2);
|
|
714
|
+
i0.ɵɵconditional(ctx_r1.actionDetailsExpanded ? 92 : -1);
|
|
715
|
+
i0.ɵɵadvance(2);
|
|
716
|
+
i0.ɵɵconditional(ctx_r1.actionMetrics.errorAnalysis.size > 0 ? 94 : -1);
|
|
717
|
+
i0.ɵɵadvance();
|
|
718
|
+
i0.ɵɵconditional(ctx_r1.actionMetrics.errorAnalysis.size === 0 ? 95 : -1);
|
|
719
|
+
i0.ɵɵadvance();
|
|
720
|
+
i0.ɵɵproperty("Expanded", true);
|
|
721
|
+
i0.ɵɵadvance(24);
|
|
722
|
+
i0.ɵɵrepeater(ctx_r1.getModelPerformanceData());
|
|
723
|
+
i0.ɵɵadvance(2);
|
|
724
|
+
i0.ɵɵproperty("Expanded", true);
|
|
725
|
+
i0.ɵɵadvance(8);
|
|
726
|
+
i0.ɵɵtextInterpolate(ctx_r1.timelineMetrics.totalSteps);
|
|
727
|
+
i0.ɵɵadvance(5);
|
|
728
|
+
i0.ɵɵtextInterpolate(ctx_r1.timelineMetrics.parallelExecutions);
|
|
729
|
+
i0.ɵɵadvance(5);
|
|
730
|
+
i0.ɵɵtextInterpolate(ctx_r1.timelineMetrics.deepestNesting);
|
|
731
|
+
i0.ɵɵadvance(5);
|
|
732
|
+
i0.ɵɵtextInterpolate(ctx_r1.subAgentRuns.length);
|
|
733
|
+
i0.ɵɵadvance(5);
|
|
734
|
+
i0.ɵɵrepeater(i0.ɵɵpipeBind1(152, 35, ctx_r1.timelineMetrics.stepsByType));
|
|
763
735
|
} }
|
|
764
736
|
export class AIAgentRunAnalyticsComponent {
|
|
765
737
|
/** Helper method to create tracked setTimeout calls */
|
|
@@ -2156,11 +2128,11 @@ export class AIAgentRunAnalyticsComponent {
|
|
|
2156
2128
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.promptTokenDistributionChart = _t.first);
|
|
2157
2129
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.promptCostDistributionChart = _t.first);
|
|
2158
2130
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.promptCountByNameChart = _t.first);
|
|
2159
|
-
} }, inputs: { agentRunId: "agentRunId" }, standalone: false, decls: 4, vars: 3, consts: [["
|
|
2131
|
+
} }, inputs: { agentRunId: "agentRunId" }, standalone: false, decls: 4, vars: 3, consts: [["actionSuccessRateChart", ""], ["stepTypeChart", ""], ["modelDistributionChart", ""], ["executionTimeChart", ""], ["costByVendorChart", ""], ["tokenUsageChart", ""], ["promptTimeDistributionChart", ""], ["promptTokenDistributionChart", ""], ["promptCostDistributionChart", ""], ["promptCountByNameChart", ""], [1, "analytics-container"], [1, "loading-state"], [1, "error-state"], [1, "analytics-content"], [1, "fas", "fa-spinner", "fa-spin", "fa-2x"], [1, "fas", "fa-exclamation-triangle", "fa-2x"], ["mjButton", "", 3, "click"], [3, "Expanded"], ["mjAccordionTitle", ""], [1, "summary-cards"], [1, "summary-card"], [1, "card-icon", "prompts"], [1, "fas", "fa-microchip"], [1, "card-content"], [1, "metric-value"], [1, "metric-detail"], [1, "success"], [1, "failed"], [1, "card-icon", "actions"], [1, "fas", "fa-cog"], [1, "card-icon", "cost"], [1, "fas", "fa-dollar-sign"], [1, "card-icon", "time"], [1, "fas", "fa-clock"], [1, "analytics-panel"], [1, "view-mode-toggle"], [1, "no-data-message"], [1, "charts-grid"], [1, "charts-grid", 2, "margin-top", "20px"], [1, "detailed-metrics"], ["mjButton", "", "variant", "flat", 3, "click"], [1, "fas", 3, "ngClass"], [1, "metrics-table"], [1, "chart-card"], [1, "chart-card-header", 3, "click"], [1, "fas", "fa-chart-bar"], [1, "expand-btn"], [1, "chart-card-body"], [1, "chart-container"], ["id", "actionSuccessRateChart"], [1, "fas", "fa-layer-group"], ["id", "stepTypeChart"], [1, "error-analysis-section"], [1, "error-analysis"], [1, "no-errors"], [1, "model-comparison"], [1, "timeline-stats"], [1, "stat-item"], [1, "stat-label"], [1, "stat-value"], [1, "step-breakdown"], [1, "step-type-list"], [1, "step-type-item"], [1, "fas", "fa-tachometer-alt"], [1, "fas", "fa-info-circle"], [1, "small"], [1, "fas", "fa-chart-pie"], ["id", "modelDistributionChart"], [1, "chart-legend"], ["id", "executionTimeChart"], ["id", "costByVendorChart"], [1, "chart-total"], [1, "fas", "fa-coins"], ["id", "tokenUsageChart"], [1, "legend-item"], [1, "legend-color"], [1, "legend-label"], [1, "fas", "fa-hourglass-half"], ["id", "promptTimeDistributionChart"], [1, "fas", "fa-database"], ["id", "promptTokenDistributionChart"], ["id", "promptCostDistributionChart"], [1, "fas", "fa-list-ol"], ["id", "promptCountByNameChart"], [1, "success-rate"], [1, "fas", "fa-exclamation-triangle"], [1, "error-analysis-description"], [1, "error-list"], [1, "error-item"], [1, "error-count"], [1, "error-message"], [1, "fas", "fa-check-circle"], [1, "fas", "fa-chart-line"], [1, "fas", "fa-stream"], [1, "type-name"], [1, "type-count"], [1, "type-percentage"]], template: function AIAgentRunAnalyticsComponent_Template(rf, ctx) { if (rf & 1) {
|
|
2160
2132
|
i0.ɵɵelementStart(0, "div", 10);
|
|
2161
2133
|
i0.ɵɵconditionalCreate(1, AIAgentRunAnalyticsComponent_Conditional_1_Template, 4, 0, "div", 11);
|
|
2162
2134
|
i0.ɵɵconditionalCreate(2, AIAgentRunAnalyticsComponent_Conditional_2_Template, 6, 1, "div", 12);
|
|
2163
|
-
i0.ɵɵconditionalCreate(3, AIAgentRunAnalyticsComponent_Conditional_3_Template,
|
|
2135
|
+
i0.ɵɵconditionalCreate(3, AIAgentRunAnalyticsComponent_Conditional_3_Template, 153, 37, "div", 13);
|
|
2164
2136
|
i0.ɵɵelementEnd();
|
|
2165
2137
|
} if (rf & 2) {
|
|
2166
2138
|
i0.ɵɵadvance();
|
|
@@ -2169,11 +2141,11 @@ export class AIAgentRunAnalyticsComponent {
|
|
|
2169
2141
|
i0.ɵɵconditional(ctx.error && !ctx.isLoading ? 2 : -1);
|
|
2170
2142
|
i0.ɵɵadvance();
|
|
2171
2143
|
i0.ɵɵconditional(!ctx.isLoading && !ctx.error ? 3 : -1);
|
|
2172
|
-
} }, dependencies: [i2.NgClass, i3.PanelBarComponent, i3.PanelBarItemComponent, i3.PanelBarContentDirective, i3.PanelBarItemTitleDirective, i4.ButtonComponent, i2.DecimalPipe, i2.KeyValuePipe], styles: [".analytics-container[_ngcontent-%COMP%] {\n padding: 20px;\n height: 100%;\n overflow-y: auto;\n background-color: var(--mj-bg-surface-sunken);\n}\n\n\n\n.loading-state[_ngcontent-%COMP%], \n.error-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-muted);\n}\n\n.loading-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.error-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-bottom: 15px;\n}\n\n.error-state[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n.summary-cards[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.summary-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 20px;\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n align-items: center;\n transition: transform 0.2s, box-shadow 0.2s;\n}\n\n.summary-card[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n}\n\n.card-icon[_ngcontent-%COMP%] {\n width: 60px;\n height: 60px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 20px;\n font-size: 24px;\n color: var(--mj-text-inverse);\n}\n\n.card-icon.prompts[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\n\n.card-icon.actions[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n}\n\n.card-icon.cost[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n}\n\n.card-icon.time[_ngcontent-%COMP%] {\n background: var(--mj-status-warning);\n}\n\n.card-content[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value[_ngcontent-%COMP%] {\n font-size: 28px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.metric-detail[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.metric-detail[_ngcontent-%COMP%] .success[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n margin-right: 10px;\n}\n\n.metric-detail[_ngcontent-%COMP%] .failed[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n.analytics-panel[_ngcontent-%COMP%] {\n padding: 15px;\n}\n\n\n\n .analytics-content .k-panelbar {\n border: none;\n background: transparent;\n}\n\n .analytics-content .k-panelbar > .k-panelbar-item {\n border: none;\n border-radius: 12px;\n margin-bottom: 12px;\n box-shadow: 0 2px 8px rgba(0,0,0,0.06);\n background: var(--mj-bg-surface-card);\n overflow: hidden;\n}\n\n .analytics-content .k-panelbar > .k-panelbar-item > .k-header {\n background: var(--mj-bg-surface-card);\n border: none;\n padding: 16px 20px;\n border-radius: 12px 12px 0 0;\n color: var(--mj-text-primary);\n font-weight: 600;\n font-size: 16px;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n .analytics-content .k-panelbar > .k-panelbar-item > .k-header:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n .analytics-content .k-panelbar > .k-panelbar-item.k-panelbar-expanded > .k-header {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 12px 12px 0 0;\n}\n\n .analytics-content .k-panelbar > .k-panelbar-item > .k-header .k-panelbar-toggle {\n position: absolute;\n right: 24px;\n color: inherit;\n font-size: 14px;\n transition: transform 0.2s ease;\n}\n\n .analytics-content .k-panelbar > .k-panelbar-item.k-panelbar-expanded > .k-header .k-panelbar-toggle {\n transform: rotate(180deg);\n}\n\n .analytics-content .k-panelbar > .k-panelbar-item > .k-header .k-panelbar-toggle::before {\n content: '\\f107';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n}\n\n .analytics-content .k-panelbar > .k-panelbar-item > .k-content {\n padding: 0;\n border: none;\n background: var(--mj-bg-surface-sunken);\n border-radius: 0 0 12px 12px;\n}\n\n .analytics-content .k-panelbar .k-header .k-panelbar-icon {\n font-size: 18px;\n color: var(--mj-brand-primary);\n margin-right: 8px;\n}\n\n .analytics-content .k-panelbar .k-panelbar-expanded .k-header .k-panelbar-icon {\n color: var(--mj-text-inverse);\n}\n\n\n\n.charts-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));\n gap: 20px;\n margin-bottom: 20px;\n}\n\n\n\n.chart-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n transition: all 0.3s ease;\n}\n\n.chart-card.expanded[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.chart-card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background-color: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n}\n\n.chart-card-header[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.chart-card-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.chart-card-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n color: var(--mj-text-muted);\n}\n\n.expand-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n padding: 4px 8px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: color 0.2s;\n}\n\n.expand-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n}\n\n.chart-card-body[_ngcontent-%COMP%] {\n padding: 16px;\n background: var(--mj-bg-surface-card);\n}\n\n.chart-card.expanded[_ngcontent-%COMP%] .chart-card-body[_ngcontent-%COMP%] {\n padding: 24px;\n}\n\n.chart-card.expanded[_ngcontent-%COMP%] .chart-container[_ngcontent-%COMP%] > div[_ngcontent-%COMP%] {\n min-height: 400px;\n}\n\n\n\n.view-mode-toggle[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n margin-bottom: 16px;\n}\n\n.view-mode-toggle[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.chart-container[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.chart-container[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 10px 0;\n font-size: 15px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.chart-container[_ngcontent-%COMP%] > div[_ngcontent-%COMP%] {\n min-height: 220px;\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n\n\n.chart-container[_ngcontent-%COMP%] svg[_ngcontent-%COMP%] {\n display: block;\n margin: 0 auto;\n}\n\n.chart-legend[_ngcontent-%COMP%] {\n margin-top: 10px;\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n font-size: 12px;\n}\n\n.legend-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n}\n\n.legend-color[_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n border-radius: 3px;\n}\n\n.chart-total[_ngcontent-%COMP%] {\n text-align: center;\n margin-top: 10px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n\n\n.detailed-metrics[_ngcontent-%COMP%] {\n margin-top: 20px;\n border-top: 1px solid var(--mj-border-default);\n padding-top: 20px;\n}\n\n.detailed-metrics[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n margin-bottom: 15px;\n}\n\n.detailed-metrics[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 8px;\n}\n\n.metrics-table[_ngcontent-%COMP%] {\n overflow-x: auto;\n}\n\n.metrics-table[_ngcontent-%COMP%] table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.metrics-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface-sunken);\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 2px solid var(--mj-border-strong);\n}\n\n.metrics-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.metrics-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.success-rate[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.success-rate.high[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.success-rate.medium[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n.success-rate.low[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n.error-analysis[_ngcontent-%COMP%] {\n margin-top: 30px;\n padding: 20px;\n background-color: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n}\n\n.error-analysis[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 15px 0;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.error-analysis-description[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin-bottom: 20px;\n line-height: 1.5;\n}\n\n.error-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.error-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 10px;\n background-color: var(--mj-bg-surface);\n border-radius: 4px;\n font-size: 14px;\n}\n\n.error-count[_ngcontent-%COMP%] {\n background-color: var(--mj-status-error);\n color: var(--mj-text-inverse);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n}\n\n.error-message[_ngcontent-%COMP%] {\n flex: 1;\n color: var(--mj-text-secondary);\n}\n\n\n\n.no-errors[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px;\n background-color: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 30%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.no-errors[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-status-success);\n}\n\n.no-errors[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n}\n\n\n\n.no-data-message[_ngcontent-%COMP%] {\n text-align: center;\n padding: 60px 20px;\n color: var(--mj-text-muted);\n}\n\n.no-data-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n margin-bottom: 20px;\n color: var(--mj-border-strong);\n}\n\n.no-data-message[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 10px 0;\n font-size: 16px;\n}\n\n.no-data-message[_ngcontent-%COMP%] p.small[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-disabled);\n}\n\n\n\n.model-comparison[_ngcontent-%COMP%] {\n overflow-x: auto;\n}\n\n.model-comparison[_ngcontent-%COMP%] table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.model-comparison[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface-sunken);\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 2px solid var(--mj-border-strong);\n white-space: nowrap;\n}\n\n.model-comparison[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.model-comparison[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n\n\n.timeline-stats[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.stat-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n}\n\n.stat-label[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n}\n\n.stat-value[_ngcontent-%COMP%] {\n font-size: 32px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.step-breakdown[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 15px 0;\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.step-type-list[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));\n gap: 12px;\n}\n\n.step-type-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n}\n\n.step-type-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 30px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.type-name[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n}\n\n.type-count[_ngcontent-%COMP%] {\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.type-percentage[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-left: 5px;\n}\n\n\n\n@media (max-width: 768px) {\n .summary-cards[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n \n .charts-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n \n .timeline-stats[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}"], changeDetection: 0 }); }
|
|
2144
|
+
} }, dependencies: [i2.NgClass, i3.MJButtonDirective, i3.MJAccordionPanelComponent, i3.MJAccordionTitleDirective, i2.DecimalPipe, i2.KeyValuePipe], styles: [".analytics-container[_ngcontent-%COMP%] {\n padding: 20px;\n height: 100%;\n overflow-y: auto;\n background-color: var(--mj-bg-surface-sunken);\n}\n\n\n\n.loading-state[_ngcontent-%COMP%], \n.error-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-muted);\n}\n\n.loading-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.error-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-bottom: 15px;\n}\n\n.error-state[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n.summary-cards[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.summary-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 20px;\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n align-items: center;\n transition: transform 0.2s, box-shadow 0.2s;\n}\n\n.summary-card[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n}\n\n.card-icon[_ngcontent-%COMP%] {\n width: 60px;\n height: 60px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 20px;\n font-size: 24px;\n color: var(--mj-text-inverse);\n}\n\n.card-icon.prompts[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\n\n.card-icon.actions[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n}\n\n.card-icon.cost[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n}\n\n.card-icon.time[_ngcontent-%COMP%] {\n background: var(--mj-status-warning);\n}\n\n.card-content[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value[_ngcontent-%COMP%] {\n font-size: 28px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.metric-detail[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.metric-detail[_ngcontent-%COMP%] .success[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n margin-right: 10px;\n}\n\n.metric-detail[_ngcontent-%COMP%] .failed[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n.analytics-panel[_ngcontent-%COMP%] {\n padding: 15px;\n}\n\n\n\n.analytics-content[_ngcontent-%COMP%] mj-accordion-panel[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 12px;\n}\n\n\n\n.charts-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));\n gap: 20px;\n margin-bottom: 20px;\n}\n\n\n\n.chart-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n transition: all 0.3s ease;\n}\n\n.chart-card.expanded[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.chart-card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background-color: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n}\n\n.chart-card-header[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.chart-card-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.chart-card-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n color: var(--mj-text-muted);\n}\n\n.expand-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n padding: 4px 8px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: color 0.2s;\n}\n\n.expand-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n}\n\n.chart-card-body[_ngcontent-%COMP%] {\n padding: 16px;\n background: var(--mj-bg-surface-card);\n}\n\n.chart-card.expanded[_ngcontent-%COMP%] .chart-card-body[_ngcontent-%COMP%] {\n padding: 24px;\n}\n\n.chart-card.expanded[_ngcontent-%COMP%] .chart-container[_ngcontent-%COMP%] > div[_ngcontent-%COMP%] {\n min-height: 400px;\n}\n\n\n\n.view-mode-toggle[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n margin-bottom: 16px;\n}\n\n.view-mode-toggle[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.chart-container[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.chart-container[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 10px 0;\n font-size: 15px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.chart-container[_ngcontent-%COMP%] > div[_ngcontent-%COMP%] {\n min-height: 220px;\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n\n\n.chart-container[_ngcontent-%COMP%] svg[_ngcontent-%COMP%] {\n display: block;\n margin: 0 auto;\n}\n\n.chart-legend[_ngcontent-%COMP%] {\n margin-top: 10px;\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n font-size: 12px;\n}\n\n.legend-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n}\n\n.legend-color[_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n border-radius: 3px;\n}\n\n.chart-total[_ngcontent-%COMP%] {\n text-align: center;\n margin-top: 10px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n\n\n.detailed-metrics[_ngcontent-%COMP%] {\n margin-top: 20px;\n border-top: 1px solid var(--mj-border-default);\n padding-top: 20px;\n}\n\n.detailed-metrics[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n margin-bottom: 15px;\n}\n\n.detailed-metrics[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 8px;\n}\n\n.metrics-table[_ngcontent-%COMP%] {\n overflow-x: auto;\n}\n\n.metrics-table[_ngcontent-%COMP%] table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.metrics-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface-sunken);\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 2px solid var(--mj-border-strong);\n}\n\n.metrics-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.metrics-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.success-rate[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.success-rate.high[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.success-rate.medium[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n.success-rate.low[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n.error-analysis[_ngcontent-%COMP%] {\n margin-top: 30px;\n padding: 20px;\n background-color: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n}\n\n.error-analysis[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 15px 0;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.error-analysis-description[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin-bottom: 20px;\n line-height: 1.5;\n}\n\n.error-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.error-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 10px;\n background-color: var(--mj-bg-surface);\n border-radius: 4px;\n font-size: 14px;\n}\n\n.error-count[_ngcontent-%COMP%] {\n background-color: var(--mj-status-error);\n color: var(--mj-text-inverse);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n}\n\n.error-message[_ngcontent-%COMP%] {\n flex: 1;\n color: var(--mj-text-secondary);\n}\n\n\n\n.no-errors[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px;\n background-color: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 30%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.no-errors[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-status-success);\n}\n\n.no-errors[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n}\n\n\n\n.no-data-message[_ngcontent-%COMP%] {\n text-align: center;\n padding: 60px 20px;\n color: var(--mj-text-muted);\n}\n\n.no-data-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n margin-bottom: 20px;\n color: var(--mj-border-strong);\n}\n\n.no-data-message[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 10px 0;\n font-size: 16px;\n}\n\n.no-data-message[_ngcontent-%COMP%] p.small[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-disabled);\n}\n\n\n\n.model-comparison[_ngcontent-%COMP%] {\n overflow-x: auto;\n}\n\n.model-comparison[_ngcontent-%COMP%] table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.model-comparison[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface-sunken);\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 2px solid var(--mj-border-strong);\n white-space: nowrap;\n}\n\n.model-comparison[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.model-comparison[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n\n\n.timeline-stats[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.stat-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n}\n\n.stat-label[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n}\n\n.stat-value[_ngcontent-%COMP%] {\n font-size: 32px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.step-breakdown[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 15px 0;\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.step-type-list[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));\n gap: 12px;\n}\n\n.step-type-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n}\n\n.step-type-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 30px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.type-name[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n}\n\n.type-count[_ngcontent-%COMP%] {\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.type-percentage[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-left: 5px;\n}\n\n\n\n@media (max-width: 768px) {\n .summary-cards[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n \n .charts-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n \n .timeline-stats[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}"], changeDetection: 0 }); }
|
|
2173
2145
|
}
|
|
2174
2146
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AIAgentRunAnalyticsComponent, [{
|
|
2175
2147
|
type: Component,
|
|
2176
|
-
args: [{ standalone: false, selector: 'mj-ai-agent-run-analytics', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"analytics-container\">\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-state\">\n <i class=\"fas fa-spinner fa-spin fa-2x\"></i>\n <p>Loading analytics data...</p>\n </div>\n }\n\n <!-- Error State -->\n @if (error && !isLoading) {\n <div class=\"error-state\">\n <i class=\"fas fa-exclamation-triangle fa-2x\"></i>\n <p>{{ error }}</p>\n <button kendoButton (click)=\"loadData()\">Retry</button>\n </div>\n }\n\n <!-- Analytics Content -->\n @if (!isLoading && !error) {\n <div class=\"analytics-content\">\n <kendo-panelbar [keepItemContent]=\"true\">\n <!-- Summary Cards -->\n <kendo-panelbar-item [expanded]=\"true\">\n <ng-template kendoPanelBarItemTitle>\n <i class=\"fas fa-tachometer-alt\"></i> Overview\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"summary-cards\">\n <div class=\"summary-card\">\n <div class=\"card-icon prompts\">\n <i class=\"fas fa-microchip\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Total Prompts</h3>\n <div class=\"metric-value\">{{ promptMetrics.totalCount }}</div>\n <div class=\"metric-detail\">\n <span class=\"success\">{{ promptMetrics.statusBreakdown.success }} successful</span>\n @if (promptMetrics.statusBreakdown.failed > 0) {\n <span class=\"failed\">{{ promptMetrics.statusBreakdown.failed }} failed</span>\n }\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon actions\">\n <i class=\"fas fa-cog\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Total Actions</h3>\n <div class=\"metric-value\">{{ actionMetrics.totalCount }}</div>\n <div class=\"metric-detail\">\n <span class=\"success\">{{ actionMetrics.statusBreakdown.success }} successful</span>\n @if (actionMetrics.statusBreakdown.failed > 0) {\n <span class=\"failed\">{{ actionMetrics.statusBreakdown.failed }} failed</span>\n }\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon cost\">\n <i class=\"fas fa-dollar-sign\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Total Cost</h3>\n <div class=\"metric-value\">{{ formatCost(promptMetrics.costBreakdown.totalCost) }}</div>\n <div class=\"metric-detail\">\n <span>{{ promptMetrics.tokenUsage.totalInput + promptMetrics.tokenUsage.totalOutput }} tokens</span>\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon time\">\n <i class=\"fas fa-clock\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Execution Time</h3>\n <div class=\"metric-value\">{{ formatDuration(promptMetrics.totalExecutionTime + actionMetrics.totalExecutionTime) }}</div>\n <div class=\"metric-detail\">\n <span>{{ timelineMetrics.totalSteps }} total steps</span>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n <!-- Prompt Analytics -->\n <kendo-panelbar-item [expanded]=\"true\">\n <ng-template kendoPanelBarItemTitle>\n <i class=\"fas fa-microchip\"></i> Prompt Analytics\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"analytics-panel\">\n <!-- View Mode Toggle -->\n @if (promptMetrics.totalCount > 0) {\n <div class=\"view-mode-toggle\">\n <button kendoButton\n fillMode=\"flat\"\n size=\"small\"\n (click)=\"toggleViewMode()\">\n <i class=\"fas\" [ngClass]=\"viewMode === 'grid' ? 'fa-expand-arrows-alt' : 'fa-compress-arrows-alt'\"></i>\n {{ viewMode === 'grid' ? 'Expand All' : 'Collapse All' }}\n </button>\n </div>\n }\n <!-- No prompts message -->\n @if (promptMetrics.totalCount === 0) {\n <div class=\"no-data-message\">\n <i class=\"fas fa-info-circle\"></i>\n <p>No prompt executions found in this agent run.</p>\n <p class=\"small\">This agent run may have only executed actions without any AI prompts.</p>\n </div>\n }\n @if (promptMetrics.totalCount > 0) {\n <div class=\"charts-grid\">\n <!-- Model Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['modelDistribution']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('modelDistribution')\">\n <h3><i class=\"fas fa-chart-pie\"></i> Prompts by Model</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['modelDistribution'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"modelDistributionChart\" #modelDistributionChart></div>\n @if (promptMetrics.byModel.size > 0) {\n <div class=\"chart-legend\">\n @for (item of promptMetrics.byModel | keyvalue; track trackByKey($index, item)) {\n <div class=\"legend-item\">\n <span class=\"legend-color\" [style.backgroundColor]=\"getModelColor(item.key)\"></span>\n <span class=\"legend-label\">{{ item.key }}: {{ item.value.count }} ({{ (item.value.count / promptMetrics.totalCount * 100).toFixed(1) }}%)</span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <!-- Execution Time by Vendor -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['executionTime']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('executionTime')\">\n <h3><i class=\"fas fa-clock\"></i> Average Execution Time by Vendor</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['executionTime'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"executionTimeChart\" #executionTimeChart></div>\n </div>\n </div>\n </div>\n <!-- Cost by Vendor -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['costByVendor']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('costByVendor')\">\n <h3><i class=\"fas fa-dollar-sign\"></i> Cost Distribution by Vendor</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['costByVendor'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"costByVendorChart\" #costByVendorChart></div>\n <div class=\"chart-total\">Total: {{ formatCost(promptMetrics.costBreakdown.totalCost) }}</div>\n </div>\n </div>\n </div>\n <!-- Token Usage -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['tokenUsage']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('tokenUsage')\">\n <h3><i class=\"fas fa-coins\"></i> Token Usage by Model</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['tokenUsage'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"tokenUsageChart\" #tokenUsageChart></div>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- Additional Prompt Analytics Charts -->\n @if (promptMetrics.totalCount > 0) {\n <div class=\"charts-grid\" style=\"margin-top: 20px;\">\n <!-- Prompt Execution Time Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptTime']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptTime')\">\n <h3><i class=\"fas fa-hourglass-half\"></i> Average Execution Time by Prompt</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptTime'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptTimeDistributionChart\" #promptTimeDistributionChart></div>\n </div>\n </div>\n </div>\n <!-- Prompt Token Usage -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptToken']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptToken')\">\n <h3><i class=\"fas fa-database\"></i> Token Usage by Prompt</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptToken'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptTokenDistributionChart\" #promptTokenDistributionChart></div>\n </div>\n </div>\n </div>\n <!-- Prompt Cost Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptCost']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptCost')\">\n <h3><i class=\"fas fa-chart-pie\"></i> Cost Distribution by Prompt</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptCost'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptCostDistributionChart\" #promptCostDistributionChart></div>\n </div>\n </div>\n </div>\n <!-- Prompt Count by Name -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptCount']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptCount')\">\n <h3><i class=\"fas fa-list-ol\"></i> Prompt Execution Count</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptCount'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptCountByNameChart\" #promptCountByNameChart></div>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- Detailed Prompt Metrics -->\n <div class=\"detailed-metrics\">\n <button kendoButton\n fillMode=\"flat\"\n (click)=\"promptDetailsExpanded = !promptDetailsExpanded\">\n <i class=\"fas\" [ngClass]=\"promptDetailsExpanded ? 'fa-chevron-up' : 'fa-chevron-down'\"></i>\n Detailed Prompt Metrics\n </button>\n @if (promptDetailsExpanded) {\n <div class=\"metrics-table\">\n <table>\n <thead>\n <tr>\n <th>Prompt Name</th>\n <th>Count</th>\n <th>Avg Time</th>\n <th>Total Time</th>\n <th>Success Rate</th>\n </tr>\n </thead>\n <tbody>\n @for (prompt of promptMetrics.byPrompt | keyvalue; track trackByKey($index, prompt)) {\n <tr>\n <td>{{ prompt.key }}</td>\n <td>{{ prompt.value.count }}</td>\n <td>{{ formatDuration(prompt.value.avgTime) }}</td>\n <td>{{ formatDuration(prompt.value.totalTime) }}</td>\n <td>\n <span class=\"success-rate\">\n <!-- Calculate success rate for this prompt -->\n {{ calculatePromptSuccessRate(prompt.key) }}%\n </span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n <!-- Action Analytics -->\n <kendo-panelbar-item [expanded]=\"true\">\n <ng-template kendoPanelBarItemTitle>\n <i class=\"fas fa-cog\"></i> Action Analytics\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"analytics-panel\">\n <div class=\"charts-grid\">\n <!-- Action Success Rate -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['actionSuccess']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('actionSuccess')\">\n <h3><i class=\"fas fa-chart-bar\"></i> Action Success Rate</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['actionSuccess'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"actionSuccessRateChart\" #actionSuccessRateChart></div>\n </div>\n </div>\n </div>\n <!-- Step Type Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['stepType']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('stepType')\">\n <h3><i class=\"fas fa-layer-group\"></i> Step Type Distribution</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['stepType'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"stepTypeChart\" #stepTypeChart></div>\n </div>\n </div>\n </div>\n </div>\n <!-- Detailed Action Metrics -->\n <div class=\"detailed-metrics\">\n <button kendoButton\n fillMode=\"flat\"\n (click)=\"actionDetailsExpanded = !actionDetailsExpanded\">\n <i class=\"fas\" [ngClass]=\"actionDetailsExpanded ? 'fa-chevron-up' : 'fa-chevron-down'\"></i>\n Detailed Action Metrics\n </button>\n @if (actionDetailsExpanded) {\n <div class=\"metrics-table\">\n <table>\n <thead>\n <tr>\n <th>Action Name</th>\n <th>Count</th>\n <th>Avg Time</th>\n <th>Success Rate</th>\n <th>Type</th>\n </tr>\n </thead>\n <tbody>\n @for (action of actionMetrics.byAction | keyvalue; track trackByKey($index, action)) {\n <tr>\n <td>{{ action.key }}</td>\n <td>{{ action.value.count }}</td>\n <td>{{ formatDuration(action.value.avgTime) }}</td>\n <td>\n <span class=\"success-rate\" [class.high]=\"action.value.successRate > 0.9\"\n [class.medium]=\"action.value.successRate > 0.7 && action.value.successRate <= 0.9\"\n [class.low]=\"action.value.successRate <= 0.7\">\n {{ (action.value.successRate * 100).toFixed(1) }}%\n </span>\n </td>\n <td>{{ getActionType(action.key) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n <!-- Error Analysis -->\n <div class=\"error-analysis-section\">\n @if (actionMetrics.errorAnalysis.size > 0) {\n <div class=\"error-analysis\">\n <h3>\n <i class=\"fas fa-exclamation-triangle\"></i>\n Common Errors\n </h3>\n <p class=\"error-analysis-description\">\n This section shows the most frequent error messages from failed actions, helping identify systemic issues that may need attention.\n </p>\n <div class=\"error-list\">\n @for (error of getTopErrors(); track trackByErrorMessage($index, error)) {\n <div class=\"error-item\">\n <span class=\"error-count\">{{ error.count }}x</span>\n <span class=\"error-message\">{{ error.message }}</span>\n </div>\n }\n </div>\n </div>\n }\n @if (actionMetrics.errorAnalysis.size === 0) {\n <div class=\"no-errors\">\n <i class=\"fas fa-check-circle\"></i>\n <p>No action errors detected in this run. All actions completed successfully!</p>\n </div>\n }\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n <!-- Model Performance Comparison -->\n <kendo-panelbar-item [expanded]=\"true\">\n <ng-template kendoPanelBarItemTitle>\n <i class=\"fas fa-chart-line\"></i> Model Performance Comparison\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"analytics-panel\">\n <div class=\"model-comparison\">\n <table>\n <thead>\n <tr>\n <th>Model</th>\n <th>Vendor</th>\n <th>Prompts</th>\n <th>Avg Time</th>\n <th>Total Cost</th>\n <th>Avg Cost/Prompt</th>\n <th>Input Tokens</th>\n <th>Output Tokens</th>\n </tr>\n </thead>\n <tbody>\n @for (model of getModelPerformanceData(); track trackByModelName($index, model)) {\n <tr>\n <td>{{ model.name }}</td>\n <td>{{ model.vendor }}</td>\n <td>{{ model.count }}</td>\n <td>{{ formatDuration(model.avgTime) }}</td>\n <td>{{ formatCost(model.totalCost) }}</td>\n <td>{{ formatCost(model.avgCost) }}</td>\n <td>{{ model.inputTokens | number:'1.0-0' }}</td>\n <td>{{ model.outputTokens | number:'1.0-0' }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n <!-- Timeline Analysis -->\n <kendo-panelbar-item [expanded]=\"true\">\n <ng-template kendoPanelBarItemTitle>\n <i class=\"fas fa-stream\"></i> Execution Timeline Analysis\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"analytics-panel\">\n <div class=\"timeline-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-label\">Total Steps</span>\n <span class=\"stat-value\">{{ timelineMetrics.totalSteps }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Parallel Executions</span>\n <span class=\"stat-value\">{{ timelineMetrics.parallelExecutions }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Max Nesting Depth</span>\n <span class=\"stat-value\">{{ timelineMetrics.deepestNesting }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Sub-Agent Runs</span>\n <span class=\"stat-value\">{{ subAgentRuns.length }}</span>\n </div>\n </div>\n <div class=\"step-breakdown\">\n <h3>Steps by Type</h3>\n <div class=\"step-type-list\">\n @for (type of timelineMetrics.stepsByType | keyvalue; track trackByKey($index, type)) {\n <div class=\"step-type-item\">\n <i class=\"fas\" [ngClass]=\"getStepTypeIcon(type.key)\"></i>\n <span class=\"type-name\">{{ type.key }}</span>\n <span class=\"type-count\">{{ type.value }}</span>\n <span class=\"type-percentage\">({{ (type.value / timelineMetrics.totalSteps * 100).toFixed(1) }}%)</span>\n </div>\n }\n </div>\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n </kendo-panelbar>\n </div>\n }\n</div>", styles: [".analytics-container {\n padding: 20px;\n height: 100%;\n overflow-y: auto;\n background-color: var(--mj-bg-surface-sunken);\n}\n\n/* Loading and Error States */\n.loading-state,\n.error-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-muted);\n}\n\n.loading-state i,\n.error-state i {\n margin-bottom: 15px;\n}\n\n.error-state {\n color: var(--mj-status-error);\n}\n\n/* Summary Cards */\n.summary-cards {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.summary-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 20px;\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n align-items: center;\n transition: transform 0.2s, box-shadow 0.2s;\n}\n\n.summary-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n}\n\n.card-icon {\n width: 60px;\n height: 60px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 20px;\n font-size: 24px;\n color: var(--mj-text-inverse);\n}\n\n.card-icon.prompts {\n background: var(--mj-brand-primary);\n}\n\n.card-icon.actions {\n background: var(--mj-status-error);\n}\n\n.card-icon.cost {\n background: var(--mj-status-success);\n}\n\n.card-icon.time {\n background: var(--mj-status-warning);\n}\n\n.card-content h3 {\n margin: 0 0 8px 0;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value {\n font-size: 28px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.metric-detail {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.metric-detail .success {\n color: var(--mj-status-success);\n margin-right: 10px;\n}\n\n.metric-detail .failed {\n color: var(--mj-status-error);\n}\n\n/* Analytics Panels */\n.analytics-panel {\n padding: 15px;\n}\n\n/* Kendo PanelBar Styling - Copied from AI Agent Form */\n::ng-deep .analytics-content .k-panelbar {\n border: none;\n background: transparent;\n}\n\n::ng-deep .analytics-content .k-panelbar > .k-panelbar-item {\n border: none;\n border-radius: 12px;\n margin-bottom: 12px;\n box-shadow: 0 2px 8px rgba(0,0,0,0.06);\n background: var(--mj-bg-surface-card);\n overflow: hidden;\n}\n\n::ng-deep .analytics-content .k-panelbar > .k-panelbar-item > .k-header {\n background: var(--mj-bg-surface-card);\n border: none;\n padding: 16px 20px;\n border-radius: 12px 12px 0 0;\n color: var(--mj-text-primary);\n font-weight: 600;\n font-size: 16px;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n::ng-deep .analytics-content .k-panelbar > .k-panelbar-item > .k-header:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n::ng-deep .analytics-content .k-panelbar > .k-panelbar-item.k-panelbar-expanded > .k-header {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 12px 12px 0 0;\n}\n\n::ng-deep .analytics-content .k-panelbar > .k-panelbar-item > .k-header .k-panelbar-toggle {\n position: absolute;\n right: 24px;\n color: inherit;\n font-size: 14px;\n transition: transform 0.2s ease;\n}\n\n::ng-deep .analytics-content .k-panelbar > .k-panelbar-item.k-panelbar-expanded > .k-header .k-panelbar-toggle {\n transform: rotate(180deg);\n}\n\n::ng-deep .analytics-content .k-panelbar > .k-panelbar-item > .k-header .k-panelbar-toggle::before {\n content: '\\f107';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n}\n\n::ng-deep .analytics-content .k-panelbar > .k-panelbar-item > .k-content {\n padding: 0;\n border: none;\n background: var(--mj-bg-surface-sunken);\n border-radius: 0 0 12px 12px;\n}\n\n::ng-deep .analytics-content .k-panelbar .k-header .k-panelbar-icon {\n font-size: 18px;\n color: var(--mj-brand-primary);\n margin-right: 8px;\n}\n\n::ng-deep .analytics-content .k-panelbar .k-panelbar-expanded .k-header .k-panelbar-icon {\n color: var(--mj-text-inverse);\n}\n\n/* Charts */\n.charts-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));\n gap: 20px;\n margin-bottom: 20px;\n}\n\n/* Chart Cards */\n.chart-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n transition: all 0.3s ease;\n}\n\n.chart-card.expanded {\n grid-column: 1 / -1;\n}\n\n.chart-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background-color: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n}\n\n.chart-card-header:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.chart-card-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.chart-card-header h3 i {\n font-size: 16px;\n color: var(--mj-text-muted);\n}\n\n.expand-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: color 0.2s;\n}\n\n.expand-btn:hover {\n color: var(--mj-text-secondary);\n}\n\n.chart-card-body {\n padding: 16px;\n background: var(--mj-bg-surface-card);\n}\n\n.chart-card.expanded .chart-card-body {\n padding: 24px;\n}\n\n.chart-card.expanded .chart-container > div {\n min-height: 400px;\n}\n\n/* View Mode Toggle */\n.view-mode-toggle {\n display: flex;\n justify-content: flex-end;\n margin-bottom: 16px;\n}\n\n.view-mode-toggle button {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.chart-container {\n position: relative;\n}\n\n.chart-container h3 {\n margin: 0 0 10px 0;\n font-size: 15px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.chart-container > div {\n min-height: 220px;\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n/* Ensure SVG charts are centered */\n.chart-container svg {\n display: block;\n margin: 0 auto;\n}\n\n.chart-legend {\n margin-top: 10px;\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n font-size: 12px;\n}\n\n.legend-item {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n}\n\n.legend-color {\n width: 16px;\n height: 16px;\n border-radius: 3px;\n}\n\n.chart-total {\n text-align: center;\n margin-top: 10px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n/* Detailed Metrics */\n.detailed-metrics {\n margin-top: 20px;\n border-top: 1px solid var(--mj-border-default);\n padding-top: 20px;\n}\n\n.detailed-metrics button {\n margin-bottom: 15px;\n}\n\n.detailed-metrics button i {\n margin-right: 8px;\n}\n\n.metrics-table {\n overflow-x: auto;\n}\n\n.metrics-table table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.metrics-table th {\n background-color: var(--mj-bg-surface-sunken);\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 2px solid var(--mj-border-strong);\n}\n\n.metrics-table td {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.metrics-table tr:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.success-rate {\n font-weight: 500;\n}\n\n.success-rate.high {\n color: var(--mj-status-success);\n}\n\n.success-rate.medium {\n color: var(--mj-status-warning);\n}\n\n.success-rate.low {\n color: var(--mj-status-error);\n}\n\n/* Error Analysis */\n.error-analysis {\n margin-top: 30px;\n padding: 20px;\n background-color: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n}\n\n.error-analysis h3 {\n margin: 0 0 15px 0;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.error-analysis-description {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin-bottom: 20px;\n line-height: 1.5;\n}\n\n.error-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.error-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 10px;\n background-color: var(--mj-bg-surface);\n border-radius: 4px;\n font-size: 14px;\n}\n\n.error-count {\n background-color: var(--mj-status-error);\n color: var(--mj-text-inverse);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n}\n\n.error-message {\n flex: 1;\n color: var(--mj-text-secondary);\n}\n\n/* No errors state */\n.no-errors {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px;\n background-color: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 30%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.no-errors i {\n font-size: 24px;\n color: var(--mj-status-success);\n}\n\n.no-errors p {\n margin: 0;\n font-size: 14px;\n}\n\n/* No data message */\n.no-data-message {\n text-align: center;\n padding: 60px 20px;\n color: var(--mj-text-muted);\n}\n\n.no-data-message i {\n font-size: 48px;\n margin-bottom: 20px;\n color: var(--mj-border-strong);\n}\n\n.no-data-message p {\n margin: 0 0 10px 0;\n font-size: 16px;\n}\n\n.no-data-message p.small {\n font-size: 14px;\n color: var(--mj-text-disabled);\n}\n\n/* Model Comparison Table */\n.model-comparison {\n overflow-x: auto;\n}\n\n.model-comparison table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.model-comparison th {\n background-color: var(--mj-bg-surface-sunken);\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 2px solid var(--mj-border-strong);\n white-space: nowrap;\n}\n\n.model-comparison td {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.model-comparison tr:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n/* Timeline Analysis */\n.timeline-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.stat-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n}\n\n.stat-label {\n font-size: 14px;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n}\n\n.stat-value {\n font-size: 32px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.step-breakdown h3 {\n margin: 0 0 15px 0;\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.step-type-list {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));\n gap: 12px;\n}\n\n.step-type-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n}\n\n.step-type-item i {\n width: 30px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.type-name {\n flex: 1;\n font-weight: 500;\n}\n\n.type-count {\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.type-percentage {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-left: 5px;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .summary-cards {\n grid-template-columns: 1fr;\n }\n \n .charts-grid {\n grid-template-columns: 1fr;\n }\n \n .timeline-stats {\n grid-template-columns: repeat(2, 1fr);\n }\n}"] }]
|
|
2148
|
+
args: [{ standalone: false, selector: 'mj-ai-agent-run-analytics', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"analytics-container\">\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-state\">\n <i class=\"fas fa-spinner fa-spin fa-2x\"></i>\n <p>Loading analytics data...</p>\n </div>\n }\n\n <!-- Error State -->\n @if (error && !isLoading) {\n <div class=\"error-state\">\n <i class=\"fas fa-exclamation-triangle fa-2x\"></i>\n <p>{{ error }}</p>\n <button mjButton (click)=\"loadData()\">Retry</button>\n </div>\n }\n\n <!-- Analytics Content -->\n @if (!isLoading && !error) {\n <div class=\"analytics-content\">\n <!-- Summary Cards -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-tachometer-alt\"></i> Overview\n </ng-template>\n <div class=\"summary-cards\">\n <div class=\"summary-card\">\n <div class=\"card-icon prompts\">\n <i class=\"fas fa-microchip\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Total Prompts</h3>\n <div class=\"metric-value\">{{ promptMetrics.totalCount }}</div>\n <div class=\"metric-detail\">\n <span class=\"success\">{{ promptMetrics.statusBreakdown.success }} successful</span>\n @if (promptMetrics.statusBreakdown.failed > 0) {\n <span class=\"failed\">{{ promptMetrics.statusBreakdown.failed }} failed</span>\n }\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon actions\">\n <i class=\"fas fa-cog\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Total Actions</h3>\n <div class=\"metric-value\">{{ actionMetrics.totalCount }}</div>\n <div class=\"metric-detail\">\n <span class=\"success\">{{ actionMetrics.statusBreakdown.success }} successful</span>\n @if (actionMetrics.statusBreakdown.failed > 0) {\n <span class=\"failed\">{{ actionMetrics.statusBreakdown.failed }} failed</span>\n }\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon cost\">\n <i class=\"fas fa-dollar-sign\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Total Cost</h3>\n <div class=\"metric-value\">{{ formatCost(promptMetrics.costBreakdown.totalCost) }}</div>\n <div class=\"metric-detail\">\n <span>{{ promptMetrics.tokenUsage.totalInput + promptMetrics.tokenUsage.totalOutput }} tokens</span>\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon time\">\n <i class=\"fas fa-clock\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Execution Time</h3>\n <div class=\"metric-value\">{{ formatDuration(promptMetrics.totalExecutionTime + actionMetrics.totalExecutionTime) }}</div>\n <div class=\"metric-detail\">\n <span>{{ timelineMetrics.totalSteps }} total steps</span>\n </div>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Prompt Analytics -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-microchip\"></i> Prompt Analytics\n </ng-template>\n <div class=\"analytics-panel\">\n <!-- View Mode Toggle -->\n @if (promptMetrics.totalCount > 0) {\n <div class=\"view-mode-toggle\">\n <button mjButton\n variant=\"flat\"\n (click)=\"toggleViewMode()\">\n <i class=\"fas\" [ngClass]=\"viewMode === 'grid' ? 'fa-expand-arrows-alt' : 'fa-compress-arrows-alt'\"></i>\n {{ viewMode === 'grid' ? 'Expand All' : 'Collapse All' }}\n </button>\n </div>\n }\n <!-- No prompts message -->\n @if (promptMetrics.totalCount === 0) {\n <div class=\"no-data-message\">\n <i class=\"fas fa-info-circle\"></i>\n <p>No prompt executions found in this agent run.</p>\n <p class=\"small\">This agent run may have only executed actions without any AI prompts.</p>\n </div>\n }\n @if (promptMetrics.totalCount > 0) {\n <div class=\"charts-grid\">\n <!-- Model Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['modelDistribution']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('modelDistribution')\">\n <h3><i class=\"fas fa-chart-pie\"></i> Prompts by Model</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['modelDistribution'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"modelDistributionChart\" #modelDistributionChart></div>\n @if (promptMetrics.byModel.size > 0) {\n <div class=\"chart-legend\">\n @for (item of promptMetrics.byModel | keyvalue; track trackByKey($index, item)) {\n <div class=\"legend-item\">\n <span class=\"legend-color\" [style.backgroundColor]=\"getModelColor(item.key)\"></span>\n <span class=\"legend-label\">{{ item.key }}: {{ item.value.count }} ({{ (item.value.count / promptMetrics.totalCount * 100).toFixed(1) }}%)</span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <!-- Execution Time by Vendor -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['executionTime']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('executionTime')\">\n <h3><i class=\"fas fa-clock\"></i> Average Execution Time by Vendor</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['executionTime'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"executionTimeChart\" #executionTimeChart></div>\n </div>\n </div>\n </div>\n <!-- Cost by Vendor -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['costByVendor']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('costByVendor')\">\n <h3><i class=\"fas fa-dollar-sign\"></i> Cost Distribution by Vendor</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['costByVendor'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"costByVendorChart\" #costByVendorChart></div>\n <div class=\"chart-total\">Total: {{ formatCost(promptMetrics.costBreakdown.totalCost) }}</div>\n </div>\n </div>\n </div>\n <!-- Token Usage -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['tokenUsage']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('tokenUsage')\">\n <h3><i class=\"fas fa-coins\"></i> Token Usage by Model</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['tokenUsage'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"tokenUsageChart\" #tokenUsageChart></div>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- Additional Prompt Analytics Charts -->\n @if (promptMetrics.totalCount > 0) {\n <div class=\"charts-grid\" style=\"margin-top: 20px;\">\n <!-- Prompt Execution Time Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptTime']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptTime')\">\n <h3><i class=\"fas fa-hourglass-half\"></i> Average Execution Time by Prompt</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptTime'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptTimeDistributionChart\" #promptTimeDistributionChart></div>\n </div>\n </div>\n </div>\n <!-- Prompt Token Usage -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptToken']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptToken')\">\n <h3><i class=\"fas fa-database\"></i> Token Usage by Prompt</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptToken'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptTokenDistributionChart\" #promptTokenDistributionChart></div>\n </div>\n </div>\n </div>\n <!-- Prompt Cost Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptCost']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptCost')\">\n <h3><i class=\"fas fa-chart-pie\"></i> Cost Distribution by Prompt</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptCost'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptCostDistributionChart\" #promptCostDistributionChart></div>\n </div>\n </div>\n </div>\n <!-- Prompt Count by Name -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptCount']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptCount')\">\n <h3><i class=\"fas fa-list-ol\"></i> Prompt Execution Count</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptCount'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptCountByNameChart\" #promptCountByNameChart></div>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- Detailed Prompt Metrics -->\n <div class=\"detailed-metrics\">\n <button mjButton\n variant=\"flat\"\n (click)=\"promptDetailsExpanded = !promptDetailsExpanded\">\n <i class=\"fas\" [ngClass]=\"promptDetailsExpanded ? 'fa-chevron-up' : 'fa-chevron-down'\"></i>\n Detailed Prompt Metrics\n </button>\n @if (promptDetailsExpanded) {\n <div class=\"metrics-table\">\n <table>\n <thead>\n <tr>\n <th>Prompt Name</th>\n <th>Count</th>\n <th>Avg Time</th>\n <th>Total Time</th>\n <th>Success Rate</th>\n </tr>\n </thead>\n <tbody>\n @for (prompt of promptMetrics.byPrompt | keyvalue; track trackByKey($index, prompt)) {\n <tr>\n <td>{{ prompt.key }}</td>\n <td>{{ prompt.value.count }}</td>\n <td>{{ formatDuration(prompt.value.avgTime) }}</td>\n <td>{{ formatDuration(prompt.value.totalTime) }}</td>\n <td>\n <span class=\"success-rate\">\n <!-- Calculate success rate for this prompt -->\n {{ calculatePromptSuccessRate(prompt.key) }}%\n </span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Action Analytics -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-cog\"></i> Action Analytics\n </ng-template>\n <div class=\"analytics-panel\">\n <div class=\"charts-grid\">\n <!-- Action Success Rate -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['actionSuccess']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('actionSuccess')\">\n <h3><i class=\"fas fa-chart-bar\"></i> Action Success Rate</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['actionSuccess'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"actionSuccessRateChart\" #actionSuccessRateChart></div>\n </div>\n </div>\n </div>\n <!-- Step Type Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['stepType']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('stepType')\">\n <h3><i class=\"fas fa-layer-group\"></i> Step Type Distribution</h3>\n <button class=\"expand-btn\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['stepType'] ? 'fa-compress' : 'fa-expand'\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"stepTypeChart\" #stepTypeChart></div>\n </div>\n </div>\n </div>\n </div>\n <!-- Detailed Action Metrics -->\n <div class=\"detailed-metrics\">\n <button mjButton\n variant=\"flat\"\n (click)=\"actionDetailsExpanded = !actionDetailsExpanded\">\n <i class=\"fas\" [ngClass]=\"actionDetailsExpanded ? 'fa-chevron-up' : 'fa-chevron-down'\"></i>\n Detailed Action Metrics\n </button>\n @if (actionDetailsExpanded) {\n <div class=\"metrics-table\">\n <table>\n <thead>\n <tr>\n <th>Action Name</th>\n <th>Count</th>\n <th>Avg Time</th>\n <th>Success Rate</th>\n <th>Type</th>\n </tr>\n </thead>\n <tbody>\n @for (action of actionMetrics.byAction | keyvalue; track trackByKey($index, action)) {\n <tr>\n <td>{{ action.key }}</td>\n <td>{{ action.value.count }}</td>\n <td>{{ formatDuration(action.value.avgTime) }}</td>\n <td>\n <span class=\"success-rate\" [class.high]=\"action.value.successRate > 0.9\"\n [class.medium]=\"action.value.successRate > 0.7 && action.value.successRate <= 0.9\"\n [class.low]=\"action.value.successRate <= 0.7\">\n {{ (action.value.successRate * 100).toFixed(1) }}%\n </span>\n </td>\n <td>{{ getActionType(action.key) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n <!-- Error Analysis -->\n <div class=\"error-analysis-section\">\n @if (actionMetrics.errorAnalysis.size > 0) {\n <div class=\"error-analysis\">\n <h3>\n <i class=\"fas fa-exclamation-triangle\"></i>\n Common Errors\n </h3>\n <p class=\"error-analysis-description\">\n This section shows the most frequent error messages from failed actions, helping identify systemic issues that may need attention.\n </p>\n <div class=\"error-list\">\n @for (error of getTopErrors(); track trackByErrorMessage($index, error)) {\n <div class=\"error-item\">\n <span class=\"error-count\">{{ error.count }}x</span>\n <span class=\"error-message\">{{ error.message }}</span>\n </div>\n }\n </div>\n </div>\n }\n @if (actionMetrics.errorAnalysis.size === 0) {\n <div class=\"no-errors\">\n <i class=\"fas fa-check-circle\"></i>\n <p>No action errors detected in this run. All actions completed successfully!</p>\n </div>\n }\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Model Performance Comparison -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-chart-line\"></i> Model Performance Comparison\n </ng-template>\n <div class=\"analytics-panel\">\n <div class=\"model-comparison\">\n <table>\n <thead>\n <tr>\n <th>Model</th>\n <th>Vendor</th>\n <th>Prompts</th>\n <th>Avg Time</th>\n <th>Total Cost</th>\n <th>Avg Cost/Prompt</th>\n <th>Input Tokens</th>\n <th>Output Tokens</th>\n </tr>\n </thead>\n <tbody>\n @for (model of getModelPerformanceData(); track trackByModelName($index, model)) {\n <tr>\n <td>{{ model.name }}</td>\n <td>{{ model.vendor }}</td>\n <td>{{ model.count }}</td>\n <td>{{ formatDuration(model.avgTime) }}</td>\n <td>{{ formatCost(model.totalCost) }}</td>\n <td>{{ formatCost(model.avgCost) }}</td>\n <td>{{ model.inputTokens | number:'1.0-0' }}</td>\n <td>{{ model.outputTokens | number:'1.0-0' }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Timeline Analysis -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-stream\"></i> Execution Timeline Analysis\n </ng-template>\n <div class=\"analytics-panel\">\n <div class=\"timeline-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-label\">Total Steps</span>\n <span class=\"stat-value\">{{ timelineMetrics.totalSteps }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Parallel Executions</span>\n <span class=\"stat-value\">{{ timelineMetrics.parallelExecutions }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Max Nesting Depth</span>\n <span class=\"stat-value\">{{ timelineMetrics.deepestNesting }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Sub-Agent Runs</span>\n <span class=\"stat-value\">{{ subAgentRuns.length }}</span>\n </div>\n </div>\n <div class=\"step-breakdown\">\n <h3>Steps by Type</h3>\n <div class=\"step-type-list\">\n @for (type of timelineMetrics.stepsByType | keyvalue; track trackByKey($index, type)) {\n <div class=\"step-type-item\">\n <i class=\"fas\" [ngClass]=\"getStepTypeIcon(type.key)\"></i>\n <span class=\"type-name\">{{ type.key }}</span>\n <span class=\"type-count\">{{ type.value }}</span>\n <span class=\"type-percentage\">({{ (type.value / timelineMetrics.totalSteps * 100).toFixed(1) }}%)</span>\n </div>\n }\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n </div>\n }\n</div>", styles: [".analytics-container {\n padding: 20px;\n height: 100%;\n overflow-y: auto;\n background-color: var(--mj-bg-surface-sunken);\n}\n\n/* Loading and Error States */\n.loading-state,\n.error-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-muted);\n}\n\n.loading-state i,\n.error-state i {\n margin-bottom: 15px;\n}\n\n.error-state {\n color: var(--mj-status-error);\n}\n\n/* Summary Cards */\n.summary-cards {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.summary-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 20px;\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n align-items: center;\n transition: transform 0.2s, box-shadow 0.2s;\n}\n\n.summary-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n}\n\n.card-icon {\n width: 60px;\n height: 60px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 20px;\n font-size: 24px;\n color: var(--mj-text-inverse);\n}\n\n.card-icon.prompts {\n background: var(--mj-brand-primary);\n}\n\n.card-icon.actions {\n background: var(--mj-status-error);\n}\n\n.card-icon.cost {\n background: var(--mj-status-success);\n}\n\n.card-icon.time {\n background: var(--mj-status-warning);\n}\n\n.card-content h3 {\n margin: 0 0 8px 0;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value {\n font-size: 28px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.metric-detail {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.metric-detail .success {\n color: var(--mj-status-success);\n margin-right: 10px;\n}\n\n.metric-detail .failed {\n color: var(--mj-status-error);\n}\n\n/* Analytics Panels */\n.analytics-panel {\n padding: 15px;\n}\n\n/* Accordion Panel Styling */\n.analytics-content mj-accordion-panel {\n display: block;\n margin-bottom: 12px;\n}\n\n/* Charts */\n.charts-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));\n gap: 20px;\n margin-bottom: 20px;\n}\n\n/* Chart Cards */\n.chart-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n transition: all 0.3s ease;\n}\n\n.chart-card.expanded {\n grid-column: 1 / -1;\n}\n\n.chart-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background-color: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n}\n\n.chart-card-header:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.chart-card-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.chart-card-header h3 i {\n font-size: 16px;\n color: var(--mj-text-muted);\n}\n\n.expand-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: color 0.2s;\n}\n\n.expand-btn:hover {\n color: var(--mj-text-secondary);\n}\n\n.chart-card-body {\n padding: 16px;\n background: var(--mj-bg-surface-card);\n}\n\n.chart-card.expanded .chart-card-body {\n padding: 24px;\n}\n\n.chart-card.expanded .chart-container > div {\n min-height: 400px;\n}\n\n/* View Mode Toggle */\n.view-mode-toggle {\n display: flex;\n justify-content: flex-end;\n margin-bottom: 16px;\n}\n\n.view-mode-toggle button {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.chart-container {\n position: relative;\n}\n\n.chart-container h3 {\n margin: 0 0 10px 0;\n font-size: 15px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.chart-container > div {\n min-height: 220px;\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n/* Ensure SVG charts are centered */\n.chart-container svg {\n display: block;\n margin: 0 auto;\n}\n\n.chart-legend {\n margin-top: 10px;\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n font-size: 12px;\n}\n\n.legend-item {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n}\n\n.legend-color {\n width: 16px;\n height: 16px;\n border-radius: 3px;\n}\n\n.chart-total {\n text-align: center;\n margin-top: 10px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n/* Detailed Metrics */\n.detailed-metrics {\n margin-top: 20px;\n border-top: 1px solid var(--mj-border-default);\n padding-top: 20px;\n}\n\n.detailed-metrics button {\n margin-bottom: 15px;\n}\n\n.detailed-metrics button i {\n margin-right: 8px;\n}\n\n.metrics-table {\n overflow-x: auto;\n}\n\n.metrics-table table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.metrics-table th {\n background-color: var(--mj-bg-surface-sunken);\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 2px solid var(--mj-border-strong);\n}\n\n.metrics-table td {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.metrics-table tr:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.success-rate {\n font-weight: 500;\n}\n\n.success-rate.high {\n color: var(--mj-status-success);\n}\n\n.success-rate.medium {\n color: var(--mj-status-warning);\n}\n\n.success-rate.low {\n color: var(--mj-status-error);\n}\n\n/* Error Analysis */\n.error-analysis {\n margin-top: 30px;\n padding: 20px;\n background-color: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n}\n\n.error-analysis h3 {\n margin: 0 0 15px 0;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.error-analysis-description {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin-bottom: 20px;\n line-height: 1.5;\n}\n\n.error-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.error-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 10px;\n background-color: var(--mj-bg-surface);\n border-radius: 4px;\n font-size: 14px;\n}\n\n.error-count {\n background-color: var(--mj-status-error);\n color: var(--mj-text-inverse);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n}\n\n.error-message {\n flex: 1;\n color: var(--mj-text-secondary);\n}\n\n/* No errors state */\n.no-errors {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px;\n background-color: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 30%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.no-errors i {\n font-size: 24px;\n color: var(--mj-status-success);\n}\n\n.no-errors p {\n margin: 0;\n font-size: 14px;\n}\n\n/* No data message */\n.no-data-message {\n text-align: center;\n padding: 60px 20px;\n color: var(--mj-text-muted);\n}\n\n.no-data-message i {\n font-size: 48px;\n margin-bottom: 20px;\n color: var(--mj-border-strong);\n}\n\n.no-data-message p {\n margin: 0 0 10px 0;\n font-size: 16px;\n}\n\n.no-data-message p.small {\n font-size: 14px;\n color: var(--mj-text-disabled);\n}\n\n/* Model Comparison Table */\n.model-comparison {\n overflow-x: auto;\n}\n\n.model-comparison table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.model-comparison th {\n background-color: var(--mj-bg-surface-sunken);\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 2px solid var(--mj-border-strong);\n white-space: nowrap;\n}\n\n.model-comparison td {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.model-comparison tr:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n/* Timeline Analysis */\n.timeline-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.stat-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n}\n\n.stat-label {\n font-size: 14px;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n}\n\n.stat-value {\n font-size: 32px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.step-breakdown h3 {\n margin: 0 0 15px 0;\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.step-type-list {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));\n gap: 12px;\n}\n\n.step-type-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n}\n\n.step-type-item i {\n width: 30px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.type-name {\n flex: 1;\n font-weight: 500;\n}\n\n.type-count {\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.type-percentage {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-left: 5px;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .summary-cards {\n grid-template-columns: 1fr;\n }\n \n .charts-grid {\n grid-template-columns: 1fr;\n }\n \n .timeline-stats {\n grid-template-columns: repeat(2, 1fr);\n }\n}"] }]
|
|
2177
2149
|
}], () => [{ type: i0.ChangeDetectorRef }, { type: i1.AIAgentRunCostService }], { agentRunId: [{
|
|
2178
2150
|
type: Input
|
|
2179
2151
|
}], modelDistributionChart: [{
|