@memberjunction/ng-dashboards 6.2.0-edge.7 → 6.2.0-edge.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  2. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +25 -4
  3. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  4. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  5. package/dist/AI/components/tags/tags-resource.component.js +11 -22
  6. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  7. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  8. package/dist/AI/components/vectors/vector-management-resource.component.js +2 -1
  9. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  10. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
  11. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +11 -3
  12. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  13. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +16 -16
  14. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  15. package/dist/KnowledgeHub/components/visualize/semantic-graph/semantic-graph-explorer.component.d.ts +113 -0
  16. package/dist/KnowledgeHub/components/visualize/semantic-graph/semantic-graph-explorer.component.d.ts.map +1 -0
  17. package/dist/KnowledgeHub/components/visualize/semantic-graph/semantic-graph-explorer.component.js +1184 -0
  18. package/dist/KnowledgeHub/components/visualize/semantic-graph/semantic-graph-explorer.component.js.map +1 -0
  19. package/dist/KnowledgeHub/components/visualize/visualize-agent-context.d.ts +1 -1
  20. package/dist/KnowledgeHub/components/visualize/visualize-agent-context.d.ts.map +1 -1
  21. package/dist/KnowledgeHub/components/visualize/visualize-agent-context.js +1 -1
  22. package/dist/KnowledgeHub/components/visualize/visualize-agent-context.js.map +1 -1
  23. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts +1 -1
  24. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts.map +1 -1
  25. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js +21 -10
  26. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js.map +1 -1
  27. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  28. package/dist/SystemDiagnostics/system-diagnostics.component.js +4 -2
  29. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  30. package/dist/ai-dashboards.module.d.ts +46 -44
  31. package/dist/ai-dashboards.module.d.ts.map +1 -1
  32. package/dist/ai-dashboards.module.js +10 -0
  33. package/dist/ai-dashboards.module.js.map +1 -1
  34. package/dist/public-api.d.ts +1 -0
  35. package/dist/public-api.d.ts.map +1 -1
  36. package/dist/public-api.js +1 -0
  37. package/dist/public-api.js.map +1 -1
  38. package/package.json +74 -73
@@ -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, EscapeSQLString } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService, ActivityService } from '@memberjunction/ng-shared';\nimport { ViewToggleOption } from '@memberjunction/ng-ui-components';\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 { MJScheduledJobEntity } from '@memberjunction/core-entities';\nimport { BuildSingleStaticParamConfiguration, ResolveActionJobTypeID } from '../../../shared/action-scheduled-job';\nimport { CronToHumanReadable } from '../autotagging/shared/classify.format';\nimport { BuildAutoVectorIndexName, FindMatchingVectorIndex } from './vector-index-auto';\nimport {\n ChosenIndexForSave,\n IndexesForSelection,\n SelectDatabase,\n SelectEmbeddingModel,\n SelectIndex,\n VectorIndexOption,\n VectorStoreSelection,\n} from './vector-store-selection';\nimport {\n BuildVectorAgentContext,\n ResolveSyncRow,\n VectorSyncRowCandidate,\n} from './vector-management-agent-context';\nimport { ValidateStringParam } from '../../../shared/agent-tool-validation';\nimport { WithoutSensitiveFields, SensitiveFieldsInTemplate, VectorFieldPurpose } from './sensitive-fields';\nimport {\n ENTITY_DOCUMENT_TYPE_BY_USE_CASE,\n MAX_TEMPLATE_FIELDS,\n CapSelectedFields,\n EntityDocumentTypeForUseCase,\n SuggestionUseCaseForDocumentType,\n IsVectorizableEntity,\n SuggestedMatchThresholds,\n TemplateFieldCapRefusal,\n} from './vector-document-rules';\n\n/** Flattened row for the entity sync table */\ninterface EntitySyncRow {\n EntityDocumentID: string;\n EntityName: string;\n DocumentName: string;\n /** Entity Document Type name, e.g. 'Search'. Fixed at creation, shown read-only. */\n DocumentType: 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 private activityService = inject(ActivityService);\n protected override navigationService = inject(NavigationService);\n protected override destroy$ = new Subject<void>();\n\n /**\n * How long a sync may go without a progress event before the tab stops waiting. Reaching it does\n * not mean the sync finished (see subscribeToPipelineProgress).\n */\n private static readonly SYNC_SILENCE_LIMIT_MS = 2 * 60 * 1000;\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 public readonly VectorViewOptions: ViewToggleOption[] = [\n { key: 'index', icon: 'fa-solid fa-cubes', title: 'Index View' },\n { key: 'operations', icon: 'fa-solid fa-gauge-high', title: 'Operations View' }\n ];\n\n /**\n * When true, renders only the body content (no chrome). Set by parent shells\n * that embed this resource. See plans/explorer-chrome-conventions.md Section 5.\n */\n @Input() HideToolbar = 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 /** Human-readable explanation of the current health status (shown as helper text / tooltip). */\n public VectorDBStatusReason = '';\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 /** Entity Document Type of the document being edited. Fixed at creation, shown read-only. */\n public EditDocType = '';\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.EditDocType = doc.Type || '';\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 = RunView.FromMetadataProvider(this.ProviderToUse);\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 SkipTotalRowCount: true,\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 = this.ProviderToUse;\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 const vectorDatabaseID = this.EditDocVectorDBID || null;\n const aiModelID = this.EditDocAIModelID || null;\n doc.VectorDatabaseID = vectorDatabaseID;\n doc.AIModelID = aiModelID;\n // \"Auto (create/find matching index)\" resolves to a real index for this DB + model, so the\n // syncer always has one to write into; without both parts there is nothing to match.\n // A chosen index counts only when it matches the database and model shown.\n const chosenIndex = ChosenIndexForSave(this.editSelection, this.AvailableVectorIndexes);\n doc.VectorIndexID = chosenIndex\n ? chosenIndex.ID\n : (vectorDatabaseID && aiModelID\n ? await this.resolveOrCreateVectorIndex(vectorDatabaseID, aiModelID, this.EditDocEntityName)\n : 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(true);\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 = RunView.FromMetadataProvider(this.ProviderToUse);\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 SkipTotalRowCount: true,\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 // Ask for the use case this document's type stands for, so the regenerated template\n // still matches the type. Refuse rather than fall back to another use case.\n const useCase = SuggestionUseCaseForDocumentType(this.EditDocType);\n if (!useCase) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Can't regenerate: documents of type \"${this.EditDocType || 'unknown'}\" have no AI template use case.`,\n 'error', 5000\n );\n return;\n }\n\n this.IsEditRegenerating = true;\n this.cdr.detectChanges();\n\n try {\n const result = await this.callSuggestionPrompt(this.EditDocEntityName, useCase);\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 = this.ProviderToUse;\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(true);\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 Scheduled Job (type: Action) 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 = this.ProviderToUse;\n\n // Resolve the 'Action' scheduled-job type\n const jobTypeID = await ResolveActionJobTypeID(md);\n if (!jobTypeID) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Could not find the \"Action\" scheduled job type. Please check scheduling configuration.',\n 'error', 5000\n );\n return;\n }\n\n // Create the Scheduled Job — the action and its entityDocumentID parameter ride in\n // Configuration, which is what ActionScheduledJobDriver reads.\n const scheduledJob = await md.GetEntityObject<MJScheduledJobEntity>('MJ: Scheduled Jobs');\n scheduledJob.NewRecord();\n scheduledJob.JobTypeID = jobTypeID;\n scheduledJob.Name = `Vectorize: ${this.ScheduleSyncDocName}`;\n scheduledJob.Description = `Automated vectorization for entity document \"${this.ScheduleSyncDocName}\"`;\n scheduledJob.CronExpression = this.ScheduleSyncCron;\n scheduledJob.Status = this.ScheduleSyncEnabled ? 'Active' : 'Disabled';\n scheduledJob.Timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n scheduledJob.Configuration = await BuildSingleStaticParamConfiguration(\n md, actionID, 'entityDocumentID', this.ScheduleSyncDocID, '[VectorManagement]'\n );\n\n const saved = await scheduledJob.Save();\n if (!saved) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to create schedule: ${scheduledJob.LatestResult?.CompleteMessage ?? 'Unknown error'}`,\n 'error', 5000\n );\n return;\n }\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 = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: Actions',\n ExtraFilter: `Name = '__VectorizeEntity'`,\n Fields: ['ID'],\n ResultType: 'simple',\n MaxRows: 1,\n SkipTotalRowCount: true,\n });\n if (result.Success && result.Results.length > 0) {\n return result.Results[0].ID;\n }\n return null;\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 /**\n * The indexes the suggestion panel offers: those in the selected database built with the selected\n * embedding model, so a chosen index can never store a different model than the one shown.\n */\n public get FilteredIndexesForSelectedDB(): VectorIndexOption[] {\n return IndexesForSelection(this.AvailableVectorIndexes, this.SelectedVectorDBID, this.SelectedEmbeddingModelID);\n }\n\n /** The indexes the edit panel offers, matched to its database and embedding model the same way. */\n public get EditFilteredIndexes(): VectorIndexOption[] {\n return IndexesForSelection(this.AvailableVectorIndexes, this.EditDocVectorDBID, this.EditDocAIModelID);\n }\n\n /** Suggestion panel: picking an index moves the model and database dropdowns to its values. */\n public OnSuggestVectorIndexChange(indexID: string): void {\n this.applySuggestSelection(SelectIndex(this.suggestSelection, this.AvailableVectorIndexes, indexID));\n }\n\n /** Suggestion panel: a chosen index from another database goes back to Auto. */\n public OnSuggestVectorDBChange(databaseID: string): void {\n this.applySuggestSelection(SelectDatabase(this.suggestSelection, this.AvailableVectorIndexes, databaseID));\n }\n\n /** Suggestion panel: a chosen index built with another model goes back to Auto. */\n public OnSuggestEmbeddingModelChange(embeddingModelID: string): void {\n this.applySuggestSelection(SelectEmbeddingModel(this.suggestSelection, this.AvailableVectorIndexes, embeddingModelID));\n }\n\n /** Edit panel: picking an index moves the model and database dropdowns to its values. */\n public OnEditVectorIndexChange(indexID: string): void {\n this.applyEditSelection(SelectIndex(this.editSelection, this.AvailableVectorIndexes, indexID));\n }\n\n /** Edit panel: a chosen index from another database goes back to Auto. */\n public OnEditVectorDBChange(databaseID: string): void {\n this.applyEditSelection(SelectDatabase(this.editSelection, this.AvailableVectorIndexes, databaseID));\n }\n\n /** Edit panel: a chosen index built with another model goes back to Auto. */\n public OnEditEmbeddingModelChange(embeddingModelID: string): void {\n this.applyEditSelection(SelectEmbeddingModel(this.editSelection, this.AvailableVectorIndexes, embeddingModelID));\n }\n\n private get suggestSelection(): VectorStoreSelection {\n return { EmbeddingModelID: this.SelectedEmbeddingModelID, VectorDatabaseID: this.SelectedVectorDBID, VectorIndexID: this.SelectedVectorIndexID };\n }\n\n private applySuggestSelection(selection: VectorStoreSelection): void {\n this.SelectedEmbeddingModelID = selection.EmbeddingModelID;\n this.SelectedVectorDBID = selection.VectorDatabaseID;\n this.SelectedVectorIndexID = selection.VectorIndexID;\n }\n\n private get editSelection(): VectorStoreSelection {\n return { EmbeddingModelID: this.EditDocAIModelID, VectorDatabaseID: this.EditDocVectorDBID, VectorIndexID: this.EditDocVectorIndexID };\n }\n\n private applyEditSelection(selection: VectorStoreSelection): void {\n this.EditDocAIModelID = selection.EmbeddingModelID;\n this.EditDocVectorDBID = selection.VectorDatabaseID;\n this.EditDocVectorIndexID = selection.VectorIndexID;\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 /** @deprecated Use {@link EntitySearchInput}. */\n get entitySearchInput(): ElementRef<HTMLInputElement> | undefined {\n return this.EntitySearchInput;\n }\n /** @deprecated Use {@link EntitySearchInput}. */\n set entitySearchInput(value: ElementRef<HTMLInputElement> | undefined) {\n this.EntitySearchInput = value;\n }\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 // When embedded in a parent shell, that host owns agent reporting.\n if (!this.HideToolbar) {\n this.emitAgentContext();\n this.registerAgentTools();\n }\n this.NotifyLoadComplete();\n }\n\n // ================================================================\n // Agent context + client tools\n // ================================================================\n\n /**\n * Publish the vector-management surface state to the AI agent. Re-emitted on\n * every data refresh and whenever an entity's sync starts or finishes, so the\n * streamed context tracks live vectorization. No-op when embedded (the host\n * owns reporting).\n */\n private emitAgentContext(): void {\n if (this.HideToolbar) {\n return;\n }\n this.navigationService.SetAgentContext(this, BuildVectorAgentContext({\n TotalVectors: this.TotalVectors,\n EntityDocumentCount: this.SyncRows.length,\n SyncingCount: this.SyncingIds.size,\n VectorDBName: this.VectorDBName,\n VectorDBStatus: this.VectorDBStatus,\n EmbeddingModelName: this.EmbeddingModel.Name,\n PrerequisitesMet: this.PrerequisitesMet,\n ViewMode: this.ViewMode,\n EntitySearchText: this.EntitySearchText,\n Entities: this.SyncRows.map(r => ({\n EntityName: r.EntityName,\n DocumentName: r.DocumentName,\n VectorCount: r.VectorCount,\n Status: r.Status,\n })),\n }));\n }\n\n /** Build the resolver candidate list from the loaded sync rows. */\n private getSyncRowCandidates(): VectorSyncRowCandidate[] {\n return this.SyncRows.map(r => ({\n EntityDocumentID: r.EntityDocumentID,\n EntityName: r.EntityName,\n DocumentName: r.DocumentName,\n VectorCount: r.VectorCount,\n Status: r.Status,\n }));\n }\n\n /**\n * 🚨 SAFETY BOUNDARY 🚨\n * Register the safe, agent-actionable operations. Exposed:\n * - RefreshVectors (read-only reload)\n * - SyncVectorsForEntity (idempotent embedding sync — guards already-syncing; re-vectorizing\n * is the documented happy path, not destructive: it re-embeds existing records)\n * - SetVectorViewMode (read-only Index/Operations toggle)\n * - OpenVectorEntityDocument (id/name resolution → opens the edit panel for VIEWING config)\n * - GoToVectorConfiguration (navigation to the Config nav item)\n *\n * INTENTIONALLY NOT EXPOSED (gated):\n * - DeleteEntityDocument / vector purge — destructive, irreversible removal of an entity's\n * vector index + document.\n * - SaveEditedDocument / SaveAsEntityDocument / RegenerateTemplate — write entity-document\n * config (template, model, DB) the user should review and commit themselves.\n * - SaveScheduleSync — creates a scheduled job (a persistent side effect).\n */\n private registerAgentTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'RefreshVectors',\n Description: 'Reload the vector management dashboard (vector counts, sync rows, KPIs) from the server.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n await this.LoadData(true);\n this.emitAgentContext();\n return { Success: true, Data: { TotalVectors: this.TotalVectors } };\n },\n },\n {\n Name: 'SyncVectorsForEntity',\n Description: 'Start vectorization (embedding sync) for an entity. Accepts the entity name, document name, or entity document ID. The entity must already have a vector entity document configured.',\n ParameterSchema: {\n type: 'object',\n properties: { entityName: { type: 'string', description: 'Entity name, document name, or entity document ID to vectorize' } },\n required: ['entityName'],\n },\n Handler: async (params: Record<string, unknown>) => {\n const v = ValidateStringParam(params['entityName'], 'entityName');\n if (!v.ok) return v.result;\n const resolved = ResolveSyncRow(v.value, this.getSyncRowCandidates());\n if (!resolved.ok) return { Success: false, ErrorMessage: resolved.error };\n if (this.IsSyncing(resolved.value.EntityDocumentID)) {\n return { Success: false, ErrorMessage: `\"${resolved.value.EntityName}\" is already syncing` };\n }\n await this.SyncEntity(resolved.value.EntityDocumentID);\n return { Success: true, Data: { EntityName: resolved.value.EntityName } };\n },\n },\n {\n Name: 'SetVectorViewMode',\n Description: 'Switch the vector dashboard between the Index view and the Operations (real-time sync) view.',\n ParameterSchema: {\n type: 'object',\n properties: { mode: { type: 'string', enum: ['index', 'operations'], description: 'index or operations' } },\n required: ['mode'],\n },\n Handler: async (params: Record<string, unknown>) => {\n const mode = String(params['mode'] ?? '');\n if (mode !== 'index' && mode !== 'operations') {\n return { Success: false, ErrorMessage: 'Invalid mode. Expected \"index\" or \"operations\".' };\n }\n if (this.ViewMode !== mode) {\n this.ToggleViewMode();\n }\n this.emitAgentContext();\n return { Success: true, Data: { ViewMode: this.ViewMode } };\n },\n },\n {\n Name: 'OpenVectorEntityDocument',\n Description: 'Open the configuration panel for an entity document (for viewing its template, model, and vector DB). Accepts the entity name, document name, or entity document ID.',\n ParameterSchema: {\n type: 'object',\n properties: { document: { type: 'string', description: 'Entity name, document name, or entity document ID' } },\n required: ['document'],\n },\n Handler: async (params: Record<string, unknown>) => {\n const v = ValidateStringParam(params['document'], 'document');\n if (!v.ok) return v.result;\n const resolved = ResolveSyncRow(v.value, this.getSyncRowCandidates());\n if (!resolved.ok) return { Success: false, ErrorMessage: resolved.error };\n await this.OpenEditPanel(resolved.value.EntityDocumentID);\n return { Success: true, Data: { EntityName: resolved.value.EntityName, DocumentName: resolved.value.DocumentName } };\n },\n },\n {\n Name: 'GoToVectorConfiguration',\n Description: 'Navigate to the Knowledge Hub Configuration page to set up the vector database and embedding model.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n await this.GoToConfiguration();\n return { Success: true };\n },\n },\n ]);\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(forceRefresh: boolean = false): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n await this.fetchAllData(forceRefresh);\n this.buildSyncRows();\n this.buildKPICards();\n this.buildSidebarData();\n this.checkPrerequisites();\n this.emitAgentContext();\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 const doc = this.entityDocuments.find(d => UUIDsEqual(d.ID, entityDocumentId));\n if (!doc) return;\n\n // Canonicalize ID to doc.ID to ensure consistent casing across maps, sets, and rows\n entityDocumentId = doc.ID;\n\n if (this.IsSyncing(entityDocumentId)) {\n return;\n }\n\n const provider = this.ProviderToUse 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 => UUIDsEqual(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 = this.ProviderToUse 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 const activityID = this.activityService.Start('Vector sync', { icon: 'fa-solid fa-cubes', detail: entityName, progress: 0 });\n\n /**\n * 'success' and 'error' come only from the server's own complete / error events.\n * 'unconfirmed' is a long silence (a dropped connection, say): the row is refreshed from the\n * database, but nothing claims the run finished, because the server may still be working.\n */\n const finishSync = (outcome: 'success' | 'error' | 'unconfirmed') => {\n if (idleTimer) clearTimeout(idleTimer);\n rxSub?.unsubscribe();\n const success = outcome !== 'error';\n this.activityService.Complete(activityID, success ? 'success' : 'error',\n outcome === 'success' ? `${entityName} vectorized`\n : outcome === 'error' ? `Failed for ${entityName}`\n : `${entityName}: no progress received`);\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 try {\n this.removeSyncingId(entityDocumentId);\n\n if (outcome === 'success') {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Vectorization complete for ${entityName}`,\n 'success', 3000\n );\n await this.refreshSyncRow(entityDocumentId);\n } else if (outcome === 'unconfirmed') {\n MJNotificationService.Instance.CreateSimpleNotification(\n `No progress received for ${entityName} in ${VectorManagementResourceComponent.SYNC_SILENCE_LIMIT_MS / 60000} minutes, ` +\n `so the result can't be confirmed. The vector count shown is what is stored now; refresh later to check.`,\n 'warning', 8000\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 } catch (err) {\n console.error(`[VectorManagement] Error finishing sync for ${entityName}:`, err);\n } finally {\n this.buildSidebarData();\n this.emitAgentContext();\n this.cdr.detectChanges();\n }\n });\n };\n\n // Reset on every event. Silence is not success: the server reports progress in 5% steps,\n // and with a remote embedding model one step can take far longer than a few seconds, so a\n // short silence routinely reported \"Synced\" while most records were still being embedded.\n const resetIdleTimer = () => {\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => {\n if (this.IsSyncing(entityDocumentId)) {\n finishSync('unconfirmed');\n }\n }, VectorManagementResourceComponent.SYNC_SILENCE_LIMIT_MS);\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('success');\n } else if (stage === 'error') {\n finishSync('error');\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('error');\n }\n });\n }\n\n /**\n * Returns true if the given entity document is currently syncing.\n * Compares case-insensitively using UUIDsEqual.\n */\n public IsSyncing(id: string): boolean {\n for (const syncingId of this.SyncingIds) {\n if (UUIDsEqual(syncingId, id)) {\n return true;\n }\n }\n return false;\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 const next = new Set<string>();\n for (const existing of this.SyncingIds) {\n if (!UUIDsEqual(existing, id)) {\n next.add(existing);\n }\n }\n next.add(id);\n this.SyncingIds = next;\n this.emitAgentContext();\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 const next = new Set<string>();\n for (const existing of this.SyncingIds) {\n if (!UUIDsEqual(existing, id)) {\n next.add(existing);\n }\n }\n if (next.size !== this.SyncingIds.size) {\n this.SyncingIds = next;\n this.emitAgentContext();\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 // The field list is whatever the model returned — no cap, no filter. Bound it\n // here so an over-wide suggestion is visible immediately rather than at save.\n const capped = CapSelectedFields(result.selectedFields);\n if (capped.dropped > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `The suggestion selected ${capped.fields.length + capped.dropped} fields. ` +\n `Keeping the first ${MAX_TEMPLATE_FIELDS} and dropping ${capped.dropped} — a list ` +\n `this long usually means the whole table was pulled in. Check the template.`,\n 'warning',\n 6000\n );\n }\n result.selectedFields = capped.fields;\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 = this.ProviderToUse;\n const entityDoc = await this.findOrCreateEntityDocument();\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 // The panel shows the model's match thresholds; store them rather than leaving the defaults.\n const thresholds = SuggestedMatchThresholds(\n this.SuggestionResult.potentialMatchThreshold,\n this.SuggestionResult.absoluteMatchThreshold\n );\n if (thresholds) {\n entityDoc.PotentialMatchThreshold = thresholds.Potential;\n entityDoc.AbsoluteMatchThreshold = thresholds.Absolute;\n }\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(true);\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(forceRefresh: boolean = false): Promise<void> {\n // Use cached engine data unless forceRefresh is true — BaseEngine's entity-event\n // auto-refresh handles updates from saves/deletes on the entities it tracks.\n const engine = KnowledgeHubMetadataEngine.Instance;\n await engine.Config(forceRefresh);\n // AIEngineBase is deferred at startup; ensure loaded before reading .VectorDatabases / .VectorIndexes.\n await AIEngineBase.Instance.EnsureLoaded();\n if (forceRefresh) {\n await AIEngineBase.Instance.RefreshItem('_vectorIndexes');\n }\n\n this.entityDocuments = engine.EntityDocuments;\n this.vectorDatabases = AIEngineBase.Instance.VectorDatabases;\n // A copy: resolveOrCreateVectorIndex() appends the index it creates, and the engine's getter\n // hands out its own cached array, which this component must not mutate.\n this.vectorIndexes = [...AIEngineBase.Instance.VectorIndexes];\n\n // Build per-EntityDocument aggregate stats (vector count + last synced).\n // Each query fetches the two most recent rows and uses TotalRowCount for the\n // vector count, which avoids loading all rows. A full page triggers the\n // count, and a short page is itself the total.\n // AI Models come from a different domain — fetched in the same batch.\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\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 BypassCache: forceRefresh,\n }));\n const allQueries = [\n ...erdQueries,\n { EntityName: 'MJ: AI Models', ExtraFilter: '', ResultType: 'entity_object' as const, BypassCache: forceRefresh }\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 ?? 0,\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 Array.from(this.erdStats.entries()).find(([k]) => UUIDsEqual(k, doc.ID))?.[1];\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 DocumentType: doc.Type || '',\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.IsSyncing(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 // \"Degraded\" here doesn't mean the database is unhealthy — it means no\n // records have been vectorized yet. Say that plainly so users don't\n // chase a phantom outage.\n const hasVectors = this.TotalVectors > 0;\n this.VectorDBStatus = hasVectors ? 'Healthy' : 'Degraded';\n this.VectorDBStatusReason = hasVectors\n ? `${this.TotalVectors.toLocaleString()} vector(s) stored and queryable.`\n : `Connected, but no records have been vectorized yet. Run a sync below to populate the index.`;\n } else {\n this.VectorDBName = 'Not configured';\n this.VectorDBStatus = 'Offline';\n this.VectorDBStatusReason = 'No vector database is configured for this environment.';\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 // No index is pre-selected: the first index is whatever happens to sort first (here, another\n // feature's shared index), and a chosen index decides the database and model Save stores.\n // Auto finds or creates the index for the database and model shown.\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 — from the use case the user actually chose. This used to be hardcoded to\n // 'Record Duplicate', so picking \"search\" in the dialog silently produced a\n // duplicate-detection document: the selection was discarded and the document was the\n // wrong type. A vector pool is typed — Provider.SearchEntity and the Search Entity\n // action read Search-typed documents — so the mislabelled document is also invisible\n // to the feature that asked for it.\n const wantedTypeName = EntityDocumentTypeForUseCase(this.SuggestUseCase);\n if (!wantedTypeName) {\n throw new Error(\n `No Entity Document Type is defined for the \"${this.SuggestUseCase}\" use case. ` +\n `Known use cases: ${Object.keys(ENTITY_DOCUMENT_TYPE_BY_USE_CASE).join(', ')}.`\n );\n }\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const typeResult = await rv.RunView<{ ID: string; Name: string }>({\n EntityName: 'MJ: Entity Document Types',\n ResultType: 'simple',\n Fields: ['ID', 'Name']\n });\n const availableTypes = typeResult.Success ? typeResult.Results : [];\n // Trimmed, case-insensitive comparison — the same match EntityDocumentCache\n // .GetDocumentTypeByName makes server-side, so the dialog and the syncer agree.\n const wanted = wantedTypeName.trim().toLowerCase();\n const matchedType = availableTypes.find(t => t.Name?.trim().toLowerCase() === wanted);\n if (matchedType) {\n entityDoc.TypeID = matchedType.ID;\n } else {\n // Never substitute a type that happens to exist: that is the defect above.\n const names = availableTypes.map(t => t.Name).sort();\n throw new Error(\n `Entity Document Type \"${wantedTypeName}\" not found in database. It is the type the ` +\n `\"${this.SuggestUseCase}\" use case needs, and no other type will be used in its place. ` +\n (names.length > 0\n ? `Types that do exist: ${names.join(', ')}. Add \"${wantedTypeName}\" to MJ: Entity Document Types.`\n : 'No Entity Document Types exist at all.')\n );\n }\n\n // An explicitly chosen index fixes the DB + model. \"Auto (create/find matching index)\" resolves\n // (or creates) the index for the chosen DB + model, so the syncer always has a VectorIndexID:\n // it refuses to run without one, which made the Auto choice a dead end before.\n // Only an index that matches the database and model shown counts as chosen, so the stored\n // database and model are always the ones the dropdowns displayed.\n const chosen = ChosenIndexForSave(this.suggestSelection, this.AvailableVectorIndexes);\n if (chosen) {\n entityDoc.VectorDatabaseID = chosen.VectorDatabaseID;\n entityDoc.AIModelID = chosen.EmbeddingModelID;\n entityDoc.VectorIndexID = chosen.ID;\n } else {\n const vectorDatabaseID = this.SelectedVectorDBID || this.vectorDatabases[0].ID;\n const aiModelID = this.SelectedEmbeddingModelID || this.findEmbeddingModel()!.ID;\n entityDoc.VectorDatabaseID = vectorDatabaseID;\n entityDoc.AIModelID = aiModelID;\n entityDoc.VectorIndexID = await this.resolveOrCreateVectorIndex(vectorDatabaseID, aiModelID, this.SuggestEntityName);\n }\n\n // TemplateID — create a Template record with the generated template content\n await this.createTemplateForDocument(entityDoc);\n }\n\n /**\n * \"Auto (create/find matching index)\": reuse the index already built for this vector database +\n * embedding model, or create the `MJ: Vector Indexes` record for one. Only the metadata row is\n * written here and the save returns as soon as it is stored; the server-side entity hook then\n * provisions the index in the provider (bounded by its own timeout) and writes the provider\n * metadata back, so this request is never held while the provider works.\n * Returns the index ID to store on the document.\n */\n private async resolveOrCreateVectorIndex(vectorDatabaseID: string, aiModelID: string, entityName: string): Promise<string> {\n const existing = FindMatchingVectorIndex(this.vectorIndexes, vectorDatabaseID, aiModelID);\n if (existing) {\n return existing.ID;\n }\n\n const md = this.ProviderToUse;\n const modelName = this.aiModels.find(m => UUIDsEqual(m.ID, aiModelID))?.Name ?? null;\n const index = await md.GetEntityObject<MJVectorIndexEntity>('MJ: Vector Indexes');\n index.NewRecord();\n index.Name = BuildAutoVectorIndexName(entityName, modelName);\n index.VectorDatabaseID = vectorDatabaseID;\n index.EmbeddingModelID = aiModelID;\n index.Description = `Auto-created for the \"${entityName}\" entity document (${modelName ?? 'embedding model'})`;\n\n const saved = await index.Save();\n if (!saved) {\n throw new Error(\n `Could not create a vector index for \"${entityName}\": ${index.LatestResult?.CompleteMessage || 'unknown error'}`\n );\n }\n this.vectorIndexes.push(index);\n this.AvailableVectorIndexes.push({\n ID: index.ID,\n Name: index.Name,\n VectorDatabaseID: index.VectorDatabaseID,\n EmbeddingModelID: index.EmbeddingModelID,\n });\n return index.ID;\n }\n\n /** Create a Template + TemplateContent record for the entity document */\n private async createTemplateForDocument(entityDoc: MJEntityDocumentEntity): Promise<void> {\n const md = this.ProviderToUse;\n const templateText = this.EditableTemplate || this.SuggestionResult?.template || '';\n if (!templateText) {\n throw new Error('No template content to save');\n }\n\n // LAYER 2: the template is hand-editable after the model returns, so a user can type\n // a field the picker never offered. Refuse before anything is written — once values\n // reach the vector index they are retrievable by similarity search, outside the\n // entity permissions that guard the source column, and not fully reversible.\n const sensitive = SensitiveFieldsInTemplate(templateText, this.vectorFieldPurpose(this.SuggestUseCase));\n if (sensitive.length > 0) {\n throw new Error(\n `This template references ${sensitive.length === 1 ? 'a field' : 'fields'} that must not be ` +\n `vectorized: ${sensitive.join(', ')}. Embedding copies the values into the vector index, ` +\n `where they are retrievable by similarity search rather than by an authorized query. ` +\n `Remove ${sensitive.length === 1 ? 'it' : 'them'} from the template and save again.`\n );\n }\n\n // The field list is unbounded and comes straight from a prompt, and the template stays\n // hand-editable after the model returns — so the authoritative bound is here, on what\n // actually gets embedded, not on the model's own description of what it picked.\n const capRefusal = TemplateFieldCapRefusal(templateText);\n if (capRefusal) {\n throw new Error(capRefusal);\n }\n\n // Find-or-create, so a retry after a mid-flow failure converges on one set of rows.\n const templateName = this.templateNameForDocument();\n const template = await this.findOrCreateTemplate(templateName, entityDoc.TemplateID);\n template.Name = templateName;\n template.Description = `Auto-generated template for entity document: ${this.SaveDocumentName}`;\n // An adopted template keeps its owner; only a new one is the current user's.\n if (!template.UserID) {\n template.UserID = md.CurrentUser.ID;\n }\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 RunView.FromMetadataProvider(this.ProviderToUse).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 this.findOrCreateTemplateContent(template.ID);\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 /** The Template name this dialog deterministically gives the current document. */\n private templateNameForDocument(): string {\n return `Template for ${this.SaveDocumentName}`;\n }\n\n /**\n * The Entity Document for the current dialog, reusing the row an earlier attempt created\n * rather than adding a second one.\n *\n * This flow writes three rows — Template, Template Content, Entity Document — in that\n * order, and only the last is protected by a unique index (`UQ_EntityDocument_Name` on\n * `EntityDocument.Name`). So a duplicate was not a rare partial-failure case: that index\n * guarantees a second attempt with the same name fails at the final step, *after* the\n * Template and Template Content rows have been written again. Orphans accumulated one\n * pair per retry.\n *\n * Matched on Name, because that is the identity the database itself enforces.\n *\n * An existing document is adopted only when this dialog created it — its TemplateID points\n * at the template named `Template for <document name>` — and only for the same entity, so a\n * retry never moves another entity's document. A collision with a document\n * authored anywhere else is refused, because silently overwriting somebody's configured\n * document is worse than asking for a different name.\n */\n private async findOrCreateEntityDocument(): Promise<MJEntityDocumentEntity> {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(md);\n const existing = await rv.RunView<MJEntityDocumentEntity>({\n EntityName: 'MJ: Entity Documents',\n ExtraFilter: `Name='${EscapeSQLString(this.SaveDocumentName)}'`,\n ResultType: 'entity_object',\n MaxRows: 1,\n SkipTotalRowCount: true,\n });\n\n if (existing.Success && existing.Results.length > 0) {\n const priorDoc = existing.Results[0];\n const ownTemplate = priorDoc.TemplateID\n ? await this.templateHasName(priorDoc.TemplateID, this.templateNameForDocument())\n : false;\n if (!ownTemplate) {\n throw new Error(\n `An Entity Document named \"${this.SaveDocumentName}\" already exists and was not ` +\n `created here, so it will not be overwritten. Choose a different name.`\n );\n }\n // Adopting a document for another entity would move it to this one.\n const entity = md.Entities.find(e => e.Name === this.SuggestEntityName);\n if (entity && priorDoc.EntityID && !UUIDsEqual(priorDoc.EntityID, entity.ID)) {\n throw new Error(\n `An Entity Document named \"${this.SaveDocumentName}\" already exists for ` +\n `${priorDoc.Entity || 'another entity'}, so it will not be reused. Choose a different name.`\n );\n }\n return priorDoc;\n }\n\n const entityDoc = await md.GetEntityObject<MJEntityDocumentEntity>('MJ: Entity Documents');\n entityDoc.NewRecord();\n return entityDoc;\n }\n\n /**\n * The Template for the current document, reusing an earlier attempt's row.\n *\n * An adopted Entity Document already points at its template (findOrCreateEntityDocument\n * checked its name), so that row is reused by ID. Matching it on Name + UserID instead\n * misses it when another user created it, writes a second template, re-points the document\n * and orphans the first Template and Template Content.\n *\n * For a new document, matched on Name + UserID: `Template` carries no unique index, and that\n * pair is exactly what this flow writes, so it identifies our own prior row without claiming\n * anyone else's.\n */\n private async findOrCreateTemplate(templateName: string, adoptedTemplateId?: string | null): Promise<MJTemplateEntity> {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(md);\n const existing = await rv.RunView<MJTemplateEntity>({\n EntityName: 'MJ: Templates',\n ExtraFilter: adoptedTemplateId\n ? `ID='${EscapeSQLString(adoptedTemplateId)}'`\n : `Name='${EscapeSQLString(templateName)}' AND UserID='${md.CurrentUser.ID}'`,\n ResultType: 'entity_object',\n MaxRows: 1,\n SkipTotalRowCount: true,\n });\n if (existing.Success && existing.Results.length > 0) {\n return existing.Results[0];\n }\n const template = await md.GetEntityObject<MJTemplateEntity>('MJ: Templates');\n template.NewRecord();\n return template;\n }\n\n /**\n * The Template Content row for a template, reusing the one it already has.\n *\n * `Priority ASC`, first row, is how loadEditDocTemplate and saveEditDocTemplate already\n * identify \"the\" content of a template — this follows that convention rather than adding\n * a second one.\n */\n private async findOrCreateTemplateContent(templateId: string): Promise<MJTemplateContentEntity> {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(md);\n const existing = 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 SkipTotalRowCount: true,\n });\n if (existing.Success && existing.Results.length > 0) {\n return existing.Results[0];\n }\n const content = await md.GetEntityObject<MJTemplateContentEntity>('MJ: Template Contents');\n content.NewRecord();\n return content;\n }\n\n /** True when the template with this ID carries the given name. */\n private async templateHasName(templateId: string, name: string): Promise<boolean> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{ Name: string }>({\n EntityName: 'MJ: Templates',\n ExtraFilter: `ID='${templateId}'`,\n Fields: ['Name'],\n ResultType: 'simple',\n MaxRows: 1,\n SkipTotalRowCount: true,\n });\n return result.Success && result.Results.length > 0 && result.Results[0].Name === name;\n }\n\n\n /** Build grouped entity list from metadata, grouped by SchemaName */\n private loadEntityGroups(): void {\n const md = this.ProviderToUse;\n const groupMap = new Map<string, { Name: string; ID: string }[]>();\n\n for (const entity of md.Entities) {\n // The picker used to list every entity in metadata, so MJ's own internal entities\n // were offered as vectorization targets. See vector-document-rules.ts for the rule\n // and the precedent it follows.\n if (!IsVectorizableEntity(entity)) {\n continue;\n }\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 => UUIDsEqual(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 => UUIDsEqual(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 => UUIDsEqual(r.EntityDocumentID, entityDocumentId));\n if (!row) return;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\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 BypassCache: true,\n });\n\n if (result.Success) {\n row.VectorCount = result.TotalRowCount ?? 0;\n row.LastSynced = result.Results.length > 0 ? new Date(result.Results[0].__mj_UpdatedAt) : (row.LastSynced ?? new Date());\n row.Status = row.VectorCount > 0 ? 'Synced' : 'Pending';\n row.PercentComplete = 100;\n\n const doc = this.entityDocuments.find(d => UUIDsEqual(d.ID, entityDocumentId));\n const docId = doc?.ID ?? row.EntityDocumentID;\n for (const key of this.erdStats.keys()) {\n if (UUIDsEqual(key, docId)) {\n this.erdStats.delete(key);\n }\n }\n this.erdStats.set(docId, { vectorCount: row.VectorCount, lastSynced: row.LastSynced });\n this.buildKPICards();\n this.buildSidebarData();\n this.emitAgentContext();\n this.cdr.detectChanges();\n } else {\n console.error(`[VectorManagement] Failed to refresh sync row for ${entityDocumentId}:`, result.ErrorMessage);\n row.Status = row.VectorCount > 0 ? 'Synced' : 'Error';\n this.buildKPICards();\n this.buildSidebarData();\n this.emitAgentContext();\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 = this.ProviderToUse;\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 // AIEngineBase is deferred at startup; ensure loaded before findSuggestionPrompt reads .Prompts.\n await AIEngineBase.Instance.EnsureLoaded();\n const prompt = this.findSuggestionPrompt();\n const provider = this.ProviderToUse 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 /**\n * What a document for this use case embeds its fields for. Only a duplicate-detection document\n * may embed a date of birth (see sensitive-fields.ts).\n */\n private vectorFieldPurpose(useCase: string): VectorFieldPurpose {\n return EntityDocumentTypeForUseCase(useCase) === 'Record Duplicate' ? 'duplicate-detection' : 'other';\n }\n\n /** Build the data payload for the suggestion prompt */\n private buildPromptData(entity: EntityInfo, useCase: string): Record<string, unknown> {\n // LAYER 1 of the sensitive-field refusal: the model never sees these columns, so it\n // cannot suggest them. See sensitive-fields.ts for why this cannot live in the prompt.\n const purpose = this.vectorFieldPurpose(useCase);\n const fields = WithoutSensitiveFields(entity.Fields, purpose).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 = this.ProviderToUse;\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 // Layer 1 covers related entities too: their fields reach the model here.\n const relFields = relatedEntity\n ? WithoutSensitiveFields(relatedEntity.Fields, purpose)\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 (!HideToolbar) {\n <mj-page-layout>\n <mj-page-header\n Title=\"Vector Management\"\n Icon=\"fa-solid fa-cubes\"\n Subtitle=\"Vector index health, embeddings, and entity sync status\">\n <div actions>\n <mj-view-toggle\n [Options]=\"VectorViewOptions\"\n [ActiveKey]=\"ViewMode\"\n (KeyChange)=\"ViewMode = $any($event)\">\n </mj-view-toggle>\n </div>\n </mj-page-header>\n <mj-page-body [Flex]=\"true\">\n <ng-container *ngTemplateOutlet=\"vectorBody\"></ng-container>\n </mj-page-body>\n </mj-page-layout>\n}\n@if (HideToolbar) {\n <ng-container *ngTemplateOutlet=\"vectorBody\"></ng-container>\n}\n\n<ng-template #vectorBody>\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\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(true)\" 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 <mj-empty-state Icon=\"fa-solid fa-folder-open\"\n Title=\"No entity documents configured for vectorization.\" />\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>Type</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=\"document-type\">{{ row.DocumentType }}</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]=\"IsSyncing(row.EntityDocumentID)\"\n (click)=\"SyncEntity(row.EntityDocumentID)\"\n title=\"Sync now\">\n @if (IsSyncing(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\" [title]=\"VectorDBStatusReason\">{{ VectorDBStatus }}</div>\n @if (VectorDBStatusReason) {\n <div class=\"health-reason\">{{ VectorDBStatusReason }}</div>\n }\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\" [title]=\"'Embeddings are generated by this model; the index above stores the resulting vectors.'\">{{ 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 <div class=\"suggest-field\">\n <label class=\"suggest-label\">Type</label>\n <span class=\"edit-readonly-value\">{{ EditDocType }}</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\" (ngModelChange)=\"OnEditEmbeddingModelChange($event)\">\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\" (ngModelChange)=\"OnEditVectorDBChange($event)\">\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\" (ngModelChange)=\"OnEditVectorIndexChange($event)\">\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 </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 <mj-alert Variant=\"error\" Size=\"sm\">{{ SuggestionError }}</mj-alert>\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\" (ngModelChange)=\"OnSuggestEmbeddingModelChange($event)\">\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\" (ngModelChange)=\"OnSuggestVectorDBChange($event)\">\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\" (ngModelChange)=\"OnSuggestVectorIndexChange($event)\">\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</ng-template>\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, EscapeSQLString } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService, ActivityService } from '@memberjunction/ng-shared';\nimport { ViewToggleOption } from '@memberjunction/ng-ui-components';\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 { MJScheduledJobEntity } from '@memberjunction/core-entities';\nimport { BuildSingleStaticParamConfiguration, ResolveActionJobTypeID } from '../../../shared/action-scheduled-job';\nimport { CronToHumanReadable } from '../autotagging/shared/classify.format';\nimport { BuildAutoVectorIndexName, FindMatchingVectorIndex } from './vector-index-auto';\nimport {\n ChosenIndexForSave,\n IndexesForSelection,\n SelectDatabase,\n SelectEmbeddingModel,\n SelectIndex,\n VectorIndexOption,\n VectorStoreSelection,\n} from './vector-store-selection';\nimport {\n BuildVectorAgentContext,\n ResolveSyncRow,\n VectorSyncRowCandidate,\n} from './vector-management-agent-context';\nimport { ValidateStringParam } from '../../../shared/agent-tool-validation';\nimport { WithoutSensitiveFields, SensitiveFieldsInTemplate, VectorFieldPurpose } from './sensitive-fields';\nimport {\n ENTITY_DOCUMENT_TYPE_BY_USE_CASE,\n MAX_TEMPLATE_FIELDS,\n CapSelectedFields,\n EntityDocumentTypeForUseCase,\n SuggestionUseCaseForDocumentType,\n IsVectorizableEntity,\n SuggestedMatchThresholds,\n TemplateFieldCapRefusal,\n} from './vector-document-rules';\n\n/** Flattened row for the entity sync table */\ninterface EntitySyncRow {\n EntityDocumentID: string;\n EntityName: string;\n DocumentName: string;\n /** Entity Document Type name, e.g. 'Search'. Fixed at creation, shown read-only. */\n DocumentType: 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 private activityService = inject(ActivityService);\n protected override navigationService = inject(NavigationService);\n protected override destroy$ = new Subject<void>();\n\n /**\n * How long a sync may go without a progress event before the tab stops waiting. Reaching it does\n * not mean the sync finished (see subscribeToPipelineProgress).\n */\n private static readonly SYNC_SILENCE_LIMIT_MS = 2 * 60 * 1000;\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 public readonly VectorViewOptions: ViewToggleOption[] = [\n { key: 'index', icon: 'fa-solid fa-cubes', title: 'Index View' },\n { key: 'operations', icon: 'fa-solid fa-gauge-high', title: 'Operations View' }\n ];\n\n /**\n * When true, renders only the body content (no chrome). Set by parent shells\n * that embed this resource. See plans/explorer-chrome-conventions.md Section 5.\n */\n @Input() HideToolbar = 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 /** Human-readable explanation of the current health status (shown as helper text / tooltip). */\n public VectorDBStatusReason = '';\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 /** Entity Document Type of the document being edited. Fixed at creation, shown read-only. */\n public EditDocType = '';\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.EditDocType = doc.Type || '';\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 = RunView.FromMetadataProvider(this.ProviderToUse);\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 SkipTotalRowCount: true,\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 = this.ProviderToUse;\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 const vectorDatabaseID = this.EditDocVectorDBID || null;\n const aiModelID = this.EditDocAIModelID || null;\n doc.VectorDatabaseID = vectorDatabaseID;\n doc.AIModelID = aiModelID;\n // \"Auto (create/find matching index)\" resolves to a real index for this DB + model, so the\n // syncer always has one to write into; without both parts there is nothing to match.\n // A chosen index counts only when it matches the database and model shown.\n const chosenIndex = ChosenIndexForSave(this.editSelection, this.AvailableVectorIndexes);\n doc.VectorIndexID = chosenIndex\n ? chosenIndex.ID\n : (vectorDatabaseID && aiModelID\n ? await this.resolveOrCreateVectorIndex(vectorDatabaseID, aiModelID, this.EditDocEntityName)\n : 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(true);\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 = RunView.FromMetadataProvider(this.ProviderToUse);\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 SkipTotalRowCount: true,\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 // Ask for the use case this document's type stands for, so the regenerated template\n // still matches the type. Refuse rather than fall back to another use case.\n const useCase = SuggestionUseCaseForDocumentType(this.EditDocType);\n if (!useCase) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Can't regenerate: documents of type \"${this.EditDocType || 'unknown'}\" have no AI template use case.`,\n 'error', 5000\n );\n return;\n }\n\n this.IsEditRegenerating = true;\n this.cdr.detectChanges();\n\n try {\n const result = await this.callSuggestionPrompt(this.EditDocEntityName, useCase);\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 = this.ProviderToUse;\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(true);\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 Scheduled Job (type: Action) 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 = this.ProviderToUse;\n\n // Resolve the 'Action' scheduled-job type\n const jobTypeID = await ResolveActionJobTypeID(md);\n if (!jobTypeID) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Could not find the \"Action\" scheduled job type. Please check scheduling configuration.',\n 'error', 5000\n );\n return;\n }\n\n // Create the Scheduled Job — the action and its entityDocumentID parameter ride in\n // Configuration, which is what ActionScheduledJobDriver reads.\n const scheduledJob = await md.GetEntityObject<MJScheduledJobEntity>('MJ: Scheduled Jobs');\n scheduledJob.NewRecord();\n scheduledJob.JobTypeID = jobTypeID;\n scheduledJob.Name = `Vectorize: ${this.ScheduleSyncDocName}`;\n scheduledJob.Description = `Automated vectorization for entity document \"${this.ScheduleSyncDocName}\"`;\n scheduledJob.CronExpression = this.ScheduleSyncCron;\n scheduledJob.Status = this.ScheduleSyncEnabled ? 'Active' : 'Disabled';\n scheduledJob.Timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n scheduledJob.Configuration = await BuildSingleStaticParamConfiguration(\n md, actionID, 'entityDocumentID', this.ScheduleSyncDocID, '[VectorManagement]'\n );\n\n const saved = await scheduledJob.Save();\n if (!saved) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to create schedule: ${scheduledJob.LatestResult?.CompleteMessage ?? 'Unknown error'}`,\n 'error', 5000\n );\n return;\n }\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 = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: Actions',\n ExtraFilter: `Name = '__VectorizeEntity'`,\n Fields: ['ID'],\n ResultType: 'simple',\n MaxRows: 1,\n SkipTotalRowCount: true,\n });\n if (result.Success && result.Results.length > 0) {\n return result.Results[0].ID;\n }\n return null;\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 /**\n * The indexes the suggestion panel offers: those in the selected database built with the selected\n * embedding model, so a chosen index can never store a different model than the one shown.\n */\n public get FilteredIndexesForSelectedDB(): VectorIndexOption[] {\n return IndexesForSelection(this.AvailableVectorIndexes, this.SelectedVectorDBID, this.SelectedEmbeddingModelID);\n }\n\n /** The indexes the edit panel offers, matched to its database and embedding model the same way. */\n public get EditFilteredIndexes(): VectorIndexOption[] {\n return IndexesForSelection(this.AvailableVectorIndexes, this.EditDocVectorDBID, this.EditDocAIModelID);\n }\n\n /** Suggestion panel: picking an index moves the model and database dropdowns to its values. */\n public OnSuggestVectorIndexChange(indexID: string): void {\n this.applySuggestSelection(SelectIndex(this.suggestSelection, this.AvailableVectorIndexes, indexID));\n }\n\n /** Suggestion panel: a chosen index from another database goes back to Auto. */\n public OnSuggestVectorDBChange(databaseID: string): void {\n this.applySuggestSelection(SelectDatabase(this.suggestSelection, this.AvailableVectorIndexes, databaseID));\n }\n\n /** Suggestion panel: a chosen index built with another model goes back to Auto. */\n public OnSuggestEmbeddingModelChange(embeddingModelID: string): void {\n this.applySuggestSelection(SelectEmbeddingModel(this.suggestSelection, this.AvailableVectorIndexes, embeddingModelID));\n }\n\n /** Edit panel: picking an index moves the model and database dropdowns to its values. */\n public OnEditVectorIndexChange(indexID: string): void {\n this.applyEditSelection(SelectIndex(this.editSelection, this.AvailableVectorIndexes, indexID));\n }\n\n /** Edit panel: a chosen index from another database goes back to Auto. */\n public OnEditVectorDBChange(databaseID: string): void {\n this.applyEditSelection(SelectDatabase(this.editSelection, this.AvailableVectorIndexes, databaseID));\n }\n\n /** Edit panel: a chosen index built with another model goes back to Auto. */\n public OnEditEmbeddingModelChange(embeddingModelID: string): void {\n this.applyEditSelection(SelectEmbeddingModel(this.editSelection, this.AvailableVectorIndexes, embeddingModelID));\n }\n\n private get suggestSelection(): VectorStoreSelection {\n return { EmbeddingModelID: this.SelectedEmbeddingModelID, VectorDatabaseID: this.SelectedVectorDBID, VectorIndexID: this.SelectedVectorIndexID };\n }\n\n private applySuggestSelection(selection: VectorStoreSelection): void {\n this.SelectedEmbeddingModelID = selection.EmbeddingModelID;\n this.SelectedVectorDBID = selection.VectorDatabaseID;\n this.SelectedVectorIndexID = selection.VectorIndexID;\n }\n\n private get editSelection(): VectorStoreSelection {\n return { EmbeddingModelID: this.EditDocAIModelID, VectorDatabaseID: this.EditDocVectorDBID, VectorIndexID: this.EditDocVectorIndexID };\n }\n\n private applyEditSelection(selection: VectorStoreSelection): void {\n this.EditDocAIModelID = selection.EmbeddingModelID;\n this.EditDocVectorDBID = selection.VectorDatabaseID;\n this.EditDocVectorIndexID = selection.VectorIndexID;\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 /** @deprecated Use {@link EntitySearchInput}. */\n get entitySearchInput(): ElementRef<HTMLInputElement> | undefined {\n return this.EntitySearchInput;\n }\n /** @deprecated Use {@link EntitySearchInput}. */\n set entitySearchInput(value: ElementRef<HTMLInputElement> | undefined) {\n this.EntitySearchInput = value;\n }\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 // When embedded in a parent shell, that host owns agent reporting.\n if (!this.HideToolbar) {\n this.emitAgentContext();\n this.registerAgentTools();\n }\n this.NotifyLoadComplete();\n }\n\n // ================================================================\n // Agent context + client tools\n // ================================================================\n\n /**\n * Publish the vector-management surface state to the AI agent. Re-emitted on\n * every data refresh and whenever an entity's sync starts or finishes, so the\n * streamed context tracks live vectorization. No-op when embedded (the host\n * owns reporting).\n */\n private emitAgentContext(): void {\n if (this.HideToolbar) {\n return;\n }\n this.navigationService.SetAgentContext(this, BuildVectorAgentContext({\n TotalVectors: this.TotalVectors,\n EntityDocumentCount: this.SyncRows.length,\n SyncingCount: this.SyncingIds.size,\n VectorDBName: this.VectorDBName,\n VectorDBStatus: this.VectorDBStatus,\n EmbeddingModelName: this.EmbeddingModel.Name,\n PrerequisitesMet: this.PrerequisitesMet,\n ViewMode: this.ViewMode,\n EntitySearchText: this.EntitySearchText,\n Entities: this.SyncRows.map(r => ({\n EntityName: r.EntityName,\n DocumentName: r.DocumentName,\n VectorCount: r.VectorCount,\n Status: r.Status,\n })),\n }));\n }\n\n /** Build the resolver candidate list from the loaded sync rows. */\n private getSyncRowCandidates(): VectorSyncRowCandidate[] {\n return this.SyncRows.map(r => ({\n EntityDocumentID: r.EntityDocumentID,\n EntityName: r.EntityName,\n DocumentName: r.DocumentName,\n VectorCount: r.VectorCount,\n Status: r.Status,\n }));\n }\n\n /**\n * 🚨 SAFETY BOUNDARY 🚨\n * Register the safe, agent-actionable operations. Exposed:\n * - RefreshVectors (read-only reload)\n * - SyncVectorsForEntity (idempotent embedding sync — guards already-syncing; re-vectorizing\n * is the documented happy path, not destructive: it re-embeds existing records)\n * - SetVectorViewMode (read-only Index/Operations toggle)\n * - OpenVectorEntityDocument (id/name resolution → opens the edit panel for VIEWING config)\n * - GoToVectorConfiguration (navigation to the Config nav item)\n *\n * INTENTIONALLY NOT EXPOSED (gated):\n * - DeleteEntityDocument / vector purge — destructive, irreversible removal of an entity's\n * vector index + document.\n * - SaveEditedDocument / SaveAsEntityDocument / RegenerateTemplate — write entity-document\n * config (template, model, DB) the user should review and commit themselves.\n * - SaveScheduleSync — creates a scheduled job (a persistent side effect).\n */\n private registerAgentTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'RefreshVectors',\n Description: 'Reload the vector management dashboard (vector counts, sync rows, KPIs) from the server.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n await this.LoadData(true);\n this.emitAgentContext();\n return { Success: true, Data: { TotalVectors: this.TotalVectors } };\n },\n },\n {\n Name: 'SyncVectorsForEntity',\n Description: 'Start vectorization (embedding sync) for an entity. Accepts the entity name, document name, or entity document ID. The entity must already have a vector entity document configured.',\n ParameterSchema: {\n type: 'object',\n properties: { entityName: { type: 'string', description: 'Entity name, document name, or entity document ID to vectorize' } },\n required: ['entityName'],\n },\n Handler: async (params: Record<string, unknown>) => {\n const v = ValidateStringParam(params['entityName'], 'entityName');\n if (!v.ok) return v.result;\n const resolved = ResolveSyncRow(v.value, this.getSyncRowCandidates());\n if (!resolved.ok) return { Success: false, ErrorMessage: resolved.error };\n if (this.IsSyncing(resolved.value.EntityDocumentID)) {\n return { Success: false, ErrorMessage: `\"${resolved.value.EntityName}\" is already syncing` };\n }\n await this.SyncEntity(resolved.value.EntityDocumentID);\n return { Success: true, Data: { EntityName: resolved.value.EntityName } };\n },\n },\n {\n Name: 'SetVectorViewMode',\n Description: 'Switch the vector dashboard between the Index view and the Operations (real-time sync) view.',\n ParameterSchema: {\n type: 'object',\n properties: { mode: { type: 'string', enum: ['index', 'operations'], description: 'index or operations' } },\n required: ['mode'],\n },\n Handler: async (params: Record<string, unknown>) => {\n const mode = String(params['mode'] ?? '');\n if (mode !== 'index' && mode !== 'operations') {\n return { Success: false, ErrorMessage: 'Invalid mode. Expected \"index\" or \"operations\".' };\n }\n if (this.ViewMode !== mode) {\n this.ToggleViewMode();\n }\n this.emitAgentContext();\n return { Success: true, Data: { ViewMode: this.ViewMode } };\n },\n },\n {\n Name: 'OpenVectorEntityDocument',\n Description: 'Open the configuration panel for an entity document (for viewing its template, model, and vector DB). Accepts the entity name, document name, or entity document ID.',\n ParameterSchema: {\n type: 'object',\n properties: { document: { type: 'string', description: 'Entity name, document name, or entity document ID' } },\n required: ['document'],\n },\n Handler: async (params: Record<string, unknown>) => {\n const v = ValidateStringParam(params['document'], 'document');\n if (!v.ok) return v.result;\n const resolved = ResolveSyncRow(v.value, this.getSyncRowCandidates());\n if (!resolved.ok) return { Success: false, ErrorMessage: resolved.error };\n await this.OpenEditPanel(resolved.value.EntityDocumentID);\n return { Success: true, Data: { EntityName: resolved.value.EntityName, DocumentName: resolved.value.DocumentName } };\n },\n },\n {\n Name: 'GoToVectorConfiguration',\n Description: 'Navigate to the Knowledge Hub Configuration page to set up the vector database and embedding model.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n await this.GoToConfiguration();\n return { Success: true };\n },\n },\n ]);\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(forceRefresh: boolean = false): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n await this.fetchAllData(forceRefresh);\n this.buildSyncRows();\n this.buildKPICards();\n this.buildSidebarData();\n this.checkPrerequisites();\n this.emitAgentContext();\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 const doc = this.entityDocuments.find(d => UUIDsEqual(d.ID, entityDocumentId));\n if (!doc) return;\n\n // Canonicalize ID to doc.ID to ensure consistent casing across maps, sets, and rows\n entityDocumentId = doc.ID;\n\n if (this.IsSyncing(entityDocumentId)) {\n return;\n }\n\n const provider = this.ProviderToUse 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 => UUIDsEqual(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 = this.ProviderToUse 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 const activityID = this.activityService.Start('Vector sync', { icon: 'fa-solid fa-cubes', detail: entityName, progress: 0 });\n\n /**\n * 'success' and 'error' come only from the server's own complete / error events.\n * 'unconfirmed' is a long silence (a dropped connection, say): the row is refreshed from the\n * database, but nothing claims the run finished, because the server may still be working.\n */\n const finishSync = (outcome: 'success' | 'error' | 'unconfirmed') => {\n if (idleTimer) clearTimeout(idleTimer);\n rxSub?.unsubscribe();\n const success = outcome !== 'error';\n this.activityService.Complete(activityID, success ? 'success' : 'error',\n outcome === 'success' ? `${entityName} vectorized`\n : outcome === 'error' ? `Failed for ${entityName}`\n : `${entityName}: no progress received`);\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 try {\n this.removeSyncingId(entityDocumentId);\n\n if (outcome === 'success') {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Vectorization complete for ${entityName}`,\n 'success', 3000\n );\n await this.refreshSyncRow(entityDocumentId);\n } else if (outcome === 'unconfirmed') {\n MJNotificationService.Instance.CreateSimpleNotification(\n `No progress received for ${entityName} in ${VectorManagementResourceComponent.SYNC_SILENCE_LIMIT_MS / 60000} minutes, ` +\n `so the result can't be confirmed. The vector count shown is what is stored now; refresh later to check.`,\n 'warning', 8000\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 } catch (err) {\n console.error(`[VectorManagement] Error finishing sync for ${entityName}:`, err);\n } finally {\n this.buildSidebarData();\n this.emitAgentContext();\n this.cdr.detectChanges();\n }\n });\n };\n\n // Reset on every event. Silence is not success: the server reports progress in 5% steps,\n // and with a remote embedding model one step can take far longer than a few seconds, so a\n // short silence routinely reported \"Synced\" while most records were still being embedded.\n const resetIdleTimer = () => {\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => {\n if (this.IsSyncing(entityDocumentId)) {\n finishSync('unconfirmed');\n }\n }, VectorManagementResourceComponent.SYNC_SILENCE_LIMIT_MS);\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('success');\n } else if (stage === 'error') {\n finishSync('error');\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('error');\n }\n });\n }\n\n /**\n * Returns true if the given entity document is currently syncing.\n * Compares case-insensitively using UUIDsEqual.\n */\n public IsSyncing(id: string): boolean {\n for (const syncingId of this.SyncingIds) {\n if (UUIDsEqual(syncingId, id)) {\n return true;\n }\n }\n return false;\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 const next = new Set<string>();\n for (const existing of this.SyncingIds) {\n if (!UUIDsEqual(existing, id)) {\n next.add(existing);\n }\n }\n next.add(id);\n this.SyncingIds = next;\n this.emitAgentContext();\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 const next = new Set<string>();\n for (const existing of this.SyncingIds) {\n if (!UUIDsEqual(existing, id)) {\n next.add(existing);\n }\n }\n if (next.size !== this.SyncingIds.size) {\n this.SyncingIds = next;\n this.emitAgentContext();\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 // The field list is whatever the model returned — no cap, no filter. Bound it\n // here so an over-wide suggestion is visible immediately rather than at save.\n const capped = CapSelectedFields(result.selectedFields);\n if (capped.dropped > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `The suggestion selected ${capped.fields.length + capped.dropped} fields. ` +\n `Keeping the first ${MAX_TEMPLATE_FIELDS} and dropping ${capped.dropped} — a list ` +\n `this long usually means the whole table was pulled in. Check the template.`,\n 'warning',\n 6000\n );\n }\n result.selectedFields = capped.fields;\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 = this.ProviderToUse;\n const entityDoc = await this.findOrCreateEntityDocument();\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 // The panel shows the model's match thresholds; store them rather than leaving the defaults.\n const thresholds = SuggestedMatchThresholds(\n this.SuggestionResult.potentialMatchThreshold,\n this.SuggestionResult.absoluteMatchThreshold\n );\n if (thresholds) {\n entityDoc.PotentialMatchThreshold = thresholds.Potential;\n entityDoc.AbsoluteMatchThreshold = thresholds.Absolute;\n }\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(true);\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(forceRefresh: boolean = false): Promise<void> {\n // Use cached engine data unless forceRefresh is true — BaseEngine's entity-event\n // auto-refresh handles updates from saves/deletes on the entities it tracks.\n const engine = KnowledgeHubMetadataEngine.Instance;\n await engine.Config(forceRefresh);\n // AIEngineBase is deferred at startup; ensure loaded before reading .VectorDatabases / .VectorIndexes.\n await AIEngineBase.Instance.EnsureLoaded();\n if (forceRefresh) {\n await AIEngineBase.Instance.RefreshItem('_vectorIndexes');\n }\n\n this.entityDocuments = engine.EntityDocuments;\n this.vectorDatabases = AIEngineBase.Instance.VectorDatabases;\n // A copy: resolveOrCreateVectorIndex() appends the index it creates, and the engine's getter\n // hands out its own cached array, which this component must not mutate.\n this.vectorIndexes = [...AIEngineBase.Instance.VectorIndexes];\n\n // Build per-EntityDocument aggregate stats (vector count + last synced).\n // Each query fetches the two most recent rows and uses TotalRowCount for the\n // vector count, which avoids loading all rows. A full page triggers the\n // count, and a short page is itself the total.\n // AI Models come from a different domain — fetched in the same batch.\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\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 BypassCache: forceRefresh,\n }));\n const allQueries = [\n ...erdQueries,\n { EntityName: 'MJ: AI Models', ExtraFilter: '', ResultType: 'entity_object' as const, BypassCache: forceRefresh }\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 ?? 0,\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 Array.from(this.erdStats.entries()).find(([k]) => UUIDsEqual(k, doc.ID))?.[1];\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 DocumentType: doc.Type || '',\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.IsSyncing(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 activeDbID = this.vectorIndexes[0]?.VectorDatabaseID ?? this.entityDocuments[0]?.VectorDatabaseID;\n const db = (activeDbID ? this.vectorDatabases.find(d => UUIDsEqual(d.ID, activeDbID)) : undefined) ?? this.vectorDatabases[0];\n this.VectorDBName = db.Name;\n // \"Degraded\" here doesn't mean the database is unhealthy — it means no\n // records have been vectorized yet. Say that plainly so users don't\n // chase a phantom outage.\n const hasVectors = this.TotalVectors > 0;\n this.VectorDBStatus = hasVectors ? 'Healthy' : 'Degraded';\n this.VectorDBStatusReason = hasVectors\n ? `${this.TotalVectors.toLocaleString()} vector(s) stored and queryable.`\n : `Connected, but no records have been vectorized yet. Run a sync below to populate the index.`;\n } else {\n this.VectorDBName = 'Not configured';\n this.VectorDBStatus = 'Offline';\n this.VectorDBStatusReason = 'No vector database is configured for this environment.';\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 // No index is pre-selected: the first index is whatever happens to sort first (here, another\n // feature's shared index), and a chosen index decides the database and model Save stores.\n // Auto finds or creates the index for the database and model shown.\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 — from the use case the user actually chose. This used to be hardcoded to\n // 'Record Duplicate', so picking \"search\" in the dialog silently produced a\n // duplicate-detection document: the selection was discarded and the document was the\n // wrong type. A vector pool is typed — Provider.SearchEntity and the Search Entity\n // action read Search-typed documents — so the mislabelled document is also invisible\n // to the feature that asked for it.\n const wantedTypeName = EntityDocumentTypeForUseCase(this.SuggestUseCase);\n if (!wantedTypeName) {\n throw new Error(\n `No Entity Document Type is defined for the \"${this.SuggestUseCase}\" use case. ` +\n `Known use cases: ${Object.keys(ENTITY_DOCUMENT_TYPE_BY_USE_CASE).join(', ')}.`\n );\n }\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const typeResult = await rv.RunView<{ ID: string; Name: string }>({\n EntityName: 'MJ: Entity Document Types',\n ResultType: 'simple',\n Fields: ['ID', 'Name']\n });\n const availableTypes = typeResult.Success ? typeResult.Results : [];\n // Trimmed, case-insensitive comparison — the same match EntityDocumentCache\n // .GetDocumentTypeByName makes server-side, so the dialog and the syncer agree.\n const wanted = wantedTypeName.trim().toLowerCase();\n const matchedType = availableTypes.find(t => t.Name?.trim().toLowerCase() === wanted);\n if (matchedType) {\n entityDoc.TypeID = matchedType.ID;\n } else {\n // Never substitute a type that happens to exist: that is the defect above.\n const names = availableTypes.map(t => t.Name).sort();\n throw new Error(\n `Entity Document Type \"${wantedTypeName}\" not found in database. It is the type the ` +\n `\"${this.SuggestUseCase}\" use case needs, and no other type will be used in its place. ` +\n (names.length > 0\n ? `Types that do exist: ${names.join(', ')}. Add \"${wantedTypeName}\" to MJ: Entity Document Types.`\n : 'No Entity Document Types exist at all.')\n );\n }\n\n // An explicitly chosen index fixes the DB + model. \"Auto (create/find matching index)\" resolves\n // (or creates) the index for the chosen DB + model, so the syncer always has a VectorIndexID:\n // it refuses to run without one, which made the Auto choice a dead end before.\n // Only an index that matches the database and model shown counts as chosen, so the stored\n // database and model are always the ones the dropdowns displayed.\n const chosen = ChosenIndexForSave(this.suggestSelection, this.AvailableVectorIndexes);\n if (chosen) {\n entityDoc.VectorDatabaseID = chosen.VectorDatabaseID;\n entityDoc.AIModelID = chosen.EmbeddingModelID;\n entityDoc.VectorIndexID = chosen.ID;\n } else {\n const vectorDatabaseID = this.SelectedVectorDBID || this.vectorDatabases[0].ID;\n const aiModelID = this.SelectedEmbeddingModelID || this.findEmbeddingModel()!.ID;\n entityDoc.VectorDatabaseID = vectorDatabaseID;\n entityDoc.AIModelID = aiModelID;\n entityDoc.VectorIndexID = await this.resolveOrCreateVectorIndex(vectorDatabaseID, aiModelID, this.SuggestEntityName);\n }\n\n // TemplateID — create a Template record with the generated template content\n await this.createTemplateForDocument(entityDoc);\n }\n\n /**\n * \"Auto (create/find matching index)\": reuse the index already built for this vector database +\n * embedding model, or create the `MJ: Vector Indexes` record for one. Only the metadata row is\n * written here and the save returns as soon as it is stored; the server-side entity hook then\n * provisions the index in the provider (bounded by its own timeout) and writes the provider\n * metadata back, so this request is never held while the provider works.\n * Returns the index ID to store on the document.\n */\n private async resolveOrCreateVectorIndex(vectorDatabaseID: string, aiModelID: string, entityName: string): Promise<string> {\n const existing = FindMatchingVectorIndex(this.vectorIndexes, vectorDatabaseID, aiModelID);\n if (existing) {\n return existing.ID;\n }\n\n const md = this.ProviderToUse;\n const modelName = this.aiModels.find(m => UUIDsEqual(m.ID, aiModelID))?.Name ?? null;\n const index = await md.GetEntityObject<MJVectorIndexEntity>('MJ: Vector Indexes');\n index.NewRecord();\n index.Name = BuildAutoVectorIndexName(entityName, modelName);\n index.VectorDatabaseID = vectorDatabaseID;\n index.EmbeddingModelID = aiModelID;\n index.Description = `Auto-created for the \"${entityName}\" entity document (${modelName ?? 'embedding model'})`;\n\n const saved = await index.Save();\n if (!saved) {\n throw new Error(\n `Could not create a vector index for \"${entityName}\": ${index.LatestResult?.CompleteMessage || 'unknown error'}`\n );\n }\n this.vectorIndexes.push(index);\n this.AvailableVectorIndexes.push({\n ID: index.ID,\n Name: index.Name,\n VectorDatabaseID: index.VectorDatabaseID,\n EmbeddingModelID: index.EmbeddingModelID,\n });\n return index.ID;\n }\n\n /** Create a Template + TemplateContent record for the entity document */\n private async createTemplateForDocument(entityDoc: MJEntityDocumentEntity): Promise<void> {\n const md = this.ProviderToUse;\n const templateText = this.EditableTemplate || this.SuggestionResult?.template || '';\n if (!templateText) {\n throw new Error('No template content to save');\n }\n\n // LAYER 2: the template is hand-editable after the model returns, so a user can type\n // a field the picker never offered. Refuse before anything is written — once values\n // reach the vector index they are retrievable by similarity search, outside the\n // entity permissions that guard the source column, and not fully reversible.\n const sensitive = SensitiveFieldsInTemplate(templateText, this.vectorFieldPurpose(this.SuggestUseCase));\n if (sensitive.length > 0) {\n throw new Error(\n `This template references ${sensitive.length === 1 ? 'a field' : 'fields'} that must not be ` +\n `vectorized: ${sensitive.join(', ')}. Embedding copies the values into the vector index, ` +\n `where they are retrievable by similarity search rather than by an authorized query. ` +\n `Remove ${sensitive.length === 1 ? 'it' : 'them'} from the template and save again.`\n );\n }\n\n // The field list is unbounded and comes straight from a prompt, and the template stays\n // hand-editable after the model returns — so the authoritative bound is here, on what\n // actually gets embedded, not on the model's own description of what it picked.\n const capRefusal = TemplateFieldCapRefusal(templateText);\n if (capRefusal) {\n throw new Error(capRefusal);\n }\n\n // Find-or-create, so a retry after a mid-flow failure converges on one set of rows.\n const templateName = this.templateNameForDocument();\n const template = await this.findOrCreateTemplate(templateName, entityDoc.TemplateID);\n template.Name = templateName;\n template.Description = `Auto-generated template for entity document: ${this.SaveDocumentName}`;\n // An adopted template keeps its owner; only a new one is the current user's.\n if (!template.UserID) {\n template.UserID = md.CurrentUser.ID;\n }\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 RunView.FromMetadataProvider(this.ProviderToUse).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 this.findOrCreateTemplateContent(template.ID);\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 /** The Template name this dialog deterministically gives the current document. */\n private templateNameForDocument(): string {\n return `Template for ${this.SaveDocumentName}`;\n }\n\n /**\n * The Entity Document for the current dialog, reusing the row an earlier attempt created\n * rather than adding a second one.\n *\n * This flow writes three rows — Template, Template Content, Entity Document — in that\n * order, and only the last is protected by a unique index (`UQ_EntityDocument_Name` on\n * `EntityDocument.Name`). So a duplicate was not a rare partial-failure case: that index\n * guarantees a second attempt with the same name fails at the final step, *after* the\n * Template and Template Content rows have been written again. Orphans accumulated one\n * pair per retry.\n *\n * Matched on Name, because that is the identity the database itself enforces.\n *\n * An existing document is adopted only when this dialog created it — its TemplateID points\n * at the template named `Template for <document name>` — and only for the same entity, so a\n * retry never moves another entity's document. A collision with a document\n * authored anywhere else is refused, because silently overwriting somebody's configured\n * document is worse than asking for a different name.\n */\n private async findOrCreateEntityDocument(): Promise<MJEntityDocumentEntity> {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(md);\n const existing = await rv.RunView<MJEntityDocumentEntity>({\n EntityName: 'MJ: Entity Documents',\n ExtraFilter: `Name='${EscapeSQLString(this.SaveDocumentName)}'`,\n ResultType: 'entity_object',\n MaxRows: 1,\n SkipTotalRowCount: true,\n });\n\n if (existing.Success && existing.Results.length > 0) {\n const priorDoc = existing.Results[0];\n const ownTemplate = priorDoc.TemplateID\n ? await this.templateHasName(priorDoc.TemplateID, this.templateNameForDocument())\n : false;\n if (!ownTemplate) {\n throw new Error(\n `An Entity Document named \"${this.SaveDocumentName}\" already exists and was not ` +\n `created here, so it will not be overwritten. Choose a different name.`\n );\n }\n // Adopting a document for another entity would move it to this one.\n const entity = md.Entities.find(e => e.Name === this.SuggestEntityName);\n if (entity && priorDoc.EntityID && !UUIDsEqual(priorDoc.EntityID, entity.ID)) {\n throw new Error(\n `An Entity Document named \"${this.SaveDocumentName}\" already exists for ` +\n `${priorDoc.Entity || 'another entity'}, so it will not be reused. Choose a different name.`\n );\n }\n return priorDoc;\n }\n\n const entityDoc = await md.GetEntityObject<MJEntityDocumentEntity>('MJ: Entity Documents');\n entityDoc.NewRecord();\n return entityDoc;\n }\n\n /**\n * The Template for the current document, reusing an earlier attempt's row.\n *\n * An adopted Entity Document already points at its template (findOrCreateEntityDocument\n * checked its name), so that row is reused by ID. Matching it on Name + UserID instead\n * misses it when another user created it, writes a second template, re-points the document\n * and orphans the first Template and Template Content.\n *\n * For a new document, matched on Name + UserID: `Template` carries no unique index, and that\n * pair is exactly what this flow writes, so it identifies our own prior row without claiming\n * anyone else's.\n */\n private async findOrCreateTemplate(templateName: string, adoptedTemplateId?: string | null): Promise<MJTemplateEntity> {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(md);\n const existing = await rv.RunView<MJTemplateEntity>({\n EntityName: 'MJ: Templates',\n ExtraFilter: adoptedTemplateId\n ? `ID='${EscapeSQLString(adoptedTemplateId)}'`\n : `Name='${EscapeSQLString(templateName)}' AND UserID='${md.CurrentUser.ID}'`,\n ResultType: 'entity_object',\n MaxRows: 1,\n SkipTotalRowCount: true,\n });\n if (existing.Success && existing.Results.length > 0) {\n return existing.Results[0];\n }\n const template = await md.GetEntityObject<MJTemplateEntity>('MJ: Templates');\n template.NewRecord();\n return template;\n }\n\n /**\n * The Template Content row for a template, reusing the one it already has.\n *\n * `Priority ASC`, first row, is how loadEditDocTemplate and saveEditDocTemplate already\n * identify \"the\" content of a template — this follows that convention rather than adding\n * a second one.\n */\n private async findOrCreateTemplateContent(templateId: string): Promise<MJTemplateContentEntity> {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(md);\n const existing = 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 SkipTotalRowCount: true,\n });\n if (existing.Success && existing.Results.length > 0) {\n return existing.Results[0];\n }\n const content = await md.GetEntityObject<MJTemplateContentEntity>('MJ: Template Contents');\n content.NewRecord();\n return content;\n }\n\n /** True when the template with this ID carries the given name. */\n private async templateHasName(templateId: string, name: string): Promise<boolean> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{ Name: string }>({\n EntityName: 'MJ: Templates',\n ExtraFilter: `ID='${templateId}'`,\n Fields: ['Name'],\n ResultType: 'simple',\n MaxRows: 1,\n SkipTotalRowCount: true,\n });\n return result.Success && result.Results.length > 0 && result.Results[0].Name === name;\n }\n\n\n /** Build grouped entity list from metadata, grouped by SchemaName */\n private loadEntityGroups(): void {\n const md = this.ProviderToUse;\n const groupMap = new Map<string, { Name: string; ID: string }[]>();\n\n for (const entity of md.Entities) {\n // The picker used to list every entity in metadata, so MJ's own internal entities\n // were offered as vectorization targets. See vector-document-rules.ts for the rule\n // and the precedent it follows.\n if (!IsVectorizableEntity(entity)) {\n continue;\n }\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 => UUIDsEqual(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 => UUIDsEqual(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 => UUIDsEqual(r.EntityDocumentID, entityDocumentId));\n if (!row) return;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\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 BypassCache: true,\n });\n\n if (result.Success) {\n row.VectorCount = result.TotalRowCount ?? 0;\n row.LastSynced = result.Results.length > 0 ? new Date(result.Results[0].__mj_UpdatedAt) : (row.LastSynced ?? new Date());\n row.Status = row.VectorCount > 0 ? 'Synced' : 'Pending';\n row.PercentComplete = 100;\n\n const doc = this.entityDocuments.find(d => UUIDsEqual(d.ID, entityDocumentId));\n const docId = doc?.ID ?? row.EntityDocumentID;\n for (const key of this.erdStats.keys()) {\n if (UUIDsEqual(key, docId)) {\n this.erdStats.delete(key);\n }\n }\n this.erdStats.set(docId, { vectorCount: row.VectorCount, lastSynced: row.LastSynced });\n this.buildKPICards();\n this.buildSidebarData();\n this.emitAgentContext();\n this.cdr.detectChanges();\n } else {\n console.error(`[VectorManagement] Failed to refresh sync row for ${entityDocumentId}:`, result.ErrorMessage);\n row.Status = row.VectorCount > 0 ? 'Synced' : 'Error';\n this.buildKPICards();\n this.buildSidebarData();\n this.emitAgentContext();\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 = this.ProviderToUse;\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 // AIEngineBase is deferred at startup; ensure loaded before findSuggestionPrompt reads .Prompts.\n await AIEngineBase.Instance.EnsureLoaded();\n const prompt = this.findSuggestionPrompt();\n const provider = this.ProviderToUse 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 /**\n * What a document for this use case embeds its fields for. Only a duplicate-detection document\n * may embed a date of birth (see sensitive-fields.ts).\n */\n private vectorFieldPurpose(useCase: string): VectorFieldPurpose {\n return EntityDocumentTypeForUseCase(useCase) === 'Record Duplicate' ? 'duplicate-detection' : 'other';\n }\n\n /** Build the data payload for the suggestion prompt */\n private buildPromptData(entity: EntityInfo, useCase: string): Record<string, unknown> {\n // LAYER 1 of the sensitive-field refusal: the model never sees these columns, so it\n // cannot suggest them. See sensitive-fields.ts for why this cannot live in the prompt.\n const purpose = this.vectorFieldPurpose(useCase);\n const fields = WithoutSensitiveFields(entity.Fields, purpose).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 = this.ProviderToUse;\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 // Layer 1 covers related entities too: their fields reach the model here.\n const relFields = relatedEntity\n ? WithoutSensitiveFields(relatedEntity.Fields, purpose)\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 (!HideToolbar) {\n <mj-page-layout>\n <mj-page-header\n Title=\"Vector Management\"\n Icon=\"fa-solid fa-cubes\"\n Subtitle=\"Vector index health, embeddings, and entity sync status\">\n <div actions>\n <mj-view-toggle\n [Options]=\"VectorViewOptions\"\n [ActiveKey]=\"ViewMode\"\n (KeyChange)=\"ViewMode = $any($event)\">\n </mj-view-toggle>\n </div>\n </mj-page-header>\n <mj-page-body [Flex]=\"true\">\n <ng-container *ngTemplateOutlet=\"vectorBody\"></ng-container>\n </mj-page-body>\n </mj-page-layout>\n}\n@if (HideToolbar) {\n <ng-container *ngTemplateOutlet=\"vectorBody\"></ng-container>\n}\n\n<ng-template #vectorBody>\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\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(true)\" 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 <mj-empty-state Icon=\"fa-solid fa-folder-open\"\n Title=\"No entity documents configured for vectorization.\" />\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>Type</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=\"document-type\">{{ row.DocumentType }}</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]=\"IsSyncing(row.EntityDocumentID)\"\n (click)=\"SyncEntity(row.EntityDocumentID)\"\n title=\"Sync now\">\n @if (IsSyncing(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\" [title]=\"VectorDBStatusReason\">{{ VectorDBStatus }}</div>\n @if (VectorDBStatusReason) {\n <div class=\"health-reason\">{{ VectorDBStatusReason }}</div>\n }\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\" [title]=\"'Embeddings are generated by this model; the index above stores the resulting vectors.'\">{{ 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 <div class=\"suggest-field\">\n <label class=\"suggest-label\">Type</label>\n <span class=\"edit-readonly-value\">{{ EditDocType }}</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\" (ngModelChange)=\"OnEditEmbeddingModelChange($event)\">\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\" (ngModelChange)=\"OnEditVectorDBChange($event)\">\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\" (ngModelChange)=\"OnEditVectorIndexChange($event)\">\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 </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 <mj-alert Variant=\"error\" Size=\"sm\">{{ SuggestionError }}</mj-alert>\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\" (ngModelChange)=\"OnSuggestEmbeddingModelChange($event)\">\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\" (ngModelChange)=\"OnSuggestVectorDBChange($event)\">\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\" (ngModelChange)=\"OnSuggestVectorIndexChange($event)\">\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</ng-template>\n"]}