@memberjunction/ng-dashboards 5.40.2 → 5.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +38 -4
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +148 -20
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-management-data.d.ts +216 -0
- package/dist/AI/components/analytics/realtime/realtime-management-data.d.ts.map +1 -0
- package/dist/AI/components/analytics/realtime/realtime-management-data.js +313 -0
- package/dist/AI/components/analytics/realtime/realtime-management-data.js.map +1 -0
- package/dist/AI/components/analytics/realtime/realtime-management.component.d.ts +103 -0
- package/dist/AI/components/analytics/realtime/realtime-management.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/realtime/realtime-management.component.js +1060 -0
- package/dist/AI/components/analytics/realtime/realtime-management.component.js.map +1 -0
- package/dist/AI/components/analytics/realtime/realtime-overview.component.d.ts +87 -0
- package/dist/AI/components/analytics/realtime/realtime-overview.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/realtime/realtime-overview.component.js +710 -0
- package/dist/AI/components/analytics/realtime/realtime-overview.component.js.map +1 -0
- package/dist/AI/components/analytics/realtime/realtime-session-data.d.ts +127 -0
- package/dist/AI/components/analytics/realtime/realtime-session-data.d.ts.map +1 -0
- package/dist/AI/components/analytics/realtime/realtime-session-data.js +233 -0
- package/dist/AI/components/analytics/realtime/realtime-session-data.js.map +1 -0
- package/dist/AI/components/analytics/realtime/realtime-sessions.component.d.ts +94 -0
- package/dist/AI/components/analytics/realtime/realtime-sessions.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/realtime/realtime-sessions.component.js +728 -0
- package/dist/AI/components/analytics/realtime/realtime-sessions.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js +2 -2
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +2 -2
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +2 -2
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/AI/index.d.ts +5 -0
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +7 -0
- package/dist/AI/index.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +2 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +12 -8
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts +12 -0
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +419 -333
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +5 -5
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +16 -2
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +37 -5
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +22 -19
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +18 -0
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +1 -1
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +3 -1
- package/dist/core-dashboards.module.js.map +1 -1
- package/package.json +55 -55
|
@@ -34,7 +34,15 @@ export declare class AIAnalyticsResourceComponent extends BaseResourceComponent
|
|
|
34
34
|
private cdr;
|
|
35
35
|
private executiveSummary?;
|
|
36
36
|
private promptRuns?;
|
|
37
|
-
|
|
37
|
+
/**
|
|
38
|
+
* Active analytics section. Implemented as a getter/setter so that changing
|
|
39
|
+
* it recomputes the (section-dependent) filter-field config exactly once,
|
|
40
|
+
* rather than rebuilding the whole FilterFieldConfig[] on every
|
|
41
|
+
* change-detection pass (the field config is template-bound twice).
|
|
42
|
+
*/
|
|
43
|
+
private _activeSection;
|
|
44
|
+
get ActiveSection(): string;
|
|
45
|
+
set ActiveSection(value: string);
|
|
38
46
|
CurrentTimeRange: string;
|
|
39
47
|
CurrentFilters: GlobalFilterState;
|
|
40
48
|
/** Single-value SortBy used by Model Performance (lives on the shared chrome). */
|
|
@@ -46,7 +54,11 @@ export declare class AIAnalyticsResourceComponent extends BaseResourceComponent
|
|
|
46
54
|
text: string;
|
|
47
55
|
value: string;
|
|
48
56
|
}[];
|
|
49
|
-
|
|
57
|
+
private _modelOptions;
|
|
58
|
+
private _agentOptions;
|
|
59
|
+
private _promptOptions;
|
|
60
|
+
private _vendorOptions;
|
|
61
|
+
/** Vendor options, built from AIEngineBase for the Model Performance leaderboard. */
|
|
50
62
|
get vendorOptions(): {
|
|
51
63
|
text: string;
|
|
52
64
|
value: string;
|
|
@@ -73,7 +85,7 @@ export declare class AIAnalyticsResourceComponent extends BaseResourceComponent
|
|
|
73
85
|
text: string;
|
|
74
86
|
value: string;
|
|
75
87
|
}[];
|
|
76
|
-
/** Built
|
|
88
|
+
/** Built from AIEngineBase (see recomputeOptionLists). */
|
|
77
89
|
get modelOptions(): {
|
|
78
90
|
text: string;
|
|
79
91
|
value: string;
|
|
@@ -86,6 +98,19 @@ export declare class AIAnalyticsResourceComponent extends BaseResourceComponent
|
|
|
86
98
|
text: string;
|
|
87
99
|
value: string;
|
|
88
100
|
}[];
|
|
101
|
+
/**
|
|
102
|
+
* Build the four option lists from AIEngineBase's cached metadata. Called once
|
|
103
|
+
* after the engine is loaded (ngOnInit). Mirrors the exact map/filter/sort the
|
|
104
|
+
* former getters performed, so the values are identical — just computed once.
|
|
105
|
+
*
|
|
106
|
+
* Accepted staleness tradeoff: these lists are built once after engine load and
|
|
107
|
+
* are NOT reactive — a mid-session AIEngineBase metadata reload (new model/agent/
|
|
108
|
+
* prompt/vendor) would not refresh them until this component is re-created. That
|
|
109
|
+
* is acceptable for an analytics surface (its option lists are near-static within
|
|
110
|
+
* a session); we deliberately do NOT wire observable reactivity here. The former
|
|
111
|
+
* getters re-read the engine on every CD, which was the perf cost we removed.
|
|
112
|
+
*/
|
|
113
|
+
private recomputeOptionLists;
|
|
89
114
|
/** Time-range chip options for the toolbar slot. */
|
|
90
115
|
get timeRangeChipOptions(): {
|
|
91
116
|
text: string;
|
|
@@ -93,8 +118,17 @@ export declare class AIAnalyticsResourceComponent extends BaseResourceComponent
|
|
|
93
118
|
}[];
|
|
94
119
|
/** Compare-mode visual state (kept on the shell now that analytics-filter-bar is gone). */
|
|
95
120
|
compareActive: boolean;
|
|
96
|
-
/**
|
|
121
|
+
/**
|
|
122
|
+
* Precomputed popover field config for the active section. Recomputed only when
|
|
123
|
+
* ActiveSection changes (via its setter) or after the option lists load — NOT
|
|
124
|
+
* on every CD pass, even though the template binds this twice (the `@if` guard
|
|
125
|
+
* and the `[Fields]` input).
|
|
126
|
+
*/
|
|
127
|
+
private _analyticsFilterFields;
|
|
128
|
+
/** Field config for the popover, based on the active section (precomputed). */
|
|
97
129
|
get analyticsFilterFields(): FilterFieldConfig[];
|
|
130
|
+
/** Rebuild {@link _analyticsFilterFields} for the current section from the option lists. */
|
|
131
|
+
private recomputeFilterFields;
|
|
98
132
|
/** Single-value flattened state for the centralized panel (the panel takes scalar values; we hold arrays in CurrentFilters). */
|
|
99
133
|
get analyticsFilterValues(): Record<string, unknown>;
|
|
100
134
|
/** Receive popover updates and translate scalar → array shape used by GlobalFilterState. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-analytics-resource.component.d.ts","sourceRoot":"","sources":["../../../../src/AI/components/analytics/ai-analytics-resource.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAgC,MAAM,EAAE,SAAS,EAAqB,MAAM,eAAe,CAAC;AAGnG,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAkB,MAAM,+BAA+B,CAAC;AAE7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAA0B,iBAAiB,EAAE,MAAM,kDAAkD,CAAC;AAE7G,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;;AAEtG,UAAU,OAAO;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,
|
|
1
|
+
{"version":3,"file":"ai-analytics-resource.component.d.ts","sourceRoot":"","sources":["../../../../src/AI/components/analytics/ai-analytics-resource.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,6 +31,9 @@ import * as i5 from "./model-performance/model-performance.component";
|
|
|
31
31
|
import * as i6 from "./cost-budget/cost-budget.component";
|
|
32
32
|
import * as i7 from "./error-analysis/error-analysis.component";
|
|
33
33
|
import * as i8 from "./usage-patterns/usage-patterns.component";
|
|
34
|
+
import * as i9 from "./realtime/realtime-overview.component";
|
|
35
|
+
import * as i10 from "./realtime/realtime-sessions.component";
|
|
36
|
+
import * as i11 from "./realtime/realtime-management.component";
|
|
34
37
|
const _c0 = ["executiveSummary"];
|
|
35
38
|
const _c1 = ["promptRuns"];
|
|
36
39
|
const _forTrack0 = ($index, $item) => $item.value;
|
|
@@ -134,6 +137,27 @@ function AIAnalyticsResourceComponent_Case_19_Template(rf, ctx) { if (rf & 1) {
|
|
|
134
137
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
135
138
|
i0.ɵɵproperty("TimeRange", ctx_r1.CurrentTimeRange);
|
|
136
139
|
} }
|
|
140
|
+
function AIAnalyticsResourceComponent_Case_20_Template(rf, ctx) { if (rf & 1) {
|
|
141
|
+
const _r8 = i0.ɵɵgetCurrentView();
|
|
142
|
+
i0.ɵɵelementStart(0, "app-analytics-realtime-overview", 26);
|
|
143
|
+
i0.ɵɵlistener("SectionNavigate", function AIAnalyticsResourceComponent_Case_20_Template_app_analytics_realtime_overview_SectionNavigate_0_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnSectionChange($event)); });
|
|
144
|
+
i0.ɵɵelementEnd();
|
|
145
|
+
} if (rf & 2) {
|
|
146
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
147
|
+
i0.ɵɵproperty("TimeRange", ctx_r1.CurrentTimeRange);
|
|
148
|
+
} }
|
|
149
|
+
function AIAnalyticsResourceComponent_Case_21_Template(rf, ctx) { if (rf & 1) {
|
|
150
|
+
i0.ɵɵelement(0, "app-analytics-realtime-sessions", 15);
|
|
151
|
+
} if (rf & 2) {
|
|
152
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
153
|
+
i0.ɵɵproperty("TimeRange", ctx_r1.CurrentTimeRange);
|
|
154
|
+
} }
|
|
155
|
+
function AIAnalyticsResourceComponent_Case_22_Template(rf, ctx) { if (rf & 1) {
|
|
156
|
+
i0.ɵɵelement(0, "app-realtime-management", 15);
|
|
157
|
+
} if (rf & 2) {
|
|
158
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
159
|
+
i0.ɵɵproperty("TimeRange", ctx_r1.CurrentTimeRange);
|
|
160
|
+
} }
|
|
137
161
|
let AIAnalyticsResourceComponent = class AIAnalyticsResourceComponent extends BaseResourceComponent {
|
|
138
162
|
USER_SETTINGS_KEY = 'AI.Analytics.UserPreferences';
|
|
139
163
|
settingsPersistSubject = new Subject();
|
|
@@ -142,7 +166,22 @@ let AIAnalyticsResourceComponent = class AIAnalyticsResourceComponent extends Ba
|
|
|
142
166
|
cdr = inject(ChangeDetectorRef);
|
|
143
167
|
executiveSummary;
|
|
144
168
|
promptRuns;
|
|
145
|
-
|
|
169
|
+
/**
|
|
170
|
+
* Active analytics section. Implemented as a getter/setter so that changing
|
|
171
|
+
* it recomputes the (section-dependent) filter-field config exactly once,
|
|
172
|
+
* rather than rebuilding the whole FilterFieldConfig[] on every
|
|
173
|
+
* change-detection pass (the field config is template-bound twice).
|
|
174
|
+
*/
|
|
175
|
+
_activeSection = 'executive-summary';
|
|
176
|
+
get ActiveSection() {
|
|
177
|
+
return this._activeSection;
|
|
178
|
+
}
|
|
179
|
+
set ActiveSection(value) {
|
|
180
|
+
if (value !== this._activeSection) {
|
|
181
|
+
this._activeSection = value;
|
|
182
|
+
this.recomputeFilterFields();
|
|
183
|
+
}
|
|
184
|
+
}
|
|
146
185
|
CurrentTimeRange = '24h';
|
|
147
186
|
CurrentFilters = {
|
|
148
187
|
Models: [],
|
|
@@ -162,10 +201,20 @@ let AIAnalyticsResourceComponent = class AIAnalyticsResourceComponent extends Ba
|
|
|
162
201
|
{ text: 'By Reliability', value: 'reliability' },
|
|
163
202
|
{ text: 'By Usage', value: 'usage-volume' }
|
|
164
203
|
];
|
|
165
|
-
|
|
204
|
+
// ── Precomputed option lists ────────────────────────────────────────────
|
|
205
|
+
// Built ONCE from AIEngineBase's (process-cached, load-once) lists in
|
|
206
|
+
// ngOnInit — see recomputeOptionLists. Each used to be a getter doing
|
|
207
|
+
// .map().sort() (and .filter() for agents) over engine-wide lists; because
|
|
208
|
+
// analyticsFilterFields is template-bound twice they re-ran 2×/CD. The
|
|
209
|
+
// backing fields are read by both the public getters (kept for any external
|
|
210
|
+
// callers) and by recomputeFilterFields.
|
|
211
|
+
_modelOptions = [];
|
|
212
|
+
_agentOptions = [];
|
|
213
|
+
_promptOptions = [];
|
|
214
|
+
_vendorOptions = [];
|
|
215
|
+
/** Vendor options, built from AIEngineBase for the Model Performance leaderboard. */
|
|
166
216
|
get vendorOptions() {
|
|
167
|
-
return
|
|
168
|
-
?.sort((a, b) => a.text.localeCompare(b.text)) ?? [];
|
|
217
|
+
return this._vendorOptions;
|
|
169
218
|
}
|
|
170
219
|
/** Per-section filter-bar config — switched on ActiveSection. */
|
|
171
220
|
get FilterBarConfig() {
|
|
@@ -184,6 +233,17 @@ let AIAnalyticsResourceComponent = class AIAnalyticsResourceComponent extends Ba
|
|
|
184
233
|
return { ShowModelFilter: true, ShowAgentFilter: false, ShowPromptFilter: true, ShowStatusFilter: false, ShowSortBy: false, ShowVendor: false, ShowCompareToggle: false, ShowExportButton: false, TimeRangeOptions: ['1h', '6h', '24h', '7d', '30d'] };
|
|
185
234
|
case 'usage-patterns':
|
|
186
235
|
return { ShowModelFilter: false, ShowAgentFilter: false, ShowPromptFilter: false, ShowStatusFilter: false, ShowSortBy: false, ShowVendor: false, ShowCompareToggle: false, ShowExportButton: false, TimeRangeOptions: ['1h', '6h', '24h', '7d', '30d'] };
|
|
236
|
+
// Realtime Voice sections own their filters internally (search/status/
|
|
237
|
+
// target/user/host live with the grid); only the time-range chips come
|
|
238
|
+
// from the shared chrome. Session data is bucketed daily, so the
|
|
239
|
+
// sub-day ranges are dropped.
|
|
240
|
+
case 'realtime-overview':
|
|
241
|
+
case 'realtime-sessions':
|
|
242
|
+
// Realtime management owns its sub-tab rail + per-surface filters
|
|
243
|
+
// internally; only the time-range chips come from the shared chrome
|
|
244
|
+
// (it windows session history daily, so sub-day ranges are dropped).
|
|
245
|
+
case 'realtime-management':
|
|
246
|
+
return { ShowModelFilter: false, ShowAgentFilter: false, ShowPromptFilter: false, ShowStatusFilter: false, ShowSortBy: false, ShowVendor: false, ShowCompareToggle: false, ShowExportButton: false, TimeRangeOptions: ['24h', '7d', '30d'] };
|
|
187
247
|
default:
|
|
188
248
|
return { ShowModelFilter: false, ShowAgentFilter: false, ShowPromptFilter: false, ShowStatusFilter: false, ShowSortBy: false, ShowVendor: false, ShowCompareToggle: false, ShowExportButton: false, TimeRangeOptions: ['1h', '6h', '24h', '7d', '30d'] };
|
|
189
249
|
}
|
|
@@ -203,19 +263,39 @@ let AIAnalyticsResourceComponent = class AIAnalyticsResourceComponent extends Ba
|
|
|
203
263
|
{ text: 'Pending', value: 'Pending' },
|
|
204
264
|
{ text: 'Canceled', value: 'Canceled' },
|
|
205
265
|
];
|
|
206
|
-
/** Built
|
|
266
|
+
/** Built from AIEngineBase (see recomputeOptionLists). */
|
|
207
267
|
get modelOptions() {
|
|
208
|
-
return
|
|
209
|
-
?.sort((a, b) => a.text.localeCompare(b.text)) ?? [];
|
|
268
|
+
return this._modelOptions;
|
|
210
269
|
}
|
|
211
270
|
get agentOptions() {
|
|
212
|
-
return
|
|
271
|
+
return this._agentOptions;
|
|
272
|
+
}
|
|
273
|
+
get promptOptions() {
|
|
274
|
+
return this._promptOptions;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Build the four option lists from AIEngineBase's cached metadata. Called once
|
|
278
|
+
* after the engine is loaded (ngOnInit). Mirrors the exact map/filter/sort the
|
|
279
|
+
* former getters performed, so the values are identical — just computed once.
|
|
280
|
+
*
|
|
281
|
+
* Accepted staleness tradeoff: these lists are built once after engine load and
|
|
282
|
+
* are NOT reactive — a mid-session AIEngineBase metadata reload (new model/agent/
|
|
283
|
+
* prompt/vendor) would not refresh them until this component is re-created. That
|
|
284
|
+
* is acceptable for an analytics surface (its option lists are near-static within
|
|
285
|
+
* a session); we deliberately do NOT wire observable reactivity here. The former
|
|
286
|
+
* getters re-read the engine on every CD, which was the perf cost we removed.
|
|
287
|
+
*/
|
|
288
|
+
recomputeOptionLists() {
|
|
289
|
+
const engine = AIEngineBase.Instance;
|
|
290
|
+
this._modelOptions = engine?.Models?.map(m => ({ text: m.Name ?? '', value: m.ID }))
|
|
291
|
+
?.sort((a, b) => a.text.localeCompare(b.text)) ?? [];
|
|
292
|
+
this._agentOptions = engine?.Agents
|
|
213
293
|
?.filter(a => a.Status === 'Active')
|
|
214
294
|
?.map(a => ({ text: a.Name ?? '', value: a.ID }))
|
|
215
295
|
?.sort((a, b) => a.text.localeCompare(b.text)) ?? [];
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
296
|
+
this._promptOptions = engine?.Prompts?.map(p => ({ text: p.Name ?? '', value: p.ID }))
|
|
297
|
+
?.sort((a, b) => a.text.localeCompare(b.text)) ?? [];
|
|
298
|
+
this._vendorOptions = engine?.Vendors?.map(v => ({ text: v.Name ?? '', value: v.ID ?? '' }))
|
|
219
299
|
?.sort((a, b) => a.text.localeCompare(b.text)) ?? [];
|
|
220
300
|
}
|
|
221
301
|
/** Time-range chip options for the toolbar slot. */
|
|
@@ -224,8 +304,19 @@ let AIAnalyticsResourceComponent = class AIAnalyticsResourceComponent extends Ba
|
|
|
224
304
|
}
|
|
225
305
|
/** Compare-mode visual state (kept on the shell now that analytics-filter-bar is gone). */
|
|
226
306
|
compareActive = false;
|
|
227
|
-
/**
|
|
307
|
+
/**
|
|
308
|
+
* Precomputed popover field config for the active section. Recomputed only when
|
|
309
|
+
* ActiveSection changes (via its setter) or after the option lists load — NOT
|
|
310
|
+
* on every CD pass, even though the template binds this twice (the `@if` guard
|
|
311
|
+
* and the `[Fields]` input).
|
|
312
|
+
*/
|
|
313
|
+
_analyticsFilterFields = [];
|
|
314
|
+
/** Field config for the popover, based on the active section (precomputed). */
|
|
228
315
|
get analyticsFilterFields() {
|
|
316
|
+
return this._analyticsFilterFields;
|
|
317
|
+
}
|
|
318
|
+
/** Rebuild {@link _analyticsFilterFields} for the current section from the option lists. */
|
|
319
|
+
recomputeFilterFields() {
|
|
229
320
|
const cfg = this.FilterBarConfig;
|
|
230
321
|
const fields = [];
|
|
231
322
|
if (cfg.ShowModelFilter) {
|
|
@@ -286,7 +377,7 @@ let AIAnalyticsResourceComponent = class AIAnalyticsResourceComponent extends Ba
|
|
|
286
377
|
options: [{ text: 'All Vendors', value: '' }, ...this.vendorOptions],
|
|
287
378
|
});
|
|
288
379
|
}
|
|
289
|
-
|
|
380
|
+
this._analyticsFilterFields = fields;
|
|
290
381
|
}
|
|
291
382
|
/** Single-value flattened state for the centralized panel (the panel takes scalar values; we hold arrays in CurrentFilters). */
|
|
292
383
|
get analyticsFilterValues() {
|
|
@@ -355,6 +446,13 @@ let AIAnalyticsResourceComponent = class AIAnalyticsResourceComponent extends Ba
|
|
|
355
446
|
Description: 'Failure patterns and root causes' },
|
|
356
447
|
{ Label: 'Usage Patterns', Icon: 'fa-solid fa-clock', Key: 'usage-patterns',
|
|
357
448
|
Description: 'Volume, frequency, and concurrency over time' },
|
|
449
|
+
{ Key: 'divider2' },
|
|
450
|
+
{ Label: 'Realtime Voice', Icon: 'fa-solid fa-tower-broadcast', Key: 'realtime-overview',
|
|
451
|
+
Description: 'Operational analytics for voice-agent sessions — sessions, channels, and delegated runs' },
|
|
452
|
+
{ Label: 'Voice Sessions', Icon: 'fa-solid fa-table-list', Key: 'realtime-sessions',
|
|
453
|
+
Description: 'Every long-lived agent session — live calls, idle holds, and closed history' },
|
|
454
|
+
{ Label: 'Realtime Management', Icon: 'fa-solid fa-satellite-dish', Key: 'realtime-management',
|
|
455
|
+
Description: 'Manage the realtime + bridge surface — live sessions, bridge providers, agent identities, channels, co-agents, history, and metrics' },
|
|
358
456
|
];
|
|
359
457
|
/**
|
|
360
458
|
* Active section metadata — drives <mj-page-header-interior> Title +
|
|
@@ -374,7 +472,7 @@ let AIAnalyticsResourceComponent = class AIAnalyticsResourceComponent extends Ba
|
|
|
374
472
|
get navSections() {
|
|
375
473
|
const sections = [{ items: [] }];
|
|
376
474
|
for (const item of this.NavItems) {
|
|
377
|
-
if (item.Key
|
|
475
|
+
if (item.Key.startsWith('divider')) {
|
|
378
476
|
sections.push({ items: [] });
|
|
379
477
|
}
|
|
380
478
|
else {
|
|
@@ -394,7 +492,21 @@ let AIAnalyticsResourceComponent = class AIAnalyticsResourceComponent extends Ba
|
|
|
394
492
|
async ngOnInit() {
|
|
395
493
|
super.ngOnInit();
|
|
396
494
|
this.setupSettingsDebounce();
|
|
495
|
+
// AIEngineBase is deferred at startup — ensure it's loaded, then build the
|
|
496
|
+
// option lists ONCE so the precomputed filter-field config has real data.
|
|
497
|
+
try {
|
|
498
|
+
await AIEngineBase.Instance.EnsureLoaded();
|
|
499
|
+
}
|
|
500
|
+
catch {
|
|
501
|
+
// Fall through with whatever (possibly empty) cache exists — the option
|
|
502
|
+
// lists tolerate an unloaded engine (same as the former lazy getters).
|
|
503
|
+
}
|
|
504
|
+
this.recomputeOptionLists();
|
|
397
505
|
await this.loadUserSettings();
|
|
506
|
+
// Final rebuild: covers both the initial section and any section restored
|
|
507
|
+
// from user settings, now that the option lists are populated.
|
|
508
|
+
this.recomputeFilterFields();
|
|
509
|
+
this.cdr.detectChanges();
|
|
398
510
|
this.NotifyLoadComplete();
|
|
399
511
|
}
|
|
400
512
|
ngOnDestroy() {
|
|
@@ -410,7 +522,7 @@ let AIAnalyticsResourceComponent = class AIAnalyticsResourceComponent extends Ba
|
|
|
410
522
|
}
|
|
411
523
|
/** Navigate to a different analytics section */
|
|
412
524
|
OnSectionChange(key) {
|
|
413
|
-
if (key
|
|
525
|
+
if (key.startsWith('divider') || key === this.ActiveSection) {
|
|
414
526
|
return;
|
|
415
527
|
}
|
|
416
528
|
this.ActiveSection = key;
|
|
@@ -511,7 +623,7 @@ let AIAnalyticsResourceComponent = class AIAnalyticsResourceComponent extends Ba
|
|
|
511
623
|
let _t;
|
|
512
624
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.executiveSummary = _t.first);
|
|
513
625
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.promptRuns = _t.first);
|
|
514
|
-
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
626
|
+
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 23, vars: 11, consts: [["executiveSummary", ""], ["promptRuns", ""], ["Title", "AI Analytics", "Icon", "fa-solid fa-chart-line", "Subtitle", "Performance, cost, and usage analytics"], [1, "analytics-shell", 3, "Padding"], ["MobileTitle", "Analytics", 3, "ItemClicked", "Sections", "ActiveId"], [3, "Title", "Subtitle"], ["actions", ""], [3, "ActiveCount", "ShowClearAll"], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "toggleable", "selected"], ["mjButton", "", "variant", "secondary", "size", "sm"], ["toolbar", "", 1, "time-range-chips"], [3, "Padding"], [1, "analytics-content"], [3, "TimeRange", "Filters"], [3, "TimeRange", "SortBy", "SelectedVendor"], [3, "TimeRange"], [3, "ClearAllRequested", "ActiveCount", "ShowClearAll"], [3, "ValuesChange", "Reset", "Fields", "Values"], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "selectedChange", "toggleable", "selected"], [1, "fa-solid", "fa-code-compare"], [1, "mj-action-label"], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "click"], [1, "fa-solid", "fa-download"], [3, "Label", "Active"], [3, "Clicked", "Label", "Active"], [3, "SectionNavigate", "TimeRange", "Filters"], [3, "SectionNavigate", "TimeRange"]], template: function AIAnalyticsResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
515
627
|
i0.ɵɵelementStart(0, "mj-page-layout");
|
|
516
628
|
i0.ɵɵelement(1, "mj-page-header", 2);
|
|
517
629
|
i0.ɵɵelementStart(2, "mj-page-body", 3)(3, "mj-left-nav", 4);
|
|
@@ -525,7 +637,7 @@ let AIAnalyticsResourceComponent = class AIAnalyticsResourceComponent extends Ba
|
|
|
525
637
|
i0.ɵɵconditionalCreate(10, AIAnalyticsResourceComponent_Conditional_10_Template, 3, 0, "div", 10);
|
|
526
638
|
i0.ɵɵelementEnd();
|
|
527
639
|
i0.ɵɵelementStart(11, "mj-page-body-interior", 11)(12, "div", 12);
|
|
528
|
-
i0.ɵɵconditionalCreate(13, AIAnalyticsResourceComponent_Case_13_Template, 2, 2, "app-analytics-executive-summary", 13)(14, AIAnalyticsResourceComponent_Case_14_Template, 2, 2, "app-analytics-prompt-runs", 13)(15, AIAnalyticsResourceComponent_Case_15_Template, 1, 2, "app-analytics-agent-runs", 13)(16, AIAnalyticsResourceComponent_Case_16_Template, 1, 3, "app-analytics-model-performance", 14)(17, AIAnalyticsResourceComponent_Case_17_Template, 1, 2, "app-analytics-cost-budget", 13)(18, AIAnalyticsResourceComponent_Case_18_Template, 1, 2, "app-analytics-error-analysis", 13)(19, AIAnalyticsResourceComponent_Case_19_Template, 1, 1, "app-analytics-usage-patterns", 15);
|
|
640
|
+
i0.ɵɵconditionalCreate(13, AIAnalyticsResourceComponent_Case_13_Template, 2, 2, "app-analytics-executive-summary", 13)(14, AIAnalyticsResourceComponent_Case_14_Template, 2, 2, "app-analytics-prompt-runs", 13)(15, AIAnalyticsResourceComponent_Case_15_Template, 1, 2, "app-analytics-agent-runs", 13)(16, AIAnalyticsResourceComponent_Case_16_Template, 1, 3, "app-analytics-model-performance", 14)(17, AIAnalyticsResourceComponent_Case_17_Template, 1, 2, "app-analytics-cost-budget", 13)(18, AIAnalyticsResourceComponent_Case_18_Template, 1, 2, "app-analytics-error-analysis", 13)(19, AIAnalyticsResourceComponent_Case_19_Template, 1, 1, "app-analytics-usage-patterns", 15)(20, AIAnalyticsResourceComponent_Case_20_Template, 1, 1, "app-analytics-realtime-overview", 15)(21, AIAnalyticsResourceComponent_Case_21_Template, 1, 1, "app-analytics-realtime-sessions", 15)(22, AIAnalyticsResourceComponent_Case_22_Template, 1, 1, "app-realtime-management", 15);
|
|
529
641
|
i0.ɵɵelementEnd()()()()();
|
|
530
642
|
} if (rf & 2) {
|
|
531
643
|
let tmp_10_0;
|
|
@@ -546,8 +658,8 @@ let AIAnalyticsResourceComponent = class AIAnalyticsResourceComponent extends Ba
|
|
|
546
658
|
i0.ɵɵadvance();
|
|
547
659
|
i0.ɵɵproperty("Padding", false);
|
|
548
660
|
i0.ɵɵadvance(2);
|
|
549
|
-
i0.ɵɵconditional((tmp_10_0 = ctx.ActiveSection) === "executive-summary" ? 13 : tmp_10_0 === "prompt-runs" ? 14 : tmp_10_0 === "agent-runs" ? 15 : tmp_10_0 === "model-performance" ? 16 : tmp_10_0 === "cost-budget" ? 17 : tmp_10_0 === "error-analysis" ? 18 : tmp_10_0 === "usage-patterns" ? 19 : -1);
|
|
550
|
-
} }, dependencies: [i1.MJButtonDirective, i1.MJPageHeaderComponent, i1.MJPageLayoutComponent, i1.MJPageBodyComponent, i1.MJPageHeaderInteriorComponent, i1.MJPageBodyInteriorComponent, i1.MJLeftNavComponent, i1.MJLeftNavContentComponent, i1.MJFilterPopoverComponent, i1.MJFilterPanelComponent, i1.MJFilterChipComponent, i2.AnalyticsExecutiveSummaryComponent, i3.AnalyticsPromptRunsComponent, i4.AnalyticsAgentRunsComponent, i5.AnalyticsModelPerformanceComponent, i6.AnalyticsCostBudgetComponent, i7.AnalyticsErrorAnalysisComponent, i8.AnalyticsUsagePatternsComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n }\n\n .analytics-shell[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n min-height: 0;\n background: var(--mj-bg-page);\n }\n\n \n\n\n \n\n\n\n\n \n\n\n .analytics-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n }\n\n \n\n\n .section-placeholder[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 80px 24px;\n color: var(--mj-text-muted);\n }\n\n .placeholder-icon[_ngcontent-%COMP%] {\n font-size: 48px;\n margin-bottom: 20px;\n color: var(--mj-brand-primary);\n opacity: 0.4;\n }\n\n .section-placeholder[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 8px;\n }\n\n .section-placeholder[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-muted);\n margin: 0;\n max-width: 420px;\n }\n\n \n\n\n \n\n\n @media (max-width: 768px) {\n .analytics-content[_ngcontent-%COMP%] {\n padding: 16px;\n }\n }\n\n \n\n\n\n @media (max-width: 700px) {\n .analytics-shell[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n }"] });
|
|
661
|
+
i0.ɵɵconditional((tmp_10_0 = ctx.ActiveSection) === "executive-summary" ? 13 : tmp_10_0 === "prompt-runs" ? 14 : tmp_10_0 === "agent-runs" ? 15 : tmp_10_0 === "model-performance" ? 16 : tmp_10_0 === "cost-budget" ? 17 : tmp_10_0 === "error-analysis" ? 18 : tmp_10_0 === "usage-patterns" ? 19 : tmp_10_0 === "realtime-overview" ? 20 : tmp_10_0 === "realtime-sessions" ? 21 : tmp_10_0 === "realtime-management" ? 22 : -1);
|
|
662
|
+
} }, dependencies: [i1.MJButtonDirective, i1.MJPageHeaderComponent, i1.MJPageLayoutComponent, i1.MJPageBodyComponent, i1.MJPageHeaderInteriorComponent, i1.MJPageBodyInteriorComponent, i1.MJLeftNavComponent, i1.MJLeftNavContentComponent, i1.MJFilterPopoverComponent, i1.MJFilterPanelComponent, i1.MJFilterChipComponent, i2.AnalyticsExecutiveSummaryComponent, i3.AnalyticsPromptRunsComponent, i4.AnalyticsAgentRunsComponent, i5.AnalyticsModelPerformanceComponent, i6.AnalyticsCostBudgetComponent, i7.AnalyticsErrorAnalysisComponent, i8.AnalyticsUsagePatternsComponent, i9.AnalyticsRealtimeOverviewComponent, i10.AnalyticsRealtimeSessionsComponent, i11.RealtimeManagementComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n }\n\n .analytics-shell[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n min-height: 0;\n background: var(--mj-bg-page);\n }\n\n \n\n\n \n\n\n\n\n \n\n\n .analytics-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n }\n\n \n\n\n .section-placeholder[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 80px 24px;\n color: var(--mj-text-muted);\n }\n\n .placeholder-icon[_ngcontent-%COMP%] {\n font-size: 48px;\n margin-bottom: 20px;\n color: var(--mj-brand-primary);\n opacity: 0.4;\n }\n\n .section-placeholder[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 8px;\n }\n\n .section-placeholder[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-muted);\n margin: 0;\n max-width: 420px;\n }\n\n \n\n\n \n\n\n @media (max-width: 768px) {\n .analytics-content[_ngcontent-%COMP%] {\n padding: 16px;\n }\n }\n\n \n\n\n\n @media (max-width: 700px) {\n .analytics-shell[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n }"] });
|
|
551
663
|
};
|
|
552
664
|
AIAnalyticsResourceComponent = __decorate([
|
|
553
665
|
RegisterClass(BaseResourceComponent, 'AIAnalyticsResource')
|
|
@@ -669,6 +781,22 @@ export { AIAnalyticsResourceComponent };
|
|
|
669
781
|
[TimeRange]="CurrentTimeRange"
|
|
670
782
|
></app-analytics-usage-patterns>
|
|
671
783
|
}
|
|
784
|
+
@case ('realtime-overview') {
|
|
785
|
+
<app-analytics-realtime-overview
|
|
786
|
+
[TimeRange]="CurrentTimeRange"
|
|
787
|
+
(SectionNavigate)="OnSectionChange($event)"
|
|
788
|
+
></app-analytics-realtime-overview>
|
|
789
|
+
}
|
|
790
|
+
@case ('realtime-sessions') {
|
|
791
|
+
<app-analytics-realtime-sessions
|
|
792
|
+
[TimeRange]="CurrentTimeRange"
|
|
793
|
+
></app-analytics-realtime-sessions>
|
|
794
|
+
}
|
|
795
|
+
@case ('realtime-management') {
|
|
796
|
+
<app-realtime-management
|
|
797
|
+
[TimeRange]="CurrentTimeRange"
|
|
798
|
+
></app-realtime-management>
|
|
799
|
+
}
|
|
672
800
|
}
|
|
673
801
|
</div>
|
|
674
802
|
</mj-page-body-interior>
|
|
@@ -683,7 +811,7 @@ export { AIAnalyticsResourceComponent };
|
|
|
683
811
|
type: ViewChild,
|
|
684
812
|
args: ['promptRuns']
|
|
685
813
|
}] }); })();
|
|
686
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIAnalyticsResourceComponent, { className: "AIAnalyticsResourceComponent", filePath: "src/AI/components/analytics/ai-analytics-resource.component.ts", lineNumber:
|
|
814
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIAnalyticsResourceComponent, { className: "AIAnalyticsResourceComponent", filePath: "src/AI/components/analytics/ai-analytics-resource.component.ts", lineNumber: 257 }); })();
|
|
687
815
|
export function LoadAIAnalyticsResource() {
|
|
688
816
|
// Prevents tree-shaking of the @RegisterClass decorator
|
|
689
817
|
}
|