@memberjunction/ng-dashboards 5.25.0 → 5.27.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/agent-runs/agent-run-analysis.component.d.ts +96 -0
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +710 -0
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +52 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +356 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +52 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.js +306 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +81 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +744 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -0
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +61 -0
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +490 -0
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -0
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts +77 -0
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +673 -0
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +65 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.js +537 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -0
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +131 -0
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +1030 -0
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +78 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +569 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -0
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +4 -14
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/overview/ai-overview-hub.component.d.ts +58 -0
- package/dist/AI/components/overview/ai-overview-hub.component.d.ts.map +1 -0
- package/dist/AI/components/overview/ai-overview-hub.component.js +315 -0
- package/dist/AI/components/overview/ai-overview-hub.component.js.map +1 -0
- package/dist/AI/components/prompts/prompt-management.component.js +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/index.d.ts +11 -0
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +13 -0
- package/dist/AI/index.js.map +1 -1
- package/dist/AI/interfaces/analytics-preferences.interface.d.ts +50 -0
- package/dist/AI/interfaces/analytics-preferences.interface.d.ts.map +1 -0
- package/dist/AI/interfaces/analytics-preferences.interface.js +9 -0
- package/dist/AI/interfaces/analytics-preferences.interface.js.map +1 -0
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +2 -2
- package/dist/MCP/index.d.ts +1 -0
- package/dist/MCP/index.d.ts.map +1 -1
- package/dist/MCP/index.js +2 -0
- package/dist/MCP/index.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +1 -0
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +5 -4
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp-resource.component.d.ts +6 -5
- package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
- package/dist/MCP/mcp-resource.component.js +7 -8
- package/dist/MCP/mcp-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +27 -17
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +66 -3
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +1 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +49 -48
- package/dist/__tests__/analytics-resource.test.d.ts +0 -2
- package/dist/__tests__/analytics-resource.test.d.ts.map +0 -1
- package/dist/__tests__/analytics-resource.test.js +0 -181
- package/dist/__tests__/analytics-resource.test.js.map +0 -1
- package/dist/__tests__/dashboards.test.d.ts +0 -2
- package/dist/__tests__/dashboards.test.d.ts.map +0 -1
- package/dist/__tests__/dashboards.test.js +0 -40
- package/dist/__tests__/dashboards.test.js.map +0 -1
- package/dist/__tests__/integration-data-service.test.d.ts +0 -2
- package/dist/__tests__/integration-data-service.test.d.ts.map +0 -1
- package/dist/__tests__/integration-data-service.test.js +0 -132
- package/dist/__tests__/integration-data-service.test.js.map +0 -1
- package/dist/__tests__/mapping-validation.test.d.ts +0 -2
- package/dist/__tests__/mapping-validation.test.d.ts.map +0 -1
- package/dist/__tests__/mapping-validation.test.js +0 -170
- package/dist/__tests__/mapping-validation.test.js.map +0 -1
- package/dist/__tests__/scheduling.test.d.ts +0 -2
- package/dist/__tests__/scheduling.test.d.ts.map +0 -1
- package/dist/__tests__/scheduling.test.js +0 -205
- package/dist/__tests__/scheduling.test.js.map +0 -1
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { OnInit, OnDestroy } from '@angular/core';
|
|
2
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
3
|
+
import { ResourceData } from '@memberjunction/core-entities';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Represents a single stat badge displayed inside a navigation card.
|
|
7
|
+
*/
|
|
8
|
+
interface CardStat {
|
|
9
|
+
Label: string;
|
|
10
|
+
Value: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Represents a navigation card on the Overview Hub grid.
|
|
14
|
+
*/
|
|
15
|
+
interface NavigationCard {
|
|
16
|
+
Key: string;
|
|
17
|
+
Title: string;
|
|
18
|
+
Description: string;
|
|
19
|
+
Icon: string;
|
|
20
|
+
ColorClass: string;
|
|
21
|
+
Stats: CardStat[];
|
|
22
|
+
NavItemLabel: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* AI Overview Hub — the default landing page for the AI Administration application.
|
|
26
|
+
* Displays quick stats and navigation cards using only in-memory data from AIEngineBase.
|
|
27
|
+
*/
|
|
28
|
+
export declare class AIOverviewHubComponent extends BaseResourceComponent implements OnInit, OnDestroy {
|
|
29
|
+
private cdr;
|
|
30
|
+
ActiveAgentCount: number;
|
|
31
|
+
ModelCount: number;
|
|
32
|
+
PromptCount: number;
|
|
33
|
+
VendorCount: number;
|
|
34
|
+
Cards: NavigationCard[];
|
|
35
|
+
ngOnInit(): Promise<void>;
|
|
36
|
+
ngOnDestroy(): void;
|
|
37
|
+
GetResourceDisplayName(data: ResourceData): Promise<string>;
|
|
38
|
+
GetResourceIconClass(data: ResourceData): Promise<string>;
|
|
39
|
+
/**
|
|
40
|
+
* Reads counts from the in-memory AIEngineBase singleton.
|
|
41
|
+
* No database queries are made.
|
|
42
|
+
*/
|
|
43
|
+
private LoadStats;
|
|
44
|
+
/**
|
|
45
|
+
* Constructs the navigation card definitions with live stat data.
|
|
46
|
+
*/
|
|
47
|
+
private BuildCards;
|
|
48
|
+
/**
|
|
49
|
+
* Navigate to another tab in the current AI application by its nav item label.
|
|
50
|
+
*/
|
|
51
|
+
NavigateToTab(navItemLabel: string): void;
|
|
52
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AIOverviewHubComponent, never>;
|
|
53
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<AIOverviewHubComponent, "app-ai-overview-hub", never, {}, {}, never, never, false, never>;
|
|
54
|
+
}
|
|
55
|
+
/** Tree-shaking prevention */
|
|
56
|
+
export declare function LoadAIOverviewHub(): void;
|
|
57
|
+
export {};
|
|
58
|
+
//# sourceMappingURL=ai-overview-hub.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-overview-hub.component.d.ts","sourceRoot":"","sources":["../../../../src/AI/components/overview/ai-overview-hub.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAsD,MAAM,eAAe,CAAC;AAEjH,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;;AAG7D;;GAEG;AACH,UAAU,QAAQ;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,UAAU,cAAc;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,qBAoTa,sBAAuB,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS;IAC5F,OAAO,CAAC,GAAG,CAA6B;IAExC,gBAAgB,SAAK;IACrB,UAAU,SAAK;IACf,WAAW,SAAK;IAChB,WAAW,SAAK;IAChB,KAAK,EAAE,cAAc,EAAE,CAAM;IAEd,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ/B,WAAW,IAAI,IAAI;IAItB,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI/D;;;OAGG;IACH,OAAO,CAAC,SAAS;IAQjB;;OAEG;IACH,OAAO,CAAC,UAAU;IA+ElB;;OAEG;IACH,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;yCA9H9B,sBAAsB;2CAAtB,sBAAsB;CAiIlC;AAED,8BAA8B;AAC9B,wBAAgB,iBAAiB,IAAI,IAAI,CAA8B"}
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Component, ChangeDetectorRef, ChangeDetectionStrategy, inject } from '@angular/core';
|
|
8
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
9
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
10
|
+
import { AIEngineBase } from '@memberjunction/ai-engine-base';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
const _forTrack0 = ($index, $item) => $item.Key;
|
|
13
|
+
const _forTrack1 = ($index, $item) => $item.Label;
|
|
14
|
+
function AIOverviewHubComponent_For_36_For_11_Template(rf, ctx) { if (rf & 1) {
|
|
15
|
+
i0.ɵɵelementStart(0, "span", 24)(1, "span", 25);
|
|
16
|
+
i0.ɵɵtext(2);
|
|
17
|
+
i0.ɵɵelementEnd();
|
|
18
|
+
i0.ɵɵtext(3);
|
|
19
|
+
i0.ɵɵelementEnd();
|
|
20
|
+
} if (rf & 2) {
|
|
21
|
+
const stat_r4 = ctx.$implicit;
|
|
22
|
+
i0.ɵɵadvance(2);
|
|
23
|
+
i0.ɵɵtextInterpolate(stat_r4.Value);
|
|
24
|
+
i0.ɵɵadvance();
|
|
25
|
+
i0.ɵɵtextInterpolate1(" ", stat_r4.Label, " ");
|
|
26
|
+
} }
|
|
27
|
+
function AIOverviewHubComponent_For_36_Template(rf, ctx) { if (rf & 1) {
|
|
28
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
29
|
+
i0.ɵɵelementStart(0, "div", 17);
|
|
30
|
+
i0.ɵɵlistener("click", function AIOverviewHubComponent_For_36_Template_div_click_0_listener() { const card_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.NavigateToTab(card_r2.NavItemLabel)); });
|
|
31
|
+
i0.ɵɵelementStart(1, "div", 18)(2, "div", 19);
|
|
32
|
+
i0.ɵɵelement(3, "i");
|
|
33
|
+
i0.ɵɵelementEnd();
|
|
34
|
+
i0.ɵɵelement(4, "i", 20);
|
|
35
|
+
i0.ɵɵelementEnd();
|
|
36
|
+
i0.ɵɵelementStart(5, "h3", 21);
|
|
37
|
+
i0.ɵɵtext(6);
|
|
38
|
+
i0.ɵɵelementEnd();
|
|
39
|
+
i0.ɵɵelementStart(7, "p", 22);
|
|
40
|
+
i0.ɵɵtext(8);
|
|
41
|
+
i0.ɵɵelementEnd();
|
|
42
|
+
i0.ɵɵelementStart(9, "div", 23);
|
|
43
|
+
i0.ɵɵrepeaterCreate(10, AIOverviewHubComponent_For_36_For_11_Template, 4, 2, "span", 24, _forTrack1);
|
|
44
|
+
i0.ɵɵelementEnd()();
|
|
45
|
+
} if (rf & 2) {
|
|
46
|
+
const card_r2 = ctx.$implicit;
|
|
47
|
+
i0.ɵɵclassMap(card_r2.ColorClass);
|
|
48
|
+
i0.ɵɵadvance(2);
|
|
49
|
+
i0.ɵɵclassMap(card_r2.ColorClass + "-icon");
|
|
50
|
+
i0.ɵɵadvance();
|
|
51
|
+
i0.ɵɵclassMap(card_r2.Icon);
|
|
52
|
+
i0.ɵɵadvance(3);
|
|
53
|
+
i0.ɵɵtextInterpolate(card_r2.Title);
|
|
54
|
+
i0.ɵɵadvance(2);
|
|
55
|
+
i0.ɵɵtextInterpolate(card_r2.Description);
|
|
56
|
+
i0.ɵɵadvance(2);
|
|
57
|
+
i0.ɵɵrepeater(card_r2.Stats);
|
|
58
|
+
} }
|
|
59
|
+
/**
|
|
60
|
+
* AI Overview Hub — the default landing page for the AI Administration application.
|
|
61
|
+
* Displays quick stats and navigation cards using only in-memory data from AIEngineBase.
|
|
62
|
+
*/
|
|
63
|
+
let AIOverviewHubComponent = class AIOverviewHubComponent extends BaseResourceComponent {
|
|
64
|
+
cdr = inject(ChangeDetectorRef);
|
|
65
|
+
ActiveAgentCount = 0;
|
|
66
|
+
ModelCount = 0;
|
|
67
|
+
PromptCount = 0;
|
|
68
|
+
VendorCount = 0;
|
|
69
|
+
Cards = [];
|
|
70
|
+
async ngOnInit() {
|
|
71
|
+
super.ngOnInit();
|
|
72
|
+
this.LoadStats();
|
|
73
|
+
this.BuildCards();
|
|
74
|
+
this.NotifyLoadComplete();
|
|
75
|
+
this.cdr.markForCheck();
|
|
76
|
+
}
|
|
77
|
+
ngOnDestroy() {
|
|
78
|
+
super.ngOnDestroy();
|
|
79
|
+
}
|
|
80
|
+
async GetResourceDisplayName(data) {
|
|
81
|
+
return 'AI Overview';
|
|
82
|
+
}
|
|
83
|
+
async GetResourceIconClass(data) {
|
|
84
|
+
return 'fa-solid fa-grid-2';
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Reads counts from the in-memory AIEngineBase singleton.
|
|
88
|
+
* No database queries are made.
|
|
89
|
+
*/
|
|
90
|
+
LoadStats() {
|
|
91
|
+
const engine = AIEngineBase.Instance;
|
|
92
|
+
this.ActiveAgentCount = engine.Agents.filter(a => a.Status === 'Active').length;
|
|
93
|
+
this.ModelCount = engine.Models.length;
|
|
94
|
+
this.PromptCount = engine.Prompts.length;
|
|
95
|
+
this.VendorCount = engine.Vendors.length;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Constructs the navigation card definitions with live stat data.
|
|
99
|
+
*/
|
|
100
|
+
BuildCards() {
|
|
101
|
+
const engine = AIEngineBase.Instance;
|
|
102
|
+
this.Cards = [
|
|
103
|
+
{
|
|
104
|
+
Key: 'analytics',
|
|
105
|
+
Title: 'Analytics',
|
|
106
|
+
Description: 'View execution metrics, cost trends, error rates, and usage patterns across your AI operations.',
|
|
107
|
+
Icon: 'fa-solid fa-chart-line',
|
|
108
|
+
ColorClass: 'card-analytics',
|
|
109
|
+
NavItemLabel: 'Analytics',
|
|
110
|
+
Stats: [
|
|
111
|
+
{ Label: 'Agents', Value: engine.Agents.length },
|
|
112
|
+
{ Label: 'Models', Value: engine.Models.length }
|
|
113
|
+
]
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
Key: 'agents',
|
|
117
|
+
Title: 'Agents',
|
|
118
|
+
Description: 'Configure and manage AI agents, their capabilities, prompts, and execution parameters.',
|
|
119
|
+
Icon: 'fa-solid fa-robot',
|
|
120
|
+
ColorClass: 'card-agents',
|
|
121
|
+
NavItemLabel: 'Agents',
|
|
122
|
+
Stats: [
|
|
123
|
+
{ Label: 'Active', Value: engine.Agents.filter(a => a.Status === 'Active').length },
|
|
124
|
+
{ Label: 'Types', Value: engine.AgentTypes.length }
|
|
125
|
+
]
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
Key: 'prompts',
|
|
129
|
+
Title: 'Prompts',
|
|
130
|
+
Description: 'Manage prompt templates, categories, and model priority assignments.',
|
|
131
|
+
Icon: 'fa-solid fa-message-lines',
|
|
132
|
+
ColorClass: 'card-prompts',
|
|
133
|
+
NavItemLabel: 'Prompts',
|
|
134
|
+
Stats: [
|
|
135
|
+
{ Label: 'Total', Value: engine.Prompts.length },
|
|
136
|
+
{ Label: 'Categories', Value: engine.PromptCategories.length }
|
|
137
|
+
]
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
Key: 'models',
|
|
141
|
+
Title: 'Models',
|
|
142
|
+
Description: 'Browse AI models, configure vendor integrations, and manage model capabilities.',
|
|
143
|
+
Icon: 'fa-solid fa-microchip',
|
|
144
|
+
ColorClass: 'card-models',
|
|
145
|
+
NavItemLabel: 'Models',
|
|
146
|
+
Stats: [
|
|
147
|
+
{ Label: 'Models', Value: engine.Models.length },
|
|
148
|
+
{ Label: 'Vendors', Value: engine.Vendors.length }
|
|
149
|
+
]
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
Key: 'requests',
|
|
153
|
+
Title: 'Agent Requests',
|
|
154
|
+
Description: 'Monitor and manage incoming agent requests, approvals, and execution queues.',
|
|
155
|
+
Icon: 'fa-solid fa-inbox',
|
|
156
|
+
ColorClass: 'card-requests',
|
|
157
|
+
NavItemLabel: 'Agent Requests',
|
|
158
|
+
Stats: [
|
|
159
|
+
{ Label: 'Agents', Value: engine.Agents.filter(a => a.Status === 'Active').length },
|
|
160
|
+
{ Label: 'Types', Value: engine.AgentTypes.length }
|
|
161
|
+
]
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
Key: 'config',
|
|
165
|
+
Title: 'Configuration',
|
|
166
|
+
Description: 'System-level AI settings, configuration parameters, and platform defaults.',
|
|
167
|
+
Icon: 'fa-solid fa-gear',
|
|
168
|
+
ColorClass: 'card-config',
|
|
169
|
+
NavItemLabel: 'Configuration',
|
|
170
|
+
Stats: [
|
|
171
|
+
{ Label: 'Configs', Value: engine.Configurations.length },
|
|
172
|
+
{ Label: 'Params', Value: engine.ConfigurationParams.length }
|
|
173
|
+
]
|
|
174
|
+
}
|
|
175
|
+
];
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Navigate to another tab in the current AI application by its nav item label.
|
|
179
|
+
*/
|
|
180
|
+
NavigateToTab(navItemLabel) {
|
|
181
|
+
this.navigationService.OpenNavItemByName(navItemLabel);
|
|
182
|
+
}
|
|
183
|
+
static ɵfac = /*@__PURE__*/ (() => { let ɵAIOverviewHubComponent_BaseFactory; return function AIOverviewHubComponent_Factory(__ngFactoryType__) { return (ɵAIOverviewHubComponent_BaseFactory || (ɵAIOverviewHubComponent_BaseFactory = i0.ɵɵgetInheritedFactory(AIOverviewHubComponent)))(__ngFactoryType__ || AIOverviewHubComponent); }; })();
|
|
184
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AIOverviewHubComponent, selectors: [["app-ai-overview-hub"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 37, vars: 4, consts: [[1, "overview-hub"], [1, "hero-section"], [1, "hero-content"], [1, "hero-title-row"], [1, "fa-solid", "fa-robot", "hero-icon"], [1, "hero-title"], [1, "hero-subtitle"], [1, "stats-strip"], [1, "stat-pill"], [1, "fa-solid", "fa-robot"], [1, "stat-value"], [1, "stat-label"], [1, "fa-solid", "fa-microchip"], [1, "fa-solid", "fa-message-lines"], [1, "fa-solid", "fa-building"], [1, "cards-grid"], [1, "nav-card", 3, "class"], [1, "nav-card", 3, "click"], [1, "card-header"], [1, "card-icon-circle"], [1, "fa-solid", "fa-arrow-right", "card-arrow"], [1, "card-title"], [1, "card-description"], [1, "card-stats"], [1, "card-stat-badge"], [1, "card-stat-value"]], template: function AIOverviewHubComponent_Template(rf, ctx) { if (rf & 1) {
|
|
185
|
+
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "div", 3);
|
|
186
|
+
i0.ɵɵelement(4, "i", 4);
|
|
187
|
+
i0.ɵɵelementStart(5, "h1", 5);
|
|
188
|
+
i0.ɵɵtext(6, "AI Administration");
|
|
189
|
+
i0.ɵɵelementEnd()();
|
|
190
|
+
i0.ɵɵelementStart(7, "p", 6);
|
|
191
|
+
i0.ɵɵtext(8, " Manage agents, models, prompts, and system configuration for your AI platform. ");
|
|
192
|
+
i0.ɵɵelementEnd()()();
|
|
193
|
+
i0.ɵɵelementStart(9, "div", 7)(10, "div", 8);
|
|
194
|
+
i0.ɵɵelement(11, "i", 9);
|
|
195
|
+
i0.ɵɵelementStart(12, "span", 10);
|
|
196
|
+
i0.ɵɵtext(13);
|
|
197
|
+
i0.ɵɵelementEnd();
|
|
198
|
+
i0.ɵɵelementStart(14, "span", 11);
|
|
199
|
+
i0.ɵɵtext(15, "Active Agents");
|
|
200
|
+
i0.ɵɵelementEnd()();
|
|
201
|
+
i0.ɵɵelementStart(16, "div", 8);
|
|
202
|
+
i0.ɵɵelement(17, "i", 12);
|
|
203
|
+
i0.ɵɵelementStart(18, "span", 10);
|
|
204
|
+
i0.ɵɵtext(19);
|
|
205
|
+
i0.ɵɵelementEnd();
|
|
206
|
+
i0.ɵɵelementStart(20, "span", 11);
|
|
207
|
+
i0.ɵɵtext(21, "Models");
|
|
208
|
+
i0.ɵɵelementEnd()();
|
|
209
|
+
i0.ɵɵelementStart(22, "div", 8);
|
|
210
|
+
i0.ɵɵelement(23, "i", 13);
|
|
211
|
+
i0.ɵɵelementStart(24, "span", 10);
|
|
212
|
+
i0.ɵɵtext(25);
|
|
213
|
+
i0.ɵɵelementEnd();
|
|
214
|
+
i0.ɵɵelementStart(26, "span", 11);
|
|
215
|
+
i0.ɵɵtext(27, "Prompts");
|
|
216
|
+
i0.ɵɵelementEnd()();
|
|
217
|
+
i0.ɵɵelementStart(28, "div", 8);
|
|
218
|
+
i0.ɵɵelement(29, "i", 14);
|
|
219
|
+
i0.ɵɵelementStart(30, "span", 10);
|
|
220
|
+
i0.ɵɵtext(31);
|
|
221
|
+
i0.ɵɵelementEnd();
|
|
222
|
+
i0.ɵɵelementStart(32, "span", 11);
|
|
223
|
+
i0.ɵɵtext(33, "Vendors");
|
|
224
|
+
i0.ɵɵelementEnd()()();
|
|
225
|
+
i0.ɵɵelementStart(34, "div", 15);
|
|
226
|
+
i0.ɵɵrepeaterCreate(35, AIOverviewHubComponent_For_36_Template, 12, 8, "div", 16, _forTrack0);
|
|
227
|
+
i0.ɵɵelementEnd()();
|
|
228
|
+
} if (rf & 2) {
|
|
229
|
+
i0.ɵɵadvance(13);
|
|
230
|
+
i0.ɵɵtextInterpolate(ctx.ActiveAgentCount);
|
|
231
|
+
i0.ɵɵadvance(6);
|
|
232
|
+
i0.ɵɵtextInterpolate(ctx.ModelCount);
|
|
233
|
+
i0.ɵɵadvance(6);
|
|
234
|
+
i0.ɵɵtextInterpolate(ctx.PromptCount);
|
|
235
|
+
i0.ɵɵadvance(6);
|
|
236
|
+
i0.ɵɵtextInterpolate(ctx.VendorCount);
|
|
237
|
+
i0.ɵɵadvance(4);
|
|
238
|
+
i0.ɵɵrepeater(ctx.Cards);
|
|
239
|
+
} }, styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-page);\n }\n\n .overview-hub[_ngcontent-%COMP%] {\n max-width: 1200px;\n margin: 0 auto;\n padding: 32px 24px;\n }\n\n \n\n .hero-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n }\n\n .hero-title-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 8px;\n }\n\n .hero-icon[_ngcontent-%COMP%] {\n font-size: 28px;\n color: var(--mj-brand-primary);\n }\n\n .hero-title[_ngcontent-%COMP%] {\n font-size: 28px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0;\n }\n\n .hero-subtitle[_ngcontent-%COMP%] {\n font-size: 15px;\n color: var(--mj-text-muted);\n margin: 0;\n line-height: 1.5;\n }\n\n \n\n .stats-strip[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n margin-bottom: 32px;\n }\n\n .stat-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 24px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .stat-pill[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n }\n\n .stat-value[_ngcontent-%COMP%] {\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n\n .stat-label[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n }\n\n \n\n .cards-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 20px;\n }\n\n .nav-card[_ngcontent-%COMP%] {\n position: relative;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 24px;\n cursor: pointer;\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n overflow: hidden;\n }\n\n .nav-card[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 4px;\n }\n\n .nav-card[_ngcontent-%COMP%]:hover {\n transform: translateY(-4px);\n box-shadow: 0 8px 24px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n }\n\n .nav-card[_ngcontent-%COMP%]:hover .card-arrow[_ngcontent-%COMP%] {\n transform: translateX(4px);\n }\n\n \n\n .card-analytics[_ngcontent-%COMP%]::before { background: var(--mj-brand-primary); }\n .card-agents[_ngcontent-%COMP%]::before { background: var(--mj-status-success); }\n .card-prompts[_ngcontent-%COMP%]::before { background: var(--mj-brand-primary); }\n .card-models[_ngcontent-%COMP%]::before { background: var(--mj-color-violet-500, #8b5cf6); }\n .card-requests[_ngcontent-%COMP%]::before { background: var(--mj-status-warning); }\n .card-config[_ngcontent-%COMP%]::before { background: var(--mj-text-muted); }\n\n \n\n .card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n }\n\n .card-icon-circle[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 20px;\n }\n\n .card-analytics-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .card-agents-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .card-prompts-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .card-models-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-color-violet-500, #8b5cf6) 12%, var(--mj-bg-surface));\n color: var(--mj-color-violet-500, #8b5cf6);\n }\n\n .card-requests-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n .card-config-icon[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n .card-arrow[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 14px;\n transition: transform 0.2s ease;\n }\n\n .card-title[_ngcontent-%COMP%] {\n font-size: 17px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 8px 0;\n }\n\n .card-description[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.5;\n margin: 0 0 16px 0;\n }\n\n .card-stats[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n }\n\n .card-stat-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 12px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n }\n\n .card-stat-value[_ngcontent-%COMP%] {\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n\n \n\n @media (max-width: 1024px) {\n .cards-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n }\n\n @media (max-width: 640px) {\n .cards-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .overview-hub[_ngcontent-%COMP%] {\n padding: 20px 16px;\n }\n\n .hero-title[_ngcontent-%COMP%] {\n font-size: 22px;\n }\n\n .stats-strip[_ngcontent-%COMP%] {\n gap: 8px;\n }\n }"], changeDetection: 0 });
|
|
240
|
+
};
|
|
241
|
+
AIOverviewHubComponent = __decorate([
|
|
242
|
+
RegisterClass(BaseResourceComponent, 'AIMonitorResource')
|
|
243
|
+
], AIOverviewHubComponent);
|
|
244
|
+
export { AIOverviewHubComponent };
|
|
245
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AIOverviewHubComponent, [{
|
|
246
|
+
type: Component,
|
|
247
|
+
args: [{ standalone: false, selector: 'app-ai-overview-hub', changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
248
|
+
<div class="overview-hub">
|
|
249
|
+
<!-- Hero Section -->
|
|
250
|
+
<div class="hero-section">
|
|
251
|
+
<div class="hero-content">
|
|
252
|
+
<div class="hero-title-row">
|
|
253
|
+
<i class="fa-solid fa-robot hero-icon"></i>
|
|
254
|
+
<h1 class="hero-title">AI Administration</h1>
|
|
255
|
+
</div>
|
|
256
|
+
<p class="hero-subtitle">
|
|
257
|
+
Manage agents, models, prompts, and system configuration for your AI platform.
|
|
258
|
+
</p>
|
|
259
|
+
</div>
|
|
260
|
+
</div>
|
|
261
|
+
|
|
262
|
+
<!-- Quick Stats Strip -->
|
|
263
|
+
<div class="stats-strip">
|
|
264
|
+
<div class="stat-pill">
|
|
265
|
+
<i class="fa-solid fa-robot"></i>
|
|
266
|
+
<span class="stat-value">{{ ActiveAgentCount }}</span>
|
|
267
|
+
<span class="stat-label">Active Agents</span>
|
|
268
|
+
</div>
|
|
269
|
+
<div class="stat-pill">
|
|
270
|
+
<i class="fa-solid fa-microchip"></i>
|
|
271
|
+
<span class="stat-value">{{ ModelCount }}</span>
|
|
272
|
+
<span class="stat-label">Models</span>
|
|
273
|
+
</div>
|
|
274
|
+
<div class="stat-pill">
|
|
275
|
+
<i class="fa-solid fa-message-lines"></i>
|
|
276
|
+
<span class="stat-value">{{ PromptCount }}</span>
|
|
277
|
+
<span class="stat-label">Prompts</span>
|
|
278
|
+
</div>
|
|
279
|
+
<div class="stat-pill">
|
|
280
|
+
<i class="fa-solid fa-building"></i>
|
|
281
|
+
<span class="stat-value">{{ VendorCount }}</span>
|
|
282
|
+
<span class="stat-label">Vendors</span>
|
|
283
|
+
</div>
|
|
284
|
+
</div>
|
|
285
|
+
|
|
286
|
+
<!-- Navigation Cards Grid -->
|
|
287
|
+
<div class="cards-grid">
|
|
288
|
+
@for (card of Cards; track card.Key) {
|
|
289
|
+
<div class="nav-card" [class]="card.ColorClass" (click)="NavigateToTab(card.NavItemLabel)">
|
|
290
|
+
<div class="card-header">
|
|
291
|
+
<div class="card-icon-circle" [class]="card.ColorClass + '-icon'">
|
|
292
|
+
<i [class]="card.Icon"></i>
|
|
293
|
+
</div>
|
|
294
|
+
<i class="fa-solid fa-arrow-right card-arrow"></i>
|
|
295
|
+
</div>
|
|
296
|
+
<h3 class="card-title">{{ card.Title }}</h3>
|
|
297
|
+
<p class="card-description">{{ card.Description }}</p>
|
|
298
|
+
<div class="card-stats">
|
|
299
|
+
@for (stat of card.Stats; track stat.Label) {
|
|
300
|
+
<span class="card-stat-badge">
|
|
301
|
+
<span class="card-stat-value">{{ stat.Value }}</span>
|
|
302
|
+
{{ stat.Label }}
|
|
303
|
+
</span>
|
|
304
|
+
}
|
|
305
|
+
</div>
|
|
306
|
+
</div>
|
|
307
|
+
}
|
|
308
|
+
</div>
|
|
309
|
+
</div>
|
|
310
|
+
`, styles: ["\n :host {\n display: block;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-page);\n }\n\n .overview-hub {\n max-width: 1200px;\n margin: 0 auto;\n padding: 32px 24px;\n }\n\n /* Hero Section */\n .hero-section {\n margin-bottom: 24px;\n }\n\n .hero-title-row {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 8px;\n }\n\n .hero-icon {\n font-size: 28px;\n color: var(--mj-brand-primary);\n }\n\n .hero-title {\n font-size: 28px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0;\n }\n\n .hero-subtitle {\n font-size: 15px;\n color: var(--mj-text-muted);\n margin: 0;\n line-height: 1.5;\n }\n\n /* Stats Strip */\n .stats-strip {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n margin-bottom: 32px;\n }\n\n .stat-pill {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 24px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .stat-pill i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n }\n\n .stat-value {\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n\n .stat-label {\n color: var(--mj-text-muted);\n }\n\n /* Cards Grid */\n .cards-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 20px;\n }\n\n .nav-card {\n position: relative;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 24px;\n cursor: pointer;\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n overflow: hidden;\n }\n\n .nav-card::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 4px;\n }\n\n .nav-card:hover {\n transform: translateY(-4px);\n box-shadow: 0 8px 24px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n }\n\n .nav-card:hover .card-arrow {\n transform: translateX(4px);\n }\n\n /* Card color variants - top border */\n .card-analytics::before { background: var(--mj-brand-primary); }\n .card-agents::before { background: var(--mj-status-success); }\n .card-prompts::before { background: var(--mj-brand-primary); }\n .card-models::before { background: var(--mj-color-violet-500, #8b5cf6); }\n .card-requests::before { background: var(--mj-status-warning); }\n .card-config::before { background: var(--mj-text-muted); }\n\n /* Card icon circles */\n .card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n }\n\n .card-icon-circle {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 20px;\n }\n\n .card-analytics-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .card-agents-icon {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .card-prompts-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .card-models-icon {\n background: color-mix(in srgb, var(--mj-color-violet-500, #8b5cf6) 12%, var(--mj-bg-surface));\n color: var(--mj-color-violet-500, #8b5cf6);\n }\n\n .card-requests-icon {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n .card-config-icon {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n .card-arrow {\n color: var(--mj-text-muted);\n font-size: 14px;\n transition: transform 0.2s ease;\n }\n\n .card-title {\n font-size: 17px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 8px 0;\n }\n\n .card-description {\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.5;\n margin: 0 0 16px 0;\n }\n\n .card-stats {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n }\n\n .card-stat-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 12px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n }\n\n .card-stat-value {\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n\n /* Responsive */\n @media (max-width: 1024px) {\n .cards-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n }\n\n @media (max-width: 640px) {\n .cards-grid {\n grid-template-columns: 1fr;\n }\n\n .overview-hub {\n padding: 20px 16px;\n }\n\n .hero-title {\n font-size: 22px;\n }\n\n .stats-strip {\n gap: 8px;\n }\n }\n "] }]
|
|
311
|
+
}], null, null); })();
|
|
312
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIOverviewHubComponent, { className: "AIOverviewHubComponent", filePath: "src/AI/components/overview/ai-overview-hub.component.ts", lineNumber: 340 }); })();
|
|
313
|
+
/** Tree-shaking prevention */
|
|
314
|
+
export function LoadAIOverviewHub() { }
|
|
315
|
+
//# sourceMappingURL=ai-overview-hub.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-overview-hub.component.js","sourceRoot":"","sources":["../../../../src/AI/components/overview/ai-overview-hub.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, inject } from '@angular/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\n\n/**\n * Represents a single stat badge displayed inside a navigation card.\n */\ninterface CardStat {\n Label: string;\n Value: number;\n}\n\n/**\n * Represents a navigation card on the Overview Hub grid.\n */\ninterface NavigationCard {\n Key: string;\n Title: string;\n Description: string;\n Icon: string;\n ColorClass: string;\n Stats: CardStat[];\n NavItemLabel: string;\n}\n\n/**\n * AI Overview Hub — the default landing page for the AI Administration application.\n * Displays quick stats and navigation cards using only in-memory data from AIEngineBase.\n */\n@RegisterClass(BaseResourceComponent, 'AIMonitorResource')\n@Component({\n standalone: false,\n selector: 'app-ai-overview-hub',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"overview-hub\">\n <!-- Hero Section -->\n <div class=\"hero-section\">\n <div class=\"hero-content\">\n <div class=\"hero-title-row\">\n <i class=\"fa-solid fa-robot hero-icon\"></i>\n <h1 class=\"hero-title\">AI Administration</h1>\n </div>\n <p class=\"hero-subtitle\">\n Manage agents, models, prompts, and system configuration for your AI platform.\n </p>\n </div>\n </div>\n\n <!-- Quick Stats Strip -->\n <div class=\"stats-strip\">\n <div class=\"stat-pill\">\n <i class=\"fa-solid fa-robot\"></i>\n <span class=\"stat-value\">{{ ActiveAgentCount }}</span>\n <span class=\"stat-label\">Active Agents</span>\n </div>\n <div class=\"stat-pill\">\n <i class=\"fa-solid fa-microchip\"></i>\n <span class=\"stat-value\">{{ ModelCount }}</span>\n <span class=\"stat-label\">Models</span>\n </div>\n <div class=\"stat-pill\">\n <i class=\"fa-solid fa-message-lines\"></i>\n <span class=\"stat-value\">{{ PromptCount }}</span>\n <span class=\"stat-label\">Prompts</span>\n </div>\n <div class=\"stat-pill\">\n <i class=\"fa-solid fa-building\"></i>\n <span class=\"stat-value\">{{ VendorCount }}</span>\n <span class=\"stat-label\">Vendors</span>\n </div>\n </div>\n\n <!-- Navigation Cards Grid -->\n <div class=\"cards-grid\">\n @for (card of Cards; track card.Key) {\n <div class=\"nav-card\" [class]=\"card.ColorClass\" (click)=\"NavigateToTab(card.NavItemLabel)\">\n <div class=\"card-header\">\n <div class=\"card-icon-circle\" [class]=\"card.ColorClass + '-icon'\">\n <i [class]=\"card.Icon\"></i>\n </div>\n <i class=\"fa-solid fa-arrow-right card-arrow\"></i>\n </div>\n <h3 class=\"card-title\">{{ card.Title }}</h3>\n <p class=\"card-description\">{{ card.Description }}</p>\n <div class=\"card-stats\">\n @for (stat of card.Stats; track stat.Label) {\n <span class=\"card-stat-badge\">\n <span class=\"card-stat-value\">{{ stat.Value }}</span>\n {{ stat.Label }}\n </span>\n }\n </div>\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-page);\n }\n\n .overview-hub {\n max-width: 1200px;\n margin: 0 auto;\n padding: 32px 24px;\n }\n\n /* Hero Section */\n .hero-section {\n margin-bottom: 24px;\n }\n\n .hero-title-row {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 8px;\n }\n\n .hero-icon {\n font-size: 28px;\n color: var(--mj-brand-primary);\n }\n\n .hero-title {\n font-size: 28px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0;\n }\n\n .hero-subtitle {\n font-size: 15px;\n color: var(--mj-text-muted);\n margin: 0;\n line-height: 1.5;\n }\n\n /* Stats Strip */\n .stats-strip {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n margin-bottom: 32px;\n }\n\n .stat-pill {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 24px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .stat-pill i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n }\n\n .stat-value {\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n\n .stat-label {\n color: var(--mj-text-muted);\n }\n\n /* Cards Grid */\n .cards-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 20px;\n }\n\n .nav-card {\n position: relative;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 24px;\n cursor: pointer;\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n overflow: hidden;\n }\n\n .nav-card::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 4px;\n }\n\n .nav-card:hover {\n transform: translateY(-4px);\n box-shadow: 0 8px 24px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n }\n\n .nav-card:hover .card-arrow {\n transform: translateX(4px);\n }\n\n /* Card color variants - top border */\n .card-analytics::before { background: var(--mj-brand-primary); }\n .card-agents::before { background: var(--mj-status-success); }\n .card-prompts::before { background: var(--mj-brand-primary); }\n .card-models::before { background: var(--mj-color-violet-500, #8b5cf6); }\n .card-requests::before { background: var(--mj-status-warning); }\n .card-config::before { background: var(--mj-text-muted); }\n\n /* Card icon circles */\n .card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n }\n\n .card-icon-circle {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 20px;\n }\n\n .card-analytics-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .card-agents-icon {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .card-prompts-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .card-models-icon {\n background: color-mix(in srgb, var(--mj-color-violet-500, #8b5cf6) 12%, var(--mj-bg-surface));\n color: var(--mj-color-violet-500, #8b5cf6);\n }\n\n .card-requests-icon {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n .card-config-icon {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n .card-arrow {\n color: var(--mj-text-muted);\n font-size: 14px;\n transition: transform 0.2s ease;\n }\n\n .card-title {\n font-size: 17px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 8px 0;\n }\n\n .card-description {\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.5;\n margin: 0 0 16px 0;\n }\n\n .card-stats {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n }\n\n .card-stat-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 12px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n }\n\n .card-stat-value {\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n\n /* Responsive */\n @media (max-width: 1024px) {\n .cards-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n }\n\n @media (max-width: 640px) {\n .cards-grid {\n grid-template-columns: 1fr;\n }\n\n .overview-hub {\n padding: 20px 16px;\n }\n\n .hero-title {\n font-size: 22px;\n }\n\n .stats-strip {\n gap: 8px;\n }\n }\n `]\n})\nexport class AIOverviewHubComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n\n ActiveAgentCount = 0;\n ModelCount = 0;\n PromptCount = 0;\n VendorCount = 0;\n Cards: NavigationCard[] = [];\n\n override async ngOnInit(): Promise<void> {\n super.ngOnInit();\n this.LoadStats();\n this.BuildCards();\n this.NotifyLoadComplete();\n this.cdr.markForCheck();\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'AI Overview';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-grid-2';\n }\n\n /**\n * Reads counts from the in-memory AIEngineBase singleton.\n * No database queries are made.\n */\n private LoadStats(): void {\n const engine = AIEngineBase.Instance;\n this.ActiveAgentCount = engine.Agents.filter(a => a.Status === 'Active').length;\n this.ModelCount = engine.Models.length;\n this.PromptCount = engine.Prompts.length;\n this.VendorCount = engine.Vendors.length;\n }\n\n /**\n * Constructs the navigation card definitions with live stat data.\n */\n private BuildCards(): void {\n const engine = AIEngineBase.Instance;\n\n this.Cards = [\n {\n Key: 'analytics',\n Title: 'Analytics',\n Description: 'View execution metrics, cost trends, error rates, and usage patterns across your AI operations.',\n Icon: 'fa-solid fa-chart-line',\n ColorClass: 'card-analytics',\n NavItemLabel: 'Analytics',\n Stats: [\n { Label: 'Agents', Value: engine.Agents.length },\n { Label: 'Models', Value: engine.Models.length }\n ]\n },\n {\n Key: 'agents',\n Title: 'Agents',\n Description: 'Configure and manage AI agents, their capabilities, prompts, and execution parameters.',\n Icon: 'fa-solid fa-robot',\n ColorClass: 'card-agents',\n NavItemLabel: 'Agents',\n Stats: [\n { Label: 'Active', Value: engine.Agents.filter(a => a.Status === 'Active').length },\n { Label: 'Types', Value: engine.AgentTypes.length }\n ]\n },\n {\n Key: 'prompts',\n Title: 'Prompts',\n Description: 'Manage prompt templates, categories, and model priority assignments.',\n Icon: 'fa-solid fa-message-lines',\n ColorClass: 'card-prompts',\n NavItemLabel: 'Prompts',\n Stats: [\n { Label: 'Total', Value: engine.Prompts.length },\n { Label: 'Categories', Value: engine.PromptCategories.length }\n ]\n },\n {\n Key: 'models',\n Title: 'Models',\n Description: 'Browse AI models, configure vendor integrations, and manage model capabilities.',\n Icon: 'fa-solid fa-microchip',\n ColorClass: 'card-models',\n NavItemLabel: 'Models',\n Stats: [\n { Label: 'Models', Value: engine.Models.length },\n { Label: 'Vendors', Value: engine.Vendors.length }\n ]\n },\n {\n Key: 'requests',\n Title: 'Agent Requests',\n Description: 'Monitor and manage incoming agent requests, approvals, and execution queues.',\n Icon: 'fa-solid fa-inbox',\n ColorClass: 'card-requests',\n NavItemLabel: 'Agent Requests',\n Stats: [\n { Label: 'Agents', Value: engine.Agents.filter(a => a.Status === 'Active').length },\n { Label: 'Types', Value: engine.AgentTypes.length }\n ]\n },\n {\n Key: 'config',\n Title: 'Configuration',\n Description: 'System-level AI settings, configuration parameters, and platform defaults.',\n Icon: 'fa-solid fa-gear',\n ColorClass: 'card-config',\n NavItemLabel: 'Configuration',\n Stats: [\n { Label: 'Configs', Value: engine.Configurations.length },\n { Label: 'Params', Value: engine.ConfigurationParams.length }\n ]\n }\n ];\n }\n\n /**\n * Navigate to another tab in the current AI application by its nav item label.\n */\n NavigateToTab(navItemLabel: string): void {\n this.navigationService.OpenNavItemByName(navItemLabel);\n }\n}\n\n/** Tree-shaking prevention */\nexport function LoadAIOverviewHub(): void { /* intentionally empty */ }\n"]}
|
|
@@ -962,7 +962,7 @@ let PromptManagementComponent = class PromptManagementComponent extends BaseReso
|
|
|
962
962
|
});
|
|
963
963
|
// Apply sorting
|
|
964
964
|
this.filteredPrompts = this.applySorting(this.filteredPrompts);
|
|
965
|
-
this.cdr.
|
|
965
|
+
this.cdr.markForCheck();
|
|
966
966
|
}
|
|
967
967
|
/**
|
|
968
968
|
* Sort the prompts by the specified column
|