@memberjunction/ng-dashboards 5.29.0 → 5.30.1
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/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +11 -9
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +21 -19
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +154 -154
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +8 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +2 -2
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.d.ts +1 -1
- package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +15 -2
- package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js +17 -5
- package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +56 -71
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +0 -8
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +73 -74
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-adapter.d.ts +25 -0
- package/dist/DashboardBrowser/dashboard-share-adapter.d.ts.map +1 -0
- package/dist/DashboardBrowser/dashboard-share-adapter.js +99 -0
- package/dist/DashboardBrowser/dashboard-share-adapter.js.map +1 -0
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +21 -104
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js +48 -530
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +5 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +17 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts +18 -1
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +251 -199
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/services/integration-data.service.d.ts +7 -2
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +10 -2
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +144 -144
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +12 -14
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +28 -57
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/Permissions/audit-log-resource.component.d.ts +38 -0
- package/dist/Permissions/audit-log-resource.component.d.ts.map +1 -0
- package/dist/Permissions/audit-log-resource.component.js +380 -0
- package/dist/Permissions/audit-log-resource.component.js.map +1 -0
- package/dist/Permissions/permissions-shared.d.ts +51 -0
- package/dist/Permissions/permissions-shared.d.ts.map +1 -0
- package/dist/Permissions/permissions-shared.js +91 -0
- package/dist/Permissions/permissions-shared.js.map +1 -0
- package/dist/Permissions/resource-access-resource.component.d.ts +45 -0
- package/dist/Permissions/resource-access-resource.component.d.ts.map +1 -0
- package/dist/Permissions/resource-access-resource.component.js +342 -0
- package/dist/Permissions/resource-access-resource.component.js.map +1 -0
- package/dist/Permissions/user-access-resource.component.d.ts +39 -0
- package/dist/Permissions/user-access-resource.component.d.ts.map +1 -0
- package/dist/Permissions/user-access-resource.component.js +346 -0
- package/dist/Permissions/user-access-resource.component.js.map +1 -0
- package/dist/component-studio-dashboards.module.d.ts +1 -0
- package/dist/component-studio-dashboards.module.d.ts.map +1 -1
- package/dist/component-studio-dashboards.module.js +7 -0
- package/dist/component-studio-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +24 -20
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +26 -1
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +4 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +4 -0
- package/dist/public-api.js.map +1 -1
- package/dist/shared/pipes/highlight-search.pipe.d.ts +1 -1
- package/dist/shared/pipes/highlight-search.pipe.d.ts.map +1 -1
- package/dist/shared/pipes/highlight-search.pipe.js +14 -4
- package/dist/shared/pipes/highlight-search.pipe.js.map +1 -1
- package/package.json +51 -50
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vector-management-resource.component.js","sourceRoot":"","sources":["../../../../src/AI/components/vectors/vector-management-resource.component.ts","../../../../src/AI/components/vectors/vector-management-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Vector Management Resource Component\n *\n * Dashboard resource for managing vector databases and entity vectorization.\n * Displays KPI cards (total vectors, entities synced, last sync, avg embedding time),\n * an entity sync table, and sidebar panels for DB health, embedding model info,\n * and storage usage.\n */\n\nimport { Component, ChangeDetectorRef, OnDestroy, AfterViewInit, Input, ViewChild, ElementRef, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { EntityInfo, Metadata, RunView } from '@memberjunction/core';\nimport {\n ResourceData,\n MJEntityDocumentEntity,\n MJVectorDatabaseEntity,\n MJVectorIndexEntity,\n MJAIModelEntity,\n MJTemplateEntity,\n MJTemplateContentEntity,\n KnowledgeHubMetadataEngine\n} from '@memberjunction/core-entities';\nimport { RegisterClass, UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { KPICardData } from '../widgets/kpi-card.component';\nimport { GraphQLDataProvider, GraphQLAIClient } from '@memberjunction/graphql-dataprovider';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { MJAIPromptEntityExtended } from '@memberjunction/ai-core-plus';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { MJScheduledActionEntity, MJScheduledActionParamEntity } from '@memberjunction/core-entities';\nimport { CronToHumanReadable } from '../autotagging/autotagging-pipeline-resource.component';\n\n/** Flattened row for the entity sync table */\ninterface EntitySyncRow {\n EntityDocumentID: string;\n EntityName: string;\n DocumentName: string;\n VectorCount: number;\n LastSynced: Date | null;\n Status: 'Synced' | 'Syncing' | 'Error' | 'Pending';\n /** Percent complete during active sync (0-100) */\n PercentComplete: number;\n /** Pipeline run ID for tracking active subscription */\n PipelineRunID?: string;\n}\n\n/** Sidebar embedding model summary */\ninterface EmbeddingModelInfo {\n Name: string;\n Dimensions: number | null;\n}\n\n/** Result from AI document suggestion */\ninterface DocumentSuggestionResult {\n template: string;\n selectedFields: string[];\n selectedRelationships: { name: string; fields: string[] }[];\n potentialMatchThreshold: number;\n absoluteMatchThreshold: number;\n reasoning: string;\n}\n\n@RegisterClass(BaseResourceComponent, 'VectorManagementResource')\n@Component({\n standalone: false,\n selector: 'app-vector-management-resource',\n templateUrl: './vector-management-resource.component.html',\n styleUrls: ['./vector-management-resource.component.css']\n})\nexport class VectorManagementResourceComponent extends BaseResourceComponent implements AfterViewInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n protected override navigationService = inject(NavigationService);\n protected override destroy$ = new Subject<void>();\n\n /** View mode: 'index' = Option A (shared index as hero, entity docs as children),\n * 'operations' = Option C (operations monitoring with real-time sync status) */\n public ViewMode: 'index' | 'operations' = 'index';\n\n /** Whether this component is embedded inside the Knowledge Hub shell */\n @Input() EmbeddedMode = false;\n\n /** Toggle between view modes */\n public ToggleViewMode(): void {\n this.ViewMode = this.ViewMode === 'index' ? 'operations' : 'index';\n this.cdr.detectChanges();\n }\n\n // --- Loading state ---\n public IsLoading = true;\n\n // --- KPI card data ---\n public KPICards: KPICardData[] = [];\n\n // --- Entity sync table ---\n public SyncRows: EntitySyncRow[] = [];\n public SyncingIds = new Set<string>();\n\n // --- Sidebar data ---\n public VectorDBName = '';\n public VectorDBStatus: 'Healthy' | 'Degraded' | 'Offline' = 'Healthy';\n public EmbeddingModel: EmbeddingModelInfo = { Name: '', Dimensions: null };\n public StorageUsagePercent = 0;\n public TotalVectors = 0;\n\n // --- Edit Entity Document Panel ---\n public ShowEditPanel = false;\n public IsEditSaving = false;\n public IsEditDeleting = false;\n public EditDocID = '';\n public EditDocName = '';\n public EditDocEntityName = '';\n public EditDocVectorDBID = '';\n public EditDocAIModelID = '';\n public EditDocVectorIndexID = '';\n public EditDocStatus = '';\n public EditDocTemplate = '';\n public IsEditRegenerating = false;\n\n /** Parse {{ FieldName }} patterns from the edit panel's template */\n public get EditDocSelectedFields(): string[] {\n if (!this.EditDocTemplate) return [];\n const matches = this.EditDocTemplate.match(/\\{\\{\\s*(\\w+(?:\\.\\w+)*)\\s*\\}\\}/g);\n if (!matches) return [];\n return [...new Set(\n matches.map(m => m.replace(/\\{\\{\\s*/, '').replace(/\\s*\\}\\}/, ''))\n )];\n }\n\n // --- Zero Vector Indexes Warning ---\n public ShowNoIndexWarning = false;\n\n /** Open the edit panel for an entity document */\n public async OpenEditPanel(entityDocumentId: string): Promise<void> {\n const doc = this.entityDocuments.find(d => UUIDsEqual(d.ID, entityDocumentId));\n if (!doc) return;\n this.EditDocID = doc.ID;\n this.EditDocName = doc.Name;\n this.EditDocEntityName = doc.Entity || '';\n this.EditDocVectorDBID = doc.VectorDatabaseID;\n this.EditDocAIModelID = doc.AIModelID;\n this.EditDocVectorIndexID = doc.VectorIndexID || '';\n this.EditDocStatus = doc.Status;\n this.EditDocTemplate = '';\n this.IsEditRegenerating = false;\n this.ShowEditPanel = true;\n this.cdr.detectChanges();\n\n // Load the template text from Template Contents\n await this.loadEditDocTemplate(doc.TemplateID);\n }\n\n /** Load the template text for the edit panel from the associated Template Contents record */\n private async loadEditDocTemplate(templateId: string): Promise<void> {\n if (!templateId) return;\n try {\n const rv = new RunView();\n const result = await rv.RunView<{ TemplateText: string }>({\n EntityName: 'MJ: Template Contents',\n ExtraFilter: `TemplateID='${templateId}'`,\n Fields: ['TemplateText'],\n ResultType: 'simple',\n OrderBy: 'Priority ASC',\n MaxRows: 1,\n });\n if (result.Success && result.Results.length > 0 && result.Results[0].TemplateText) {\n this.EditDocTemplate = result.Results[0].TemplateText;\n this.cdr.detectChanges();\n }\n } catch (error) {\n console.warn('[VectorManagement] Could not load template text:', error);\n }\n }\n\n public CloseEditPanel(): void {\n this.ShowEditPanel = false;\n this.cdr.detectChanges();\n }\n\n public async SaveEditedDocument(): Promise<void> {\n this.IsEditSaving = true;\n this.cdr.detectChanges();\n try {\n const md = new Metadata();\n const doc = await md.GetEntityObject<MJEntityDocumentEntity>('MJ: Entity Documents');\n const loaded = await doc.Load(this.EditDocID);\n if (!loaded) throw new Error('Could not load entity document');\n\n doc.Name = this.EditDocName;\n doc.VectorDatabaseID = this.EditDocVectorDBID;\n doc.AIModelID = this.EditDocAIModelID;\n doc.VectorIndexID = this.EditDocVectorIndexID || null;\n doc.Status = this.EditDocStatus as 'Active' | 'Inactive';\n\n const saved = await doc.Save();\n if (saved) {\n // Also save updated template text if changed\n await this.saveEditDocTemplate(doc.TemplateID);\n MJNotificationService.Instance.CreateSimpleNotification('Entity document updated', 'success', 2500);\n this.ShowEditPanel = false;\n await this.LoadData();\n } else {\n const msg = doc.LatestResult?.CompleteMessage || 'Unknown error';\n MJNotificationService.Instance.CreateSimpleNotification(`Save failed: ${msg}`, 'error', 5000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);\n } finally {\n this.IsEditSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Save the edited template text back to the Template Contents record */\n private async saveEditDocTemplate(templateId: string): Promise<void> {\n if (!templateId || !this.EditDocTemplate) return;\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJTemplateContentEntity>({\n EntityName: 'MJ: Template Contents',\n ExtraFilter: `TemplateID='${templateId}'`,\n ResultType: 'entity_object',\n OrderBy: 'Priority ASC',\n MaxRows: 1,\n });\n if (result.Success && result.Results.length > 0) {\n const content = result.Results[0];\n content.TemplateText = this.EditDocTemplate;\n await content.Save();\n }\n } catch (error) {\n console.warn('[VectorManagement] Could not save template text:', error);\n }\n }\n\n /** Regenerate the template using AI for the current edit panel entity */\n public async RegenerateTemplate(): Promise<void> {\n if (!this.EditDocEntityName || this.IsEditRegenerating) return;\n\n this.IsEditRegenerating = true;\n this.cdr.detectChanges();\n\n try {\n const result = await this.callSuggestionPrompt(this.EditDocEntityName, 'duplicate detection');\n if (result) {\n this.EditDocTemplate = result.template;\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Template regenerated with AI. Review and save to apply.',\n 'info', 3000\n );\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Regeneration failed: ${msg}`, 'error', 5000);\n } finally {\n this.IsEditRegenerating = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Handle template edits from the edit panel's code editor */\n public OnEditTemplateChange(newValue: string): void {\n this.EditDocTemplate = newValue;\n }\n\n public async DeleteEntityDocument(): Promise<void> {\n this.IsEditDeleting = true;\n this.cdr.detectChanges();\n try {\n const md = new Metadata();\n const doc = await md.GetEntityObject<MJEntityDocumentEntity>('MJ: Entity Documents');\n const loaded = await doc.Load(this.EditDocID);\n if (!loaded) throw new Error('Could not load entity document');\n\n const deleted = await doc.Delete();\n if (deleted) {\n MJNotificationService.Instance.CreateSimpleNotification('Entity document deleted', 'success', 2500);\n this.ShowEditPanel = false;\n await this.LoadData();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Delete failed', 'error', 3000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);\n } finally {\n this.IsEditDeleting = false;\n this.cdr.detectChanges();\n }\n }\n\n // --- Schedule Sync Dialog ---\n public ShowScheduleSyncDialog = false;\n public ScheduleSyncSaving = false;\n public ScheduleSyncDocID = '';\n public ScheduleSyncDocName = '';\n public ScheduleSyncCron = '0 2 * * *';\n public ScheduleSyncEnabled = true;\n\n /** Opens the schedule sync dialog for a specific entity document */\n public OpenScheduleSyncDialog(entityDocumentId: string): void {\n const doc = this.entityDocuments.find(d => UUIDsEqual(d.ID, entityDocumentId));\n if (!doc) return;\n this.ScheduleSyncDocID = doc.ID;\n this.ScheduleSyncDocName = doc.Entity || doc.Name;\n this.ScheduleSyncCron = '0 2 * * *';\n this.ScheduleSyncEnabled = true;\n this.ShowScheduleSyncDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Closes the schedule sync dialog */\n public CloseScheduleSyncDialog(): void {\n this.ShowScheduleSyncDialog = false;\n this.ScheduleSyncDocID = '';\n this.cdr.detectChanges();\n }\n\n /** Returns a human-readable description of a cron expression */\n public GetScheduleCronPreview(cron: string): string {\n return CronToHumanReadable(cron);\n }\n\n /** Saves a new ScheduledAction for vectorizing the selected entity document */\n public async SaveScheduleSync(): Promise<void> {\n if (this.ScheduleSyncSaving || !this.ScheduleSyncDocID) return;\n this.ScheduleSyncSaving = true;\n this.cdr.detectChanges();\n\n try {\n const actionID = await this.findVectorizeActionID();\n if (!actionID) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Could not find the \"__VectorizeEntity\" action. Please check action configuration.',\n 'error', 5000\n );\n return;\n }\n\n const md = new Metadata();\n\n // Create ScheduledAction\n const scheduledAction = await md.GetEntityObject<MJScheduledActionEntity>('MJ: Scheduled Actions');\n scheduledAction.NewRecord();\n scheduledAction.Name = `Vectorize: ${this.ScheduleSyncDocName}`;\n scheduledAction.Description = `Automated vectorization for entity document \"${this.ScheduleSyncDocName}\"`;\n scheduledAction.ActionID = actionID;\n scheduledAction.Type = 'Custom';\n scheduledAction.CronExpression = this.ScheduleSyncCron;\n scheduledAction.CustomCronExpression = this.ScheduleSyncCron;\n scheduledAction.Status = this.ScheduleSyncEnabled ? 'Active' : 'Disabled';\n scheduledAction.Timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n const saved = await scheduledAction.Save();\n if (!saved) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to create schedule: ${scheduledAction.LatestResult?.Message ?? 'Unknown error'}`,\n 'error', 5000\n );\n return;\n }\n\n // Create param linking the entityDocumentID\n await this.createVectorizeScheduleParam(scheduledAction.ID, actionID, this.ScheduleSyncDocID);\n\n MJNotificationService.Instance.CreateSimpleNotification(\n `Schedule created: ${CronToHumanReadable(this.ScheduleSyncCron)}`, 'success', 3000\n );\n\n this.CloseScheduleSyncDialog();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);\n } finally {\n this.ScheduleSyncSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Find the __VectorizeEntity action ID */\n private async findVectorizeActionID(): Promise<string | null> {\n const rv = new RunView();\n const result = await rv.RunView<{ ID: string }>({\n EntityName: 'Actions',\n ExtraFilter: `Name = '__VectorizeEntity'`,\n Fields: ['ID'],\n ResultType: 'simple',\n MaxRows: 1,\n });\n if (result.Success && result.Results.length > 0) {\n return result.Results[0].ID;\n }\n return null;\n }\n\n /** Create a ScheduledActionParam linking the entity document ID */\n private async createVectorizeScheduleParam(scheduledActionID: string, actionID: string, entityDocumentID: string): Promise<void> {\n const rv = new RunView();\n const paramResult = await rv.RunView<{ ID: string; Name: string }>({\n EntityName: 'Action Params',\n ExtraFilter: `ActionID = '${actionID}' AND Name = 'entityDocumentID'`,\n Fields: ['ID', 'Name'],\n ResultType: 'simple',\n MaxRows: 1,\n });\n\n if (!paramResult.Success || paramResult.Results.length === 0) {\n console.warn('[VectorManagement] Could not find entityDocumentID action param');\n return;\n }\n\n const md = new Metadata();\n const param = await md.GetEntityObject<MJScheduledActionParamEntity>('MJ: Scheduled Action Params');\n param.NewRecord();\n param.ScheduledActionID = scheduledActionID;\n param.ActionParamID = paramResult.Results[0].ID;\n param.ValueType = 'Static';\n param.Value = entityDocumentID;\n\n const saved = await param.Save();\n if (!saved) {\n console.warn('[VectorManagement] Failed to save schedule param:', param.LatestResult?.Message);\n }\n }\n\n // --- Suggest Document Dialog ---\n public ShowSuggestDialog = false;\n public IsSuggesting = false;\n public SuggestEntityName = '';\n public SuggestUseCase = 'duplicate detection';\n public SuggestionResult: DocumentSuggestionResult | null = null;\n public SaveDocumentName = '';\n public SuggestionError = '';\n public IsSavingDocument = false;\n public EditableTemplate = '';\n\n /** Prerequisites check — are vector DB and embedding model configured? */\n public HasVectorDB = false;\n public HasEmbeddingModel = false;\n public get PrerequisitesMet(): boolean {\n return this.HasVectorDB && this.HasEmbeddingModel;\n }\n\n /** Available embedding models for selection in save form */\n public AvailableEmbeddingModels: { ID: string; Name: string }[] = [];\n /** Selected embedding model ID for the new entity document */\n public SelectedEmbeddingModelID = '';\n /** Selected vector database ID for the new entity document */\n public SelectedVectorDBID = '';\n /** Available vector indexes for selection */\n public AvailableVectorIndexes: { ID: string; Name: string; VectorDatabaseID: string; EmbeddingModelID: string }[] = [];\n /** Selected vector index ID — if user picks an existing one */\n public SelectedVectorIndexID = '';\n\n /** Indexes filtered by the currently selected vector DB (for create/edit forms) */\n public get FilteredIndexesForSelectedDB(): { ID: string; Name: string; VectorDatabaseID: string; EmbeddingModelID: string }[] {\n const dbId = this.SelectedVectorDBID || this.EditDocVectorDBID;\n if (!dbId) return this.AvailableVectorIndexes;\n return this.AvailableVectorIndexes.filter(i => i.VectorDatabaseID === dbId);\n }\n\n /** Indexes filtered by the edit panel's selected vector DB */\n public get EditFilteredIndexes(): { ID: string; Name: string; VectorDatabaseID: string; EmbeddingModelID: string }[] {\n if (!this.EditDocVectorDBID) return this.AvailableVectorIndexes;\n return this.AvailableVectorIndexes.filter(i => i.VectorDatabaseID === this.EditDocVectorDBID);\n }\n\n /** Grouped entity list for the suggestion panel — schemas as groups, entities as items */\n public EntityGroups: { SchemaName: string; Entities: { Name: string; ID: string }[] }[] = [];\n /** Filtered entity groups based on search input */\n public FilteredEntityGroups: { SchemaName: string; Entities: { Name: string; ID: string }[] }[] = [];\n /** Search text for filtering entities */\n public EntitySearchText = '';\n /** Whether the entity picker dropdown is open */\n public ShowEntityPicker = false;\n public SelectedEntityIndex = -1;\n /** Reference to the entity search input for programmatic focus */\n @ViewChild('entitySearchInput') entitySearchInput?: ElementRef<HTMLInputElement>;\n\n // --- Raw entity data (private) ---\n private entityDocuments: MJEntityDocumentEntity[] = [];\n protected vectorDatabases: MJVectorDatabaseEntity[] = [];\n private vectorIndexes: MJVectorIndexEntity[] = [];\n private aiModels: MJAIModelEntity[] = [];\n\n /** Lightweight aggregate stats per EntityDocumentID — avoids loading all record documents */\n private erdStats: Map<string, { vectorCount: number; lastSynced: Date | null }> = new Map();\n\n // ================================================================\n // Lifecycle\n // ================================================================\n\n async ngAfterViewInit(): Promise<void> {\n await this.LoadData();\n this.navigationService.SetAgentContext(this, {\n TotalVectors: this.TotalVectors,\n KPICount: this.KPICards.length,\n });\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ================================================================\n // BaseResourceComponent overrides\n // ================================================================\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Vector Management';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-database';\n }\n\n // ================================================================\n // Public Methods\n // ================================================================\n\n /** Reload all dashboard data */\n public async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n await this.fetchAllData();\n this.buildSyncRows();\n this.buildKPICards();\n this.buildSidebarData();\n this.checkPrerequisites();\n } catch (error) {\n console.error('[VectorManagement] Error loading data:', error);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Trigger vectorization for a specific entity document via GraphQL (fire-and-forget with progress subscription) */\n public async SyncEntity(entityDocumentId: string): Promise<void> {\n if (this.SyncingIds.has(entityDocumentId)) {\n return;\n }\n\n const doc = this.entityDocuments.find(d => UUIDsEqual(d.ID, entityDocumentId));\n if (!doc) return;\n\n const provider = Metadata.Provider as GraphQLDataProvider;\n if (!provider) return;\n\n this.addSyncingId(entityDocumentId);\n this.updateRowStatus(entityDocumentId, 'Syncing');\n this.updateRowProgress(entityDocumentId, 0);\n this.cdr.detectChanges();\n\n try {\n const aiClient = new GraphQLAIClient(provider);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Starting vectorization for ${doc.Entity}...`,\n 'info', 3000\n );\n\n // Step 1: Start the mutation (fire-and-forget — returns PipelineRunID immediately)\n const result = await aiClient.VectorizeEntity({\n entityDocumentID: entityDocumentId,\n entityID: doc.EntityID,\n batchSize: 50\n });\n\n if (!result.Success || !result.PipelineRunID) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Vectorization failed: ${result.ErrorMessage || 'Unknown error'}`,\n 'error', 5000\n );\n this.removeSyncingId(entityDocumentId);\n this.updateRowStatus(entityDocumentId, 'Error');\n this.cdr.detectChanges();\n return;\n }\n\n // Store PipelineRunID on the row for tracking\n const row = this.SyncRows.find(r => r.EntityDocumentID === entityDocumentId);\n if (row) {\n row.PipelineRunID = result.PipelineRunID;\n }\n\n // Step 2: Subscribe to progress updates and also set a safety timeout\n // in case the subscription misses events (race condition, network issue, etc.)\n this.subscribeToPipelineProgress(entityDocumentId, result.PipelineRunID, doc.Entity);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error(`[VectorManagement] Error starting sync for ${entityDocumentId}:`, msg);\n MJNotificationService.Instance.CreateSimpleNotification(`Sync error: ${msg}`, 'error', 5000);\n this.removeSyncingId(entityDocumentId);\n this.updateRowStatus(entityDocumentId, 'Error');\n this.cdr.detectChanges();\n }\n }\n\n /** Subscribe to PipelineProgress for a specific pipeline run */\n private subscribeToPipelineProgress(entityDocumentId: string, pipelineRunID: string, entityName: string): void {\n const provider = Metadata.Provider as GraphQLDataProvider;\n const subscriptionQuery = `\n subscription PipelineProgress($pipelineRunID: String!) {\n PipelineProgress(pipelineRunID: $pipelineRunID) {\n PipelineRunID\n Stage\n TotalItems\n ProcessedItems\n PercentComplete\n ElapsedMs\n }\n }\n `;\n\n let idleTimer: ReturnType<typeof setTimeout> | null = null;\n\n const finishSync = (success: boolean) => {\n if (idleTimer) clearTimeout(idleTimer);\n rxSub?.unsubscribe();\n\n // Use setTimeout to defer state changes to the next macrotask,\n // avoiding ExpressionChangedAfterItHasBeenCheckedError.\n // (Promise.resolve microtasks run between Angular's check passes\n // and still trigger NG0100.)\n setTimeout(async () => {\n this.removeSyncingId(entityDocumentId);\n\n if (success) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Vectorization complete for ${entityName}`,\n 'success', 3000\n );\n await this.refreshSyncRow(entityDocumentId);\n } else {\n this.updateRowStatus(entityDocumentId, 'Error');\n MJNotificationService.Instance.CreateSimpleNotification(\n `Vectorization failed for ${entityName}`,\n 'error', 5000\n );\n }\n this.cdr.detectChanges();\n });\n };\n\n // Reset idle timer on every event. When no events arrive for 5s,\n // assume the pipeline is done (handles missing 'complete' event).\n const resetIdleTimer = () => {\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => {\n if (this.SyncingIds.has(entityDocumentId)) {\n finishSync(true);\n }\n }, 5000);\n };\n\n // Start the idle timer immediately in case no events ever arrive\n resetIdleTimer();\n\n const sub = provider.subscribe(subscriptionQuery, { pipelineRunID });\n const rxSub = sub.pipe(takeUntil(this.destroy$)).subscribe({\n next: (data: Record<string, unknown>) => {\n const progress = (data as Record<string, Record<string, unknown>>)['PipelineProgress'];\n if (!progress) return;\n\n const stage = progress['Stage'] as string;\n const pct = progress['PercentComplete'] as number;\n\n this.updateRowProgress(entityDocumentId, pct);\n this.cdr.detectChanges();\n\n if (stage === 'complete') {\n finishSync(true);\n } else if (stage === 'error') {\n finishSync(false);\n } else {\n // Got a progress event — reset idle timer\n resetIdleTimer();\n }\n },\n error: (err: unknown) => {\n console.error(`[VectorManagement] Pipeline subscription error:`, err);\n finishSync(false);\n }\n });\n }\n\n /**\n * Add an ID to SyncingIds, creating a new Set reference so Angular\n * change detection picks up the mutation in template bindings.\n */\n private addSyncingId(id: string): void {\n this.SyncingIds = new Set([...this.SyncingIds, id]);\n }\n\n /**\n * Remove an ID from SyncingIds, creating a new Set reference so Angular\n * change detection picks up the mutation in template bindings.\n */\n private removeSyncingId(id: string): void {\n if (this.SyncingIds.has(id)) {\n const next = new Set(this.SyncingIds);\n next.delete(id);\n this.SyncingIds = next;\n }\n }\n\n /** Opens the AI suggestion dialog, or shows a warning if no vector indexes exist */\n public OpenSuggestDialog(): void {\n if (this.vectorIndexes.length === 0 && this.vectorDatabases.length === 0) {\n this.ShowNoIndexWarning = true;\n this.cdr.detectChanges();\n return;\n }\n\n this.SuggestionResult = null;\n this.SuggestEntityName = '';\n this.SuggestUseCase = 'duplicate detection';\n this.EditableTemplate = '';\n this.SuggestionError = '';\n this.EntitySearchText = '';\n this.ShowEntityPicker = false;\n this.loadEntityGroups();\n this.ShowSuggestDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Close the no-index warning dialog */\n public CloseNoIndexWarning(): void {\n this.ShowNoIndexWarning = false;\n this.cdr.detectChanges();\n }\n\n /** Navigate to the Configuration section from the no-index warning */\n public async GoToConfiguration(): Promise<void> {\n this.ShowNoIndexWarning = false;\n this.cdr.detectChanges();\n // Attempt to open the Config nav item in the current app\n await this.navigationService.OpenNavItemByName('Config');\n }\n\n /** Select an entity from the grouped picker */\n public SelectEntity(entityName: string): void {\n this.SuggestEntityName = entityName;\n this.ShowEntityPicker = false;\n this.cdr.detectChanges();\n }\n\n /** Filter entities by search text */\n public FilterEntities(): void {\n const query = this.EntitySearchText.toLowerCase().trim();\n if (!query) {\n this.FilteredEntityGroups = this.EntityGroups;\n } else {\n this.FilteredEntityGroups = this.EntityGroups\n .map(group => ({\n SchemaName: group.SchemaName,\n Entities: group.Entities.filter(e => e.Name.toLowerCase().includes(query))\n }))\n .filter(group => group.Entities.length > 0);\n }\n // Reset selection to first item when filter changes\n this.SelectedEntityIndex = this.FlatFilteredEntities.length > 0 ? 0 : -1;\n this.cdr.detectChanges();\n }\n\n /**\n * Get a flat list of all entities across groups (for keyboard navigation indexing)\n */\n get FlatFilteredEntities(): { Name: string; ID: string }[] {\n return this.FilteredEntityGroups.flatMap(g => g.Entities);\n }\n\n /**\n * Handle keyboard events in the entity picker search input\n */\n public OnEntityPickerKeyDown(event: KeyboardEvent): void {\n const entities = this.FlatFilteredEntities;\n if (entities.length === 0) return;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.SelectedEntityIndex = Math.min(this.SelectedEntityIndex + 1, entities.length - 1);\n this.scrollSelectedEntityIntoView();\n this.cdr.detectChanges();\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.SelectedEntityIndex = Math.max(this.SelectedEntityIndex - 1, 0);\n this.scrollSelectedEntityIntoView();\n this.cdr.detectChanges();\n break;\n case 'Enter':\n event.preventDefault();\n if (this.SelectedEntityIndex >= 0 && this.SelectedEntityIndex < entities.length) {\n this.SelectEntity(entities[this.SelectedEntityIndex].Name);\n }\n break;\n case 'Escape':\n event.preventDefault();\n this.ShowEntityPicker = false;\n this.cdr.detectChanges();\n break;\n }\n }\n\n /**\n * Scroll the currently selected entity picker item into view\n */\n private scrollSelectedEntityIntoView(): void {\n setTimeout(() => {\n const selected = document.querySelector('.entity-picker-item-focused');\n if (selected) {\n selected.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }, 0);\n }\n\n /** Toggle entity picker visibility */\n public ToggleEntityPicker(): void {\n this.ShowEntityPicker = !this.ShowEntityPicker;\n if (this.ShowEntityPicker) {\n this.FilteredEntityGroups = this.EntityGroups;\n this.EntitySearchText = '';\n this.cdr.detectChanges();\n // Focus search input after the @if block renders — deferred past the click event\n setTimeout(() => {\n if (this.entitySearchInput?.nativeElement) {\n this.entitySearchInput.nativeElement.focus();\n }\n }, 0);\n } else {\n this.cdr.detectChanges();\n }\n }\n\n /** Handle template edits from code editor */\n public OnTemplateChange(newValue: string): void {\n this.EditableTemplate = newValue;\n if (this.SuggestionResult) {\n this.SuggestionResult.template = newValue;\n }\n }\n\n /** Closes the suggestion dialog */\n public CloseSuggestDialog(): void {\n this.ShowSuggestDialog = false;\n this.SuggestionResult = null;\n this.cdr.detectChanges();\n }\n\n /** Clears the current suggestion to try again */\n public ClearSuggestion(): void {\n this.SuggestionResult = null;\n this.cdr.detectChanges();\n }\n\n /**\n * Runs the AI suggestion by calling the server-side \"Entity Document Suggestion\"\n * AI prompt via GraphQL. The LLM analyzes the entity schema and generates\n * natural language Nunjucks templates optimized for embedding quality.\n */\n public async RunSuggestion(): Promise<void> {\n if (!this.SuggestEntityName || this.IsSuggesting) {\n return;\n }\n\n this.IsSuggesting = true;\n this.SuggestionError = '';\n this.cdr.detectChanges();\n\n try {\n const result = await this.callSuggestionPrompt(this.SuggestEntityName, this.SuggestUseCase);\n if (result) {\n this.SuggestionResult = result;\n this.EditableTemplate = result.template;\n this.SaveDocumentName = `${this.SuggestEntityName} - ${this.SuggestUseCase}`;\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[VectorManagement] Error generating suggestion:', msg);\n this.SuggestionError = `Failed to generate suggestion: ${msg}`;\n } finally {\n this.IsSuggesting = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Saves the current suggestion as an Entity Document record */\n public async SaveAsEntityDocument(): Promise<void> {\n if (this.IsSavingDocument || !this.SuggestionResult) {\n return;\n }\n\n this.IsSavingDocument = true;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n const entityDoc = await md.GetEntityObject<MJEntityDocumentEntity>('MJ: Entity Documents');\n entityDoc.NewRecord();\n entityDoc.Name = this.SaveDocumentName;\n\n const matchingEntity = md.Entities.find(e => e.Name === this.SuggestEntityName);\n if (matchingEntity) {\n entityDoc.EntityID = matchingEntity.ID;\n }\n\n entityDoc.Status = 'Active';\n\n // Populate required FK fields from existing data\n await this.populateEntityDocumentFKs(entityDoc);\n\n const saved = await entityDoc.Save();\n if (saved) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Entity Document \"${this.SaveDocumentName}\" created successfully`,\n 'success',\n 3000\n );\n await this.LoadData();\n setTimeout(() => {\n this.CloseSuggestDialog();\n this.cdr.detectChanges();\n }, 1500);\n } else {\n const errorMsg = entityDoc.LatestResult?.CompleteMessage || 'Unknown error saving entity document';\n console.error('[VectorManagement] Failed to save entity document:', errorMsg);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to save: ${errorMsg}`,\n 'error',\n 5000\n );\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[VectorManagement] Error saving entity document:', msg);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Error: ${msg}`,\n 'error',\n 5000\n );\n } finally {\n this.IsSavingDocument = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Returns the CSS class for a given sync status badge */\n public GetStatusClass(status: string): string {\n switch (status) {\n case 'Synced': return 'status-synced';\n case 'Syncing': return 'status-syncing';\n case 'Error': return 'status-error';\n case 'Pending': return 'status-pending';\n default: return '';\n }\n }\n\n /** Returns the icon class for a given sync status */\n public GetStatusIcon(status: string): string {\n switch (status) {\n case 'Synced': return 'fa-solid fa-circle-check';\n case 'Syncing': return 'fa-solid fa-spinner fa-spin';\n case 'Error': return 'fa-solid fa-circle-exclamation';\n case 'Pending': return 'fa-solid fa-clock';\n default: return 'fa-solid fa-question';\n }\n }\n\n /** Format a Date value for display */\n public FormatDate(date: Date | null): string {\n if (!date) return 'Never';\n const d = new Date(date);\n return d.toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit'\n });\n }\n\n /** Format the storage gauge label */\n public get StorageLabel(): string {\n return `${this.StorageUsagePercent}%`;\n }\n\n /** CSS class for the DB health indicator dot */\n public get DBHealthClass(): string {\n switch (this.VectorDBStatus) {\n case 'Healthy': return 'health-healthy';\n case 'Degraded': return 'health-degraded';\n case 'Offline': return 'health-offline';\n default: return '';\n }\n }\n\n // ================================================================\n // Private helpers\n // ================================================================\n\n private async fetchAllData(): Promise<void> {\n // Use cached engine data — BaseEngine's entity-event auto-refresh handles\n // updates from saves/deletes on the entities it tracks.\n const engine = KnowledgeHubMetadataEngine.Instance;\n await engine.Config(false);\n\n this.entityDocuments = engine.EntityDocuments;\n this.vectorDatabases = AIEngineBase.Instance.VectorDatabases;\n this.vectorIndexes = engine.VectorIndexes;\n\n // Build per-EntityDocument aggregate stats (vector count + last synced).\n // Each query fetches only the most recent row (MaxRows: 1) and uses\n // TotalRowCount for the actual vector count — avoids loading all rows.\n // AI Models come from a different domain — fetched in the same batch.\n const rv = new RunView();\n const erdQueries = this.entityDocuments.map(doc => ({\n EntityName: 'MJ: Entity Record Documents',\n ExtraFilter: `EntityDocumentID='${doc.ID}' AND VectorID IS NOT NULL`,\n ResultType: 'simple' as const,\n Fields: ['__mj_UpdatedAt'],\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: 1,\n }));\n const allQueries = [\n ...erdQueries,\n { EntityName: 'MJ: AI Models', ExtraFilter: '', ResultType: 'entity_object' as const }\n ];\n const allResults = await rv.RunViews(allQueries);\n\n // Map results back to erdStats\n this.erdStats.clear();\n for (let i = 0; i < this.entityDocuments.length; i++) {\n const result = allResults[i];\n if (result.Success) {\n const rows = result.Results as { __mj_UpdatedAt: string }[];\n const lastDate = rows.length > 0 ? new Date(rows[0].__mj_UpdatedAt) : null;\n this.erdStats.set(this.entityDocuments[i].ID, {\n vectorCount: result.TotalRowCount,\n lastSynced: lastDate,\n });\n }\n }\n\n const modelsResult = allResults[allResults.length - 1];\n if (modelsResult.Success) {\n this.aiModels = modelsResult.Results as MJAIModelEntity[];\n }\n }\n\n private buildSyncRows(): void {\n this.SyncRows = this.entityDocuments.map(doc => {\n const stats = this.erdStats.get(doc.ID);\n const vectorCount = stats?.vectorCount ?? 0;\n const lastSynced = stats?.lastSynced ?? null;\n const status = this.computeSyncStatus(doc, vectorCount);\n\n // Preserve progress info from any active sync\n const existingRow = this.SyncRows.find(r => UUIDsEqual(r.EntityDocumentID, doc.ID));\n return {\n EntityDocumentID: doc.ID,\n EntityName: doc.Entity || '',\n DocumentName: doc.Name,\n VectorCount: vectorCount,\n LastSynced: lastSynced,\n Status: status,\n PercentComplete: existingRow?.PercentComplete ?? 0,\n PipelineRunID: existingRow?.PipelineRunID,\n };\n });\n }\n\n private computeSyncStatus(\n doc: MJEntityDocumentEntity,\n vectorCount: number\n ): 'Synced' | 'Syncing' | 'Error' | 'Pending' {\n if (this.SyncingIds.has(doc.ID)) {\n return 'Syncing';\n }\n if (doc.Status === 'Inactive') {\n return 'Pending';\n }\n if (vectorCount > 0) {\n return 'Synced';\n }\n return 'Pending';\n }\n\n private buildKPICards(): void {\n let totalVectors = 0;\n let latestSync: Date | null = null;\n for (const stats of this.erdStats.values()) {\n totalVectors += stats.vectorCount;\n if (stats.lastSynced && (!latestSync || stats.lastSynced > latestSync)) {\n latestSync = stats.lastSynced;\n }\n }\n this.TotalVectors = totalVectors;\n\n const entitiesSynced = new Set(\n this.entityDocuments\n .filter(d => d.Status === 'Active')\n .map(d => d.EntityID)\n ).size;\n\n const lastSyncDate = latestSync;\n\n this.KPICards = [\n {\n title: 'Total Vectors',\n value: this.TotalVectors,\n subtitle: `across ${this.entityDocuments.length} documents`,\n icon: 'fa-cubes',\n color: 'primary',\n loading: false\n },\n {\n title: 'Entities Synced',\n value: entitiesSynced,\n subtitle: `of ${this.entityDocuments.length} configured`,\n icon: 'fa-layer-group',\n color: 'success',\n loading: false\n },\n {\n title: 'Last Sync',\n value: lastSyncDate ? this.FormatDate(lastSyncDate) : 'Never',\n icon: 'fa-clock',\n color: 'info',\n loading: false\n },\n {\n title: 'Vector Indexes',\n value: this.vectorIndexes.length,\n subtitle: `in ${this.vectorDatabases.length} database(s)`,\n icon: 'fa-diagram-project',\n color: 'warning',\n loading: false\n }\n ];\n }\n\n private buildSidebarData(): void {\n this.buildVectorDBHealth();\n this.buildEmbeddingModelInfo();\n this.buildStorageUsage();\n }\n\n private buildVectorDBHealth(): void {\n if (this.vectorDatabases.length > 0) {\n const db = this.vectorDatabases[0];\n this.VectorDBName = db.Name;\n // Determine health based on whether we have records with vectors\n const hasVectors = this.TotalVectors > 0;\n this.VectorDBStatus = hasVectors ? 'Healthy' : 'Degraded';\n } else {\n this.VectorDBName = 'Not configured';\n this.VectorDBStatus = 'Offline';\n }\n }\n\n private buildEmbeddingModelInfo(): void {\n if (this.vectorIndexes.length > 0) {\n const index = this.vectorIndexes[0];\n const model = this.aiModels.find(m => UUIDsEqual(m.ID, index.EmbeddingModelID));\n this.EmbeddingModel = {\n Name: model?.Name ?? index.EmbeddingModel ?? 'Unknown',\n Dimensions: null\n };\n } else {\n this.EmbeddingModel = { Name: 'Not configured', Dimensions: null };\n }\n }\n\n private buildStorageUsage(): void {\n // All records in erdStats already have vectors (query filters VectorID IS NOT NULL),\n // so coverage is 100% if any exist.\n this.StorageUsagePercent = this.TotalVectors > 0 ? 100 : 0;\n }\n\n /** Check if vector DB and embedding model are configured, populate selection lists */\n private checkPrerequisites(): void {\n this.HasVectorDB = this.vectorDatabases.length > 0;\n const allEmbeddings = this.aiModels.filter(m =>\n m.AIModelType?.toLowerCase().includes('embedding') || m.Name?.toLowerCase().includes('embedding')\n );\n this.HasEmbeddingModel = allEmbeddings.length > 0;\n this.AvailableEmbeddingModels = allEmbeddings.map(m => ({ ID: m.ID, Name: m.Name }));\n\n // Default selections — first available, no hardcoded preference\n if (this.HasVectorDB && !this.SelectedVectorDBID) {\n this.SelectedVectorDBID = this.vectorDatabases[0].ID;\n }\n if (this.HasEmbeddingModel && !this.SelectedEmbeddingModelID) {\n this.SelectedEmbeddingModelID = allEmbeddings[0].ID;\n }\n\n // Build vector index list\n this.AvailableVectorIndexes = this.vectorIndexes.map(vi => ({\n ID: vi.ID,\n Name: vi.Name,\n VectorDatabaseID: vi.VectorDatabaseID,\n EmbeddingModelID: vi.EmbeddingModelID\n }));\n // Pre-select first index if available\n if (this.AvailableVectorIndexes.length > 0 && !this.SelectedVectorIndexID) {\n this.SelectedVectorIndexID = this.AvailableVectorIndexes[0].ID;\n }\n }\n\n /** Find the best embedding model from loaded AI models */\n private findEmbeddingModel(): MJAIModelEntity | undefined {\n return this.aiModels.find(m =>\n m.AIModelType?.toLowerCase().includes('embedding') || m.Name?.toLowerCase().includes('embedding')\n );\n }\n\n /**\n * Populate required foreign key fields on an Entity Document before saving.\n * Throws if prerequisites are not met.\n */\n private async populateEntityDocumentFKs(entityDoc: MJEntityDocumentEntity): Promise<void> {\n if (!this.PrerequisitesMet) {\n const missing: string[] = [];\n if (!this.HasVectorDB) missing.push('Vector Database');\n if (!this.HasEmbeddingModel) missing.push('Embedding Model');\n throw new Error(`Prerequisites not configured: ${missing.join(', ')}. Go to the Configuration tab to set these up.`);\n }\n\n // TypeID — look up 'Record Duplicate' entity document type\n const rv = new RunView();\n const typeResult = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: Entity Document Types',\n ExtraFilter: \"Name = 'Record Duplicate'\",\n ResultType: 'simple',\n Fields: ['ID']\n });\n if (typeResult.Success && typeResult.Results.length > 0) {\n entityDoc.TypeID = typeResult.Results[0].ID;\n } else {\n throw new Error('Entity Document Type \"Record Duplicate\" not found in database');\n }\n\n // If a vector index is selected, use its DB + model so the syncer finds it\n // instead of auto-creating a new one\n if (this.SelectedVectorIndexID) {\n const idx = this.AvailableVectorIndexes.find(i => UUIDsEqual(i.ID, this.SelectedVectorIndexID));\n if (idx) {\n entityDoc.VectorDatabaseID = idx.VectorDatabaseID;\n entityDoc.AIModelID = idx.EmbeddingModelID;\n entityDoc.VectorIndexID = idx.ID;\n } else {\n entityDoc.VectorDatabaseID = this.SelectedVectorDBID || this.vectorDatabases[0].ID;\n entityDoc.AIModelID = this.SelectedEmbeddingModelID || this.findEmbeddingModel()!.ID;\n }\n } else {\n entityDoc.VectorDatabaseID = this.SelectedVectorDBID || this.vectorDatabases[0].ID;\n entityDoc.AIModelID = this.SelectedEmbeddingModelID || this.findEmbeddingModel()!.ID;\n }\n\n // TemplateID — create a Template record with the generated template content\n await this.createTemplateForDocument(entityDoc);\n }\n\n /** Create a Template + TemplateContent record for the entity document */\n private async createTemplateForDocument(entityDoc: MJEntityDocumentEntity): Promise<void> {\n const md = new Metadata();\n const templateText = this.EditableTemplate || this.SuggestionResult?.template || '';\n if (!templateText) {\n throw new Error('No template content to save');\n }\n\n // Create Template record\n const template = await md.GetEntityObject<MJTemplateEntity>('MJ: Templates');\n template.NewRecord();\n template.Name = `Template for ${this.SaveDocumentName}`;\n template.Description = `Auto-generated template for entity document: ${this.SaveDocumentName}`;\n template.UserID = md.CurrentUser.ID;\n template.IsActive = true;\n const templateSaved = await template.Save();\n if (!templateSaved) {\n throw new Error(`Failed to create template: ${template.LatestResult?.CompleteMessage || 'unknown error'}`);\n }\n\n entityDoc.TemplateID = template.ID;\n\n // Find 'Text' content type\n const contentTypeResult = await new RunView().RunView<{ ID: string }>({\n EntityName: 'MJ: Template Content Types',\n ExtraFilter: \"Name = 'Text'\",\n ResultType: 'simple',\n Fields: ['ID']\n });\n if (!contentTypeResult.Success || contentTypeResult.Results.length === 0) {\n throw new Error('Template Content Type \"Text\" not found');\n }\n\n // Create TemplateContent record with the template text\n // Server-side MJTemplateContentEntityServer hook auto-creates Scalar params\n // for each {{FieldName}} — GetTemplateData() handles them via the flat convention.\n const content = await md.GetEntityObject<MJTemplateContentEntity>('MJ: Template Contents');\n content.NewRecord();\n content.TemplateID = template.ID;\n content.TypeID = contentTypeResult.Results[0].ID;\n content.TemplateText = templateText;\n content.Priority = 1;\n content.IsActive = true;\n const contentSaved = await content.Save();\n if (!contentSaved) {\n throw new Error(`Failed to create template content: ${content.LatestResult?.CompleteMessage || 'unknown error'}`);\n }\n }\n\n /** Build grouped entity list from metadata, grouped by SchemaName */\n private loadEntityGroups(): void {\n const md = new Metadata();\n const groupMap = new Map<string, { Name: string; ID: string }[]>();\n\n for (const entity of md.Entities) {\n const schema = entity.SchemaName || '__default';\n const existing = groupMap.get(schema);\n if (existing) {\n existing.push({ Name: entity.Name, ID: entity.ID });\n } else {\n groupMap.set(schema, [{ Name: entity.Name, ID: entity.ID }]);\n }\n }\n\n this.EntityGroups = Array.from(groupMap.entries())\n .map(([schemaName, entities]) => ({\n SchemaName: schemaName,\n Entities: entities.sort((a, b) => a.Name.localeCompare(b.Name))\n }))\n .sort((a, b) => a.SchemaName.localeCompare(b.SchemaName));\n\n this.FilteredEntityGroups = this.EntityGroups;\n }\n\n private updateRowStatus(entityDocumentId: string, status: EntitySyncRow['Status']): void {\n const row = this.SyncRows.find(r => r.EntityDocumentID === entityDocumentId);\n if (row) {\n row.Status = status;\n }\n }\n\n private updateRowProgress(entityDocumentId: string, percentComplete: number): void {\n const row = this.SyncRows.find(r => r.EntityDocumentID === entityDocumentId);\n if (row) {\n row.PercentComplete = percentComplete;\n }\n }\n\n /** Refresh a single sync row's vector count and status from the DB */\n private async refreshSyncRow(entityDocumentId: string): Promise<void> {\n const row = this.SyncRows.find(r => r.EntityDocumentID === entityDocumentId);\n if (!row) return;\n\n const rv = new RunView();\n const result = await rv.RunView<{ __mj_UpdatedAt: string }>({\n EntityName: 'MJ: Entity Record Documents',\n ExtraFilter: `EntityDocumentID='${entityDocumentId}' AND VectorID IS NOT NULL`,\n Fields: ['__mj_UpdatedAt'],\n OrderBy: '__mj_UpdatedAt DESC',\n ResultType: 'simple',\n MaxRows: 1\n });\n\n if (result.Success) {\n row.VectorCount = result.TotalRowCount;\n row.LastSynced = result.Results.length > 0 ? new Date(result.Results[0].__mj_UpdatedAt) : null;\n row.Status = row.VectorCount > 0 ? 'Synced' : 'Pending';\n row.PercentComplete = 100;\n this.erdStats.set(entityDocumentId, { vectorCount: row.VectorCount, lastSynced: row.LastSynced });\n this.buildKPICards();\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Calls the \"Entity Document Suggestion\" AI prompt via GraphQL to generate\n * a natural language template optimized for vector embeddings.\n */\n private async callSuggestionPrompt(entityName: string, useCase: string): Promise<DocumentSuggestionResult | null> {\n const md = new Metadata();\n const entity = md.Entities.find(e => e.Name === entityName);\n if (!entity) {\n throw new Error(`Entity \"${entityName}\" not found in metadata`);\n }\n\n const prompt = this.findSuggestionPrompt();\n const provider = Metadata.Provider as GraphQLDataProvider;\n if (!provider) {\n throw new Error('GraphQL provider not available');\n }\n\n const aiClient = new GraphQLAIClient(provider);\n const data = this.buildPromptData(entity, useCase);\n\n const result = await aiClient.RunAIPrompt({\n promptId: prompt.ID,\n data,\n });\n\n if (!result.success) {\n throw new Error(result.error || 'AI prompt execution failed');\n }\n\n const parsed = result.parsedResult as DocumentSuggestionResult;\n if (!parsed?.template) {\n throw new Error('AI returned no template in response');\n }\n\n return parsed;\n }\n\n /** Find the Entity Document Suggestion prompt from AIEngineBase */\n private findSuggestionPrompt(): MJAIPromptEntityExtended {\n const prompt = AIEngineBase.Instance.Prompts.find(\n (p: MJAIPromptEntityExtended) => p.Name === 'Entity Document Suggestion'\n );\n if (!prompt) {\n throw new Error(\n 'AI Prompt \"Entity Document Suggestion\" not found. ' +\n 'Run \"npx mj sync push --dir=metadata --include=prompts\" to install it.'\n );\n }\n return prompt;\n }\n\n /** Build the data payload for the suggestion prompt */\n private buildPromptData(entity: EntityInfo, useCase: string): Record<string, unknown> {\n const fields = entity.Fields.map(f => ({\n Name: f.Name,\n Type: f.Type,\n IsPrimaryKey: f.IsPrimaryKey,\n IsUnique: f.IsUnique,\n MaxLength: f.MaxLength,\n AllowsNull: f.AllowsNull,\n Description: f.Description || '',\n }));\n\n const md = new Metadata();\n const relationships = entity.RelatedEntities\n .filter(r => r.Type === 'One to Many' || r.Type === 'Many to One')\n .slice(0, 20)\n .map(r => {\n const relatedEntity = md.Entities.find(e => e.Name === r.RelatedEntity);\n const relFields = relatedEntity\n ? relatedEntity.Fields\n .filter(f => !f.IsPrimaryKey && f.Type !== 'datetimeoffset')\n .map(f => f.Name)\n : [];\n return {\n Name: r.RelatedEntityJoinField || r.RelatedEntity,\n RelatedEntity: r.RelatedEntity,\n Fields: relFields,\n ForeignKeyField: r.RelatedEntityJoinField || '',\n };\n });\n\n return {\n EntityName: entity.Name,\n FieldsJSON: JSON.stringify(fields, null, 2),\n RelationshipsJSON: JSON.stringify(relationships, null, 2),\n UseCase: useCase,\n };\n }\n}\n\nexport function LoadVectorManagementResource(): void {\n // Prevents tree-shaking\n}\n","@if (IsLoading) {\n <div class=\"vector-loading\">\n <mj-loading text=\"Loading vector management data...\"></mj-loading>\n </div>\n} @else {\n <div class=\"vector-dashboard\">\n <!-- View Mode Toggle -->\n @if (!EmbeddedMode) {\n <div class=\"view-mode-toggle\">\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'index'\" (click)=\"ViewMode = 'index'\">\n <i class=\"fa-solid fa-cubes\"></i> Index View\n </button>\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'operations'\" (click)=\"ViewMode = 'operations'\">\n <i class=\"fa-solid fa-gauge-high\"></i> Operations\n </button>\n </div>\n }\n\n <!-- KPI Cards Row -->\n <div class=\"kpi-row\">\n @for (card of KPICards; track card.title) {\n <app-kpi-card [data]=\"card\"></app-kpi-card>\n }\n </div>\n\n <!-- Main Content Area: Table + Sidebar -->\n <div class=\"content-area\">\n <!-- Entity Sync Table -->\n <div class=\"sync-table-panel\">\n <div class=\"panel-header\">\n <h3 class=\"panel-title\">\n <i class=\"fa-solid fa-table-list\"></i>\n Entity Sync Status\n </h3>\n <div class=\"panel-actions\">\n <button class=\"suggest-btn\" (click)=\"OpenSuggestDialog()\" title=\"Use AI to suggest an Entity Document template\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <span class=\"suggest-btn-text\">Suggest Document</span>\n </button>\n <button class=\"refresh-btn\" (click)=\"LoadData()\" title=\"Refresh data\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Refresh\n </button>\n </div>\n </div>\n\n @if (SyncRows.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>No entity documents configured for vectorization.</p>\n </div>\n } @else {\n <div class=\"table-wrapper\">\n <table class=\"sync-table\">\n <thead>\n <tr>\n <th>Entity</th>\n <th>Document</th>\n <th class=\"text-right\">Vectors</th>\n <th>Last Synced</th>\n <th>Status</th>\n <th class=\"text-center\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (row of SyncRows; track row.EntityDocumentID) {\n <tr>\n <td class=\"entity-name\">{{ row.EntityName }}</td>\n <td class=\"document-name\">{{ row.DocumentName }}</td>\n <td class=\"text-right vector-count\">{{ row.VectorCount | number }}</td>\n <td class=\"last-synced\">{{ FormatDate(row.LastSynced) }}</td>\n <td>\n <span class=\"status-badge\" [class]=\"GetStatusClass(row.Status)\">\n <i [class]=\"GetStatusIcon(row.Status)\"></i>\n @if (row.Status === 'Syncing' && row.PercentComplete > 0) {\n {{ row.PercentComplete }}%\n } @else {\n {{ row.Status }}\n }\n </span>\n </td>\n <td class=\"text-center actions-cell\">\n <button\n class=\"sync-btn\"\n [disabled]=\"SyncingIds.has(row.EntityDocumentID)\"\n (click)=\"SyncEntity(row.EntityDocumentID)\"\n title=\"Sync now\">\n @if (SyncingIds.has(row.EntityDocumentID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n {{ row.PercentComplete > 0 ? row.PercentComplete + '%' : 'Sync' }}\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Sync\n }\n </button>\n <button\n class=\"schedule-btn\"\n (click)=\"OpenScheduleSyncDialog(row.EntityDocumentID)\"\n title=\"Schedule recurring sync\">\n <i class=\"fa-regular fa-clock\"></i>\n </button>\n <button\n class=\"edit-btn\"\n (click)=\"OpenEditPanel(row.EntityDocumentID)\"\n title=\"Edit entity document\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n\n <!-- Sidebar Panels -->\n <div class=\"sidebar\">\n <!-- Vector DB Health -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-heart-pulse\"></i>\n Vector DB Health\n </h4>\n <div class=\"health-row\">\n <span class=\"health-dot\" [class]=\"DBHealthClass\"></span>\n <span class=\"health-label\">{{ VectorDBName }}</span>\n </div>\n <div class=\"health-status\">{{ VectorDBStatus }}</div>\n </div>\n\n <!-- Embedding Model Info -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-microchip\"></i>\n Embedding Model\n </h4>\n <div class=\"model-info\">\n <div class=\"info-row\">\n <span class=\"info-label\">Model</span>\n <span class=\"info-value\">{{ EmbeddingModel.Name }}</span>\n </div>\n @if (EmbeddingModel.Dimensions != null) {\n <div class=\"info-row\">\n <span class=\"info-label\">Dimensions</span>\n <span class=\"info-value\">{{ EmbeddingModel.Dimensions | number }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Storage Usage -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-hard-drive\"></i>\n Vectorization Coverage\n </h4>\n <div class=\"gauge-container\">\n <div class=\"gauge-bar\">\n <div class=\"gauge-fill\" [style.width.%]=\"StorageUsagePercent\"></div>\n </div>\n <div class=\"gauge-label\">{{ StorageLabel }} of records vectorized</div>\n </div>\n <div class=\"storage-detail\">\n {{ TotalVectors | number }} vectors stored\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Edit Entity Document Slide-in Panel -->\n @if (ShowEditPanel) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseEditPanel()\">\n <div class=\"slide-panel open\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-pen\"></i>\n Edit Entity Document\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseEditPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <span class=\"edit-readonly-value\">{{ EditDocEntityName }}</span>\n </div>\n\n <!-- Template Section -->\n <div class=\"suggest-field\">\n <div class=\"edit-template-header\">\n <label class=\"suggest-label\">Template</label>\n <button class=\"edit-regenerate-btn\"\n [disabled]=\"IsEditRegenerating\"\n (click)=\"RegenerateTemplate()\"\n title=\"Regenerate template using AI\">\n @if (IsEditRegenerating) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Regenerating...\n } @else {\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Regenerate with AI\n }\n </button>\n </div>\n <div class=\"template-editor-wrapper\">\n <mj-code-editor\n [value]=\"EditDocTemplate\"\n language=\"markdown\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"OnEditTemplateChange($event)\">\n </mj-code-editor>\n </div>\n </div>\n\n <!-- Selected Fields (parsed from template) -->\n @if (EditDocSelectedFields.length > 0) {\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Selected Fields</label>\n <div class=\"result-tags\">\n @for (field of EditDocSelectedFields; track field) {\n <span class=\"result-tag\">{{ field }}</span>\n }\n </div>\n </div>\n }\n\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"EditDocName\" />\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocAIModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (EditFilteredIndexes.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of EditFilteredIndexes; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes for this database — one will be created automatically on sync\n </span>\n }\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Status</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocStatus\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </div>\n <div class=\"result-actions\" style=\"margin-top: 1rem\">\n @if (IsEditSaving || IsEditDeleting) {\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveEditedDocument()\">\n <i class=\"fa-solid fa-save\"></i> Save Changes\n </button>\n <button class=\"edit-delete-btn\" (click)=\"DeleteEntityDocument()\">\n <i class=\"fa-solid fa-trash-can\"></i> Delete\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseEditPanel()\">\n Cancel\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Schedule Sync Dialog -->\n @if (ShowScheduleSyncDialog) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseScheduleSyncDialog()\">\n <div class=\"schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-regular fa-clock\"></i>\n Schedule Vector Sync\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseScheduleSyncDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity Document</label>\n <span class=\"edit-readonly-value\">{{ ScheduleSyncDocName }}</span>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Action</label>\n <span class=\"edit-readonly-value\">__VectorizeEntity</span>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Cron Expression</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"ScheduleSyncCron\" placeholder=\"0 2 * * *\" />\n <div class=\"schedule-cron-preview\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{ GetScheduleCronPreview(ScheduleSyncCron) }}\n </div>\n </div>\n <div class=\"suggest-field schedule-toggle-row\">\n <label class=\"suggest-label\">Enabled</label>\n <input type=\"checkbox\" class=\"mj-checkbox\" [(ngModel)]=\"ScheduleSyncEnabled\" />\n </div>\n <div class=\"result-actions\" style=\"margin-top: 1rem\">\n @if (ScheduleSyncSaving) {\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveScheduleSync()\">\n <i class=\"fa-solid fa-check\"></i> Create Schedule\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseScheduleSyncDialog()\">\n Cancel\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- No Vector Index Warning Dialog -->\n @if (ShowNoIndexWarning) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseNoIndexWarning()\">\n <div class=\"no-index-warning-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"no-index-warning-icon\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n </div>\n <h3 class=\"no-index-warning-title\">Vector Index Required</h3>\n <p class=\"no-index-warning-message\">\n You need to create at least one vector database and index before creating entity documents.\n Go to the Configuration section to set up a vector database and create an index.\n </p>\n <div class=\"no-index-warning-actions\">\n <button class=\"suggest-submit-btn\" (click)=\"GoToConfiguration()\">\n <i class=\"fa-solid fa-gear\"></i> Go to Configuration\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseNoIndexWarning()\">\n Close\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Suggest Document Slide-in Panel -->\n @if (ShowSuggestDialog) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseSuggestDialog()\">\n <div class=\"slide-panel\" [class.open]=\"ShowSuggestDialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n AI Document Suggestion\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseSuggestDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n @if (!SuggestionResult) {\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <div class=\"entity-picker\">\n <button class=\"entity-picker-trigger\" (click)=\"ToggleEntityPicker()\">\n @if (SuggestEntityName) {\n <i class=\"fa-solid fa-table\"></i>\n <span class=\"entity-picker-value\">{{ SuggestEntityName }}</span>\n } @else {\n <i class=\"fa-solid fa-search\"></i>\n <span class=\"entity-picker-placeholder\">Search and select an entity...</span>\n }\n <i class=\"fa-solid fa-chevron-down entity-picker-arrow\"></i>\n </button>\n @if (ShowEntityPicker) {\n <div class=\"entity-picker-dropdown\" (mousedown)=\"$event.stopPropagation()\">\n <div class=\"entity-picker-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input #entitySearchInput\n type=\"text\"\n class=\"entity-picker-search-input\"\n placeholder=\"Filter entities...\"\n [(ngModel)]=\"EntitySearchText\"\n (input)=\"FilterEntities()\"\n (keydown)=\"OnEntityPickerKeyDown($event)\" />\n </div>\n <div class=\"entity-picker-list\">\n @for (group of FilteredEntityGroups; track group.SchemaName) {\n <div class=\"entity-picker-group\">\n <div class=\"entity-picker-group-header\">\n <i class=\"fa-solid fa-database\"></i>\n {{ group.SchemaName }}\n </div>\n @for (entity of group.Entities; track entity.ID) {\n <button class=\"entity-picker-item\"\n [class.entity-picker-item-selected]=\"entity.Name === SuggestEntityName\"\n [class.entity-picker-item-focused]=\"FlatFilteredEntities[SelectedEntityIndex]?.ID === entity.ID\"\n (click)=\"SelectEntity(entity.Name)\">\n <i class=\"fa-solid fa-table\"></i>\n {{ entity.Name }}\n </button>\n }\n </div>\n }\n @if (FilteredEntityGroups.length === 0) {\n <div class=\"entity-picker-empty\">\n No entities matching \"{{ EntitySearchText }}\"\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Use Case</label>\n <div class=\"use-case-options\">\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'duplicate detection'\"\n (click)=\"SuggestUseCase = 'duplicate detection'\">\n <i class=\"fa-solid fa-clone\"></i>\n Duplicate Detection\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'search'\"\n (click)=\"SuggestUseCase = 'search'\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n Search\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'classification'\"\n (click)=\"SuggestUseCase = 'classification'\">\n <i class=\"fa-solid fa-tags\"></i>\n Classification\n </button>\n </div>\n </div>\n <button class=\"suggest-submit-btn\"\n [disabled]=\"IsSuggesting || !SuggestEntityName\"\n (click)=\"RunSuggestion()\">\n @if (IsSuggesting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Generating with AI...\n } @else {\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Generate Template\n }\n </button>\n @if (SuggestionError) {\n <div class=\"suggestion-error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ SuggestionError }}\n </div>\n }\n </div>\n } @else {\n <div class=\"suggest-result\">\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Suggested Template</h4>\n <div class=\"template-editor-wrapper\">\n <mj-code-editor\n [value]=\"EditableTemplate\"\n language=\"markdown\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"OnTemplateChange($event)\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Selected Fields</h4>\n <div class=\"result-tags\">\n @for (field of SuggestionResult.selectedFields; track field) {\n <span class=\"result-tag\">{{ field }}</span>\n }\n </div>\n </div>\n @if (SuggestionResult.selectedRelationships.length > 0) {\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Related Entities</h4>\n @for (rel of SuggestionResult.selectedRelationships; track rel.name) {\n <div class=\"result-relationship\">\n <span class=\"rel-name\">{{ rel.name }}</span>\n <span class=\"rel-fields\">{{ rel.fields.join(', ') }}</span>\n </div>\n }\n </div>\n }\n <div class=\"result-section result-thresholds\">\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Potential Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.potentialMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Absolute Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.absoluteMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Reasoning</h4>\n <p class=\"result-reasoning\">{{ SuggestionResult.reasoning }}</p>\n </div>\n <div class=\"result-section\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"SaveDocumentName\" />\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedEmbeddingModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (FilteredIndexesForSelectedDB.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of FilteredIndexesForSelectedDB; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes yet — create one in Configuration > Vector Database, or one will be created on sync\n </span>\n }\n </div>\n </div>\n <div class=\"result-actions\">\n @if (IsSavingDocument) {\n <div class=\"save-spinner\">\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveAsEntityDocument()\">\n <i class=\"fa-solid fa-floppy-disk\"></i> Save as Entity Document\n </button>\n <button class=\"suggest-submit-btn suggest-try-again-btn\" (click)=\"ClearSuggestion()\">\n <i class=\"fa-solid fa-rotate\"></i> Try Again\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseSuggestDialog()\">\n Close\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"vector-management-resource.component.js","sourceRoot":"","sources":["../../../../src/AI/components/vectors/vector-management-resource.component.ts","../../../../src/AI/components/vectors/vector-management-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Vector Management Resource Component\n *\n * Dashboard resource for managing vector databases and entity vectorization.\n * Displays KPI cards (total vectors, entities synced, last sync, avg embedding time),\n * an entity sync table, and sidebar panels for DB health, embedding model info,\n * and storage usage.\n */\n\nimport { Component, ChangeDetectorRef, OnDestroy, AfterViewInit, Input, ViewChild, ElementRef, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { EntityInfo, Metadata, RunView } from '@memberjunction/core';\nimport {\n ResourceData,\n MJEntityDocumentEntity,\n MJVectorDatabaseEntity,\n MJVectorIndexEntity,\n MJAIModelEntity,\n MJTemplateEntity,\n MJTemplateContentEntity,\n KnowledgeHubMetadataEngine\n} from '@memberjunction/core-entities';\nimport { RegisterClass, UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { KPICardData } from '../widgets/kpi-card.component';\nimport { GraphQLDataProvider, GraphQLAIClient } from '@memberjunction/graphql-dataprovider';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { MJAIPromptEntityExtended } from '@memberjunction/ai-core-plus';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { MJScheduledActionEntity, MJScheduledActionParamEntity } from '@memberjunction/core-entities';\nimport { CronToHumanReadable } from '../autotagging/autotagging-pipeline-resource.component';\n\n/** Flattened row for the entity sync table */\ninterface EntitySyncRow {\n EntityDocumentID: string;\n EntityName: string;\n DocumentName: string;\n VectorCount: number;\n LastSynced: Date | null;\n Status: 'Synced' | 'Syncing' | 'Error' | 'Pending';\n /** Percent complete during active sync (0-100) */\n PercentComplete: number;\n /** Pipeline run ID for tracking active subscription */\n PipelineRunID?: string;\n}\n\n/** Sidebar embedding model summary */\ninterface EmbeddingModelInfo {\n Name: string;\n Dimensions: number | null;\n}\n\n/** Result from AI document suggestion */\ninterface DocumentSuggestionResult {\n template: string;\n selectedFields: string[];\n selectedRelationships?: { name: string; fields: string[] }[];\n potentialMatchThreshold: number;\n absoluteMatchThreshold: number;\n reasoning: string;\n}\n\n@RegisterClass(BaseResourceComponent, 'VectorManagementResource')\n@Component({\n standalone: false,\n selector: 'app-vector-management-resource',\n templateUrl: './vector-management-resource.component.html',\n styleUrls: ['./vector-management-resource.component.css']\n})\nexport class VectorManagementResourceComponent extends BaseResourceComponent implements AfterViewInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n protected override navigationService = inject(NavigationService);\n protected override destroy$ = new Subject<void>();\n\n /** View mode: 'index' = Option A (shared index as hero, entity docs as children),\n * 'operations' = Option C (operations monitoring with real-time sync status) */\n public ViewMode: 'index' | 'operations' = 'index';\n\n /** Whether this component is embedded inside the Knowledge Hub shell */\n @Input() EmbeddedMode = false;\n\n /** Toggle between view modes */\n public ToggleViewMode(): void {\n this.ViewMode = this.ViewMode === 'index' ? 'operations' : 'index';\n this.cdr.detectChanges();\n }\n\n // --- Loading state ---\n public IsLoading = true;\n\n // --- KPI card data ---\n public KPICards: KPICardData[] = [];\n\n // --- Entity sync table ---\n public SyncRows: EntitySyncRow[] = [];\n public SyncingIds = new Set<string>();\n\n // --- Sidebar data ---\n public VectorDBName = '';\n public VectorDBStatus: 'Healthy' | 'Degraded' | 'Offline' = 'Healthy';\n public EmbeddingModel: EmbeddingModelInfo = { Name: '', Dimensions: null };\n public StorageUsagePercent = 0;\n public TotalVectors = 0;\n\n // --- Edit Entity Document Panel ---\n public ShowEditPanel = false;\n public IsEditSaving = false;\n public IsEditDeleting = false;\n public EditDocID = '';\n public EditDocName = '';\n public EditDocEntityName = '';\n public EditDocVectorDBID = '';\n public EditDocAIModelID = '';\n public EditDocVectorIndexID = '';\n public EditDocStatus = '';\n public EditDocTemplate = '';\n public IsEditRegenerating = false;\n\n /** Parse {{ FieldName }} patterns from the edit panel's template */\n public get EditDocSelectedFields(): string[] {\n if (!this.EditDocTemplate) return [];\n const matches = this.EditDocTemplate.match(/\\{\\{\\s*(\\w+(?:\\.\\w+)*)\\s*\\}\\}/g);\n if (!matches) return [];\n return [...new Set(\n matches.map(m => m.replace(/\\{\\{\\s*/, '').replace(/\\s*\\}\\}/, ''))\n )];\n }\n\n // --- Zero Vector Indexes Warning ---\n public ShowNoIndexWarning = false;\n\n /** Open the edit panel for an entity document */\n public async OpenEditPanel(entityDocumentId: string): Promise<void> {\n const doc = this.entityDocuments.find(d => UUIDsEqual(d.ID, entityDocumentId));\n if (!doc) return;\n this.EditDocID = doc.ID;\n this.EditDocName = doc.Name;\n this.EditDocEntityName = doc.Entity || '';\n this.EditDocVectorDBID = doc.VectorDatabaseID;\n this.EditDocAIModelID = doc.AIModelID;\n this.EditDocVectorIndexID = doc.VectorIndexID || '';\n this.EditDocStatus = doc.Status;\n this.EditDocTemplate = '';\n this.IsEditRegenerating = false;\n this.ShowEditPanel = true;\n this.cdr.detectChanges();\n\n // Load the template text from Template Contents\n await this.loadEditDocTemplate(doc.TemplateID);\n }\n\n /** Load the template text for the edit panel from the associated Template Contents record */\n private async loadEditDocTemplate(templateId: string): Promise<void> {\n if (!templateId) return;\n try {\n const rv = new RunView();\n const result = await rv.RunView<{ TemplateText: string }>({\n EntityName: 'MJ: Template Contents',\n ExtraFilter: `TemplateID='${templateId}'`,\n Fields: ['TemplateText'],\n ResultType: 'simple',\n OrderBy: 'Priority ASC',\n MaxRows: 1,\n });\n if (result.Success && result.Results.length > 0 && result.Results[0].TemplateText) {\n this.EditDocTemplate = result.Results[0].TemplateText;\n this.cdr.detectChanges();\n }\n } catch (error) {\n console.warn('[VectorManagement] Could not load template text:', error);\n }\n }\n\n public CloseEditPanel(): void {\n this.ShowEditPanel = false;\n this.cdr.detectChanges();\n }\n\n public async SaveEditedDocument(): Promise<void> {\n this.IsEditSaving = true;\n this.cdr.detectChanges();\n try {\n const md = new Metadata();\n const doc = await md.GetEntityObject<MJEntityDocumentEntity>('MJ: Entity Documents');\n const loaded = await doc.Load(this.EditDocID);\n if (!loaded) throw new Error('Could not load entity document');\n\n doc.Name = this.EditDocName;\n doc.VectorDatabaseID = this.EditDocVectorDBID;\n doc.AIModelID = this.EditDocAIModelID;\n doc.VectorIndexID = this.EditDocVectorIndexID || null;\n doc.Status = this.EditDocStatus as 'Active' | 'Inactive';\n\n const saved = await doc.Save();\n if (saved) {\n // Also save updated template text if changed\n await this.saveEditDocTemplate(doc.TemplateID);\n MJNotificationService.Instance.CreateSimpleNotification('Entity document updated', 'success', 2500);\n this.ShowEditPanel = false;\n await this.LoadData();\n } else {\n const msg = doc.LatestResult?.CompleteMessage || 'Unknown error';\n MJNotificationService.Instance.CreateSimpleNotification(`Save failed: ${msg}`, 'error', 5000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);\n } finally {\n this.IsEditSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Save the edited template text back to the Template Contents record */\n private async saveEditDocTemplate(templateId: string): Promise<void> {\n if (!templateId || !this.EditDocTemplate) return;\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJTemplateContentEntity>({\n EntityName: 'MJ: Template Contents',\n ExtraFilter: `TemplateID='${templateId}'`,\n ResultType: 'entity_object',\n OrderBy: 'Priority ASC',\n MaxRows: 1,\n });\n if (result.Success && result.Results.length > 0) {\n const content = result.Results[0];\n content.TemplateText = this.EditDocTemplate;\n await content.Save();\n }\n } catch (error) {\n console.warn('[VectorManagement] Could not save template text:', error);\n }\n }\n\n /** Regenerate the template using AI for the current edit panel entity */\n public async RegenerateTemplate(): Promise<void> {\n if (!this.EditDocEntityName || this.IsEditRegenerating) return;\n\n this.IsEditRegenerating = true;\n this.cdr.detectChanges();\n\n try {\n const result = await this.callSuggestionPrompt(this.EditDocEntityName, 'duplicate detection');\n if (result) {\n this.EditDocTemplate = result.template;\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Template regenerated with AI. Review and save to apply.',\n 'info', 3000\n );\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Regeneration failed: ${msg}`, 'error', 5000);\n } finally {\n this.IsEditRegenerating = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Handle template edits from the edit panel's code editor */\n public OnEditTemplateChange(newValue: string): void {\n this.EditDocTemplate = newValue;\n }\n\n public async DeleteEntityDocument(): Promise<void> {\n this.IsEditDeleting = true;\n this.cdr.detectChanges();\n try {\n const md = new Metadata();\n const doc = await md.GetEntityObject<MJEntityDocumentEntity>('MJ: Entity Documents');\n const loaded = await doc.Load(this.EditDocID);\n if (!loaded) throw new Error('Could not load entity document');\n\n const deleted = await doc.Delete();\n if (deleted) {\n MJNotificationService.Instance.CreateSimpleNotification('Entity document deleted', 'success', 2500);\n this.ShowEditPanel = false;\n await this.LoadData();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Delete failed', 'error', 3000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);\n } finally {\n this.IsEditDeleting = false;\n this.cdr.detectChanges();\n }\n }\n\n // --- Schedule Sync Dialog ---\n public ShowScheduleSyncDialog = false;\n public ScheduleSyncSaving = false;\n public ScheduleSyncDocID = '';\n public ScheduleSyncDocName = '';\n public ScheduleSyncCron = '0 2 * * *';\n public ScheduleSyncEnabled = true;\n\n /** Opens the schedule sync dialog for a specific entity document */\n public OpenScheduleSyncDialog(entityDocumentId: string): void {\n const doc = this.entityDocuments.find(d => UUIDsEqual(d.ID, entityDocumentId));\n if (!doc) return;\n this.ScheduleSyncDocID = doc.ID;\n this.ScheduleSyncDocName = doc.Entity || doc.Name;\n this.ScheduleSyncCron = '0 2 * * *';\n this.ScheduleSyncEnabled = true;\n this.ShowScheduleSyncDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Closes the schedule sync dialog */\n public CloseScheduleSyncDialog(): void {\n this.ShowScheduleSyncDialog = false;\n this.ScheduleSyncDocID = '';\n this.cdr.detectChanges();\n }\n\n /** Returns a human-readable description of a cron expression */\n public GetScheduleCronPreview(cron: string): string {\n return CronToHumanReadable(cron);\n }\n\n /** Saves a new ScheduledAction for vectorizing the selected entity document */\n public async SaveScheduleSync(): Promise<void> {\n if (this.ScheduleSyncSaving || !this.ScheduleSyncDocID) return;\n this.ScheduleSyncSaving = true;\n this.cdr.detectChanges();\n\n try {\n const actionID = await this.findVectorizeActionID();\n if (!actionID) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Could not find the \"__VectorizeEntity\" action. Please check action configuration.',\n 'error', 5000\n );\n return;\n }\n\n const md = new Metadata();\n\n // Create ScheduledAction\n const scheduledAction = await md.GetEntityObject<MJScheduledActionEntity>('MJ: Scheduled Actions');\n scheduledAction.NewRecord();\n scheduledAction.Name = `Vectorize: ${this.ScheduleSyncDocName}`;\n scheduledAction.Description = `Automated vectorization for entity document \"${this.ScheduleSyncDocName}\"`;\n scheduledAction.ActionID = actionID;\n scheduledAction.Type = 'Custom';\n scheduledAction.CronExpression = this.ScheduleSyncCron;\n scheduledAction.CustomCronExpression = this.ScheduleSyncCron;\n scheduledAction.Status = this.ScheduleSyncEnabled ? 'Active' : 'Disabled';\n scheduledAction.Timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n const saved = await scheduledAction.Save();\n if (!saved) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to create schedule: ${scheduledAction.LatestResult?.Message ?? 'Unknown error'}`,\n 'error', 5000\n );\n return;\n }\n\n // Create param linking the entityDocumentID\n await this.createVectorizeScheduleParam(scheduledAction.ID, actionID, this.ScheduleSyncDocID);\n\n MJNotificationService.Instance.CreateSimpleNotification(\n `Schedule created: ${CronToHumanReadable(this.ScheduleSyncCron)}`, 'success', 3000\n );\n\n this.CloseScheduleSyncDialog();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);\n } finally {\n this.ScheduleSyncSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Find the __VectorizeEntity action ID */\n private async findVectorizeActionID(): Promise<string | null> {\n const rv = new RunView();\n const result = await rv.RunView<{ ID: string }>({\n EntityName: 'Actions',\n ExtraFilter: `Name = '__VectorizeEntity'`,\n Fields: ['ID'],\n ResultType: 'simple',\n MaxRows: 1,\n });\n if (result.Success && result.Results.length > 0) {\n return result.Results[0].ID;\n }\n return null;\n }\n\n /** Create a ScheduledActionParam linking the entity document ID */\n private async createVectorizeScheduleParam(scheduledActionID: string, actionID: string, entityDocumentID: string): Promise<void> {\n const rv = new RunView();\n const paramResult = await rv.RunView<{ ID: string; Name: string }>({\n EntityName: 'Action Params',\n ExtraFilter: `ActionID = '${actionID}' AND Name = 'entityDocumentID'`,\n Fields: ['ID', 'Name'],\n ResultType: 'simple',\n MaxRows: 1,\n });\n\n if (!paramResult.Success || paramResult.Results.length === 0) {\n console.warn('[VectorManagement] Could not find entityDocumentID action param');\n return;\n }\n\n const md = new Metadata();\n const param = await md.GetEntityObject<MJScheduledActionParamEntity>('MJ: Scheduled Action Params');\n param.NewRecord();\n param.ScheduledActionID = scheduledActionID;\n param.ActionParamID = paramResult.Results[0].ID;\n param.ValueType = 'Static';\n param.Value = entityDocumentID;\n\n const saved = await param.Save();\n if (!saved) {\n console.warn('[VectorManagement] Failed to save schedule param:', param.LatestResult?.Message);\n }\n }\n\n // --- Suggest Document Dialog ---\n public ShowSuggestDialog = false;\n public IsSuggesting = false;\n public SuggestEntityName = '';\n public SuggestUseCase = 'duplicate detection';\n public SuggestionResult: DocumentSuggestionResult | null = null;\n public SaveDocumentName = '';\n public SuggestionError = '';\n public IsSavingDocument = false;\n public EditableTemplate = '';\n\n /** Prerequisites check — are vector DB and embedding model configured? */\n public HasVectorDB = false;\n public HasEmbeddingModel = false;\n public get PrerequisitesMet(): boolean {\n return this.HasVectorDB && this.HasEmbeddingModel;\n }\n\n /** Available embedding models for selection in save form */\n public AvailableEmbeddingModels: { ID: string; Name: string }[] = [];\n /** Selected embedding model ID for the new entity document */\n public SelectedEmbeddingModelID = '';\n /** Selected vector database ID for the new entity document */\n public SelectedVectorDBID = '';\n /** Available vector indexes for selection */\n public AvailableVectorIndexes: { ID: string; Name: string; VectorDatabaseID: string; EmbeddingModelID: string }[] = [];\n /** Selected vector index ID — if user picks an existing one */\n public SelectedVectorIndexID = '';\n\n /** Indexes filtered by the currently selected vector DB (for create/edit forms) */\n public get FilteredIndexesForSelectedDB(): { ID: string; Name: string; VectorDatabaseID: string; EmbeddingModelID: string }[] {\n const dbId = this.SelectedVectorDBID || this.EditDocVectorDBID;\n if (!dbId) return this.AvailableVectorIndexes;\n return this.AvailableVectorIndexes.filter(i => i.VectorDatabaseID === dbId);\n }\n\n /** Indexes filtered by the edit panel's selected vector DB */\n public get EditFilteredIndexes(): { ID: string; Name: string; VectorDatabaseID: string; EmbeddingModelID: string }[] {\n if (!this.EditDocVectorDBID) return this.AvailableVectorIndexes;\n return this.AvailableVectorIndexes.filter(i => i.VectorDatabaseID === this.EditDocVectorDBID);\n }\n\n /** Grouped entity list for the suggestion panel — schemas as groups, entities as items */\n public EntityGroups: { SchemaName: string; Entities: { Name: string; ID: string }[] }[] = [];\n /** Filtered entity groups based on search input */\n public FilteredEntityGroups: { SchemaName: string; Entities: { Name: string; ID: string }[] }[] = [];\n /** Search text for filtering entities */\n public EntitySearchText = '';\n /** Whether the entity picker dropdown is open */\n public ShowEntityPicker = false;\n public SelectedEntityIndex = -1;\n /** Reference to the entity search input for programmatic focus */\n @ViewChild('entitySearchInput') entitySearchInput?: ElementRef<HTMLInputElement>;\n\n // --- Raw entity data (private) ---\n private entityDocuments: MJEntityDocumentEntity[] = [];\n protected vectorDatabases: MJVectorDatabaseEntity[] = [];\n private vectorIndexes: MJVectorIndexEntity[] = [];\n private aiModels: MJAIModelEntity[] = [];\n\n /** Lightweight aggregate stats per EntityDocumentID — avoids loading all record documents */\n private erdStats: Map<string, { vectorCount: number; lastSynced: Date | null }> = new Map();\n\n // ================================================================\n // Lifecycle\n // ================================================================\n\n async ngAfterViewInit(): Promise<void> {\n await this.LoadData();\n this.navigationService.SetAgentContext(this, {\n TotalVectors: this.TotalVectors,\n KPICount: this.KPICards.length,\n });\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ================================================================\n // BaseResourceComponent overrides\n // ================================================================\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Vector Management';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-database';\n }\n\n // ================================================================\n // Public Methods\n // ================================================================\n\n /** Reload all dashboard data */\n public async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n await this.fetchAllData();\n this.buildSyncRows();\n this.buildKPICards();\n this.buildSidebarData();\n this.checkPrerequisites();\n } catch (error) {\n console.error('[VectorManagement] Error loading data:', error);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Trigger vectorization for a specific entity document via GraphQL (fire-and-forget with progress subscription) */\n public async SyncEntity(entityDocumentId: string): Promise<void> {\n if (this.SyncingIds.has(entityDocumentId)) {\n return;\n }\n\n const doc = this.entityDocuments.find(d => UUIDsEqual(d.ID, entityDocumentId));\n if (!doc) return;\n\n const provider = Metadata.Provider as GraphQLDataProvider;\n if (!provider) return;\n\n this.addSyncingId(entityDocumentId);\n this.updateRowStatus(entityDocumentId, 'Syncing');\n this.updateRowProgress(entityDocumentId, 0);\n this.cdr.detectChanges();\n\n try {\n const aiClient = new GraphQLAIClient(provider);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Starting vectorization for ${doc.Entity}...`,\n 'info', 3000\n );\n\n // Step 1: Start the mutation (fire-and-forget — returns PipelineRunID immediately)\n const result = await aiClient.VectorizeEntity({\n entityDocumentID: entityDocumentId,\n entityID: doc.EntityID,\n batchSize: 50\n });\n\n if (!result.Success || !result.PipelineRunID) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Vectorization failed: ${result.ErrorMessage || 'Unknown error'}`,\n 'error', 5000\n );\n this.removeSyncingId(entityDocumentId);\n this.updateRowStatus(entityDocumentId, 'Error');\n this.cdr.detectChanges();\n return;\n }\n\n // Store PipelineRunID on the row for tracking\n const row = this.SyncRows.find(r => r.EntityDocumentID === entityDocumentId);\n if (row) {\n row.PipelineRunID = result.PipelineRunID;\n }\n\n // Step 2: Subscribe to progress updates and also set a safety timeout\n // in case the subscription misses events (race condition, network issue, etc.)\n this.subscribeToPipelineProgress(entityDocumentId, result.PipelineRunID, doc.Entity);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error(`[VectorManagement] Error starting sync for ${entityDocumentId}:`, msg);\n MJNotificationService.Instance.CreateSimpleNotification(`Sync error: ${msg}`, 'error', 5000);\n this.removeSyncingId(entityDocumentId);\n this.updateRowStatus(entityDocumentId, 'Error');\n this.cdr.detectChanges();\n }\n }\n\n /** Subscribe to PipelineProgress for a specific pipeline run */\n private subscribeToPipelineProgress(entityDocumentId: string, pipelineRunID: string, entityName: string): void {\n const provider = Metadata.Provider as GraphQLDataProvider;\n const subscriptionQuery = `\n subscription PipelineProgress($pipelineRunID: String!) {\n PipelineProgress(pipelineRunID: $pipelineRunID) {\n PipelineRunID\n Stage\n TotalItems\n ProcessedItems\n PercentComplete\n ElapsedMs\n }\n }\n `;\n\n let idleTimer: ReturnType<typeof setTimeout> | null = null;\n\n const finishSync = (success: boolean) => {\n if (idleTimer) clearTimeout(idleTimer);\n rxSub?.unsubscribe();\n\n // Use setTimeout to defer state changes to the next macrotask,\n // avoiding ExpressionChangedAfterItHasBeenCheckedError.\n // (Promise.resolve microtasks run between Angular's check passes\n // and still trigger NG0100.)\n setTimeout(async () => {\n this.removeSyncingId(entityDocumentId);\n\n if (success) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Vectorization complete for ${entityName}`,\n 'success', 3000\n );\n await this.refreshSyncRow(entityDocumentId);\n } else {\n this.updateRowStatus(entityDocumentId, 'Error');\n MJNotificationService.Instance.CreateSimpleNotification(\n `Vectorization failed for ${entityName}`,\n 'error', 5000\n );\n }\n this.cdr.detectChanges();\n });\n };\n\n // Reset idle timer on every event. When no events arrive for 5s,\n // assume the pipeline is done (handles missing 'complete' event).\n const resetIdleTimer = () => {\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => {\n if (this.SyncingIds.has(entityDocumentId)) {\n finishSync(true);\n }\n }, 5000);\n };\n\n // Start the idle timer immediately in case no events ever arrive\n resetIdleTimer();\n\n const sub = provider.subscribe(subscriptionQuery, { pipelineRunID });\n const rxSub = sub.pipe(takeUntil(this.destroy$)).subscribe({\n next: (data: Record<string, unknown>) => {\n const progress = (data as Record<string, Record<string, unknown>>)['PipelineProgress'];\n if (!progress) return;\n\n const stage = progress['Stage'] as string;\n const pct = progress['PercentComplete'] as number;\n\n this.updateRowProgress(entityDocumentId, pct);\n this.cdr.detectChanges();\n\n if (stage === 'complete') {\n finishSync(true);\n } else if (stage === 'error') {\n finishSync(false);\n } else {\n // Got a progress event — reset idle timer\n resetIdleTimer();\n }\n },\n error: (err: unknown) => {\n console.error(`[VectorManagement] Pipeline subscription error:`, err);\n finishSync(false);\n }\n });\n }\n\n /**\n * Add an ID to SyncingIds, creating a new Set reference so Angular\n * change detection picks up the mutation in template bindings.\n */\n private addSyncingId(id: string): void {\n this.SyncingIds = new Set([...this.SyncingIds, id]);\n }\n\n /**\n * Remove an ID from SyncingIds, creating a new Set reference so Angular\n * change detection picks up the mutation in template bindings.\n */\n private removeSyncingId(id: string): void {\n if (this.SyncingIds.has(id)) {\n const next = new Set(this.SyncingIds);\n next.delete(id);\n this.SyncingIds = next;\n }\n }\n\n /** Opens the AI suggestion dialog, or shows a warning if no vector indexes exist */\n public OpenSuggestDialog(): void {\n if (this.vectorIndexes.length === 0 && this.vectorDatabases.length === 0) {\n this.ShowNoIndexWarning = true;\n this.cdr.detectChanges();\n return;\n }\n\n this.SuggestionResult = null;\n this.SuggestEntityName = '';\n this.SuggestUseCase = 'duplicate detection';\n this.EditableTemplate = '';\n this.SuggestionError = '';\n this.EntitySearchText = '';\n this.ShowEntityPicker = false;\n this.loadEntityGroups();\n this.ShowSuggestDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Close the no-index warning dialog */\n public CloseNoIndexWarning(): void {\n this.ShowNoIndexWarning = false;\n this.cdr.detectChanges();\n }\n\n /** Navigate to the Configuration section from the no-index warning */\n public async GoToConfiguration(): Promise<void> {\n this.ShowNoIndexWarning = false;\n this.cdr.detectChanges();\n // Attempt to open the Config nav item in the current app\n await this.navigationService.OpenNavItemByName('Config');\n }\n\n /** Select an entity from the grouped picker */\n public SelectEntity(entityName: string): void {\n this.SuggestEntityName = entityName;\n this.ShowEntityPicker = false;\n this.cdr.detectChanges();\n }\n\n /** Filter entities by search text */\n public FilterEntities(): void {\n const query = this.EntitySearchText.toLowerCase().trim();\n if (!query) {\n this.FilteredEntityGroups = this.EntityGroups;\n } else {\n this.FilteredEntityGroups = this.EntityGroups\n .map(group => ({\n SchemaName: group.SchemaName,\n Entities: group.Entities.filter(e => e.Name.toLowerCase().includes(query))\n }))\n .filter(group => group.Entities.length > 0);\n }\n // Reset selection to first item when filter changes\n this.SelectedEntityIndex = this.FlatFilteredEntities.length > 0 ? 0 : -1;\n this.cdr.detectChanges();\n }\n\n /**\n * Get a flat list of all entities across groups (for keyboard navigation indexing)\n */\n get FlatFilteredEntities(): { Name: string; ID: string }[] {\n return this.FilteredEntityGroups.flatMap(g => g.Entities);\n }\n\n /**\n * Handle keyboard events in the entity picker search input\n */\n public OnEntityPickerKeyDown(event: KeyboardEvent): void {\n const entities = this.FlatFilteredEntities;\n if (entities.length === 0) return;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.SelectedEntityIndex = Math.min(this.SelectedEntityIndex + 1, entities.length - 1);\n this.scrollSelectedEntityIntoView();\n this.cdr.detectChanges();\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.SelectedEntityIndex = Math.max(this.SelectedEntityIndex - 1, 0);\n this.scrollSelectedEntityIntoView();\n this.cdr.detectChanges();\n break;\n case 'Enter':\n event.preventDefault();\n if (this.SelectedEntityIndex >= 0 && this.SelectedEntityIndex < entities.length) {\n this.SelectEntity(entities[this.SelectedEntityIndex].Name);\n }\n break;\n case 'Escape':\n event.preventDefault();\n this.ShowEntityPicker = false;\n this.cdr.detectChanges();\n break;\n }\n }\n\n /**\n * Scroll the currently selected entity picker item into view\n */\n private scrollSelectedEntityIntoView(): void {\n setTimeout(() => {\n const selected = document.querySelector('.entity-picker-item-focused');\n if (selected) {\n selected.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }, 0);\n }\n\n /** Toggle entity picker visibility */\n public ToggleEntityPicker(): void {\n this.ShowEntityPicker = !this.ShowEntityPicker;\n if (this.ShowEntityPicker) {\n this.FilteredEntityGroups = this.EntityGroups;\n this.EntitySearchText = '';\n this.cdr.detectChanges();\n // Focus search input after the @if block renders — deferred past the click event\n setTimeout(() => {\n if (this.entitySearchInput?.nativeElement) {\n this.entitySearchInput.nativeElement.focus();\n }\n }, 0);\n } else {\n this.cdr.detectChanges();\n }\n }\n\n /** Handle template edits from code editor */\n public OnTemplateChange(newValue: string): void {\n this.EditableTemplate = newValue;\n if (this.SuggestionResult) {\n this.SuggestionResult.template = newValue;\n }\n }\n\n /** Closes the suggestion dialog */\n public CloseSuggestDialog(): void {\n this.ShowSuggestDialog = false;\n this.SuggestionResult = null;\n this.cdr.detectChanges();\n }\n\n /** Clears the current suggestion to try again */\n public ClearSuggestion(): void {\n this.SuggestionResult = null;\n this.cdr.detectChanges();\n }\n\n /**\n * Runs the AI suggestion by calling the server-side \"Entity Document Suggestion\"\n * AI prompt via GraphQL. The LLM analyzes the entity schema and generates\n * natural language Nunjucks templates optimized for embedding quality.\n */\n public async RunSuggestion(): Promise<void> {\n if (!this.SuggestEntityName || this.IsSuggesting) {\n return;\n }\n\n this.IsSuggesting = true;\n this.SuggestionError = '';\n this.cdr.detectChanges();\n\n try {\n const result = await this.callSuggestionPrompt(this.SuggestEntityName, this.SuggestUseCase);\n if (result) {\n this.SuggestionResult = result;\n this.EditableTemplate = result.template;\n this.SaveDocumentName = `${this.SuggestEntityName} - ${this.SuggestUseCase}`;\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[VectorManagement] Error generating suggestion:', msg);\n this.SuggestionError = `Failed to generate suggestion: ${msg}`;\n } finally {\n this.IsSuggesting = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Saves the current suggestion as an Entity Document record */\n public async SaveAsEntityDocument(): Promise<void> {\n if (this.IsSavingDocument || !this.SuggestionResult) {\n return;\n }\n\n this.IsSavingDocument = true;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n const entityDoc = await md.GetEntityObject<MJEntityDocumentEntity>('MJ: Entity Documents');\n entityDoc.NewRecord();\n entityDoc.Name = this.SaveDocumentName;\n\n const matchingEntity = md.Entities.find(e => e.Name === this.SuggestEntityName);\n if (matchingEntity) {\n entityDoc.EntityID = matchingEntity.ID;\n }\n\n entityDoc.Status = 'Active';\n\n // Populate required FK fields from existing data\n await this.populateEntityDocumentFKs(entityDoc);\n\n const saved = await entityDoc.Save();\n if (saved) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Entity Document \"${this.SaveDocumentName}\" created successfully`,\n 'success',\n 3000\n );\n await this.LoadData();\n setTimeout(() => {\n this.CloseSuggestDialog();\n this.cdr.detectChanges();\n }, 1500);\n } else {\n const errorMsg = entityDoc.LatestResult?.CompleteMessage || 'Unknown error saving entity document';\n console.error('[VectorManagement] Failed to save entity document:', errorMsg);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to save: ${errorMsg}`,\n 'error',\n 5000\n );\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[VectorManagement] Error saving entity document:', msg);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Error: ${msg}`,\n 'error',\n 5000\n );\n } finally {\n this.IsSavingDocument = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Returns the CSS class for a given sync status badge */\n public GetStatusClass(status: string): string {\n switch (status) {\n case 'Synced': return 'status-synced';\n case 'Syncing': return 'status-syncing';\n case 'Error': return 'status-error';\n case 'Pending': return 'status-pending';\n default: return '';\n }\n }\n\n /** Returns the icon class for a given sync status */\n public GetStatusIcon(status: string): string {\n switch (status) {\n case 'Synced': return 'fa-solid fa-circle-check';\n case 'Syncing': return 'fa-solid fa-spinner fa-spin';\n case 'Error': return 'fa-solid fa-circle-exclamation';\n case 'Pending': return 'fa-solid fa-clock';\n default: return 'fa-solid fa-question';\n }\n }\n\n /** Format a Date value for display */\n public FormatDate(date: Date | null): string {\n if (!date) return 'Never';\n const d = new Date(date);\n return d.toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit'\n });\n }\n\n /** Format the storage gauge label */\n public get StorageLabel(): string {\n return `${this.StorageUsagePercent}%`;\n }\n\n /** CSS class for the DB health indicator dot */\n public get DBHealthClass(): string {\n switch (this.VectorDBStatus) {\n case 'Healthy': return 'health-healthy';\n case 'Degraded': return 'health-degraded';\n case 'Offline': return 'health-offline';\n default: return '';\n }\n }\n\n // ================================================================\n // Private helpers\n // ================================================================\n\n private async fetchAllData(): Promise<void> {\n // Use cached engine data — BaseEngine's entity-event auto-refresh handles\n // updates from saves/deletes on the entities it tracks.\n const engine = KnowledgeHubMetadataEngine.Instance;\n await engine.Config(false);\n\n this.entityDocuments = engine.EntityDocuments;\n this.vectorDatabases = AIEngineBase.Instance.VectorDatabases;\n this.vectorIndexes = engine.VectorIndexes;\n\n // Build per-EntityDocument aggregate stats (vector count + last synced).\n // Each query fetches only the most recent row (MaxRows: 1) and uses\n // TotalRowCount for the actual vector count — avoids loading all rows.\n // AI Models come from a different domain — fetched in the same batch.\n const rv = new RunView();\n const erdQueries = this.entityDocuments.map(doc => ({\n EntityName: 'MJ: Entity Record Documents',\n ExtraFilter: `EntityDocumentID='${doc.ID}' AND VectorID IS NOT NULL`,\n ResultType: 'simple' as const,\n Fields: ['__mj_UpdatedAt'],\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: 1,\n }));\n const allQueries = [\n ...erdQueries,\n { EntityName: 'MJ: AI Models', ExtraFilter: '', ResultType: 'entity_object' as const }\n ];\n const allResults = await rv.RunViews(allQueries);\n\n // Map results back to erdStats\n this.erdStats.clear();\n for (let i = 0; i < this.entityDocuments.length; i++) {\n const result = allResults[i];\n if (result.Success) {\n const rows = result.Results as { __mj_UpdatedAt: string }[];\n const lastDate = rows.length > 0 ? new Date(rows[0].__mj_UpdatedAt) : null;\n this.erdStats.set(this.entityDocuments[i].ID, {\n vectorCount: result.TotalRowCount,\n lastSynced: lastDate,\n });\n }\n }\n\n const modelsResult = allResults[allResults.length - 1];\n if (modelsResult.Success) {\n this.aiModels = modelsResult.Results as MJAIModelEntity[];\n }\n }\n\n private buildSyncRows(): void {\n this.SyncRows = this.entityDocuments.map(doc => {\n const stats = this.erdStats.get(doc.ID);\n const vectorCount = stats?.vectorCount ?? 0;\n const lastSynced = stats?.lastSynced ?? null;\n const status = this.computeSyncStatus(doc, vectorCount);\n\n // Preserve progress info from any active sync\n const existingRow = this.SyncRows.find(r => UUIDsEqual(r.EntityDocumentID, doc.ID));\n return {\n EntityDocumentID: doc.ID,\n EntityName: doc.Entity || '',\n DocumentName: doc.Name,\n VectorCount: vectorCount,\n LastSynced: lastSynced,\n Status: status,\n PercentComplete: existingRow?.PercentComplete ?? 0,\n PipelineRunID: existingRow?.PipelineRunID,\n };\n });\n }\n\n private computeSyncStatus(\n doc: MJEntityDocumentEntity,\n vectorCount: number\n ): 'Synced' | 'Syncing' | 'Error' | 'Pending' {\n if (this.SyncingIds.has(doc.ID)) {\n return 'Syncing';\n }\n if (doc.Status === 'Inactive') {\n return 'Pending';\n }\n if (vectorCount > 0) {\n return 'Synced';\n }\n return 'Pending';\n }\n\n private buildKPICards(): void {\n let totalVectors = 0;\n let latestSync: Date | null = null;\n for (const stats of this.erdStats.values()) {\n totalVectors += stats.vectorCount;\n if (stats.lastSynced && (!latestSync || stats.lastSynced > latestSync)) {\n latestSync = stats.lastSynced;\n }\n }\n this.TotalVectors = totalVectors;\n\n const entitiesSynced = new Set(\n this.entityDocuments\n .filter(d => d.Status === 'Active')\n .map(d => d.EntityID)\n ).size;\n\n const lastSyncDate = latestSync;\n\n this.KPICards = [\n {\n title: 'Total Vectors',\n value: this.TotalVectors,\n subtitle: `across ${this.entityDocuments.length} documents`,\n icon: 'fa-cubes',\n color: 'primary',\n loading: false\n },\n {\n title: 'Entities Synced',\n value: entitiesSynced,\n subtitle: `of ${this.entityDocuments.length} configured`,\n icon: 'fa-layer-group',\n color: 'success',\n loading: false\n },\n {\n title: 'Last Sync',\n value: lastSyncDate ? this.FormatDate(lastSyncDate) : 'Never',\n icon: 'fa-clock',\n color: 'info',\n loading: false\n },\n {\n title: 'Vector Indexes',\n value: this.vectorIndexes.length,\n subtitle: `in ${this.vectorDatabases.length} database(s)`,\n icon: 'fa-diagram-project',\n color: 'warning',\n loading: false\n }\n ];\n }\n\n private buildSidebarData(): void {\n this.buildVectorDBHealth();\n this.buildEmbeddingModelInfo();\n this.buildStorageUsage();\n }\n\n private buildVectorDBHealth(): void {\n if (this.vectorDatabases.length > 0) {\n const db = this.vectorDatabases[0];\n this.VectorDBName = db.Name;\n // Determine health based on whether we have records with vectors\n const hasVectors = this.TotalVectors > 0;\n this.VectorDBStatus = hasVectors ? 'Healthy' : 'Degraded';\n } else {\n this.VectorDBName = 'Not configured';\n this.VectorDBStatus = 'Offline';\n }\n }\n\n private buildEmbeddingModelInfo(): void {\n if (this.vectorIndexes.length > 0) {\n const index = this.vectorIndexes[0];\n const model = this.aiModels.find(m => UUIDsEqual(m.ID, index.EmbeddingModelID));\n this.EmbeddingModel = {\n Name: model?.Name ?? index.EmbeddingModel ?? 'Unknown',\n Dimensions: null\n };\n } else {\n this.EmbeddingModel = { Name: 'Not configured', Dimensions: null };\n }\n }\n\n private buildStorageUsage(): void {\n // All records in erdStats already have vectors (query filters VectorID IS NOT NULL),\n // so coverage is 100% if any exist.\n this.StorageUsagePercent = this.TotalVectors > 0 ? 100 : 0;\n }\n\n /** Check if vector DB and embedding model are configured, populate selection lists */\n private checkPrerequisites(): void {\n this.HasVectorDB = this.vectorDatabases.length > 0;\n const allEmbeddings = this.aiModels.filter(m =>\n m.AIModelType?.toLowerCase().includes('embedding') || m.Name?.toLowerCase().includes('embedding')\n );\n this.HasEmbeddingModel = allEmbeddings.length > 0;\n this.AvailableEmbeddingModels = allEmbeddings.map(m => ({ ID: m.ID, Name: m.Name }));\n\n // Default selections — first available, no hardcoded preference\n if (this.HasVectorDB && !this.SelectedVectorDBID) {\n this.SelectedVectorDBID = this.vectorDatabases[0].ID;\n }\n if (this.HasEmbeddingModel && !this.SelectedEmbeddingModelID) {\n this.SelectedEmbeddingModelID = allEmbeddings[0].ID;\n }\n\n // Build vector index list\n this.AvailableVectorIndexes = this.vectorIndexes.map(vi => ({\n ID: vi.ID,\n Name: vi.Name,\n VectorDatabaseID: vi.VectorDatabaseID,\n EmbeddingModelID: vi.EmbeddingModelID\n }));\n // Pre-select first index if available\n if (this.AvailableVectorIndexes.length > 0 && !this.SelectedVectorIndexID) {\n this.SelectedVectorIndexID = this.AvailableVectorIndexes[0].ID;\n }\n }\n\n /** Find the best embedding model from loaded AI models */\n private findEmbeddingModel(): MJAIModelEntity | undefined {\n return this.aiModels.find(m =>\n m.AIModelType?.toLowerCase().includes('embedding') || m.Name?.toLowerCase().includes('embedding')\n );\n }\n\n /**\n * Populate required foreign key fields on an Entity Document before saving.\n * Throws if prerequisites are not met.\n */\n private async populateEntityDocumentFKs(entityDoc: MJEntityDocumentEntity): Promise<void> {\n if (!this.PrerequisitesMet) {\n const missing: string[] = [];\n if (!this.HasVectorDB) missing.push('Vector Database');\n if (!this.HasEmbeddingModel) missing.push('Embedding Model');\n throw new Error(`Prerequisites not configured: ${missing.join(', ')}. Go to the Configuration tab to set these up.`);\n }\n\n // TypeID — look up 'Record Duplicate' entity document type\n const rv = new RunView();\n const typeResult = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: Entity Document Types',\n ExtraFilter: \"Name = 'Record Duplicate'\",\n ResultType: 'simple',\n Fields: ['ID']\n });\n if (typeResult.Success && typeResult.Results.length > 0) {\n entityDoc.TypeID = typeResult.Results[0].ID;\n } else {\n throw new Error('Entity Document Type \"Record Duplicate\" not found in database');\n }\n\n // If a vector index is selected, use its DB + model so the syncer finds it\n // instead of auto-creating a new one\n if (this.SelectedVectorIndexID) {\n const idx = this.AvailableVectorIndexes.find(i => UUIDsEqual(i.ID, this.SelectedVectorIndexID));\n if (idx) {\n entityDoc.VectorDatabaseID = idx.VectorDatabaseID;\n entityDoc.AIModelID = idx.EmbeddingModelID;\n entityDoc.VectorIndexID = idx.ID;\n } else {\n entityDoc.VectorDatabaseID = this.SelectedVectorDBID || this.vectorDatabases[0].ID;\n entityDoc.AIModelID = this.SelectedEmbeddingModelID || this.findEmbeddingModel()!.ID;\n }\n } else {\n entityDoc.VectorDatabaseID = this.SelectedVectorDBID || this.vectorDatabases[0].ID;\n entityDoc.AIModelID = this.SelectedEmbeddingModelID || this.findEmbeddingModel()!.ID;\n }\n\n // TemplateID — create a Template record with the generated template content\n await this.createTemplateForDocument(entityDoc);\n }\n\n /** Create a Template + TemplateContent record for the entity document */\n private async createTemplateForDocument(entityDoc: MJEntityDocumentEntity): Promise<void> {\n const md = new Metadata();\n const templateText = this.EditableTemplate || this.SuggestionResult?.template || '';\n if (!templateText) {\n throw new Error('No template content to save');\n }\n\n // Create Template record\n const template = await md.GetEntityObject<MJTemplateEntity>('MJ: Templates');\n template.NewRecord();\n template.Name = `Template for ${this.SaveDocumentName}`;\n template.Description = `Auto-generated template for entity document: ${this.SaveDocumentName}`;\n template.UserID = md.CurrentUser.ID;\n template.IsActive = true;\n const templateSaved = await template.Save();\n if (!templateSaved) {\n throw new Error(`Failed to create template: ${template.LatestResult?.CompleteMessage || 'unknown error'}`);\n }\n\n entityDoc.TemplateID = template.ID;\n\n // Find 'Text' content type\n const contentTypeResult = await new RunView().RunView<{ ID: string }>({\n EntityName: 'MJ: Template Content Types',\n ExtraFilter: \"Name = 'Text'\",\n ResultType: 'simple',\n Fields: ['ID']\n });\n if (!contentTypeResult.Success || contentTypeResult.Results.length === 0) {\n throw new Error('Template Content Type \"Text\" not found');\n }\n\n // Create TemplateContent record with the template text\n // Server-side MJTemplateContentEntityServer hook auto-creates Scalar params\n // for each {{FieldName}} — GetTemplateData() handles them via the flat convention.\n const content = await md.GetEntityObject<MJTemplateContentEntity>('MJ: Template Contents');\n content.NewRecord();\n content.TemplateID = template.ID;\n content.TypeID = contentTypeResult.Results[0].ID;\n content.TemplateText = templateText;\n content.Priority = 1;\n content.IsActive = true;\n const contentSaved = await content.Save();\n if (!contentSaved) {\n throw new Error(`Failed to create template content: ${content.LatestResult?.CompleteMessage || 'unknown error'}`);\n }\n }\n\n /** Build grouped entity list from metadata, grouped by SchemaName */\n private loadEntityGroups(): void {\n const md = new Metadata();\n const groupMap = new Map<string, { Name: string; ID: string }[]>();\n\n for (const entity of md.Entities) {\n const schema = entity.SchemaName || '__default';\n const existing = groupMap.get(schema);\n if (existing) {\n existing.push({ Name: entity.Name, ID: entity.ID });\n } else {\n groupMap.set(schema, [{ Name: entity.Name, ID: entity.ID }]);\n }\n }\n\n this.EntityGroups = Array.from(groupMap.entries())\n .map(([schemaName, entities]) => ({\n SchemaName: schemaName,\n Entities: entities.sort((a, b) => a.Name.localeCompare(b.Name))\n }))\n .sort((a, b) => a.SchemaName.localeCompare(b.SchemaName));\n\n this.FilteredEntityGroups = this.EntityGroups;\n }\n\n private updateRowStatus(entityDocumentId: string, status: EntitySyncRow['Status']): void {\n const row = this.SyncRows.find(r => r.EntityDocumentID === entityDocumentId);\n if (row) {\n row.Status = status;\n }\n }\n\n private updateRowProgress(entityDocumentId: string, percentComplete: number): void {\n const row = this.SyncRows.find(r => r.EntityDocumentID === entityDocumentId);\n if (row) {\n row.PercentComplete = percentComplete;\n }\n }\n\n /** Refresh a single sync row's vector count and status from the DB */\n private async refreshSyncRow(entityDocumentId: string): Promise<void> {\n const row = this.SyncRows.find(r => r.EntityDocumentID === entityDocumentId);\n if (!row) return;\n\n const rv = new RunView();\n const result = await rv.RunView<{ __mj_UpdatedAt: string }>({\n EntityName: 'MJ: Entity Record Documents',\n ExtraFilter: `EntityDocumentID='${entityDocumentId}' AND VectorID IS NOT NULL`,\n Fields: ['__mj_UpdatedAt'],\n OrderBy: '__mj_UpdatedAt DESC',\n ResultType: 'simple',\n MaxRows: 1\n });\n\n if (result.Success) {\n row.VectorCount = result.TotalRowCount;\n row.LastSynced = result.Results.length > 0 ? new Date(result.Results[0].__mj_UpdatedAt) : null;\n row.Status = row.VectorCount > 0 ? 'Synced' : 'Pending';\n row.PercentComplete = 100;\n this.erdStats.set(entityDocumentId, { vectorCount: row.VectorCount, lastSynced: row.LastSynced });\n this.buildKPICards();\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Calls the \"Entity Document Suggestion\" AI prompt via GraphQL to generate\n * a natural language template optimized for vector embeddings.\n */\n private async callSuggestionPrompt(entityName: string, useCase: string): Promise<DocumentSuggestionResult | null> {\n const md = new Metadata();\n const entity = md.Entities.find(e => e.Name === entityName);\n if (!entity) {\n throw new Error(`Entity \"${entityName}\" not found in metadata`);\n }\n\n const prompt = this.findSuggestionPrompt();\n const provider = Metadata.Provider as GraphQLDataProvider;\n if (!provider) {\n throw new Error('GraphQL provider not available');\n }\n\n const aiClient = new GraphQLAIClient(provider);\n const data = this.buildPromptData(entity, useCase);\n\n const result = await aiClient.RunAIPrompt({\n promptId: prompt.ID,\n data,\n });\n\n if (!result.success) {\n throw new Error(result.error || 'AI prompt execution failed');\n }\n\n const parsed = result.parsedResult as DocumentSuggestionResult;\n if (!parsed?.template) {\n throw new Error('AI returned no template in response');\n }\n\n return parsed;\n }\n\n /** Find the Entity Document Suggestion prompt from AIEngineBase */\n private findSuggestionPrompt(): MJAIPromptEntityExtended {\n const prompt = AIEngineBase.Instance.Prompts.find(\n (p: MJAIPromptEntityExtended) => p.Name === 'Entity Document Suggestion'\n );\n if (!prompt) {\n throw new Error(\n 'AI Prompt \"Entity Document Suggestion\" not found. ' +\n 'Run \"npx mj sync push --dir=metadata --include=prompts\" to install it.'\n );\n }\n return prompt;\n }\n\n /** Build the data payload for the suggestion prompt */\n private buildPromptData(entity: EntityInfo, useCase: string): Record<string, unknown> {\n const fields = entity.Fields.map(f => ({\n Name: f.Name,\n Type: f.Type,\n IsPrimaryKey: f.IsPrimaryKey,\n IsUnique: f.IsUnique,\n MaxLength: f.MaxLength,\n AllowsNull: f.AllowsNull,\n Description: f.Description || '',\n }));\n\n const md = new Metadata();\n const relationships = entity.RelatedEntities\n .filter(r => r.Type === 'One to Many' || r.Type === 'Many to One')\n .slice(0, 20)\n .map(r => {\n const relatedEntity = md.Entities.find(e => e.Name === r.RelatedEntity);\n const relFields = relatedEntity\n ? relatedEntity.Fields\n .filter(f => !f.IsPrimaryKey && f.Type !== 'datetimeoffset')\n .map(f => f.Name)\n : [];\n return {\n Name: r.RelatedEntityJoinField || r.RelatedEntity,\n RelatedEntity: r.RelatedEntity,\n Fields: relFields,\n ForeignKeyField: r.RelatedEntityJoinField || '',\n };\n });\n\n return {\n EntityName: entity.Name,\n FieldsJSON: JSON.stringify(fields, null, 2),\n RelationshipsJSON: JSON.stringify(relationships, null, 2),\n UseCase: useCase,\n };\n }\n}\n\nexport function LoadVectorManagementResource(): void {\n // Prevents tree-shaking\n}\n","@if (IsLoading) {\n <div class=\"vector-loading\">\n <mj-loading text=\"Loading vector management data...\"></mj-loading>\n </div>\n} @else {\n <div class=\"vector-dashboard\">\n <!-- View Mode Toggle -->\n @if (!EmbeddedMode) {\n <div class=\"view-mode-toggle\">\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'index'\" (click)=\"ViewMode = 'index'\">\n <i class=\"fa-solid fa-cubes\"></i> Index View\n </button>\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'operations'\" (click)=\"ViewMode = 'operations'\">\n <i class=\"fa-solid fa-gauge-high\"></i> Operations\n </button>\n </div>\n }\n\n <!-- KPI Cards Row -->\n <div class=\"kpi-row\">\n @for (card of KPICards; track card.title) {\n <app-kpi-card [data]=\"card\"></app-kpi-card>\n }\n </div>\n\n <!-- Main Content Area: Table + Sidebar -->\n <div class=\"content-area\">\n <!-- Entity Sync Table -->\n <div class=\"sync-table-panel\">\n <div class=\"panel-header\">\n <h3 class=\"panel-title\">\n <i class=\"fa-solid fa-table-list\"></i>\n Entity Sync Status\n </h3>\n <div class=\"panel-actions\">\n <button class=\"suggest-btn\" (click)=\"OpenSuggestDialog()\" title=\"Use AI to suggest an Entity Document template\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <span class=\"suggest-btn-text\">Suggest Document</span>\n </button>\n <button class=\"refresh-btn\" (click)=\"LoadData()\" title=\"Refresh data\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Refresh\n </button>\n </div>\n </div>\n\n @if (SyncRows.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>No entity documents configured for vectorization.</p>\n </div>\n } @else {\n <div class=\"table-wrapper\">\n <table class=\"sync-table\">\n <thead>\n <tr>\n <th>Entity</th>\n <th>Document</th>\n <th class=\"text-right\">Vectors</th>\n <th>Last Synced</th>\n <th>Status</th>\n <th class=\"text-center\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (row of SyncRows; track row.EntityDocumentID) {\n <tr>\n <td class=\"entity-name\">{{ row.EntityName }}</td>\n <td class=\"document-name\">{{ row.DocumentName }}</td>\n <td class=\"text-right vector-count\">{{ row.VectorCount | number }}</td>\n <td class=\"last-synced\">{{ FormatDate(row.LastSynced) }}</td>\n <td>\n <span class=\"status-badge\" [class]=\"GetStatusClass(row.Status)\">\n <i [class]=\"GetStatusIcon(row.Status)\"></i>\n @if (row.Status === 'Syncing' && row.PercentComplete > 0) {\n {{ row.PercentComplete }}%\n } @else {\n {{ row.Status }}\n }\n </span>\n </td>\n <td class=\"text-center actions-cell\">\n <button\n class=\"sync-btn\"\n [disabled]=\"SyncingIds.has(row.EntityDocumentID)\"\n (click)=\"SyncEntity(row.EntityDocumentID)\"\n title=\"Sync now\">\n @if (SyncingIds.has(row.EntityDocumentID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n {{ row.PercentComplete > 0 ? row.PercentComplete + '%' : 'Sync' }}\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Sync\n }\n </button>\n <button\n class=\"schedule-btn\"\n (click)=\"OpenScheduleSyncDialog(row.EntityDocumentID)\"\n title=\"Schedule recurring sync\">\n <i class=\"fa-regular fa-clock\"></i>\n </button>\n <button\n class=\"edit-btn\"\n (click)=\"OpenEditPanel(row.EntityDocumentID)\"\n title=\"Edit entity document\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n\n <!-- Sidebar Panels -->\n <div class=\"sidebar\">\n <!-- Vector DB Health -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-heart-pulse\"></i>\n Vector DB Health\n </h4>\n <div class=\"health-row\">\n <span class=\"health-dot\" [class]=\"DBHealthClass\"></span>\n <span class=\"health-label\">{{ VectorDBName }}</span>\n </div>\n <div class=\"health-status\">{{ VectorDBStatus }}</div>\n </div>\n\n <!-- Embedding Model Info -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-microchip\"></i>\n Embedding Model\n </h4>\n <div class=\"model-info\">\n <div class=\"info-row\">\n <span class=\"info-label\">Model</span>\n <span class=\"info-value\">{{ EmbeddingModel.Name }}</span>\n </div>\n @if (EmbeddingModel.Dimensions != null) {\n <div class=\"info-row\">\n <span class=\"info-label\">Dimensions</span>\n <span class=\"info-value\">{{ EmbeddingModel.Dimensions | number }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Storage Usage -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-hard-drive\"></i>\n Vectorization Coverage\n </h4>\n <div class=\"gauge-container\">\n <div class=\"gauge-bar\">\n <div class=\"gauge-fill\" [style.width.%]=\"StorageUsagePercent\"></div>\n </div>\n <div class=\"gauge-label\">{{ StorageLabel }} of records vectorized</div>\n </div>\n <div class=\"storage-detail\">\n {{ TotalVectors | number }} vectors stored\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Edit Entity Document Slide-in Panel -->\n @if (ShowEditPanel) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseEditPanel()\">\n <div class=\"slide-panel open\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-pen\"></i>\n Edit Entity Document\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseEditPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <span class=\"edit-readonly-value\">{{ EditDocEntityName }}</span>\n </div>\n\n <!-- Template Section -->\n <div class=\"suggest-field\">\n <div class=\"edit-template-header\">\n <label class=\"suggest-label\">Template</label>\n <button class=\"edit-regenerate-btn\"\n [disabled]=\"IsEditRegenerating\"\n (click)=\"RegenerateTemplate()\"\n title=\"Regenerate template using AI\">\n @if (IsEditRegenerating) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Regenerating...\n } @else {\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Regenerate with AI\n }\n </button>\n </div>\n <div class=\"template-editor-wrapper\">\n <mj-code-editor\n [value]=\"EditDocTemplate\"\n language=\"markdown\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"OnEditTemplateChange($event)\">\n </mj-code-editor>\n </div>\n </div>\n\n <!-- Selected Fields (parsed from template) -->\n @if (EditDocSelectedFields.length > 0) {\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Selected Fields</label>\n <div class=\"result-tags\">\n @for (field of EditDocSelectedFields; track field) {\n <span class=\"result-tag\">{{ field }}</span>\n }\n </div>\n </div>\n }\n\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"EditDocName\" />\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocAIModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (EditFilteredIndexes.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of EditFilteredIndexes; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes for this database — one will be created automatically on sync\n </span>\n }\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Status</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocStatus\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </div>\n <div class=\"result-actions\" style=\"margin-top: 1rem\">\n @if (IsEditSaving || IsEditDeleting) {\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveEditedDocument()\">\n <i class=\"fa-solid fa-save\"></i> Save Changes\n </button>\n <button class=\"edit-delete-btn\" (click)=\"DeleteEntityDocument()\">\n <i class=\"fa-solid fa-trash-can\"></i> Delete\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseEditPanel()\">\n Cancel\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Schedule Sync Dialog -->\n @if (ShowScheduleSyncDialog) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseScheduleSyncDialog()\">\n <div class=\"schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-regular fa-clock\"></i>\n Schedule Vector Sync\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseScheduleSyncDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity Document</label>\n <span class=\"edit-readonly-value\">{{ ScheduleSyncDocName }}</span>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Action</label>\n <span class=\"edit-readonly-value\">__VectorizeEntity</span>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Cron Expression</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"ScheduleSyncCron\" placeholder=\"0 2 * * *\" />\n <div class=\"schedule-cron-preview\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{ GetScheduleCronPreview(ScheduleSyncCron) }}\n </div>\n </div>\n <div class=\"suggest-field schedule-toggle-row\">\n <label class=\"suggest-label\">Enabled</label>\n <input type=\"checkbox\" class=\"mj-checkbox\" [(ngModel)]=\"ScheduleSyncEnabled\" />\n </div>\n <div class=\"result-actions\" style=\"margin-top: 1rem\">\n @if (ScheduleSyncSaving) {\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveScheduleSync()\">\n <i class=\"fa-solid fa-check\"></i> Create Schedule\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseScheduleSyncDialog()\">\n Cancel\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- No Vector Index Warning Dialog -->\n @if (ShowNoIndexWarning) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseNoIndexWarning()\">\n <div class=\"no-index-warning-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"no-index-warning-icon\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n </div>\n <h3 class=\"no-index-warning-title\">Vector Index Required</h3>\n <p class=\"no-index-warning-message\">\n You need to create at least one vector database and index before creating entity documents.\n Go to the Configuration section to set up a vector database and create an index.\n </p>\n <div class=\"no-index-warning-actions\">\n <button class=\"suggest-submit-btn\" (click)=\"GoToConfiguration()\">\n <i class=\"fa-solid fa-gear\"></i> Go to Configuration\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseNoIndexWarning()\">\n Close\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Suggest Document Slide-in Panel -->\n @if (ShowSuggestDialog) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseSuggestDialog()\">\n <div class=\"slide-panel\" [class.open]=\"ShowSuggestDialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n AI Document Suggestion\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseSuggestDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n @if (!SuggestionResult) {\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <div class=\"entity-picker\">\n <button class=\"entity-picker-trigger\" (click)=\"ToggleEntityPicker()\">\n @if (SuggestEntityName) {\n <i class=\"fa-solid fa-table\"></i>\n <span class=\"entity-picker-value\">{{ SuggestEntityName }}</span>\n } @else {\n <i class=\"fa-solid fa-search\"></i>\n <span class=\"entity-picker-placeholder\">Search and select an entity...</span>\n }\n <i class=\"fa-solid fa-chevron-down entity-picker-arrow\"></i>\n </button>\n @if (ShowEntityPicker) {\n <div class=\"entity-picker-dropdown\" (mousedown)=\"$event.stopPropagation()\">\n <div class=\"entity-picker-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input #entitySearchInput\n type=\"text\"\n class=\"entity-picker-search-input\"\n placeholder=\"Filter entities...\"\n [(ngModel)]=\"EntitySearchText\"\n (input)=\"FilterEntities()\"\n (keydown)=\"OnEntityPickerKeyDown($event)\" />\n </div>\n <div class=\"entity-picker-list\">\n @for (group of FilteredEntityGroups; track group.SchemaName) {\n <div class=\"entity-picker-group\">\n <div class=\"entity-picker-group-header\">\n <i class=\"fa-solid fa-database\"></i>\n {{ group.SchemaName }}\n </div>\n @for (entity of group.Entities; track entity.ID) {\n <button class=\"entity-picker-item\"\n [class.entity-picker-item-selected]=\"entity.Name === SuggestEntityName\"\n [class.entity-picker-item-focused]=\"FlatFilteredEntities[SelectedEntityIndex]?.ID === entity.ID\"\n (click)=\"SelectEntity(entity.Name)\">\n <i class=\"fa-solid fa-table\"></i>\n {{ entity.Name }}\n </button>\n }\n </div>\n }\n @if (FilteredEntityGroups.length === 0) {\n <div class=\"entity-picker-empty\">\n No entities matching \"{{ EntitySearchText }}\"\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Use Case</label>\n <div class=\"use-case-options\">\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'duplicate detection'\"\n (click)=\"SuggestUseCase = 'duplicate detection'\">\n <i class=\"fa-solid fa-clone\"></i>\n Duplicate Detection\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'search'\"\n (click)=\"SuggestUseCase = 'search'\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n Search\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'classification'\"\n (click)=\"SuggestUseCase = 'classification'\">\n <i class=\"fa-solid fa-tags\"></i>\n Classification\n </button>\n </div>\n </div>\n <button class=\"suggest-submit-btn\"\n [disabled]=\"IsSuggesting || !SuggestEntityName\"\n (click)=\"RunSuggestion()\">\n @if (IsSuggesting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Generating with AI...\n } @else {\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Generate Template\n }\n </button>\n @if (SuggestionError) {\n <div class=\"suggestion-error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ SuggestionError }}\n </div>\n }\n </div>\n } @else {\n <div class=\"suggest-result\">\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Suggested Template</h4>\n <div class=\"template-editor-wrapper\">\n <mj-code-editor\n [value]=\"EditableTemplate\"\n language=\"markdown\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"OnTemplateChange($event)\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Selected Fields</h4>\n <div class=\"result-tags\">\n @for (field of SuggestionResult.selectedFields; track field) {\n <span class=\"result-tag\">{{ field }}</span>\n }\n </div>\n </div>\n @if ((SuggestionResult.selectedRelationships?.length ?? 0) > 0) {\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Related Entities</h4>\n @for (rel of SuggestionResult.selectedRelationships; track rel.name) {\n <div class=\"result-relationship\">\n <span class=\"rel-name\">{{ rel.name }}</span>\n <span class=\"rel-fields\">{{ rel.fields.join(', ') }}</span>\n </div>\n }\n </div>\n }\n <div class=\"result-section result-thresholds\">\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Potential Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.potentialMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Absolute Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.absoluteMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Reasoning</h4>\n <p class=\"result-reasoning\">{{ SuggestionResult.reasoning }}</p>\n </div>\n <div class=\"result-section\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"SaveDocumentName\" />\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedEmbeddingModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (FilteredIndexesForSelectedDB.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of FilteredIndexesForSelectedDB; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes yet — create one in Configuration > Vector Database, or one will be created on sync\n </span>\n }\n </div>\n </div>\n <div class=\"result-actions\">\n @if (IsSavingDocument) {\n <div class=\"save-spinner\">\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveAsEntityDocument()\">\n <i class=\"fa-solid fa-floppy-disk\"></i> Save as Entity Document\n </button>\n <button class=\"suggest-submit-btn suggest-try-again-btn\" (click)=\"ClearSuggestion()\">\n <i class=\"fa-solid fa-rotate\"></i> Try Again\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseSuggestDialog()\">\n Close\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n}\n"]}
|