@memberjunction/ng-dashboards 2.48.0 → 2.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +105 -2
- package/dist/AI/ai-dashboard.component.d.ts +2 -0
- package/dist/AI/ai-dashboard.component.d.ts.map +1 -1
- package/dist/AI/ai-dashboard.component.js +66 -43
- package/dist/AI/ai-dashboard.component.js.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +45 -58
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts +6 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +368 -366
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +83 -85
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
- package/dist/AI/components/charts/performance-heatmap.component.d.ts +66 -0
- package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -0
- package/dist/AI/components/charts/performance-heatmap.component.js +428 -0
- package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -0
- package/dist/AI/components/charts/time-series-chart.component.d.ts +66 -0
- package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -0
- package/dist/AI/components/charts/time-series-chart.component.js +547 -0
- package/dist/AI/components/charts/time-series-chart.component.js.map +1 -0
- package/dist/AI/components/execution-monitoring.component.d.ts +157 -5
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +2032 -20
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +211 -237
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +208 -226
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +97 -99
- package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +381 -424
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js +173 -191
- package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
- package/dist/AI/components/system/system-config-filter-panel.component.js +85 -87
- package/dist/AI/components/system/system-config-filter-panel.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +86 -99
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/widgets/kpi-card.component.d.ts +25 -0
- package/dist/AI/components/widgets/kpi-card.component.d.ts.map +1 -0
- package/dist/AI/components/widgets/kpi-card.component.js +163 -0
- package/dist/AI/components/widgets/kpi-card.component.js.map +1 -0
- package/dist/AI/components/widgets/live-execution-widget.component.d.ts +25 -0
- package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -0
- package/dist/AI/components/widgets/live-execution-widget.component.js +298 -0
- package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -0
- package/dist/AI/index.d.ts +7 -0
- package/dist/AI/index.d.ts.map +1 -0
- package/dist/AI/index.js +9 -0
- package/dist/AI/index.js.map +1 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts +109 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -0
- package/dist/AI/services/ai-instrumentation.service.js +490 -0
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -0
- package/dist/Actions/actions-management-dashboard.component.js +40 -41
- package/dist/Actions/actions-management-dashboard.component.js.map +1 -1
- package/dist/Actions/components/actions-list-view.component.js +117 -134
- package/dist/Actions/components/actions-list-view.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +274 -296
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +12 -14
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/Actions/components/code-management.component.js +12 -14
- package/dist/Actions/components/code-management.component.js.map +1 -1
- package/dist/Actions/components/entity-integration.component.js +12 -14
- package/dist/Actions/components/entity-integration.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +238 -256
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/executions-list-view.component.js +12 -14
- package/dist/Actions/components/executions-list-view.component.js.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.js +12 -14
- package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
- package/dist/Actions/components/security-permissions.component.js +12 -14
- package/dist/Actions/components/security-permissions.component.js.map +1 -1
- package/dist/EntityAdmin/components/entity-details.component.js +105 -107
- package/dist/EntityAdmin/components/entity-details.component.js.map +1 -1
- package/dist/EntityAdmin/components/entity-filter-panel.component.js +100 -102
- package/dist/EntityAdmin/components/entity-filter-panel.component.js.map +1 -1
- package/dist/EntityAdmin/components/erd-composite.component.js +84 -100
- package/dist/EntityAdmin/components/erd-composite.component.js.map +1 -1
- package/dist/EntityAdmin/components/erd-diagram.component.js +50 -50
- package/dist/EntityAdmin/components/erd-diagram.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +45 -49
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/generic/base-dashboard.js +28 -40
- package/dist/generic/base-dashboard.js.map +1 -1
- package/dist/module.d.ts +16 -12
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +36 -15
- package/dist/module.js.map +1 -1
- package/package.json +6 -6
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, combineLatest, interval as rxInterval } from 'rxjs';
|
|
3
|
+
import { switchMap, startWith, shareReplay } from 'rxjs/operators';
|
|
4
|
+
import { RunView } from '@memberjunction/core';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class AIInstrumentationService {
|
|
7
|
+
_refreshInterval$ = new BehaviorSubject(30000); // 30 seconds default
|
|
8
|
+
_dateRange$ = new BehaviorSubject({
|
|
9
|
+
start: new Date(Date.now() - 24 * 60 * 60 * 1000), // Last 24 hours
|
|
10
|
+
end: new Date()
|
|
11
|
+
});
|
|
12
|
+
constructor() { }
|
|
13
|
+
// Main data streams
|
|
14
|
+
kpis$ = this.createRefreshableStream(() => this.loadKPIs());
|
|
15
|
+
trends$ = this.createRefreshableStream(() => this.loadTrends());
|
|
16
|
+
liveExecutions$ = this.createRefreshableStream(() => this.loadLiveExecutions());
|
|
17
|
+
chartData$ = this.createRefreshableStream(() => this.loadChartData());
|
|
18
|
+
setRefreshInterval(intervalMs) {
|
|
19
|
+
this._refreshInterval$.next(intervalMs);
|
|
20
|
+
}
|
|
21
|
+
setDateRange(start, end) {
|
|
22
|
+
this._dateRange$.next({ start, end });
|
|
23
|
+
}
|
|
24
|
+
createRefreshableStream(loadFn) {
|
|
25
|
+
return combineLatest([
|
|
26
|
+
this._refreshInterval$,
|
|
27
|
+
this._dateRange$
|
|
28
|
+
]).pipe(switchMap(([interval]) => interval > 0
|
|
29
|
+
? rxInterval(interval).pipe(startWith(0))
|
|
30
|
+
: [0]), switchMap(() => loadFn()), shareReplay(1));
|
|
31
|
+
}
|
|
32
|
+
async loadKPIs() {
|
|
33
|
+
const { start, end } = this._dateRange$.value;
|
|
34
|
+
const dateFilter = `RunAt >= '${start.toISOString()}' AND RunAt <= '${end.toISOString()}'`;
|
|
35
|
+
// Load prompt executions
|
|
36
|
+
const promptRv = new RunView();
|
|
37
|
+
const promptResults = await promptRv.RunView({
|
|
38
|
+
EntityName: 'MJ: AI Prompt Runs',
|
|
39
|
+
ExtraFilter: dateFilter,
|
|
40
|
+
ResultType: 'entity_object'
|
|
41
|
+
});
|
|
42
|
+
// Load agent executions
|
|
43
|
+
const agentRv = new RunView();
|
|
44
|
+
const agentResults = await agentRv.RunView({
|
|
45
|
+
EntityName: 'MJ: AI Agent Runs',
|
|
46
|
+
ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,
|
|
47
|
+
ResultType: 'entity_object'
|
|
48
|
+
});
|
|
49
|
+
const promptRuns = promptResults.Results;
|
|
50
|
+
const agentRuns = agentResults.Results;
|
|
51
|
+
// Calculate KPIs
|
|
52
|
+
const totalExecutions = promptRuns.length + agentRuns.length;
|
|
53
|
+
const activeExecutions = this.countActiveExecutions(promptRuns, agentRuns);
|
|
54
|
+
const totalCost = this.sumCosts(promptRuns, agentRuns);
|
|
55
|
+
const totalTokens = this.sumTokens(promptRuns, agentRuns);
|
|
56
|
+
const avgExecutionTime = this.calculateAverageExecutionTime(promptRuns, agentRuns);
|
|
57
|
+
const successRate = this.calculateSuccessRate(promptRuns, agentRuns);
|
|
58
|
+
const errorRate = 1 - successRate;
|
|
59
|
+
const costPerToken = totalTokens > 0 ? totalCost / totalTokens : 0;
|
|
60
|
+
const dailyCostBurn = this.calculateDailyCostBurn(promptRuns, agentRuns);
|
|
61
|
+
const topModel = await this.getTopModel(promptRuns);
|
|
62
|
+
const topAgent = await this.getTopAgent(agentRuns);
|
|
63
|
+
return {
|
|
64
|
+
totalExecutions,
|
|
65
|
+
activeExecutions,
|
|
66
|
+
totalCost,
|
|
67
|
+
costCurrency: 'USD',
|
|
68
|
+
avgExecutionTime,
|
|
69
|
+
successRate,
|
|
70
|
+
totalTokens,
|
|
71
|
+
costPerToken,
|
|
72
|
+
topModel,
|
|
73
|
+
topAgent,
|
|
74
|
+
errorRate,
|
|
75
|
+
dailyCostBurn
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
async loadTrends() {
|
|
79
|
+
const { start, end } = this._dateRange$.value;
|
|
80
|
+
const hourlyBuckets = this.createHourlyBuckets(start, end);
|
|
81
|
+
const trends = [];
|
|
82
|
+
for (const bucket of hourlyBuckets) {
|
|
83
|
+
const bucketStart = bucket;
|
|
84
|
+
const bucketEnd = new Date(bucket.getTime() + 60 * 60 * 1000);
|
|
85
|
+
const promptFilter = `RunAt >= '${bucketStart.toISOString()}' AND RunAt < '${bucketEnd.toISOString()}'`;
|
|
86
|
+
const agentFilter = `StartedAt >= '${bucketStart.toISOString()}' AND StartedAt < '${bucketEnd.toISOString()}'`;
|
|
87
|
+
const [promptResults, agentResults] = await Promise.all([
|
|
88
|
+
new RunView().RunView({
|
|
89
|
+
EntityName: 'MJ: AI Prompt Runs',
|
|
90
|
+
ExtraFilter: promptFilter,
|
|
91
|
+
ResultType: 'entity_object'
|
|
92
|
+
}),
|
|
93
|
+
new RunView().RunView({
|
|
94
|
+
EntityName: 'MJ: AI Agent Runs',
|
|
95
|
+
ExtraFilter: agentFilter,
|
|
96
|
+
ResultType: 'entity_object'
|
|
97
|
+
})
|
|
98
|
+
]);
|
|
99
|
+
const promptRuns = promptResults.Results;
|
|
100
|
+
const agentRuns = agentResults.Results;
|
|
101
|
+
trends.push({
|
|
102
|
+
timestamp: bucket,
|
|
103
|
+
executions: promptRuns.length + agentRuns.length,
|
|
104
|
+
cost: this.sumCosts(promptRuns, agentRuns),
|
|
105
|
+
tokens: this.sumTokens(promptRuns, agentRuns),
|
|
106
|
+
avgTime: this.calculateAverageExecutionTime(promptRuns, agentRuns),
|
|
107
|
+
errors: this.countErrors(promptRuns, agentRuns)
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return trends;
|
|
111
|
+
}
|
|
112
|
+
async loadLiveExecutions() {
|
|
113
|
+
const now = new Date();
|
|
114
|
+
const recentTime = new Date(now.getTime() - 5 * 60 * 1000);
|
|
115
|
+
const [promptResults, agentResults] = await Promise.all([
|
|
116
|
+
new RunView().RunView({
|
|
117
|
+
EntityName: 'MJ: AI Prompt Runs',
|
|
118
|
+
ExtraFilter: `RunAt >= '${recentTime.toISOString()}'`,
|
|
119
|
+
OrderBy: 'RunAt DESC',
|
|
120
|
+
ResultType: 'entity_object'
|
|
121
|
+
}),
|
|
122
|
+
new RunView().RunView({
|
|
123
|
+
EntityName: 'MJ: AI Agent Runs',
|
|
124
|
+
ExtraFilter: `StartedAt >= '${recentTime.toISOString()}'`,
|
|
125
|
+
OrderBy: 'StartedAt DESC',
|
|
126
|
+
ResultType: 'entity_object'
|
|
127
|
+
})
|
|
128
|
+
]);
|
|
129
|
+
const liveExecutions = [];
|
|
130
|
+
for (const run of promptResults.Results) {
|
|
131
|
+
const isRunning = !run.CompletedAt && run.Success !== false;
|
|
132
|
+
const duration = run.CompletedAt ?
|
|
133
|
+
new Date(run.CompletedAt).getTime() - new Date(run.RunAt).getTime() :
|
|
134
|
+
now.getTime() - new Date(run.RunAt).getTime();
|
|
135
|
+
liveExecutions.push({
|
|
136
|
+
id: run.ID,
|
|
137
|
+
type: 'prompt',
|
|
138
|
+
name: await this.getPromptName(run.PromptID),
|
|
139
|
+
status: isRunning ? 'running' : (run.Success ? 'completed' : 'failed'),
|
|
140
|
+
startTime: new Date(run.RunAt),
|
|
141
|
+
duration: duration,
|
|
142
|
+
cost: run.Cost || 0,
|
|
143
|
+
tokens: run.TokensUsed || 0,
|
|
144
|
+
progress: isRunning ? Math.min(90, (duration / 30000) * 100) : 100
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
for (const run of agentResults.Results) {
|
|
148
|
+
const isRunning = run.Status === 'Running';
|
|
149
|
+
const duration = run.CompletedAt ?
|
|
150
|
+
new Date(run.CompletedAt).getTime() - new Date(run.StartedAt).getTime() :
|
|
151
|
+
now.getTime() - new Date(run.StartedAt).getTime();
|
|
152
|
+
liveExecutions.push({
|
|
153
|
+
id: run.ID,
|
|
154
|
+
type: 'agent',
|
|
155
|
+
name: await this.getAgentName(run.AgentID),
|
|
156
|
+
status: run.Status.toLowerCase(),
|
|
157
|
+
startTime: new Date(run.StartedAt),
|
|
158
|
+
duration: duration,
|
|
159
|
+
cost: run.TotalCost || 0,
|
|
160
|
+
tokens: run.TotalTokensUsed || 0,
|
|
161
|
+
progress: isRunning ? Math.min(90, (duration / 60000) * 100) : 100
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
return liveExecutions.sort((a, b) => b.startTime.getTime() - a.startTime.getTime());
|
|
165
|
+
}
|
|
166
|
+
async loadChartData() {
|
|
167
|
+
const { start, end } = this._dateRange$.value;
|
|
168
|
+
const dateFilter = `RunAt >= '${start.toISOString()}' AND RunAt <= '${end.toISOString()}'`;
|
|
169
|
+
const promptRv = new RunView();
|
|
170
|
+
const promptResults = await promptRv.RunView({
|
|
171
|
+
EntityName: 'MJ: AI Prompt Runs',
|
|
172
|
+
ExtraFilter: dateFilter,
|
|
173
|
+
ResultType: 'entity_object'
|
|
174
|
+
});
|
|
175
|
+
const promptRuns = promptResults.Results;
|
|
176
|
+
const executionTrends = await this.loadTrends();
|
|
177
|
+
const costByModel = await this.analyzeCostByModel(promptRuns);
|
|
178
|
+
const performanceMatrix = await this.analyzePerformanceMatrix(promptRuns);
|
|
179
|
+
const tokenEfficiency = await this.analyzeTokenEfficiency(promptRuns);
|
|
180
|
+
return {
|
|
181
|
+
executionTrends,
|
|
182
|
+
costByModel,
|
|
183
|
+
performanceMatrix,
|
|
184
|
+
tokenEfficiency
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
// Helper methods
|
|
188
|
+
countActiveExecutions(promptRuns, agentRuns) {
|
|
189
|
+
const activePrompts = promptRuns.filter(r => !r.CompletedAt && r.Success !== false).length;
|
|
190
|
+
const activeAgents = agentRuns.filter(r => r.Status === 'Running').length;
|
|
191
|
+
return activePrompts + activeAgents;
|
|
192
|
+
}
|
|
193
|
+
sumCosts(promptRuns, agentRuns) {
|
|
194
|
+
const promptCost = promptRuns.reduce((sum, r) => sum + (r.Cost || 0), 0);
|
|
195
|
+
const agentCost = agentRuns.reduce((sum, r) => sum + (r.TotalCost || 0), 0);
|
|
196
|
+
return promptCost + agentCost;
|
|
197
|
+
}
|
|
198
|
+
sumTokens(promptRuns, agentRuns) {
|
|
199
|
+
const promptTokens = promptRuns.reduce((sum, r) => sum + (r.TokensUsed || 0), 0);
|
|
200
|
+
const agentTokens = agentRuns.reduce((sum, r) => sum + (r.TotalTokensUsed || 0), 0);
|
|
201
|
+
return promptTokens + agentTokens;
|
|
202
|
+
}
|
|
203
|
+
calculateAverageExecutionTime(promptRuns, agentRuns) {
|
|
204
|
+
const promptTimes = promptRuns
|
|
205
|
+
.filter(r => r.ExecutionTimeMS)
|
|
206
|
+
.map(r => r.ExecutionTimeMS);
|
|
207
|
+
const agentTimes = agentRuns
|
|
208
|
+
.filter(r => r.StartedAt && r.CompletedAt)
|
|
209
|
+
.map(r => new Date(r.CompletedAt).getTime() - new Date(r.StartedAt).getTime());
|
|
210
|
+
const allTimes = [...promptTimes, ...agentTimes];
|
|
211
|
+
return allTimes.length > 0 ? allTimes.reduce((sum, time) => sum + time, 0) / allTimes.length : 0;
|
|
212
|
+
}
|
|
213
|
+
calculateSuccessRate(promptRuns, agentRuns) {
|
|
214
|
+
const totalExecutions = promptRuns.length + agentRuns.length;
|
|
215
|
+
if (totalExecutions === 0)
|
|
216
|
+
return 1;
|
|
217
|
+
const successfulPrompts = promptRuns.filter(r => r.Success).length;
|
|
218
|
+
const successfulAgents = agentRuns.filter(r => r.Success).length;
|
|
219
|
+
return (successfulPrompts + successfulAgents) / totalExecutions;
|
|
220
|
+
}
|
|
221
|
+
countErrors(promptRuns, agentRuns) {
|
|
222
|
+
const promptErrors = promptRuns.filter(r => !r.Success).length;
|
|
223
|
+
const agentErrors = agentRuns.filter(r => !r.Success).length;
|
|
224
|
+
return promptErrors + agentErrors;
|
|
225
|
+
}
|
|
226
|
+
calculateDailyCostBurn(promptRuns, agentRuns) {
|
|
227
|
+
const now = new Date();
|
|
228
|
+
const dayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
|
229
|
+
const todayPrompts = promptRuns.filter(r => new Date(r.RunAt) >= dayStart);
|
|
230
|
+
const todayAgents = agentRuns.filter(r => new Date(r.StartedAt) >= dayStart);
|
|
231
|
+
return this.sumCosts(todayPrompts, todayAgents);
|
|
232
|
+
}
|
|
233
|
+
createHourlyBuckets(start, end) {
|
|
234
|
+
const buckets = [];
|
|
235
|
+
const current = new Date(start);
|
|
236
|
+
current.setMinutes(0, 0, 0);
|
|
237
|
+
while (current < end) {
|
|
238
|
+
buckets.push(new Date(current));
|
|
239
|
+
current.setHours(current.getHours() + 1);
|
|
240
|
+
}
|
|
241
|
+
return buckets;
|
|
242
|
+
}
|
|
243
|
+
async getPromptName(promptId) {
|
|
244
|
+
try {
|
|
245
|
+
const rv = new RunView();
|
|
246
|
+
const result = await rv.RunView({
|
|
247
|
+
EntityName: 'AI Prompts',
|
|
248
|
+
ExtraFilter: `ID = '${promptId}'`,
|
|
249
|
+
ResultType: 'entity_object'
|
|
250
|
+
});
|
|
251
|
+
return result.Results[0]?.Name || 'Unknown Prompt';
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
return 'Unknown Prompt';
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
async getAgentName(agentId) {
|
|
258
|
+
try {
|
|
259
|
+
const rv = new RunView();
|
|
260
|
+
const result = await rv.RunView({
|
|
261
|
+
EntityName: 'AI Agents',
|
|
262
|
+
ExtraFilter: `ID = '${agentId}'`,
|
|
263
|
+
ResultType: 'entity_object'
|
|
264
|
+
});
|
|
265
|
+
return result.Results[0]?.Name || 'Unknown Agent';
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
return 'Unknown Agent';
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
async getTopModel(promptRuns) {
|
|
272
|
+
const modelCounts = new Map();
|
|
273
|
+
for (const run of promptRuns) {
|
|
274
|
+
if (run.ModelID) {
|
|
275
|
+
const count = modelCounts.get(run.ModelID) || 0;
|
|
276
|
+
modelCounts.set(run.ModelID, count + 1);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
if (modelCounts.size === 0)
|
|
280
|
+
return 'N/A';
|
|
281
|
+
const topModelId = Array.from(modelCounts.entries())
|
|
282
|
+
.sort(([, a], [, b]) => b - a)[0][0];
|
|
283
|
+
try {
|
|
284
|
+
const rv = new RunView();
|
|
285
|
+
const result = await rv.RunView({
|
|
286
|
+
EntityName: 'AI Models',
|
|
287
|
+
ExtraFilter: `ID = '${topModelId}'`,
|
|
288
|
+
ResultType: 'entity_object'
|
|
289
|
+
});
|
|
290
|
+
return result.Results[0]?.Name || 'Unknown Model';
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
return 'Unknown Model';
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
async getTopAgent(agentRuns) {
|
|
297
|
+
const agentCounts = new Map();
|
|
298
|
+
for (const run of agentRuns) {
|
|
299
|
+
const count = agentCounts.get(run.AgentID) || 0;
|
|
300
|
+
agentCounts.set(run.AgentID, count + 1);
|
|
301
|
+
}
|
|
302
|
+
if (agentCounts.size === 0)
|
|
303
|
+
return 'N/A';
|
|
304
|
+
const topAgentId = Array.from(agentCounts.entries())
|
|
305
|
+
.sort(([, a], [, b]) => b - a)[0][0];
|
|
306
|
+
try {
|
|
307
|
+
const rv = new RunView();
|
|
308
|
+
const result = await rv.RunView({
|
|
309
|
+
EntityName: 'AI Agents',
|
|
310
|
+
ExtraFilter: `ID = '${topAgentId}'`,
|
|
311
|
+
ResultType: 'entity_object'
|
|
312
|
+
});
|
|
313
|
+
return result.Results[0]?.Name || 'Unknown Agent';
|
|
314
|
+
}
|
|
315
|
+
catch {
|
|
316
|
+
return 'Unknown Agent';
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
async analyzeCostByModel(promptRuns) {
|
|
320
|
+
const modelStats = new Map();
|
|
321
|
+
for (const run of promptRuns) {
|
|
322
|
+
if (run.ModelID) {
|
|
323
|
+
const existing = modelStats.get(run.ModelID) || { cost: 0, tokens: 0 };
|
|
324
|
+
existing.cost += run.Cost || 0;
|
|
325
|
+
existing.tokens += run.TokensUsed || 0;
|
|
326
|
+
modelStats.set(run.ModelID, existing);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
const results = [];
|
|
330
|
+
for (const [modelId, stats] of modelStats.entries()) {
|
|
331
|
+
const modelName = await this.getModelName(modelId);
|
|
332
|
+
results.push({
|
|
333
|
+
model: modelName,
|
|
334
|
+
cost: stats.cost,
|
|
335
|
+
tokens: stats.tokens
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
return results.sort((a, b) => b.cost - a.cost);
|
|
339
|
+
}
|
|
340
|
+
async analyzePerformanceMatrix(promptRuns) {
|
|
341
|
+
const combinations = new Map();
|
|
342
|
+
for (const run of promptRuns) {
|
|
343
|
+
if (run.AgentID && run.ModelID && run.ExecutionTimeMS) {
|
|
344
|
+
const key = `${run.AgentID}:${run.ModelID}`;
|
|
345
|
+
const existing = combinations.get(key) || { times: [], successes: 0, total: 0 };
|
|
346
|
+
existing.times.push(run.ExecutionTimeMS);
|
|
347
|
+
existing.total += 1;
|
|
348
|
+
if (run.Success)
|
|
349
|
+
existing.successes += 1;
|
|
350
|
+
combinations.set(key, existing);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
const results = [];
|
|
354
|
+
for (const [key, data] of combinations.entries()) {
|
|
355
|
+
const [agentId, modelId] = key.split(':');
|
|
356
|
+
const agentName = await this.getAgentName(agentId);
|
|
357
|
+
const modelName = await this.getModelName(modelId);
|
|
358
|
+
results.push({
|
|
359
|
+
agent: agentName,
|
|
360
|
+
model: modelName,
|
|
361
|
+
avgTime: data.times.reduce((sum, time) => sum + time, 0) / data.times.length,
|
|
362
|
+
successRate: data.successes / data.total
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
return results;
|
|
366
|
+
}
|
|
367
|
+
async analyzeTokenEfficiency(promptRuns) {
|
|
368
|
+
const modelEfficiency = new Map();
|
|
369
|
+
for (const run of promptRuns) {
|
|
370
|
+
if (run.ModelID && run.TokensPrompt && run.TokensCompletion) {
|
|
371
|
+
const existing = modelEfficiency.get(run.ModelID) || { input: 0, output: 0, cost: 0 };
|
|
372
|
+
existing.input += run.TokensPrompt;
|
|
373
|
+
existing.output += run.TokensCompletion;
|
|
374
|
+
existing.cost += run.Cost || 0;
|
|
375
|
+
modelEfficiency.set(run.ModelID, existing);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
const results = [];
|
|
379
|
+
for (const [modelId, data] of modelEfficiency.entries()) {
|
|
380
|
+
const modelName = await this.getModelName(modelId);
|
|
381
|
+
results.push({
|
|
382
|
+
inputTokens: data.input,
|
|
383
|
+
outputTokens: data.output,
|
|
384
|
+
cost: data.cost,
|
|
385
|
+
model: modelName
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
return results;
|
|
389
|
+
}
|
|
390
|
+
async getModelName(modelId) {
|
|
391
|
+
try {
|
|
392
|
+
const rv = new RunView();
|
|
393
|
+
const result = await rv.RunView({
|
|
394
|
+
EntityName: 'AI Models',
|
|
395
|
+
ExtraFilter: `ID = '${modelId}'`,
|
|
396
|
+
ResultType: 'entity_object'
|
|
397
|
+
});
|
|
398
|
+
return result.Results[0]?.Name || 'Unknown Model';
|
|
399
|
+
}
|
|
400
|
+
catch {
|
|
401
|
+
return 'Unknown Model';
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
async getExecutionDetails(executionId, type) {
|
|
405
|
+
try {
|
|
406
|
+
if (type === 'prompt') {
|
|
407
|
+
return await this.getPromptExecutionDetails(executionId);
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
return await this.getAgentExecutionDetails(executionId);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
catch (error) {
|
|
414
|
+
console.error('Error loading execution details:', error);
|
|
415
|
+
return null;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
async getPromptExecutionDetails(promptRunId) {
|
|
419
|
+
const rv = new RunView();
|
|
420
|
+
const result = await rv.RunView({
|
|
421
|
+
EntityName: 'MJ: AI Prompt Runs',
|
|
422
|
+
ExtraFilter: `ID = '${promptRunId}'`,
|
|
423
|
+
ResultType: 'entity_object'
|
|
424
|
+
});
|
|
425
|
+
const run = result.Results[0];
|
|
426
|
+
if (!run)
|
|
427
|
+
throw new Error('Prompt run not found');
|
|
428
|
+
const childrenResult = await rv.RunView({
|
|
429
|
+
EntityName: 'MJ: AI Prompt Runs',
|
|
430
|
+
ExtraFilter: `ParentID = '${promptRunId}'`,
|
|
431
|
+
ResultType: 'entity_object'
|
|
432
|
+
});
|
|
433
|
+
const children = await Promise.all(childrenResult.Results.map(child => this.getPromptExecutionDetails(child.ID)));
|
|
434
|
+
return {
|
|
435
|
+
id: run.ID,
|
|
436
|
+
type: 'prompt',
|
|
437
|
+
name: await this.getPromptName(run.PromptID),
|
|
438
|
+
status: run.Success ? 'completed' : 'failed',
|
|
439
|
+
startTime: new Date(run.RunAt),
|
|
440
|
+
endTime: run.CompletedAt ? new Date(run.CompletedAt) : undefined,
|
|
441
|
+
cost: run.Cost || 0,
|
|
442
|
+
tokens: run.TokensUsed || 0,
|
|
443
|
+
success: run.Success || false,
|
|
444
|
+
errorMessage: run.ErrorMessage || undefined,
|
|
445
|
+
parentId: run.ParentID || undefined,
|
|
446
|
+
children,
|
|
447
|
+
model: run.ModelID ? await this.getModelName(run.ModelID) : undefined
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
async getAgentExecutionDetails(agentRunId) {
|
|
451
|
+
const rv = new RunView();
|
|
452
|
+
const result = await rv.RunView({
|
|
453
|
+
EntityName: 'MJ: AI Agent Runs',
|
|
454
|
+
ExtraFilter: `ID = '${agentRunId}'`,
|
|
455
|
+
ResultType: 'entity_object'
|
|
456
|
+
});
|
|
457
|
+
const run = result.Results[0];
|
|
458
|
+
if (!run)
|
|
459
|
+
throw new Error('Agent run not found');
|
|
460
|
+
const childrenResult = await rv.RunView({
|
|
461
|
+
EntityName: 'MJ: AI Agent Runs',
|
|
462
|
+
ExtraFilter: `ParentRunID = '${agentRunId}'`,
|
|
463
|
+
ResultType: 'entity_object'
|
|
464
|
+
});
|
|
465
|
+
const children = await Promise.all(childrenResult.Results.map(child => this.getAgentExecutionDetails(child.ID)));
|
|
466
|
+
return {
|
|
467
|
+
id: run.ID,
|
|
468
|
+
type: 'agent',
|
|
469
|
+
name: await this.getAgentName(run.AgentID),
|
|
470
|
+
status: run.Status.toLowerCase(),
|
|
471
|
+
startTime: new Date(run.StartedAt),
|
|
472
|
+
endTime: run.CompletedAt ? new Date(run.CompletedAt) : undefined,
|
|
473
|
+
cost: run.TotalCost || 0,
|
|
474
|
+
tokens: run.TotalTokensUsed || 0,
|
|
475
|
+
success: run.Success || false,
|
|
476
|
+
errorMessage: run.ErrorMessage || undefined,
|
|
477
|
+
parentId: run.ParentRunID || undefined,
|
|
478
|
+
children
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
static ɵfac = function AIInstrumentationService_Factory(t) { return new (t || AIInstrumentationService)(); };
|
|
482
|
+
static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: AIInstrumentationService, factory: AIInstrumentationService.ɵfac, providedIn: 'root' });
|
|
483
|
+
}
|
|
484
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AIInstrumentationService, [{
|
|
485
|
+
type: Injectable,
|
|
486
|
+
args: [{
|
|
487
|
+
providedIn: 'root'
|
|
488
|
+
}]
|
|
489
|
+
}], () => [], null); })();
|
|
490
|
+
//# sourceMappingURL=ai-instrumentation.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-instrumentation.service.js","sourceRoot":"","sources":["../../../src/AI/services/ai-instrumentation.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -124,22 +124,22 @@ function ActionsManagementDashboardComponent_Conditional_12_Template(rf, ctx) {
|
|
|
124
124
|
i0.ɵɵproperty("themeColor", "primary");
|
|
125
125
|
} }
|
|
126
126
|
let ActionsManagementDashboardComponent = class ActionsManagementDashboardComponent extends BaseDashboard {
|
|
127
|
+
isLoading = false;
|
|
128
|
+
activeTab = 'overview'; // Default tab
|
|
129
|
+
subView = null; // Current sub-view
|
|
130
|
+
// Navigation items for bottom navigation
|
|
131
|
+
navigationItems = ['overview', 'execution', 'scheduled', 'code', 'entities', 'security'];
|
|
132
|
+
navigationConfig = [
|
|
133
|
+
{ text: 'Overview', icon: 'k-icon k-i-dashboard' },
|
|
134
|
+
{ text: 'Execution', icon: 'k-icon k-i-track-changes' },
|
|
135
|
+
{ text: 'Scheduled', icon: 'k-icon k-i-clock' },
|
|
136
|
+
{ text: 'Code', icon: 'k-icon k-i-code' },
|
|
137
|
+
{ text: 'Entities', icon: 'k-icon k-i-sitemap' },
|
|
138
|
+
{ text: 'Security', icon: 'k-icon k-i-lock' }
|
|
139
|
+
];
|
|
140
|
+
stateChangeSubject = new Subject();
|
|
127
141
|
constructor() {
|
|
128
142
|
super();
|
|
129
|
-
this.isLoading = false;
|
|
130
|
-
this.activeTab = 'overview'; // Default tab
|
|
131
|
-
this.subView = null; // Current sub-view
|
|
132
|
-
// Navigation items for bottom navigation
|
|
133
|
-
this.navigationItems = ['overview', 'execution', 'scheduled', 'code', 'entities', 'security'];
|
|
134
|
-
this.navigationConfig = [
|
|
135
|
-
{ text: 'Overview', icon: 'k-icon k-i-dashboard' },
|
|
136
|
-
{ text: 'Execution', icon: 'k-icon k-i-track-changes' },
|
|
137
|
-
{ text: 'Scheduled', icon: 'k-icon k-i-clock' },
|
|
138
|
-
{ text: 'Code', icon: 'k-icon k-i-code' },
|
|
139
|
-
{ text: 'Entities', icon: 'k-icon k-i-sitemap' },
|
|
140
|
-
{ text: 'Security', icon: 'k-icon k-i-lock' }
|
|
141
|
-
];
|
|
142
|
-
this.stateChangeSubject = new Subject();
|
|
143
143
|
this.setupStateManagement();
|
|
144
144
|
}
|
|
145
145
|
ngAfterViewInit() {
|
|
@@ -153,9 +153,8 @@ let ActionsManagementDashboardComponent = class ActionsManagementDashboardCompon
|
|
|
153
153
|
this.emitStateChange();
|
|
154
154
|
}
|
|
155
155
|
onNavigationChange(event) {
|
|
156
|
-
var _a;
|
|
157
156
|
const target = event.target;
|
|
158
|
-
const index = Array.from(
|
|
157
|
+
const index = Array.from(target.parentElement?.children || []).indexOf(target);
|
|
159
158
|
if (index >= 0 && index < this.navigationItems.length) {
|
|
160
159
|
this.activeTab = this.navigationItems[index];
|
|
161
160
|
this.emitStateChange();
|
|
@@ -241,32 +240,32 @@ let ActionsManagementDashboardComponent = class ActionsManagementDashboardCompon
|
|
|
241
240
|
onShowCategoriesListView() {
|
|
242
241
|
this.showSubView('categories-list');
|
|
243
242
|
}
|
|
243
|
+
static ɵfac = function ActionsManagementDashboardComponent_Factory(t) { return new (t || ActionsManagementDashboardComponent)(); };
|
|
244
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ActionsManagementDashboardComponent, selectors: [["mj-actions-management-dashboard"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 13, vars: 3, consts: [["mjFillContainer", "", 1, "actions-management-dashboard"], [1, "dashboard-header"], [1, "dashboard-title"], [1, "fa-solid", "fa-cogs"], [1, "dashboard-subtitle"], [1, "dashboard-content"], [1, "actions-navigation", 3, "itemClick", "items"], [1, "tab-content"], [1, "sub-view-container"], [1, "loading-overlay"], [3, "openEntityRecord", "showActionsListView", "showExecutionsListView", "showCategoriesListView"], [3, "openEntityRecord", "showExecutionsListView"], [3, "openEntityRecord"], [1, "sub-view-header"], ["kendoButton", "", 1, "back-button", 3, "click", "icon", "fillMode"], ["type", "converging-spinner", 3, "themeColor"]], template: function ActionsManagementDashboardComponent_Template(rf, ctx) { if (rf & 1) {
|
|
245
|
+
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "h2", 2);
|
|
246
|
+
i0.ɵɵelement(3, "i", 3);
|
|
247
|
+
i0.ɵɵtext(4, " Actions Management ");
|
|
248
|
+
i0.ɵɵelementEnd();
|
|
249
|
+
i0.ɵɵelementStart(5, "div", 4);
|
|
250
|
+
i0.ɵɵtext(6, " Manage actions, execution monitoring, and integrations ");
|
|
251
|
+
i0.ɵɵelementEnd()();
|
|
252
|
+
i0.ɵɵelementStart(7, "div", 5)(8, "kendo-bottomnavigation", 6);
|
|
253
|
+
i0.ɵɵlistener("itemClick", function ActionsManagementDashboardComponent_Template_kendo_bottomnavigation_itemClick_8_listener($event) { return ctx.onNavigationChange($event); });
|
|
254
|
+
i0.ɵɵelementEnd();
|
|
255
|
+
i0.ɵɵelementStart(9, "div", 7);
|
|
256
|
+
i0.ɵɵtemplate(10, ActionsManagementDashboardComponent_Conditional_10_Template, 6, 6)(11, ActionsManagementDashboardComponent_Conditional_11_Template, 7, 6, "div", 8);
|
|
257
|
+
i0.ɵɵelementEnd()();
|
|
258
|
+
i0.ɵɵtemplate(12, ActionsManagementDashboardComponent_Conditional_12_Template, 2, 1, "div", 9);
|
|
259
|
+
i0.ɵɵelementEnd();
|
|
260
|
+
} if (rf & 2) {
|
|
261
|
+
i0.ɵɵadvance(8);
|
|
262
|
+
i0.ɵɵproperty("items", ctx.navigationConfig);
|
|
263
|
+
i0.ɵɵadvance(2);
|
|
264
|
+
i0.ɵɵconditional(ctx.subView === null ? 10 : 11);
|
|
265
|
+
i0.ɵɵadvance(2);
|
|
266
|
+
i0.ɵɵconditional(ctx.isLoading ? 12 : -1);
|
|
267
|
+
} }, dependencies: [i1.LoaderComponent, i2.FillContainer, i3.BottomNavigationComponent, i4.ButtonComponent, i5.ActionsOverviewComponent, i6.ExecutionMonitoringComponent, i7.ScheduledActionsComponent, i8.CodeManagementComponent, i9.EntityIntegrationComponent, i10.SecurityPermissionsComponent, i11.ActionsListViewComponent, i12.ExecutionsListViewComponent, i13.CategoriesListViewComponent], styles: [".actions-management-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 1rem;\n background-color: var(--kendo-color-surface);\n\n .dashboard-header {\n margin-bottom: 1.5rem;\n \n .dashboard-title {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin: 0 0 0.5rem 0;\n font-size: 1.75rem;\n font-weight: 600;\n color: var(--kendo-color-on-app-surface);\n \n i {\n color: var(--kendo-color-primary);\n }\n }\n \n .dashboard-subtitle {\n color: var(--kendo-color-subtle);\n font-size: 1rem;\n margin-left: 2.25rem;\n }\n }\n\n .dashboard-content {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n\n .actions-navigation {\n margin-bottom: 1rem;\n border-radius: 0.5rem;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n }\n\n .tab-content {\n flex: 1;\n min-height: 0;\n background: var(--kendo-color-app-surface);\n border-radius: 0.5rem;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n\n .sub-view-container {\n height: 100%;\n display: flex;\n flex-direction: column;\n\n .sub-view-header {\n padding: 1rem 1.5rem;\n border-bottom: 1px solid var(--kendo-color-border);\n background: var(--kendo-color-surface);\n\n .back-button {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: var(--kendo-color-primary);\n font-weight: 600;\n\n &:hover {\n color: var(--kendo-color-primary-darker);\n }\n }\n }\n\n mj-actions-list-view,\n mj-executions-list-view,\n mj-categories-list-view {\n flex: 1;\n min-height: 0;\n }\n }\n }\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n }\n}\n\n// Navigation styling\n[_nghost-%COMP%] {\n .k-bottom-nav {\n .k-bottom-nav-item {\n transition: all 0.2s ease;\n \n &:hover {\n background-color: var(--kendo-color-base-hover);\n }\n \n &.k-state-selected {\n background-color: var(--kendo-color-primary);\n color: var(--kendo-color-on-primary);\n }\n }\n }\n}\n\n//[_ngcontent-%COMP%] Responsive[_ngcontent-%COMP%] design\n@media[_ngcontent-%COMP%] (max-width[_ngcontent-%COMP%]: 768px)[_ngcontent-%COMP%] {\n .actions-management-dashboard {\n padding: 0.5rem;\n \n .dashboard-header {\n margin-bottom: 1rem;\n \n .dashboard-title {\n font-size: 1.5rem;\n }\n \n .dashboard-subtitle {\n font-size: 0.9rem;\n }\n }\n }\n}"] });
|
|
244
268
|
};
|
|
245
|
-
ActionsManagementDashboardComponent.ɵfac = function ActionsManagementDashboardComponent_Factory(t) { return new (t || ActionsManagementDashboardComponent)(); };
|
|
246
|
-
ActionsManagementDashboardComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ActionsManagementDashboardComponent, selectors: [["mj-actions-management-dashboard"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 13, vars: 3, consts: [["mjFillContainer", "", 1, "actions-management-dashboard"], [1, "dashboard-header"], [1, "dashboard-title"], [1, "fa-solid", "fa-cogs"], [1, "dashboard-subtitle"], [1, "dashboard-content"], [1, "actions-navigation", 3, "itemClick", "items"], [1, "tab-content"], [1, "sub-view-container"], [1, "loading-overlay"], [3, "openEntityRecord", "showActionsListView", "showExecutionsListView", "showCategoriesListView"], [3, "openEntityRecord", "showExecutionsListView"], [3, "openEntityRecord"], [1, "sub-view-header"], ["kendoButton", "", 1, "back-button", 3, "click", "icon", "fillMode"], ["type", "converging-spinner", 3, "themeColor"]], template: function ActionsManagementDashboardComponent_Template(rf, ctx) { if (rf & 1) {
|
|
247
|
-
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "h2", 2);
|
|
248
|
-
i0.ɵɵelement(3, "i", 3);
|
|
249
|
-
i0.ɵɵtext(4, " Actions Management ");
|
|
250
|
-
i0.ɵɵelementEnd();
|
|
251
|
-
i0.ɵɵelementStart(5, "div", 4);
|
|
252
|
-
i0.ɵɵtext(6, " Manage actions, execution monitoring, and integrations ");
|
|
253
|
-
i0.ɵɵelementEnd()();
|
|
254
|
-
i0.ɵɵelementStart(7, "div", 5)(8, "kendo-bottomnavigation", 6);
|
|
255
|
-
i0.ɵɵlistener("itemClick", function ActionsManagementDashboardComponent_Template_kendo_bottomnavigation_itemClick_8_listener($event) { return ctx.onNavigationChange($event); });
|
|
256
|
-
i0.ɵɵelementEnd();
|
|
257
|
-
i0.ɵɵelementStart(9, "div", 7);
|
|
258
|
-
i0.ɵɵtemplate(10, ActionsManagementDashboardComponent_Conditional_10_Template, 6, 6)(11, ActionsManagementDashboardComponent_Conditional_11_Template, 7, 6, "div", 8);
|
|
259
|
-
i0.ɵɵelementEnd()();
|
|
260
|
-
i0.ɵɵtemplate(12, ActionsManagementDashboardComponent_Conditional_12_Template, 2, 1, "div", 9);
|
|
261
|
-
i0.ɵɵelementEnd();
|
|
262
|
-
} if (rf & 2) {
|
|
263
|
-
i0.ɵɵadvance(8);
|
|
264
|
-
i0.ɵɵproperty("items", ctx.navigationConfig);
|
|
265
|
-
i0.ɵɵadvance(2);
|
|
266
|
-
i0.ɵɵconditional(ctx.subView === null ? 10 : 11);
|
|
267
|
-
i0.ɵɵadvance(2);
|
|
268
|
-
i0.ɵɵconditional(ctx.isLoading ? 12 : -1);
|
|
269
|
-
} }, dependencies: [i1.LoaderComponent, i2.FillContainer, i3.BottomNavigationComponent, i4.ButtonComponent, i5.ActionsOverviewComponent, i6.ExecutionMonitoringComponent, i7.ScheduledActionsComponent, i8.CodeManagementComponent, i9.EntityIntegrationComponent, i10.SecurityPermissionsComponent, i11.ActionsListViewComponent, i12.ExecutionsListViewComponent, i13.CategoriesListViewComponent], styles: [".actions-management-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 1rem;\n background-color: var(--kendo-color-surface);\n\n .dashboard-header {\n margin-bottom: 1.5rem;\n \n .dashboard-title {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin: 0 0 0.5rem 0;\n font-size: 1.75rem;\n font-weight: 600;\n color: var(--kendo-color-on-app-surface);\n \n i {\n color: var(--kendo-color-primary);\n }\n }\n \n .dashboard-subtitle {\n color: var(--kendo-color-subtle);\n font-size: 1rem;\n margin-left: 2.25rem;\n }\n }\n\n .dashboard-content {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n\n .actions-navigation {\n margin-bottom: 1rem;\n border-radius: 0.5rem;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n }\n\n .tab-content {\n flex: 1;\n min-height: 0;\n background: var(--kendo-color-app-surface);\n border-radius: 0.5rem;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n\n .sub-view-container {\n height: 100%;\n display: flex;\n flex-direction: column;\n\n .sub-view-header {\n padding: 1rem 1.5rem;\n border-bottom: 1px solid var(--kendo-color-border);\n background: var(--kendo-color-surface);\n\n .back-button {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: var(--kendo-color-primary);\n font-weight: 600;\n\n &:hover {\n color: var(--kendo-color-primary-darker);\n }\n }\n }\n\n mj-actions-list-view,\n mj-executions-list-view,\n mj-categories-list-view {\n flex: 1;\n min-height: 0;\n }\n }\n }\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n }\n}\n\n// Navigation styling\n[_nghost-%COMP%] {\n .k-bottom-nav {\n .k-bottom-nav-item {\n transition: all 0.2s ease;\n \n &:hover {\n background-color: var(--kendo-color-base-hover);\n }\n \n &.k-state-selected {\n background-color: var(--kendo-color-primary);\n color: var(--kendo-color-on-primary);\n }\n }\n }\n}\n\n//[_ngcontent-%COMP%] Responsive[_ngcontent-%COMP%] design\n@media[_ngcontent-%COMP%] (max-width[_ngcontent-%COMP%]: 768px)[_ngcontent-%COMP%] {\n .actions-management-dashboard {\n padding: 0.5rem;\n \n .dashboard-header {\n margin-bottom: 1rem;\n \n .dashboard-title {\n font-size: 1.5rem;\n }\n \n .dashboard-subtitle {\n font-size: 0.9rem;\n }\n }\n }\n}"] });
|
|
270
269
|
ActionsManagementDashboardComponent = __decorate([
|
|
271
270
|
RegisterClass(BaseDashboard, 'ActionsManagement')
|
|
272
271
|
], ActionsManagementDashboardComponent);
|