@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.
Files changed (57) hide show
  1. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +38 -4
  2. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  3. package/dist/AI/components/analytics/ai-analytics-resource.component.js +148 -20
  4. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  5. package/dist/AI/components/analytics/realtime/realtime-management-data.d.ts +216 -0
  6. package/dist/AI/components/analytics/realtime/realtime-management-data.d.ts.map +1 -0
  7. package/dist/AI/components/analytics/realtime/realtime-management-data.js +313 -0
  8. package/dist/AI/components/analytics/realtime/realtime-management-data.js.map +1 -0
  9. package/dist/AI/components/analytics/realtime/realtime-management.component.d.ts +103 -0
  10. package/dist/AI/components/analytics/realtime/realtime-management.component.d.ts.map +1 -0
  11. package/dist/AI/components/analytics/realtime/realtime-management.component.js +1060 -0
  12. package/dist/AI/components/analytics/realtime/realtime-management.component.js.map +1 -0
  13. package/dist/AI/components/analytics/realtime/realtime-overview.component.d.ts +87 -0
  14. package/dist/AI/components/analytics/realtime/realtime-overview.component.d.ts.map +1 -0
  15. package/dist/AI/components/analytics/realtime/realtime-overview.component.js +710 -0
  16. package/dist/AI/components/analytics/realtime/realtime-overview.component.js.map +1 -0
  17. package/dist/AI/components/analytics/realtime/realtime-session-data.d.ts +127 -0
  18. package/dist/AI/components/analytics/realtime/realtime-session-data.d.ts.map +1 -0
  19. package/dist/AI/components/analytics/realtime/realtime-session-data.js +233 -0
  20. package/dist/AI/components/analytics/realtime/realtime-session-data.js.map +1 -0
  21. package/dist/AI/components/analytics/realtime/realtime-sessions.component.d.ts +94 -0
  22. package/dist/AI/components/analytics/realtime/realtime-sessions.component.d.ts.map +1 -0
  23. package/dist/AI/components/analytics/realtime/realtime-sessions.component.js +728 -0
  24. package/dist/AI/components/analytics/realtime/realtime-sessions.component.js.map +1 -0
  25. package/dist/AI/components/autotagging/tabs/sources-tab.component.js +2 -2
  26. package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
  27. package/dist/AI/components/tags/tags-resource.component.js +2 -2
  28. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  29. package/dist/AI/components/vectors/vector-management-resource.component.js +2 -2
  30. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  31. package/dist/AI/index.d.ts +5 -0
  32. package/dist/AI/index.d.ts.map +1 -1
  33. package/dist/AI/index.js +7 -0
  34. package/dist/AI/index.js.map +1 -1
  35. package/dist/DataExplorer/data-explorer-dashboard.component.js +2 -2
  36. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  37. package/dist/Home/home-dashboard.component.js +12 -8
  38. package/dist/Home/home-dashboard.component.js.map +1 -1
  39. package/dist/Integration/components/connections/connections.component.d.ts +12 -0
  40. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  41. package/dist/Integration/components/connections/connections.component.js +419 -333
  42. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  43. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +5 -5
  44. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  45. package/dist/MCP/mcp-dashboard.component.d.ts +16 -2
  46. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  47. package/dist/MCP/mcp-dashboard.component.js +37 -5
  48. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  49. package/dist/ai-dashboards.module.d.ts +22 -19
  50. package/dist/ai-dashboards.module.d.ts.map +1 -1
  51. package/dist/ai-dashboards.module.js +18 -0
  52. package/dist/ai-dashboards.module.js.map +1 -1
  53. package/dist/core-dashboards.module.d.ts +1 -1
  54. package/dist/core-dashboards.module.d.ts.map +1 -1
  55. package/dist/core-dashboards.module.js +3 -1
  56. package/dist/core-dashboards.module.js.map +1 -1
  57. package/package.json +55 -55
@@ -1 +1 @@
1
- {"version":3,"file":"ai-analytics-resource.component.js","sourceRoot":"","sources":["../../../../src/AI/components/analytics/ai-analytics-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview AI Analytics Shell — Resource Component\n *\n * Main resource component for the AI Analytics dashboard. Provides a left\n * navigation panel and content area that switches between analytics sections:\n * Executive Summary, Prompt Runs, Agent Runs, Model Performance, Cost & Budget,\n * Error Analysis, and Usage Patterns.\n *\n * Persists the active section and filter state via UserInfoEngine settings\n * with debounced writes.\n */\n\nimport { Component, ChangeDetectorRef, OnInit, OnDestroy, ViewChild, inject } from '@angular/core';\nimport { AnalyticsExecutiveSummaryComponent } from './executive-summary/executive-summary.component';\nimport { AnalyticsPromptRunsComponent } from './prompt-runs/prompt-run-analysis.component';\nimport { Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { ResourceData, UserInfoEngine } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { AIAnalyticsPreferences, GlobalFilterState } from '../../interfaces/analytics-preferences.interface';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { FilterFieldConfig, MJLeftNavItem, MJLeftNavSection } from '@memberjunction/ng-ui-components';\n\ninterface NavItem {\n Label?: string;\n Icon?: string;\n Key: string;\n /**\n * Short prose used as the Subtitle on this section's\n * <mj-page-header-interior> card. Omitted for the `divider` entry.\n */\n Description?: string;\n}\n\n@RegisterClass(BaseResourceComponent, 'AIAnalyticsResource')\n@Component({\n standalone: false,\n selector: 'app-ai-analytics-resource',\n template: `\n <mj-page-layout>\n <!-- Outer chrome — pure identity. Every control (filter-popover,\n TimeRange chips, Compare, Export) lives in the per-section\n <mj-page-header-interior> card below because each section\n configures its own filter fields and time-range options. -->\n <mj-page-header\n Title=\"AI Analytics\"\n Icon=\"fa-solid fa-chart-line\"\n Subtitle=\"Performance, cost, and usage analytics\">\n </mj-page-header>\n <mj-page-body [Padding]=\"false\" class=\"analytics-shell\">\n <mj-left-nav\n MobileTitle=\"Analytics\"\n [Sections]=\"navSections\"\n [ActiveId]=\"ActiveSection\"\n (ItemClicked)=\"onNavItemClicked($event)\">\n </mj-left-nav>\n\n <mj-left-nav-content>\n <!-- Per-section interior chrome owns the complete control surface\n for the active section: identity + actions + the section's\n own time-range chip strip. Even TimeRange options vary per\n section (Cost & Budget adds MTD / YTD, Model Performance\n drops 1h / 6h, etc.) so it belongs here rather than in the\n outer chrome. -->\n <mj-page-header-interior\n [Title]=\"currentSection?.Label || ''\"\n [Subtitle]=\"currentSection?.Description || ''\">\n <div actions>\n @if (analyticsFilterFields.length > 0) {\n <mj-filter-popover\n [ActiveCount]=\"ActiveFilterCount\"\n [ShowClearAll]=\"ActiveFilterCount > 0\"\n (ClearAllRequested)=\"resetPopoverFilters()\">\n <mj-filter-panel\n [Fields]=\"analyticsFilterFields\"\n [Values]=\"analyticsFilterValues\"\n (ValuesChange)=\"onAnalyticsFilterValuesChange($event)\"\n (Reset)=\"resetPopoverFilters()\">\n </mj-filter-panel>\n </mj-filter-popover>\n }\n @if (FilterBarConfig.ShowCompareToggle) {\n <button mjButton variant=\"secondary\" size=\"sm\" [toggleable]=\"true\" [(selected)]=\"compareActive\" (selectedChange)=\"toggleCompare()\">\n <i class=\"fa-solid fa-code-compare\"></i> <span class=\"mj-action-label\">Compare</span>\n </button>\n }\n @if (FilterBarConfig.ShowExportButton) {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OnExportClicked()\">\n <i class=\"fa-solid fa-download\"></i> <span class=\"mj-action-label\">Export</span>\n </button>\n }\n </div>\n @if (timeRangeChipOptions.length > 0) {\n <div toolbar class=\"time-range-chips\">\n @for (chip of timeRangeChipOptions; track chip.value) {\n <mj-filter-chip\n [Label]=\"chip.text\"\n [Active]=\"CurrentTimeRange === chip.value\"\n (Clicked)=\"OnTimeRangeChange(chip.value)\">\n </mj-filter-chip>\n }\n </div>\n }\n </mj-page-header-interior>\n <mj-page-body-interior [Padding]=\"false\">\n <div class=\"analytics-content\">\n @switch (ActiveSection) {\n @case ('executive-summary') {\n <app-analytics-executive-summary\n #executiveSummary\n [TimeRange]=\"CurrentTimeRange\"\n [Filters]=\"CurrentFilters\"\n (SectionNavigate)=\"OnSectionChange($event)\"\n ></app-analytics-executive-summary>\n }\n @case ('prompt-runs') {\n <app-analytics-prompt-runs\n #promptRuns\n [TimeRange]=\"CurrentTimeRange\"\n [Filters]=\"CurrentFilters\"\n ></app-analytics-prompt-runs>\n }\n @case ('agent-runs') {\n <app-analytics-agent-runs\n [TimeRange]=\"CurrentTimeRange\"\n [Filters]=\"CurrentFilters\"\n ></app-analytics-agent-runs>\n }\n @case ('model-performance') {\n <app-analytics-model-performance\n [TimeRange]=\"CurrentTimeRange\"\n [SortBy]=\"CurrentSortBy\"\n [SelectedVendor]=\"CurrentVendor\"\n ></app-analytics-model-performance>\n }\n @case ('cost-budget') {\n <app-analytics-cost-budget\n [TimeRange]=\"CurrentTimeRange\"\n [Filters]=\"CurrentFilters\"\n ></app-analytics-cost-budget>\n }\n @case ('error-analysis') {\n <app-analytics-error-analysis\n [TimeRange]=\"CurrentTimeRange\"\n [Filters]=\"CurrentFilters\"\n ></app-analytics-error-analysis>\n }\n @case ('usage-patterns') {\n <app-analytics-usage-patterns\n [TimeRange]=\"CurrentTimeRange\"\n ></app-analytics-usage-patterns>\n }\n }\n </div>\n </mj-page-body-interior>\n </mj-left-nav-content>\n </mj-page-body>\n </mj-page-layout>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n }\n\n .analytics-shell {\n display: flex;\n flex: 1;\n min-height: 0;\n background: var(--mj-bg-page);\n }\n\n /* ── Left Navigation ── */\n\n /* Rail width + nav-item styling now owned by <mj-left-nav>; the\n divider is expressed as a new MJLeftNavSection rather than a CSS\n rule. */\n\n /* ── Content Area ── */\n\n .analytics-content {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n }\n\n /* ── Section Placeholders ── */\n\n .section-placeholder {\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 {\n font-size: 48px;\n margin-bottom: 20px;\n color: var(--mj-brand-primary);\n opacity: 0.4;\n }\n\n .section-placeholder h2 {\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 8px;\n }\n\n .section-placeholder p {\n font-size: 14px;\n color: var(--mj-text-muted);\n margin: 0;\n max-width: 420px;\n }\n\n /* ── Responsive: collapse nav to horizontal strip ── */\n\n /* Responsive — <mj-left-nav> handles its own collapse-to-row at\n narrow viewports. We only need to tune the content padding. */\n @media (max-width: 768px) {\n .analytics-content {\n padding: 16px;\n }\n }\n\n /* <mj-left-nav> collapses to a full-width top bar at ≤700px; stack the\n shell vertically so the content pane sits below it instead of being\n squeezed to zero width in the flex row. */\n @media (max-width: 700px) {\n .analytics-shell {\n flex-direction: column;\n }\n }\n `]\n})\nexport class AIAnalyticsResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n private readonly USER_SETTINGS_KEY = 'AI.Analytics.UserPreferences';\n private settingsPersistSubject = new Subject<void>();\n protected override destroy$ = new Subject<void>();\n private settingsLoaded = false;\n private cdr = inject(ChangeDetectorRef);\n\n @ViewChild('executiveSummary') private executiveSummary?: AnalyticsExecutiveSummaryComponent;\n @ViewChild('promptRuns') private promptRuns?: AnalyticsPromptRunsComponent;\n\n public ActiveSection = 'executive-summary';\n public CurrentTimeRange = '24h';\n public CurrentFilters: GlobalFilterState = {\n Models: [],\n Agents: [],\n Prompts: [],\n Statuses: []\n };\n /** Single-value SortBy used by Model Performance (lives on the shared chrome). */\n public CurrentSortBy: string = 'cost-efficiency';\n /** Single-value Vendor filter used by Model Performance (lives on the shared chrome). */\n public CurrentVendor: string = '';\n\n /** SortBy options for Model Performance leaderboard. */\n public readonly sortByOptions = [\n { text: 'By Performance', value: 'cost-efficiency' },\n { text: 'By Cost', value: 'cost' },\n { text: 'By Speed', value: 'speed' },\n { text: 'By Reliability', value: 'reliability' },\n { text: 'By Usage', value: 'usage-volume' }\n ];\n\n /** Vendor options, lazily built from AIEngineBase for Model Performance leaderboard. */\n public get vendorOptions(): { text: string; value: string }[] {\n return AIEngineBase.Instance?.Vendors?.map(v => ({ text: v.Name ?? '', value: v.ID ?? '' }))\n ?.sort((a, b) => a.text.localeCompare(b.text)) ?? [];\n }\n\n /** Per-section filter-bar config — switched on ActiveSection. */\n public get FilterBarConfig() {\n switch (this.ActiveSection) {\n case 'executive-summary':\n return { ShowModelFilter: false, ShowAgentFilter: false, ShowPromptFilter: false, ShowStatusFilter: false, ShowSortBy: false, ShowVendor: false, ShowCompareToggle: true, ShowExportButton: false, TimeRangeOptions: ['1h', '6h', '24h', '7d', '30d'] };\n case 'prompt-runs':\n return { ShowModelFilter: true, ShowAgentFilter: true, ShowPromptFilter: true, ShowStatusFilter: true, ShowSortBy: false, ShowVendor: false, ShowCompareToggle: false, ShowExportButton: true, TimeRangeOptions: ['1h', '6h', '24h', '7d', '30d'] };\n case 'agent-runs':\n return { ShowModelFilter: false, ShowAgentFilter: true, ShowPromptFilter: false, ShowStatusFilter: true, ShowSortBy: false, ShowVendor: false, ShowCompareToggle: false, ShowExportButton: false, TimeRangeOptions: ['1h', '6h', '24h', '7d', '30d'] };\n case 'model-performance':\n return { ShowModelFilter: false, ShowAgentFilter: false, ShowPromptFilter: false, ShowStatusFilter: false, ShowSortBy: true, ShowVendor: true, ShowCompareToggle: false, ShowExportButton: false, TimeRangeOptions: ['24h', '7d', '30d'] };\n case 'cost-budget':\n return { ShowModelFilter: true, ShowAgentFilter: false, ShowPromptFilter: false, ShowStatusFilter: false, ShowSortBy: false, ShowVendor: false, ShowCompareToggle: false, ShowExportButton: false, TimeRangeOptions: ['7d', '30d', '90d', 'MTD', 'YTD'] };\n case 'error-analysis':\n return { ShowModelFilter: true, ShowAgentFilter: false, ShowPromptFilter: true, ShowStatusFilter: false, ShowSortBy: false, ShowVendor: false, ShowCompareToggle: false, ShowExportButton: false, TimeRangeOptions: ['1h', '6h', '24h', '7d', '30d'] };\n case 'usage-patterns':\n return { ShowModelFilter: false, ShowAgentFilter: false, ShowPromptFilter: false, ShowStatusFilter: false, ShowSortBy: false, ShowVendor: false, ShowCompareToggle: false, ShowExportButton: false, TimeRangeOptions: ['1h', '6h', '24h', '7d', '30d'] };\n default:\n return { ShowModelFilter: false, ShowAgentFilter: false, ShowPromptFilter: false, ShowStatusFilter: false, ShowSortBy: false, ShowVendor: false, ShowCompareToggle: false, ShowExportButton: false, TimeRangeOptions: ['1h', '6h', '24h', '7d', '30d'] };\n }\n }\n\n /**\n * Always true now — every section uses the shared chrome filter bar.\n * Kept as a getter for future per-section carve-outs.\n */\n public get ShowSharedFilterBar(): boolean {\n return true;\n }\n\n /** Status options used by the popover dropdown when the section has ShowStatusFilter. */\n public readonly statusOptions = [\n { text: 'Success', value: 'Success' },\n { text: 'Error', value: 'Error' },\n { text: 'Running', value: 'Running' },\n { text: 'Pending', value: 'Pending' },\n { text: 'Canceled', value: 'Canceled' },\n ];\n\n /** Built lazily from AIEngineBase. */\n public get modelOptions(): { text: string; value: string }[] {\n return AIEngineBase.Instance?.Models?.map(m => ({ text: m.Name ?? '', value: m.ID }))\n ?.sort((a, b) => a.text.localeCompare(b.text)) ?? [];\n }\n\n public get agentOptions(): { text: string; value: string }[] {\n return AIEngineBase.Instance?.Agents\n ?.filter(a => a.Status === 'Active')\n ?.map(a => ({ text: a.Name ?? '', value: a.ID }))\n ?.sort((a, b) => a.text.localeCompare(b.text)) ?? [];\n }\n\n public get promptOptions(): { text: string; value: string }[] {\n return AIEngineBase.Instance?.Prompts?.map(p => ({ text: p.Name ?? '', value: p.ID }))\n ?.sort((a, b) => a.text.localeCompare(b.text)) ?? [];\n }\n\n /** Time-range chip options for the toolbar slot. */\n public get timeRangeChipOptions(): { text: string; value: string }[] {\n return this.FilterBarConfig.TimeRangeOptions.map(t => ({ text: t, value: t }));\n }\n\n /** Compare-mode visual state (kept on the shell now that analytics-filter-bar is gone). */\n public compareActive = false;\n\n /** Build the FilterFieldConfig[] for the popover based on the active section. */\n public get analyticsFilterFields(): FilterFieldConfig[] {\n const cfg = this.FilterBarConfig;\n const fields: FilterFieldConfig[] = [];\n if (cfg.ShowModelFilter) {\n fields.push({\n key: 'Models',\n type: 'dropdown',\n label: 'Model',\n icon: 'fa-solid fa-microchip',\n filterable: this.modelOptions.length > 10,\n options: [{ text: 'All Models', value: '' }, ...this.modelOptions],\n });\n }\n if (cfg.ShowAgentFilter) {\n fields.push({\n key: 'Agents',\n type: 'dropdown',\n label: 'Agent',\n icon: 'fa-solid fa-robot',\n filterable: this.agentOptions.length > 10,\n options: [{ text: 'All Agents', value: '' }, ...this.agentOptions],\n });\n }\n if (cfg.ShowPromptFilter) {\n fields.push({\n key: 'Prompts',\n type: 'dropdown',\n label: 'Prompt',\n icon: 'fa-solid fa-comment-dots',\n filterable: this.promptOptions.length > 10,\n options: [{ text: 'All Prompts', value: '' }, ...this.promptOptions],\n });\n }\n if (cfg.ShowStatusFilter) {\n fields.push({\n key: 'Statuses',\n type: 'dropdown',\n label: 'Status',\n icon: 'fa-solid fa-toggle-on',\n options: [{ text: 'All Statuses', value: '' }, ...this.statusOptions],\n });\n }\n if (cfg.ShowSortBy) {\n fields.push({\n key: 'SortBy',\n type: 'dropdown',\n label: 'Sort By',\n icon: 'fa-solid fa-arrow-down-wide-short',\n options: this.sortByOptions,\n });\n }\n if (cfg.ShowVendor) {\n fields.push({\n key: 'Vendor',\n type: 'dropdown',\n label: 'Vendor',\n icon: 'fa-solid fa-building',\n filterable: this.vendorOptions.length > 10,\n options: [{ text: 'All Vendors', value: '' }, ...this.vendorOptions],\n });\n }\n return fields;\n }\n\n /** Single-value flattened state for the centralized panel (the panel takes scalar values; we hold arrays in CurrentFilters). */\n public get analyticsFilterValues(): Record<string, unknown> {\n return {\n Models: this.CurrentFilters.Models?.[0] ?? '',\n Agents: this.CurrentFilters.Agents?.[0] ?? '',\n Prompts: this.CurrentFilters.Prompts?.[0] ?? '',\n Statuses: this.CurrentFilters.Statuses?.[0] ?? '',\n SortBy: this.CurrentSortBy,\n Vendor: this.CurrentVendor,\n };\n }\n\n /** Receive popover updates and translate scalar → array shape used by GlobalFilterState. */\n public onAnalyticsFilterValuesChange(values: Record<string, unknown>): void {\n const next: GlobalFilterState = {\n Models: values['Models'] ? [values['Models'] as string] : [],\n Agents: values['Agents'] ? [values['Agents'] as string] : [],\n Prompts: values['Prompts'] ? [values['Prompts'] as string] : [],\n Statuses: values['Statuses'] ? [values['Statuses'] as string] : [],\n };\n this.OnFiltersChange(next);\n if ('SortBy' in values) {\n this.CurrentSortBy = (values['SortBy'] as string) || 'cost-efficiency';\n }\n if ('Vendor' in values) {\n this.CurrentVendor = (values['Vendor'] as string) || '';\n }\n }\n\n /** Reset only the popover filters — leaves TimeRange and CompareActive alone. */\n public resetPopoverFilters(): void {\n this.OnFiltersChange({ Models: [], Agents: [], Prompts: [], Statuses: [] });\n // SortBy + Vendor reset only when Model Performance is the active section.\n if (this.ActiveSection === 'model-performance') {\n this.CurrentSortBy = 'cost-efficiency';\n this.CurrentVendor = '';\n }\n }\n\n /** Active filter count for the popover badge. */\n public get ActiveFilterCount(): number {\n const f = this.CurrentFilters;\n let count = (f.Models?.length ?? 0) + (f.Agents?.length ?? 0) + (f.Prompts?.length ?? 0) + (f.Statuses?.length ?? 0);\n // SortBy counts as \"active\" when it differs from the default.\n if (this.FilterBarConfig.ShowSortBy && this.CurrentSortBy && this.CurrentSortBy !== 'cost-efficiency') count++;\n if (this.FilterBarConfig.ShowVendor && this.CurrentVendor) count++;\n return count;\n }\n\n /** Toggle Compare mode — the mjButton directive owns the [(selected)] flip, so this handler only forwards the new value. */\n public toggleCompare(): void {\n this.OnCompareToggled(this.compareActive);\n }\n\n readonly NavItems: NavItem[] = [\n { Label: 'Executive Summary', Icon: 'fa-solid fa-gauge-high', Key: 'executive-summary',\n Description: 'High-level KPIs and trends across the platform' },\n { Label: 'Prompt Runs', Icon: 'fa-solid fa-comment-dots', Key: 'prompt-runs',\n Description: 'Detailed analysis of individual prompt executions' },\n { Label: 'Agent Runs', Icon: 'fa-solid fa-robot', Key: 'agent-runs',\n Description: 'Performance breakdown by agent' },\n { Label: 'Model Performance', Icon: 'fa-solid fa-microchip', Key: 'model-performance',\n Description: 'Compare models across cost, speed, and quality' },\n { Key: 'divider' },\n { Label: 'Cost & Budget', Icon: 'fa-solid fa-coins', Key: 'cost-budget',\n Description: 'Spend trends and budget tracking' },\n { Label: 'Error Analysis', Icon: 'fa-solid fa-triangle-exclamation', Key: 'error-analysis',\n Description: 'Failure patterns and root causes' },\n { Label: 'Usage Patterns', Icon: 'fa-solid fa-clock', Key: 'usage-patterns',\n Description: 'Volume, frequency, and concurrency over time' },\n ];\n\n /**\n * Active section metadata — drives <mj-page-header-interior> Title +\n * Subtitle. Mirrors the pattern in KH Configuration / KH Analytics: one\n * source of truth (NavItems) used both to build the rail and to render\n * per-section identity.\n */\n get currentSection(): NavItem | undefined {\n return this.NavItems.find(n => n.Key === this.ActiveSection);\n }\n\n /**\n * Wraps `NavItems` for `<mj-left-nav>`. The `{ Key: 'divider' }` entry\n * splits the items into two `MJLeftNavSection`s (an unlabeled section per\n * group) — the rail's natural section break replaces the bespoke\n * `.nav-divider` line.\n */\n get navSections(): MJLeftNavSection[] {\n const sections: MJLeftNavSection[] = [{ items: [] }];\n for (const item of this.NavItems) {\n if (item.Key === 'divider') {\n sections.push({ items: [] });\n } else {\n sections[sections.length - 1].items.push({\n id: item.Key,\n label: item.Label ?? '',\n icon: item.Icon\n });\n }\n }\n return sections;\n }\n\n /** Adapter for `<mj-left-nav>`'s `(ItemClicked)` output. */\n onNavItemClicked(item: MJLeftNavItem): void {\n this.OnSectionChange(item.id);\n }\n\n async ngOnInit(): Promise<void> {\n super.ngOnInit();\n this.setupSettingsDebounce();\n await this.loadUserSettings();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'AI Analytics';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-chart-line';\n }\n\n /** Navigate to a different analytics section */\n public OnSectionChange(key: string): void {\n if (key === 'divider' || key === this.ActiveSection) {\n return;\n }\n this.ActiveSection = key;\n this.saveUserSettings();\n this.cdr.detectChanges();\n }\n\n /** Handle time range changes from the filter bar */\n public OnTimeRangeChange(range: string): void {\n this.CurrentTimeRange = range;\n this.saveUserSettings();\n }\n\n /** Handle filter changes from the filter bar */\n public OnFiltersChange(filters: GlobalFilterState): void {\n this.CurrentFilters = filters;\n this.saveUserSettings();\n }\n\n /** Compare-toggle button — only visible on Executive Summary; forwards to that section. */\n public OnCompareToggled(value: boolean): void {\n this.executiveSummary?.OnCompareToggled?.(value);\n }\n\n /** Export button — only visible on Prompt Runs; forwards to that section. */\n public OnExportClicked(): void {\n this.promptRuns?.ExportCSV?.();\n }\n\n // ── Private Helpers ──\n\n private setupSettingsDebounce(): void {\n this.settingsPersistSubject.pipe(\n debounceTime(500),\n takeUntil(this.destroy$)\n ).subscribe(() => this.persistUserSettings());\n }\n\n private async loadUserSettings(): Promise<void> {\n try {\n const raw = UserInfoEngine.Instance.GetSetting(this.USER_SETTINGS_KEY);\n if (raw) {\n const prefs: AIAnalyticsPreferences = JSON.parse(raw);\n if (prefs.ActiveSection) {\n this.ActiveSection = prefs.ActiveSection;\n }\n if (prefs.ExecutiveSummary?.Filters) {\n this.CurrentFilters = { ...this.CurrentFilters, ...prefs.ExecutiveSummary.Filters };\n }\n if (prefs.ExecutiveSummary?.TimeRange) {\n this.CurrentTimeRange = prefs.ExecutiveSummary.TimeRange;\n }\n }\n } catch {\n // Use defaults on parse failure\n }\n this.settingsLoaded = true;\n }\n\n private saveUserSettings(): void {\n if (this.settingsLoaded) {\n this.settingsPersistSubject.next();\n }\n }\n\n private async persistUserSettings(): Promise<void> {\n try {\n const prefs: AIAnalyticsPreferences = {\n ActiveSection: this.ActiveSection,\n ExecutiveSummary: {\n TimeRange: this.CurrentTimeRange,\n ComparisonEnabled: false,\n Filters: this.CurrentFilters\n },\n PromptRuns: {\n TimeRange: this.CurrentTimeRange,\n Filters: this.CurrentFilters,\n ChartMetric: 'count',\n SortField: 'StartedAt',\n SortDirection: 'desc'\n },\n AgentRuns: {\n TimeRange: this.CurrentTimeRange,\n Filters: {\n Agents: this.CurrentFilters.Agents,\n Statuses: this.CurrentFilters.Statuses\n }\n },\n ModelPerformance: {\n TimeRange: this.CurrentTimeRange,\n SortBy: 'latency',\n VendorFilter: []\n },\n CostBudget: {\n TimeRange: this.CurrentTimeRange,\n Filters: this.CurrentFilters\n }\n };\n await UserInfoEngine.Instance.SetSetting(\n this.USER_SETTINGS_KEY,\n JSON.stringify(prefs)\n );\n } catch {\n // Silent failure for settings persistence\n }\n }\n}\n\nexport function LoadAIAnalyticsResource(): void {\n // Prevents tree-shaking of the @RegisterClass decorator\n}\n"]}
1
+ {"version":3,"file":"ai-analytics-resource.component.js","sourceRoot":"","sources":["../../../../src/AI/components/analytics/ai-analytics-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview AI Analytics Shell — Resource Component\n *\n * Main resource component for the AI Analytics dashboard. Provides a left\n * navigation panel and content area that switches between analytics sections:\n * Executive Summary, Prompt Runs, Agent Runs, Model Performance, Cost & Budget,\n * Error Analysis, and Usage Patterns.\n *\n * Persists the active section and filter state via UserInfoEngine settings\n * with debounced writes.\n */\n\nimport { Component, ChangeDetectorRef, OnInit, OnDestroy, ViewChild, inject } from '@angular/core';\nimport { AnalyticsExecutiveSummaryComponent } from './executive-summary/executive-summary.component';\nimport { AnalyticsPromptRunsComponent } from './prompt-runs/prompt-run-analysis.component';\nimport { Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { ResourceData, UserInfoEngine } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { AIAnalyticsPreferences, GlobalFilterState } from '../../interfaces/analytics-preferences.interface';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { FilterFieldConfig, MJLeftNavItem, MJLeftNavSection } from '@memberjunction/ng-ui-components';\n\ninterface NavItem {\n Label?: string;\n Icon?: string;\n Key: string;\n /**\n * Short prose used as the Subtitle on this section's\n * <mj-page-header-interior> card. Omitted for the `divider` entry.\n */\n Description?: string;\n}\n\n@RegisterClass(BaseResourceComponent, 'AIAnalyticsResource')\n@Component({\n standalone: false,\n selector: 'app-ai-analytics-resource',\n template: `\n <mj-page-layout>\n <!-- Outer chrome — pure identity. Every control (filter-popover,\n TimeRange chips, Compare, Export) lives in the per-section\n <mj-page-header-interior> card below because each section\n configures its own filter fields and time-range options. -->\n <mj-page-header\n Title=\"AI Analytics\"\n Icon=\"fa-solid fa-chart-line\"\n Subtitle=\"Performance, cost, and usage analytics\">\n </mj-page-header>\n <mj-page-body [Padding]=\"false\" class=\"analytics-shell\">\n <mj-left-nav\n MobileTitle=\"Analytics\"\n [Sections]=\"navSections\"\n [ActiveId]=\"ActiveSection\"\n (ItemClicked)=\"onNavItemClicked($event)\">\n </mj-left-nav>\n\n <mj-left-nav-content>\n <!-- Per-section interior chrome owns the complete control surface\n for the active section: identity + actions + the section's\n own time-range chip strip. Even TimeRange options vary per\n section (Cost & Budget adds MTD / YTD, Model Performance\n drops 1h / 6h, etc.) so it belongs here rather than in the\n outer chrome. -->\n <mj-page-header-interior\n [Title]=\"currentSection?.Label || ''\"\n [Subtitle]=\"currentSection?.Description || ''\">\n <div actions>\n @if (analyticsFilterFields.length > 0) {\n <mj-filter-popover\n [ActiveCount]=\"ActiveFilterCount\"\n [ShowClearAll]=\"ActiveFilterCount > 0\"\n (ClearAllRequested)=\"resetPopoverFilters()\">\n <mj-filter-panel\n [Fields]=\"analyticsFilterFields\"\n [Values]=\"analyticsFilterValues\"\n (ValuesChange)=\"onAnalyticsFilterValuesChange($event)\"\n (Reset)=\"resetPopoverFilters()\">\n </mj-filter-panel>\n </mj-filter-popover>\n }\n @if (FilterBarConfig.ShowCompareToggle) {\n <button mjButton variant=\"secondary\" size=\"sm\" [toggleable]=\"true\" [(selected)]=\"compareActive\" (selectedChange)=\"toggleCompare()\">\n <i class=\"fa-solid fa-code-compare\"></i> <span class=\"mj-action-label\">Compare</span>\n </button>\n }\n @if (FilterBarConfig.ShowExportButton) {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OnExportClicked()\">\n <i class=\"fa-solid fa-download\"></i> <span class=\"mj-action-label\">Export</span>\n </button>\n }\n </div>\n @if (timeRangeChipOptions.length > 0) {\n <div toolbar class=\"time-range-chips\">\n @for (chip of timeRangeChipOptions; track chip.value) {\n <mj-filter-chip\n [Label]=\"chip.text\"\n [Active]=\"CurrentTimeRange === chip.value\"\n (Clicked)=\"OnTimeRangeChange(chip.value)\">\n </mj-filter-chip>\n }\n </div>\n }\n </mj-page-header-interior>\n <mj-page-body-interior [Padding]=\"false\">\n <div class=\"analytics-content\">\n @switch (ActiveSection) {\n @case ('executive-summary') {\n <app-analytics-executive-summary\n #executiveSummary\n [TimeRange]=\"CurrentTimeRange\"\n [Filters]=\"CurrentFilters\"\n (SectionNavigate)=\"OnSectionChange($event)\"\n ></app-analytics-executive-summary>\n }\n @case ('prompt-runs') {\n <app-analytics-prompt-runs\n #promptRuns\n [TimeRange]=\"CurrentTimeRange\"\n [Filters]=\"CurrentFilters\"\n ></app-analytics-prompt-runs>\n }\n @case ('agent-runs') {\n <app-analytics-agent-runs\n [TimeRange]=\"CurrentTimeRange\"\n [Filters]=\"CurrentFilters\"\n ></app-analytics-agent-runs>\n }\n @case ('model-performance') {\n <app-analytics-model-performance\n [TimeRange]=\"CurrentTimeRange\"\n [SortBy]=\"CurrentSortBy\"\n [SelectedVendor]=\"CurrentVendor\"\n ></app-analytics-model-performance>\n }\n @case ('cost-budget') {\n <app-analytics-cost-budget\n [TimeRange]=\"CurrentTimeRange\"\n [Filters]=\"CurrentFilters\"\n ></app-analytics-cost-budget>\n }\n @case ('error-analysis') {\n <app-analytics-error-analysis\n [TimeRange]=\"CurrentTimeRange\"\n [Filters]=\"CurrentFilters\"\n ></app-analytics-error-analysis>\n }\n @case ('usage-patterns') {\n <app-analytics-usage-patterns\n [TimeRange]=\"CurrentTimeRange\"\n ></app-analytics-usage-patterns>\n }\n @case ('realtime-overview') {\n <app-analytics-realtime-overview\n [TimeRange]=\"CurrentTimeRange\"\n (SectionNavigate)=\"OnSectionChange($event)\"\n ></app-analytics-realtime-overview>\n }\n @case ('realtime-sessions') {\n <app-analytics-realtime-sessions\n [TimeRange]=\"CurrentTimeRange\"\n ></app-analytics-realtime-sessions>\n }\n @case ('realtime-management') {\n <app-realtime-management\n [TimeRange]=\"CurrentTimeRange\"\n ></app-realtime-management>\n }\n }\n </div>\n </mj-page-body-interior>\n </mj-left-nav-content>\n </mj-page-body>\n </mj-page-layout>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n }\n\n .analytics-shell {\n display: flex;\n flex: 1;\n min-height: 0;\n background: var(--mj-bg-page);\n }\n\n /* ── Left Navigation ── */\n\n /* Rail width + nav-item styling now owned by <mj-left-nav>; the\n divider is expressed as a new MJLeftNavSection rather than a CSS\n rule. */\n\n /* ── Content Area ── */\n\n .analytics-content {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n }\n\n /* ── Section Placeholders ── */\n\n .section-placeholder {\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 {\n font-size: 48px;\n margin-bottom: 20px;\n color: var(--mj-brand-primary);\n opacity: 0.4;\n }\n\n .section-placeholder h2 {\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 8px;\n }\n\n .section-placeholder p {\n font-size: 14px;\n color: var(--mj-text-muted);\n margin: 0;\n max-width: 420px;\n }\n\n /* ── Responsive: collapse nav to horizontal strip ── */\n\n /* Responsive — <mj-left-nav> handles its own collapse-to-row at\n narrow viewports. We only need to tune the content padding. */\n @media (max-width: 768px) {\n .analytics-content {\n padding: 16px;\n }\n }\n\n /* <mj-left-nav> collapses to a full-width top bar at ≤700px; stack the\n shell vertically so the content pane sits below it instead of being\n squeezed to zero width in the flex row. */\n @media (max-width: 700px) {\n .analytics-shell {\n flex-direction: column;\n }\n }\n `]\n})\nexport class AIAnalyticsResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n private readonly USER_SETTINGS_KEY = 'AI.Analytics.UserPreferences';\n private settingsPersistSubject = new Subject<void>();\n protected override destroy$ = new Subject<void>();\n private settingsLoaded = false;\n private cdr = inject(ChangeDetectorRef);\n\n @ViewChild('executiveSummary') private executiveSummary?: AnalyticsExecutiveSummaryComponent;\n @ViewChild('promptRuns') private promptRuns?: AnalyticsPromptRunsComponent;\n\n /**\n * Active analytics section. Implemented as a getter/setter so that changing\n * it recomputes the (section-dependent) filter-field config exactly once,\n * rather than rebuilding the whole FilterFieldConfig[] on every\n * change-detection pass (the field config is template-bound twice).\n */\n private _activeSection = 'executive-summary';\n public get ActiveSection(): string {\n return this._activeSection;\n }\n public set ActiveSection(value: string) {\n if (value !== this._activeSection) {\n this._activeSection = value;\n this.recomputeFilterFields();\n }\n }\n public CurrentTimeRange = '24h';\n public CurrentFilters: GlobalFilterState = {\n Models: [],\n Agents: [],\n Prompts: [],\n Statuses: []\n };\n /** Single-value SortBy used by Model Performance (lives on the shared chrome). */\n public CurrentSortBy: string = 'cost-efficiency';\n /** Single-value Vendor filter used by Model Performance (lives on the shared chrome). */\n public CurrentVendor: string = '';\n\n /** SortBy options for Model Performance leaderboard. */\n public readonly sortByOptions = [\n { text: 'By Performance', value: 'cost-efficiency' },\n { text: 'By Cost', value: 'cost' },\n { text: 'By Speed', value: 'speed' },\n { text: 'By Reliability', value: 'reliability' },\n { text: 'By Usage', value: 'usage-volume' }\n ];\n\n // ── Precomputed option lists ────────────────────────────────────────────\n // Built ONCE from AIEngineBase's (process-cached, load-once) lists in\n // ngOnInit — see recomputeOptionLists. Each used to be a getter doing\n // .map().sort() (and .filter() for agents) over engine-wide lists; because\n // analyticsFilterFields is template-bound twice they re-ran 2×/CD. The\n // backing fields are read by both the public getters (kept for any external\n // callers) and by recomputeFilterFields.\n private _modelOptions: { text: string; value: string }[] = [];\n private _agentOptions: { text: string; value: string }[] = [];\n private _promptOptions: { text: string; value: string }[] = [];\n private _vendorOptions: { text: string; value: string }[] = [];\n\n /** Vendor options, built from AIEngineBase for the Model Performance leaderboard. */\n public get vendorOptions(): { text: string; value: string }[] {\n return this._vendorOptions;\n }\n\n /** Per-section filter-bar config — switched on ActiveSection. */\n public get FilterBarConfig() {\n switch (this.ActiveSection) {\n case 'executive-summary':\n return { ShowModelFilter: false, ShowAgentFilter: false, ShowPromptFilter: false, ShowStatusFilter: false, ShowSortBy: false, ShowVendor: false, ShowCompareToggle: true, ShowExportButton: false, TimeRangeOptions: ['1h', '6h', '24h', '7d', '30d'] };\n case 'prompt-runs':\n return { ShowModelFilter: true, ShowAgentFilter: true, ShowPromptFilter: true, ShowStatusFilter: true, ShowSortBy: false, ShowVendor: false, ShowCompareToggle: false, ShowExportButton: true, TimeRangeOptions: ['1h', '6h', '24h', '7d', '30d'] };\n case 'agent-runs':\n return { ShowModelFilter: false, ShowAgentFilter: true, ShowPromptFilter: false, ShowStatusFilter: true, ShowSortBy: false, ShowVendor: false, ShowCompareToggle: false, ShowExportButton: false, TimeRangeOptions: ['1h', '6h', '24h', '7d', '30d'] };\n case 'model-performance':\n return { ShowModelFilter: false, ShowAgentFilter: false, ShowPromptFilter: false, ShowStatusFilter: false, ShowSortBy: true, ShowVendor: true, ShowCompareToggle: false, ShowExportButton: false, TimeRangeOptions: ['24h', '7d', '30d'] };\n case 'cost-budget':\n return { ShowModelFilter: true, ShowAgentFilter: false, ShowPromptFilter: false, ShowStatusFilter: false, ShowSortBy: false, ShowVendor: false, ShowCompareToggle: false, ShowExportButton: false, TimeRangeOptions: ['7d', '30d', '90d', 'MTD', 'YTD'] };\n case 'error-analysis':\n return { ShowModelFilter: true, ShowAgentFilter: false, ShowPromptFilter: true, ShowStatusFilter: false, ShowSortBy: false, ShowVendor: false, ShowCompareToggle: false, ShowExportButton: false, TimeRangeOptions: ['1h', '6h', '24h', '7d', '30d'] };\n case 'usage-patterns':\n return { ShowModelFilter: false, ShowAgentFilter: false, ShowPromptFilter: false, ShowStatusFilter: false, ShowSortBy: false, ShowVendor: false, ShowCompareToggle: false, ShowExportButton: false, TimeRangeOptions: ['1h', '6h', '24h', '7d', '30d'] };\n // Realtime Voice sections own their filters internally (search/status/\n // target/user/host live with the grid); only the time-range chips come\n // from the shared chrome. Session data is bucketed daily, so the\n // sub-day ranges are dropped.\n case 'realtime-overview':\n case 'realtime-sessions':\n // Realtime management owns its sub-tab rail + per-surface filters\n // internally; only the time-range chips come from the shared chrome\n // (it windows session history daily, so sub-day ranges are dropped).\n case 'realtime-management':\n return { ShowModelFilter: false, ShowAgentFilter: false, ShowPromptFilter: false, ShowStatusFilter: false, ShowSortBy: false, ShowVendor: false, ShowCompareToggle: false, ShowExportButton: false, TimeRangeOptions: ['24h', '7d', '30d'] };\n default:\n return { ShowModelFilter: false, ShowAgentFilter: false, ShowPromptFilter: false, ShowStatusFilter: false, ShowSortBy: false, ShowVendor: false, ShowCompareToggle: false, ShowExportButton: false, TimeRangeOptions: ['1h', '6h', '24h', '7d', '30d'] };\n }\n }\n\n /**\n * Always true now — every section uses the shared chrome filter bar.\n * Kept as a getter for future per-section carve-outs.\n */\n public get ShowSharedFilterBar(): boolean {\n return true;\n }\n\n /** Status options used by the popover dropdown when the section has ShowStatusFilter. */\n public readonly statusOptions = [\n { text: 'Success', value: 'Success' },\n { text: 'Error', value: 'Error' },\n { text: 'Running', value: 'Running' },\n { text: 'Pending', value: 'Pending' },\n { text: 'Canceled', value: 'Canceled' },\n ];\n\n /** Built from AIEngineBase (see recomputeOptionLists). */\n public get modelOptions(): { text: string; value: string }[] {\n return this._modelOptions;\n }\n\n public get agentOptions(): { text: string; value: string }[] {\n return this._agentOptions;\n }\n\n public get promptOptions(): { text: string; value: string }[] {\n return this._promptOptions;\n }\n\n /**\n * Build the four option lists from AIEngineBase's cached metadata. Called once\n * after the engine is loaded (ngOnInit). Mirrors the exact map/filter/sort the\n * former getters performed, so the values are identical — just computed once.\n *\n * Accepted staleness tradeoff: these lists are built once after engine load and\n * are NOT reactive — a mid-session AIEngineBase metadata reload (new model/agent/\n * prompt/vendor) would not refresh them until this component is re-created. That\n * is acceptable for an analytics surface (its option lists are near-static within\n * a session); we deliberately do NOT wire observable reactivity here. The former\n * getters re-read the engine on every CD, which was the perf cost we removed.\n */\n private recomputeOptionLists(): void {\n const engine = AIEngineBase.Instance;\n this._modelOptions = engine?.Models?.map(m => ({ text: m.Name ?? '', value: m.ID }))\n ?.sort((a, b) => a.text.localeCompare(b.text)) ?? [];\n this._agentOptions = engine?.Agents\n ?.filter(a => a.Status === 'Active')\n ?.map(a => ({ text: a.Name ?? '', value: a.ID }))\n ?.sort((a, b) => a.text.localeCompare(b.text)) ?? [];\n this._promptOptions = engine?.Prompts?.map(p => ({ text: p.Name ?? '', value: p.ID }))\n ?.sort((a, b) => a.text.localeCompare(b.text)) ?? [];\n this._vendorOptions = engine?.Vendors?.map(v => ({ text: v.Name ?? '', value: v.ID ?? '' }))\n ?.sort((a, b) => a.text.localeCompare(b.text)) ?? [];\n }\n\n /** Time-range chip options for the toolbar slot. */\n public get timeRangeChipOptions(): { text: string; value: string }[] {\n return this.FilterBarConfig.TimeRangeOptions.map(t => ({ text: t, value: t }));\n }\n\n /** Compare-mode visual state (kept on the shell now that analytics-filter-bar is gone). */\n public compareActive = false;\n\n /**\n * Precomputed popover field config for the active section. Recomputed only when\n * ActiveSection changes (via its setter) or after the option lists load — NOT\n * on every CD pass, even though the template binds this twice (the `@if` guard\n * and the `[Fields]` input).\n */\n private _analyticsFilterFields: FilterFieldConfig[] = [];\n\n /** Field config for the popover, based on the active section (precomputed). */\n public get analyticsFilterFields(): FilterFieldConfig[] {\n return this._analyticsFilterFields;\n }\n\n /** Rebuild {@link _analyticsFilterFields} for the current section from the option lists. */\n private recomputeFilterFields(): void {\n const cfg = this.FilterBarConfig;\n const fields: FilterFieldConfig[] = [];\n if (cfg.ShowModelFilter) {\n fields.push({\n key: 'Models',\n type: 'dropdown',\n label: 'Model',\n icon: 'fa-solid fa-microchip',\n filterable: this.modelOptions.length > 10,\n options: [{ text: 'All Models', value: '' }, ...this.modelOptions],\n });\n }\n if (cfg.ShowAgentFilter) {\n fields.push({\n key: 'Agents',\n type: 'dropdown',\n label: 'Agent',\n icon: 'fa-solid fa-robot',\n filterable: this.agentOptions.length > 10,\n options: [{ text: 'All Agents', value: '' }, ...this.agentOptions],\n });\n }\n if (cfg.ShowPromptFilter) {\n fields.push({\n key: 'Prompts',\n type: 'dropdown',\n label: 'Prompt',\n icon: 'fa-solid fa-comment-dots',\n filterable: this.promptOptions.length > 10,\n options: [{ text: 'All Prompts', value: '' }, ...this.promptOptions],\n });\n }\n if (cfg.ShowStatusFilter) {\n fields.push({\n key: 'Statuses',\n type: 'dropdown',\n label: 'Status',\n icon: 'fa-solid fa-toggle-on',\n options: [{ text: 'All Statuses', value: '' }, ...this.statusOptions],\n });\n }\n if (cfg.ShowSortBy) {\n fields.push({\n key: 'SortBy',\n type: 'dropdown',\n label: 'Sort By',\n icon: 'fa-solid fa-arrow-down-wide-short',\n options: this.sortByOptions,\n });\n }\n if (cfg.ShowVendor) {\n fields.push({\n key: 'Vendor',\n type: 'dropdown',\n label: 'Vendor',\n icon: 'fa-solid fa-building',\n filterable: this.vendorOptions.length > 10,\n options: [{ text: 'All Vendors', value: '' }, ...this.vendorOptions],\n });\n }\n this._analyticsFilterFields = fields;\n }\n\n /** Single-value flattened state for the centralized panel (the panel takes scalar values; we hold arrays in CurrentFilters). */\n public get analyticsFilterValues(): Record<string, unknown> {\n return {\n Models: this.CurrentFilters.Models?.[0] ?? '',\n Agents: this.CurrentFilters.Agents?.[0] ?? '',\n Prompts: this.CurrentFilters.Prompts?.[0] ?? '',\n Statuses: this.CurrentFilters.Statuses?.[0] ?? '',\n SortBy: this.CurrentSortBy,\n Vendor: this.CurrentVendor,\n };\n }\n\n /** Receive popover updates and translate scalar → array shape used by GlobalFilterState. */\n public onAnalyticsFilterValuesChange(values: Record<string, unknown>): void {\n const next: GlobalFilterState = {\n Models: values['Models'] ? [values['Models'] as string] : [],\n Agents: values['Agents'] ? [values['Agents'] as string] : [],\n Prompts: values['Prompts'] ? [values['Prompts'] as string] : [],\n Statuses: values['Statuses'] ? [values['Statuses'] as string] : [],\n };\n this.OnFiltersChange(next);\n if ('SortBy' in values) {\n this.CurrentSortBy = (values['SortBy'] as string) || 'cost-efficiency';\n }\n if ('Vendor' in values) {\n this.CurrentVendor = (values['Vendor'] as string) || '';\n }\n }\n\n /** Reset only the popover filters — leaves TimeRange and CompareActive alone. */\n public resetPopoverFilters(): void {\n this.OnFiltersChange({ Models: [], Agents: [], Prompts: [], Statuses: [] });\n // SortBy + Vendor reset only when Model Performance is the active section.\n if (this.ActiveSection === 'model-performance') {\n this.CurrentSortBy = 'cost-efficiency';\n this.CurrentVendor = '';\n }\n }\n\n /** Active filter count for the popover badge. */\n public get ActiveFilterCount(): number {\n const f = this.CurrentFilters;\n let count = (f.Models?.length ?? 0) + (f.Agents?.length ?? 0) + (f.Prompts?.length ?? 0) + (f.Statuses?.length ?? 0);\n // SortBy counts as \"active\" when it differs from the default.\n if (this.FilterBarConfig.ShowSortBy && this.CurrentSortBy && this.CurrentSortBy !== 'cost-efficiency') count++;\n if (this.FilterBarConfig.ShowVendor && this.CurrentVendor) count++;\n return count;\n }\n\n /** Toggle Compare mode — the mjButton directive owns the [(selected)] flip, so this handler only forwards the new value. */\n public toggleCompare(): void {\n this.OnCompareToggled(this.compareActive);\n }\n\n readonly NavItems: NavItem[] = [\n { Label: 'Executive Summary', Icon: 'fa-solid fa-gauge-high', Key: 'executive-summary',\n Description: 'High-level KPIs and trends across the platform' },\n { Label: 'Prompt Runs', Icon: 'fa-solid fa-comment-dots', Key: 'prompt-runs',\n Description: 'Detailed analysis of individual prompt executions' },\n { Label: 'Agent Runs', Icon: 'fa-solid fa-robot', Key: 'agent-runs',\n Description: 'Performance breakdown by agent' },\n { Label: 'Model Performance', Icon: 'fa-solid fa-microchip', Key: 'model-performance',\n Description: 'Compare models across cost, speed, and quality' },\n { Key: 'divider' },\n { Label: 'Cost & Budget', Icon: 'fa-solid fa-coins', Key: 'cost-budget',\n Description: 'Spend trends and budget tracking' },\n { Label: 'Error Analysis', Icon: 'fa-solid fa-triangle-exclamation', Key: 'error-analysis',\n Description: 'Failure patterns and root causes' },\n { Label: 'Usage Patterns', Icon: 'fa-solid fa-clock', Key: 'usage-patterns',\n Description: 'Volume, frequency, and concurrency over time' },\n { Key: 'divider2' },\n { Label: 'Realtime Voice', Icon: 'fa-solid fa-tower-broadcast', Key: 'realtime-overview',\n Description: 'Operational analytics for voice-agent sessions — sessions, channels, and delegated runs' },\n { Label: 'Voice Sessions', Icon: 'fa-solid fa-table-list', Key: 'realtime-sessions',\n Description: 'Every long-lived agent session — live calls, idle holds, and closed history' },\n { Label: 'Realtime Management', Icon: 'fa-solid fa-satellite-dish', Key: 'realtime-management',\n Description: 'Manage the realtime + bridge surface — live sessions, bridge providers, agent identities, channels, co-agents, history, and metrics' },\n ];\n\n /**\n * Active section metadata — drives <mj-page-header-interior> Title +\n * Subtitle. Mirrors the pattern in KH Configuration / KH Analytics: one\n * source of truth (NavItems) used both to build the rail and to render\n * per-section identity.\n */\n get currentSection(): NavItem | undefined {\n return this.NavItems.find(n => n.Key === this.ActiveSection);\n }\n\n /**\n * Wraps `NavItems` for `<mj-left-nav>`. The `{ Key: 'divider' }` entry\n * splits the items into two `MJLeftNavSection`s (an unlabeled section per\n * group) — the rail's natural section break replaces the bespoke\n * `.nav-divider` line.\n */\n get navSections(): MJLeftNavSection[] {\n const sections: MJLeftNavSection[] = [{ items: [] }];\n for (const item of this.NavItems) {\n if (item.Key.startsWith('divider')) {\n sections.push({ items: [] });\n } else {\n sections[sections.length - 1].items.push({\n id: item.Key,\n label: item.Label ?? '',\n icon: item.Icon\n });\n }\n }\n return sections;\n }\n\n /** Adapter for `<mj-left-nav>`'s `(ItemClicked)` output. */\n onNavItemClicked(item: MJLeftNavItem): void {\n this.OnSectionChange(item.id);\n }\n\n async ngOnInit(): Promise<void> {\n super.ngOnInit();\n this.setupSettingsDebounce();\n // AIEngineBase is deferred at startup — ensure it's loaded, then build the\n // option lists ONCE so the precomputed filter-field config has real data.\n try {\n await AIEngineBase.Instance.EnsureLoaded();\n } catch {\n // Fall through with whatever (possibly empty) cache exists — the option\n // lists tolerate an unloaded engine (same as the former lazy getters).\n }\n this.recomputeOptionLists();\n await this.loadUserSettings();\n // Final rebuild: covers both the initial section and any section restored\n // from user settings, now that the option lists are populated.\n this.recomputeFilterFields();\n this.cdr.detectChanges();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'AI Analytics';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-chart-line';\n }\n\n /** Navigate to a different analytics section */\n public OnSectionChange(key: string): void {\n if (key.startsWith('divider') || key === this.ActiveSection) {\n return;\n }\n this.ActiveSection = key;\n this.saveUserSettings();\n this.cdr.detectChanges();\n }\n\n /** Handle time range changes from the filter bar */\n public OnTimeRangeChange(range: string): void {\n this.CurrentTimeRange = range;\n this.saveUserSettings();\n }\n\n /** Handle filter changes from the filter bar */\n public OnFiltersChange(filters: GlobalFilterState): void {\n this.CurrentFilters = filters;\n this.saveUserSettings();\n }\n\n /** Compare-toggle button — only visible on Executive Summary; forwards to that section. */\n public OnCompareToggled(value: boolean): void {\n this.executiveSummary?.OnCompareToggled?.(value);\n }\n\n /** Export button — only visible on Prompt Runs; forwards to that section. */\n public OnExportClicked(): void {\n this.promptRuns?.ExportCSV?.();\n }\n\n // ── Private Helpers ──\n\n private setupSettingsDebounce(): void {\n this.settingsPersistSubject.pipe(\n debounceTime(500),\n takeUntil(this.destroy$)\n ).subscribe(() => this.persistUserSettings());\n }\n\n private async loadUserSettings(): Promise<void> {\n try {\n const raw = UserInfoEngine.Instance.GetSetting(this.USER_SETTINGS_KEY);\n if (raw) {\n const prefs: AIAnalyticsPreferences = JSON.parse(raw);\n if (prefs.ActiveSection) {\n this.ActiveSection = prefs.ActiveSection;\n }\n if (prefs.ExecutiveSummary?.Filters) {\n this.CurrentFilters = { ...this.CurrentFilters, ...prefs.ExecutiveSummary.Filters };\n }\n if (prefs.ExecutiveSummary?.TimeRange) {\n this.CurrentTimeRange = prefs.ExecutiveSummary.TimeRange;\n }\n }\n } catch {\n // Use defaults on parse failure\n }\n this.settingsLoaded = true;\n }\n\n private saveUserSettings(): void {\n if (this.settingsLoaded) {\n this.settingsPersistSubject.next();\n }\n }\n\n private async persistUserSettings(): Promise<void> {\n try {\n const prefs: AIAnalyticsPreferences = {\n ActiveSection: this.ActiveSection,\n ExecutiveSummary: {\n TimeRange: this.CurrentTimeRange,\n ComparisonEnabled: false,\n Filters: this.CurrentFilters\n },\n PromptRuns: {\n TimeRange: this.CurrentTimeRange,\n Filters: this.CurrentFilters,\n ChartMetric: 'count',\n SortField: 'StartedAt',\n SortDirection: 'desc'\n },\n AgentRuns: {\n TimeRange: this.CurrentTimeRange,\n Filters: {\n Agents: this.CurrentFilters.Agents,\n Statuses: this.CurrentFilters.Statuses\n }\n },\n ModelPerformance: {\n TimeRange: this.CurrentTimeRange,\n SortBy: 'latency',\n VendorFilter: []\n },\n CostBudget: {\n TimeRange: this.CurrentTimeRange,\n Filters: this.CurrentFilters\n }\n };\n await UserInfoEngine.Instance.SetSetting(\n this.USER_SETTINGS_KEY,\n JSON.stringify(prefs)\n );\n } catch {\n // Silent failure for settings persistence\n }\n }\n}\n\nexport function LoadAIAnalyticsResource(): void {\n // Prevents tree-shaking of the @RegisterClass decorator\n}\n"]}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * @fileoverview Shared data layer for the **Realtime management** section.
3
+ *
4
+ * Distinct from `realtime-session-data.ts` (which powers the operational
5
+ * *analytics* on voice sessions), this module loads the whole realtime + bridge
6
+ * **management** surface described in §11b of the Realtime Bridges architecture:
7
+ * bridge providers, agent identities, channels, provider→channel contributions,
8
+ * co-agent pairings, live + historical session bridges, and bridge
9
+ * participants. Everything loads in one batched `RunViews` call and is folded
10
+ * into per-surface view models client-side.
11
+ *
12
+ * The pure aggregation in {@link BucketSessionBridgesByDay} +
13
+ * {@link SummarizeBridgesByProvider} / {@link SummarizeBridgesByStatus} is
14
+ * extracted here (no Angular, no `RunView`) so it can be unit-tested in
15
+ * isolation — see `realtime-management-data.spec.ts`.
16
+ */
17
+ import { IMetadataProvider } from '@memberjunction/core';
18
+ import type { MJAIBridgeProviderEntity_IBridgeProviderFeatures } from '@memberjunction/core-entities';
19
+ /** A bridge provider registry row (`MJ: AI Bridge Providers`). */
20
+ export interface BridgeProviderRecord {
21
+ ID: string;
22
+ Name: string;
23
+ Description: string | null;
24
+ BridgeType: 'Meeting' | 'Telephony';
25
+ DriverClass: string;
26
+ Status: 'Active' | 'Disabled';
27
+ /** Raw `SupportedFeatures` JSON string (parsed client-side, see {@link parseFeatures}). */
28
+ SupportedFeatures: string | null;
29
+ }
30
+ /** A bridge agent-identity row (`MJ: AI Bridge Agent Identities`). */
31
+ export interface BridgeAgentIdentityRecord {
32
+ ID: string;
33
+ AgentID: string;
34
+ Agent: string | null;
35
+ ProviderID: string;
36
+ Provider: string;
37
+ IdentityType: 'AccountID' | 'Email' | 'PhoneNumber';
38
+ IdentityValue: string;
39
+ DisplayName: string | null;
40
+ IsActive: boolean;
41
+ }
42
+ /** An agent-channel registry row (`MJ: AI Agent Channels`). */
43
+ export interface AgentChannelRecord {
44
+ ID: string;
45
+ Name: string;
46
+ Description: string | null;
47
+ TransportType: 'PubSub' | 'WebRTC' | 'WebSocket';
48
+ ServerPluginClass: string;
49
+ ClientPluginClass: string;
50
+ IsActive: boolean;
51
+ }
52
+ /** A provider→channel contribution row (`MJ: AI Bridge Provider Channels`). */
53
+ export interface BridgeProviderChannelRecord {
54
+ ID: string;
55
+ ProviderID: string;
56
+ Provider: string;
57
+ ChannelID: string;
58
+ Channel: string;
59
+ IsDefault: boolean;
60
+ Sequence: number;
61
+ }
62
+ /** A co-agent pairing row (`MJ: AI Agent Co Agents`). */
63
+ export interface AgentCoAgentRecord {
64
+ ID: string;
65
+ CoAgentID: string;
66
+ CoAgent: string | null;
67
+ TargetAgentID: string | null;
68
+ TargetAgent: string | null;
69
+ TargetAgentTypeID: string | null;
70
+ TargetAgentType: string | null;
71
+ Type: 'CoAgent' | 'Delegate' | 'Fallback' | 'Observer' | 'Peer' | 'Reviewer';
72
+ IsDefault: boolean;
73
+ Sequence: number;
74
+ Status: 'Active' | 'Disabled';
75
+ }
76
+ /** A session-bridge row (`MJ: AI Agent Session Bridges`). */
77
+ export interface SessionBridgeRecord {
78
+ ID: string;
79
+ AgentSessionID: string;
80
+ ProviderID: string;
81
+ Provider: string;
82
+ Direction: 'Inbound' | 'Outbound';
83
+ JoinMethod: 'InMeetingCommand' | 'InboundRoute' | 'Invite' | 'NativeInvite' | 'OnDemand' | 'Scheduled';
84
+ TurnMode: 'Active' | 'Hybrid' | 'Passive';
85
+ Address: string | null;
86
+ Status: 'Connected' | 'Connecting' | 'Disconnected' | 'Disconnecting' | 'Failed' | 'Pending' | 'Scheduled';
87
+ ScheduledStartTime: string | null;
88
+ ConnectedAt: string | null;
89
+ DisconnectedAt: string | null;
90
+ CloseReason: 'Error' | 'Explicit' | 'HostEnded' | 'Janitor' | 'Shutdown' | null;
91
+ HostInstanceID: string | null;
92
+ __mj_CreatedAt: string;
93
+ }
94
+ /** A bridge participant row (`MJ: AI Agent Session Bridge Participants`). */
95
+ export interface SessionBridgeParticipantRecord {
96
+ ID: string;
97
+ SessionBridgeID: string;
98
+ DisplayName: string | null;
99
+ Role: 'Agent' | 'CoHost' | 'Host' | 'Participant';
100
+ UserID: string | null;
101
+ User: string | null;
102
+ IsAgent: boolean;
103
+ JoinedAt: string | null;
104
+ LeftAt: string | null;
105
+ }
106
+ /** The session a bridge attaches to (`MJ: AI Agent Sessions`, narrowed). */
107
+ export interface SessionLiteRecord {
108
+ ID: string;
109
+ Agent: string | null;
110
+ User: string;
111
+ Status: 'Active' | 'Idle' | 'Closed';
112
+ __mj_CreatedAt: string;
113
+ }
114
+ /** A provider plus its parsed capability summary and contributed channels. */
115
+ export interface BridgeProviderRollup {
116
+ Record: BridgeProviderRecord;
117
+ /** Parsed `SupportedFeatures` JSON; `null` when unset/unparseable. */
118
+ Features: MJAIBridgeProviderEntity_IBridgeProviderFeatures | null;
119
+ /** Count of `true` capability flags. */
120
+ FeatureCount: number;
121
+ /** Channels this provider contributes (sorted by Sequence). */
122
+ Channels: BridgeProviderChannelRecord[];
123
+ }
124
+ /** A session bridge joined with its session + participant count. */
125
+ export interface SessionBridgeRollup {
126
+ Record: SessionBridgeRecord;
127
+ /** The attached session, when found in the loaded window. */
128
+ Session: SessionLiteRecord | null;
129
+ AgentName: string;
130
+ UserName: string;
131
+ ParticipantCount: number;
132
+ StartedAt: Date;
133
+ /** ConnectedAt → (DisconnectedAt ?? now) for connected; else 0. */
134
+ DurationMs: number;
135
+ /** True when the bridge is live (Connecting / Connected). */
136
+ IsLive: boolean;
137
+ }
138
+ /** A complete load pass of the management surface. */
139
+ export interface RealtimeManagementDataset {
140
+ Providers: BridgeProviderRollup[];
141
+ Identities: BridgeAgentIdentityRecord[];
142
+ Channels: AgentChannelRecord[];
143
+ ProviderChannels: BridgeProviderChannelRecord[];
144
+ CoAgents: AgentCoAgentRecord[];
145
+ /** Live session bridges (Connecting / Connected), newest first. */
146
+ LiveBridges: SessionBridgeRollup[];
147
+ /** Closed/terminal session bridges in the window, newest first. */
148
+ HistoryBridges: SessionBridgeRollup[];
149
+ /** Every bridge rollup loaded (live + history), for metrics. */
150
+ AllBridges: SessionBridgeRollup[];
151
+ WindowStart: Date;
152
+ WindowMs: number;
153
+ }
154
+ /**
155
+ * Loads the full management surface in one batched `RunViews` call, then folds
156
+ * everything into per-surface view models. History is windowed by `timeRange`;
157
+ * live bridges are always included regardless of age.
158
+ */
159
+ export declare function LoadRealtimeManagementDataset(provider: IMetadataProvider, timeRange: string): Promise<RealtimeManagementDataset>;
160
+ /** One day bucket for the sessions-over-time metric. */
161
+ export interface SessionBridgeDayBucket {
162
+ /** Local-midnight Date for the bucket. */
163
+ Date: Date;
164
+ /** YYYY-MM-DD label. */
165
+ Label: string;
166
+ Count: number;
167
+ }
168
+ /** One labeled aggregate slice (provider, status, etc.) with a count. */
169
+ export interface MetricSlice {
170
+ Label: string;
171
+ Count: number;
172
+ }
173
+ /**
174
+ * Buckets session bridges by their local calendar day across `[windowStart, now]`,
175
+ * emitting one bucket **per day in the window** (including zero-count days) so the
176
+ * resulting series is dense and renderable as bars without gaps.
177
+ *
178
+ * Pure + deterministic given its inputs — `now` is injected for testability.
179
+ *
180
+ * @param bridges the bridge rollups to bucket (uses each `StartedAt`)
181
+ * @param windowStart inclusive start of the window
182
+ * @param now the window end (exclusive upper edge is `now`'s day + 1)
183
+ * @returns one bucket per day, oldest → newest
184
+ */
185
+ export declare function BucketSessionBridgesByDay(bridges: SessionBridgeRollup[], windowStart: Date, now: Date): SessionBridgeDayBucket[];
186
+ /** Aggregates bridge rollups into count-by-provider slices, descending by count. */
187
+ export declare function SummarizeBridgesByProvider(bridges: SessionBridgeRollup[]): MetricSlice[];
188
+ /** Aggregates bridge rollups into count-by-status slices, descending by count. */
189
+ export declare function SummarizeBridgesByStatus(bridges: SessionBridgeRollup[]): MetricSlice[];
190
+ /** Aggregates bridge rollups into count-by-agent slices, descending by count. */
191
+ export declare function SummarizeBridgesByAgent(bridges: SessionBridgeRollup[]): MetricSlice[];
192
+ /** Font Awesome icon for a bridge type. */
193
+ export declare function BridgeTypeIcon(type: BridgeProviderRecord['BridgeType']): string;
194
+ /** Font Awesome icon for an identity type. */
195
+ export declare function IdentityTypeIcon(type: BridgeAgentIdentityRecord['IdentityType']): string;
196
+ /** Font Awesome icon for a channel transport type. */
197
+ export declare function TransportTypeIcon(type: AgentChannelRecord['TransportType']): string;
198
+ /**
199
+ * A compact, human-readable summary of a provider's top capabilities — a few
200
+ * key icons + label pairs derived from the parsed features, capped for density.
201
+ */
202
+ export interface CapabilityChip {
203
+ Icon: string;
204
+ Label: string;
205
+ }
206
+ /**
207
+ * Builds the prioritized capability chips for a provider's feature set. Returns
208
+ * the highest-signal capabilities first (media, then join methods, then
209
+ * signals), so the grid can render a few and show "+N" for the remainder.
210
+ */
211
+ export declare function BuildCapabilityChips(features: MJAIBridgeProviderEntity_IBridgeProviderFeatures | null): CapabilityChip[];
212
+ /** Formats a duration as m:ss (or h:mm:ss past the hour). */
213
+ export declare function FormatBridgeDuration(ms: number): string;
214
+ /** Today → "3:40 pm", yesterday → "Yesterday", else "M/d". */
215
+ export declare function FormatBridgeStart(date: Date): string;
216
+ //# sourceMappingURL=realtime-management-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime-management-data.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/realtime/realtime-management-data.ts"],"names":[],"mappings":"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"}