@memberjunction/ng-dashboards 5.39.0 β†’ 5.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +128 -4
  2. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  3. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +548 -145
  4. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  5. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts +56 -0
  6. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts.map +1 -0
  7. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js +423 -0
  8. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js.map +1 -0
  9. package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts +70 -0
  10. package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts.map +1 -0
  11. package/dist/AI/components/autotagging/components/classify-item-grid.component.js +308 -0
  12. package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -0
  13. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts +29 -0
  14. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -0
  15. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +186 -0
  16. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -0
  17. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts +69 -0
  18. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts.map +1 -0
  19. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js +278 -0
  20. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js.map +1 -0
  21. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts +73 -0
  22. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts.map +1 -0
  23. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js +393 -0
  24. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js.map +1 -0
  25. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts +122 -0
  26. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts.map +1 -0
  27. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js +908 -0
  28. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js.map +1 -0
  29. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +100 -2
  30. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -1
  31. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +603 -213
  32. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -1
  33. package/dist/AI/components/autotagging/shared/classify.format.d.ts +15 -0
  34. package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -1
  35. package/dist/AI/components/autotagging/shared/classify.format.js +51 -0
  36. package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -1
  37. package/dist/AI/components/autotagging/shared/classify.types.d.ts +43 -0
  38. package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -1
  39. package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -1
  40. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +38 -1
  41. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -1
  42. package/dist/AI/components/autotagging/tabs/history-tab.component.js +185 -68
  43. package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -1
  44. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +10 -1
  45. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -1
  46. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +249 -188
  47. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -1
  48. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +12 -1
  49. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -1
  50. package/dist/AI/components/autotagging/tabs/sources-tab.component.js +377 -296
  51. package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
  52. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +8 -0
  53. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -1
  54. package/dist/AI/components/autotagging/tabs/tags-tab.component.js +112 -68
  55. package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -1
  56. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +9 -0
  57. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -1
  58. package/dist/AI/components/autotagging/tabs/types-tab.component.js +87 -36
  59. package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -1
  60. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +3 -0
  61. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  62. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +15 -3
  63. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  64. package/dist/AI/components/execution-monitoring.component.js +1 -1
  65. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  66. package/dist/AI/components/tags/tags-resource.component.d.ts +1 -0
  67. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  68. package/dist/AI/components/tags/tags-resource.component.js +28 -6
  69. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  70. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +3 -0
  71. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  72. package/dist/AI/components/vectors/vector-management-resource.component.js +330 -302
  73. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  74. package/dist/APIKeys/api-applications-panel.component.js +2 -2
  75. package/dist/APIKeys/api-key-create-dialog.component.js +2 -2
  76. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +31 -340
  77. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  78. package/dist/DataExplorer/data-explorer-dashboard.component.js +468 -1958
  79. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  80. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  81. package/dist/DataExplorer/data-explorer-resource.component.js +10 -0
  82. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  83. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
  84. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +12 -9
  85. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  86. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +27 -2
  87. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
  88. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +244 -120
  89. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  90. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts +65 -0
  91. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts.map +1 -0
  92. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js +176 -0
  93. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js.map +1 -0
  94. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts +81 -0
  95. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts.map +1 -0
  96. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js +308 -0
  97. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js.map +1 -0
  98. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts +85 -0
  99. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts.map +1 -0
  100. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js +362 -0
  101. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js.map +1 -0
  102. package/dist/KnowledgeHub/index.d.ts +3 -0
  103. package/dist/KnowledgeHub/index.d.ts.map +1 -1
  104. package/dist/KnowledgeHub/index.js +3 -0
  105. package/dist/KnowledgeHub/index.js.map +1 -1
  106. package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
  107. package/dist/QueryBrowser/query-browser-resource.component.js +1 -1
  108. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  109. package/dist/ai-dashboards.module.d.ts +48 -38
  110. package/dist/ai-dashboards.module.d.ts.map +1 -1
  111. package/dist/ai-dashboards.module.js +41 -1
  112. package/dist/ai-dashboards.module.js.map +1 -1
  113. package/dist/data-explorer-dashboards.module.d.ts +12 -14
  114. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  115. package/dist/data-explorer-dashboards.module.js +5 -14
  116. package/dist/data-explorer-dashboards.module.js.map +1 -1
  117. package/dist/public-api.d.ts +3 -0
  118. package/dist/public-api.d.ts.map +1 -1
  119. package/dist/public-api.js +3 -0
  120. package/dist/public-api.js.map +1 -1
  121. package/package.json +57 -55
  122. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts +0 -79
  123. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts.map +0 -1
  124. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +0 -195
  125. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +0 -1
  126. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +0 -226
  127. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +0 -1
  128. package/dist/DataExplorer/components/view-selector/view-selector.component.js +0 -861
  129. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"autotagging-pipeline-resource.component.js","sourceRoot":"","sources":["../../../../src/AI/components/autotagging/autotagging-pipeline-resource.component.ts","../../../../src/AI/components/autotagging/autotagging-pipeline-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Content Autotagging Dashboard\n *\n * Full dashboard for the content autotagging pipeline with left-nav and 5 tabs:\n * Pipeline Monitor, Sources Management, Content Types, Tag Library, Run History.\n * Supports CRUD on sources and content types via slide-in forms,\n * pipeline triggering with real-time GraphQL subscription progress.\n */\n\nimport { Component, ChangeDetectorRef, OnDestroy, AfterViewInit, inject, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { CompositeKey, RunView } from '@memberjunction/core';\nimport { ResourceData, KnowledgeHubMetadataEngine, MJScheduledActionEntity, MJContentItemDuplicateEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { RegisterClass, UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { MJLeftNavItem, MJLeftNavSection } from '@memberjunction/ng-ui-components';\nimport { GraphQLDataProvider, GraphQLAIClient } from '@memberjunction/graphql-dataprovider';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { ClassifyTagsTabComponent } from './tabs/tags-tab.component';\nimport { ClassifyInboxTabComponent } from './tabs/inbox-tab.component';\nimport { ClassifyHealthTabComponent } from './tabs/health-tab.component';\nimport { ClassifySourceTypeFormDialogComponent } from './dialogs/source-type-form.dialog.component';\n\n\n// ── Shared types (extracted to ./shared/classify.types.ts) ──\nimport { TabName, NavItem, KPIMetric, PipelineStageInfo, FeedItem, SourceMini, SourceCard, ContentTypeCard, TagCloudItem, ContentDuplicateRow, RunDetailRow, WeightedTag, ItemPipelineStatus, ContentItemDetail } from './shared/classify.types';\nimport { formatNumber, formatDate, getSourceTypeIcon, mapRunDetailRecords } from './shared/classify.format';\n\n@RegisterClass(BaseResourceComponent, 'AutotaggingPipelineResource')\n@Component({\n standalone: false,\n selector: 'app-autotagging-pipeline-resource',\n templateUrl: './autotagging-pipeline-resource.component.html',\n styleUrls: ['./autotagging-pipeline-resource.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class AutotaggingPipelineResourceComponent extends BaseResourceComponent implements AfterViewInit, OnDestroy {\n protected override destroy$ = new Subject<void>();\n private cdr = inject(ChangeDetectorRef);\n protected override navigationService = inject(NavigationService);\n\n // ── Global state ──\n public IsLoading = true;\n\n // ── Accurate total counts from TotalRowCount (not capped by MaxRows) ──\n private totalContentItemCount = 0;\n private totalContentTagCount = 0;\n\n // ── Tab state ──\n public ActiveTab: TabName = 'pipeline';\n private tabDataLoaded = new Set<TabName>();\n\n /** Live reference to the Tag Library tab (for deep-link + agent-tool search). */\n @ViewChild(ClassifyTagsTabComponent) private tagsTab?: ClassifyTagsTabComponent;\n\n // ── Left nav ──\n public NavItems: NavItem[] = [];\n\n // ── Pipeline tab ──\n public KPIMetrics: KPIMetric[] = [];\n public PipelineStages: PipelineStageInfo[] = [];\n public FeedItems: FeedItem[] = [];\n public SourceMinis: SourceMini[] = [];\n public TrendingTags: TagCloudItem[] = [];\n\n // Pipeline feed search/sort/pagination moved to ClassifyPipelineTabComponent\n // (tab-local presentational state). The host still builds FeedItems and owns\n // OpenFeedItemDetail(index) β€” the tab emits the original index back up.\n\n // Pipeline run state\n public IsRunning = false;\n public IsPaused = false;\n public RunProgress = 0;\n public RunStage = '';\n public RunCurrentItem = '';\n /** The current pipeline run ID (from GraphQL subscription) */\n public CurrentPipelineRunID: string | null = null;\n /** The process run ID (server-side ContentProcessRun) for pause/cancel/resume */\n public CurrentProcessRunID: string | null = null;\n\n // ── Pipeline Config Widget ──\n public ShowPipelineConfig = false;\n public PipelineConfig: {\n Pipeline?: { BatchSize?: number; MaxConcurrentBatches?: number; DelayBetweenBatchesMs?: number; ResumeFromLastBatch?: boolean; ErrorThresholdPercent?: number };\n RateLimits?: { LLM?: { RequestsPerMinute?: number; TokensPerMinute?: number }; Embedding?: { RequestsPerMinute?: number; TokensPerMinute?: number }; VectorDB?: { RequestsPerMinute?: number } };\n } = {\n Pipeline: { BatchSize: 100, MaxConcurrentBatches: 1, DelayBetweenBatchesMs: 200, ResumeFromLastBatch: true, ErrorThresholdPercent: 20 },\n RateLimits: { LLM: { RequestsPerMinute: 60, TokensPerMinute: 100000 }, Embedding: { RequestsPerMinute: 300, TokensPerMinute: 500000 }, VectorDB: { RequestsPerMinute: 200 } }\n };\n\n public TogglePipelineConfig(): void {\n this.ShowPipelineConfig = !this.ShowPipelineConfig;\n this.persistClassifyPreferences();\n }\n\n private persistClassifyPreferences(): void {\n const prefs = JSON.stringify({\n ActiveTab: this.ActiveTab,\n ShowPipelineConfig: this.ShowPipelineConfig,\n });\n UserInfoEngine.Instance.SetSettingDebounced(AutotaggingPipelineResourceComponent.PREFS_KEY, prefs);\n }\n\n private loadClassifyPreferences(): void {\n const raw = UserInfoEngine.Instance.GetSetting(AutotaggingPipelineResourceComponent.PREFS_KEY);\n if (raw) {\n try {\n const prefs = JSON.parse(raw);\n // Guard against stale persisted state that doesn't match the\n // current Classify rail (e.g. 'tags'/'taxonomy' from when those\n // surfaces lived here, or a value seeded by a sibling dashboard).\n if (prefs.ActiveTab && AutotaggingPipelineResourceComponent.VALID_TABS.includes(prefs.ActiveTab)) {\n this.ActiveTab = prefs.ActiveTab;\n }\n if (prefs.ShowPipelineConfig != null) this.ShowPipelineConfig = prefs.ShowPipelineConfig;\n } catch { /* ignore */ }\n }\n }\n\n // FormatTokenCount moved to ClassifyPipelineTabComponent (only the pipeline\n // config panel used it; the tab uses formatTokenCount from shared).\n\n // ── Sources tab ──\n // SourceCards + buildSourceCards() + the source-detail slide-in + the\n // quick-schedule dialog moved to ClassifySourcesTabComponent. The host still\n // owns the Content Duplicates section (rendered alongside the sources tab).\n public ContentDuplicates: ContentDuplicateRow[] = [];\n public IsLoadingDuplicates = false;\n\n // ── Content Types tab ──\n // ContentTypeCards + buildContentTypeCards() moved to ClassifyTypesTabComponent.\n\n // ── Tag Library tab ──\n // State + view-model building moved to ClassifyTagsTabComponent, which\n // rebuilds from its [ContentTags]/[ContentItems] inputs.\n\n // D2: Pipeline Monitor β€” live per-source progress\n public LiveRunDetailRows: RunDetailRow[] = [];\n public IsLoadingLiveDetails = false;\n\n // ── Slide-in form (Source + Content Type CRUD) ──\n // ALL form state, dropdown getters, dynamic-field logic, and the open/save/\n // close lifecycle moved to ClassifySourceTypeFormDialogComponent. The host\n // keeps only the no-content-type warning toggle (the warning dialog is\n // host-owned and triggered by the form dialog's (ContentTypeMissing) output),\n // and a @ViewChild to drive the form dialog from the tab add/edit events.\n public ShowNoContentTypeWarning = false;\n\n /** Live reference to the slide-in CRUD form dialog (driven from tab events). */\n @ViewChild('formDialog') private formDialog?: ClassifySourceTypeFormDialogComponent;\n\n // ── Schedule dialog ──\n // The quick-schedule dialog (state + save/remove logic) moved to\n // ClassifySourcesTabComponent.\n\n /** Cached ScheduledAction entities, keyed by normalized ID */\n private scheduledActionsCache = new Map<string, MJScheduledActionEntity>();\n\n // ── Detail panels ──\n // The Source Detail slide-in (state, pagination, status filter, retry, badge\n // class) moved to ClassifySourcesTabComponent. The item-detail slide-in below\n // stays in the host (shared by the pipeline feed + tag drill-down + sources).\n public SelectedFeedItem: ContentItemDetail | null = null;\n public ShowItemDetail = false;\n\n // Form dropdown options + tree-dropdown configs (SourceType/ContentType/\n // FileType/AIModel/EmbeddingModel/VectorIndex options and the AI-model vendor\n // tree configs) moved to ClassifySourceTypeFormDialogComponent.\n\n // ── Raw data cache ──\n private contentSourcesRaw: Record<string, unknown>[] = [];\n private contentItemsRaw: Record<string, unknown>[] = [];\n private contentTagsRaw: Record<string, unknown>[] = [];\n private contentRunsRaw: Record<string, unknown>[] = [];\n /** Exposes the raw run rows to the Run History tab component via `[Runs]`. */\n public get ContentRunsRaw(): Record<string, unknown>[] {\n return this.contentRunsRaw;\n }\n private contentSourceTypesRaw: Record<string, unknown>[] = [];\n private contentTypesRaw: Record<string, unknown>[] = [];\n private contentFileTypesRaw: Record<string, unknown>[] = [];\n private aiModelsRaw: Record<string, unknown>[] = [];\n\n /** Exposes raw content types to the Content Types tab via `[ContentTypes]`. */\n public get ContentTypesRaw(): Record<string, unknown>[] {\n return this.contentTypesRaw;\n }\n /** Exposes raw content sources to the Content Types tab via `[Sources]`. */\n public get ContentSourcesRaw(): Record<string, unknown>[] {\n return this.contentSourcesRaw;\n }\n /** Exposes raw content items to the Content Types / Tag Library tabs via `[Items]`/`[ContentItems]`. */\n public get ContentItemsRaw(): Record<string, unknown>[] {\n return this.contentItemsRaw;\n }\n /** Exposes raw content item tags to the Tag Library tab via `[ContentTags]`. */\n public get ContentTagsRaw(): Record<string, unknown>[] {\n return this.contentTagsRaw;\n }\n /** Exposes the accurate total item count to the Content Types / Sources tabs via `[TotalItemCount]`. */\n public get TotalContentItemCount(): number {\n return this.totalContentItemCount;\n }\n /** Exposes the accurate total tag count to the Sources tab via `[TotalTagCount]`. */\n public get TotalContentTagCount(): number {\n return this.totalContentTagCount;\n }\n /** Exposes the cached ScheduledAction entities to the Sources tab via `[ScheduledActions]`. */\n public get ScheduledActionsCache(): Map<string, MJScheduledActionEntity> {\n return this.scheduledActionsCache;\n }\n /** Exposes the EntityRecordDocument IDβ†’RecordID cache to the Sources tab via `[EntityRecordDocCache]`. */\n public get EntityRecordDocCacheMap(): Map<string, string> {\n return this.entityRecordDocCache;\n }\n\n /**\n * Reload the shared source list after the Sources tab mutates a source\n * (delete / schedule change). Rebinding `contentSourcesRaw` flows through the\n * tab's `[Sources]` input setter, which rebuilds its cards.\n */\n public async OnSourcesDataChanged(): Promise<void> {\n await this.refreshSourcesTab();\n }\n\n /**\n * Hook for the Taxonomy tab's `(DataChanged)` output. The taxonomy tab owns\n * and reloads its own data; the host has no shared taxonomy surface to\n * refresh today, so this is a no-op placeholder kept for future cross-tab wiring.\n */\n public OnTaxonomyDataChanged(): void {\n // No host-owned taxonomy surface to refresh; the tab manages its own data.\n }\n\n // ── Lifecycle ──\n\n private static readonly PREFS_KEY = 'KH_Classify_Preferences';\n private static readonly VALID_TABS: TabName[] = ['pipeline', 'sources', 'types', 'tags', 'taxonomy', 'inbox', 'health', 'history'];\n\n /** Lightweight count of Pending tag suggestions for the Inbox nav badge. */\n public InboxPendingCount = 0;\n\n /** Lightweight count of Pending health-signal suggestions for the Health nav badge. */\n public HealthPendingCount = 0;\n\n /** Live reference to the Suggestions Inbox tab (for refresh after host actions). */\n @ViewChild(ClassifyInboxTabComponent) private inboxTab?: ClassifyInboxTabComponent;\n\n /** Live reference to the Tag Health tab (for refresh after host actions). */\n @ViewChild(ClassifyHealthTabComponent) private healthTab?: ClassifyHealthTabComponent;\n\n async ngAfterViewInit(): Promise<void> {\n await Promise.all([\n KnowledgeHubMetadataEngine.Instance.Config(false),\n UserInfoEngine.Instance.Config(false),\n ]);\n this.loadClassifyPreferences();\n this.applyIncomingConfiguration();\n await Promise.all([this.LoadPipelineData(), this.loadEntityRecordDocCache(), this.loadInboxPendingCount(), this.loadHealthPendingCount()]);\n this.tabDataLoaded.add('pipeline');\n this.buildNavItems();\n\n // If user preferences or incoming config set a non-pipeline initial tab,\n // eagerly load that tab's data so it is not blank on first render.\n if (this.ActiveTab !== 'pipeline' && !this.tabDataLoaded.has(this.ActiveTab)) {\n await this.loadTabData(this.ActiveTab);\n this.tabDataLoaded.add(this.ActiveTab);\n }\n\n this.IsLoading = false;\n this.registerAgentTools();\n this.emitAgentContext();\n\n // D9: If navigated with tagSearch, switch to tags tab and pre-fill search\n await this.handleInitialTagSearch();\n\n this.cdr.detectChanges();\n this.NotifyLoadComplete();\n }\n\n /**\n * D9: Read incoming configuration from ResourceData (e.g. from Analytics tag navigation).\n * Sets the initial tab and tag search query if provided.\n */\n private applyIncomingConfiguration(): void {\n const config = this.Data?.Configuration as Record<string, unknown> | undefined;\n if (!config) return;\n\n const initialTab = config['initialTab'] as TabName | undefined;\n if (initialTab) {\n this.ActiveTab = initialTab;\n }\n }\n\n /**\n * D9: If a tagSearch parameter was provided via configuration, switch to the tags tab\n * and apply the search filter after tag data loads.\n */\n private async handleInitialTagSearch(): Promise<void> {\n const config = this.Data?.Configuration as Record<string, unknown> | undefined;\n const tagSearch = config?.['tagSearch'] as string | undefined;\n if (!tagSearch) return;\n\n // Switch to the tags tab so ClassifyTagsTabComponent renders and the\n // ViewChild resolves, ensuring its data is loaded.\n if (this.ActiveTab !== 'tags') {\n this.ActiveTab = 'tags';\n }\n if (!this.tabDataLoaded.has('tags')) {\n await this.loadTabData('tags');\n this.tabDataLoaded.add('tags');\n }\n this.cdr.detectChanges();\n\n this.tagsTab?.ApplySearch(tagSearch);\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /** Report current classify dashboard state to the agent */\n private emitAgentContext(): void {\n this.navigationService.SetAgentContext(this, {\n ActiveTab: this.ActiveTab,\n SourceCount: this.contentSourcesRaw.length,\n ContentItemCount: this.contentItemsRaw.length,\n TagCount: this.contentTagsRaw.length,\n PipelineStatus: this.IsRunning ? 'running' : 'idle',\n PipelineProgress: this.RunProgress,\n ShowPipelineConfig: this.ShowPipelineConfig,\n InboxPendingCount: this.InboxPendingCount,\n });\n }\n\n /** Register client tools the agent can invoke on the Classify dashboard */\n private registerAgentTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'SwitchClassifyTab',\n Description: 'Switch to a specific tab in the Classify dashboard',\n ParameterSchema: {\n type: 'object',\n properties: {\n tab: { type: 'string', enum: ['pipeline', 'sources', 'types', 'tags', 'taxonomy', 'inbox', 'health', 'history'], description: 'The tab to switch to' },\n },\n required: ['tab'],\n },\n Handler: async (params: Record<string, unknown>) => {\n await this.SwitchTab(params['tab'] as TabName);\n return { Success: true, Data: { ActiveTab: this.ActiveTab } };\n },\n },\n {\n Name: 'RunClassificationPipeline',\n Description: 'Trigger the content classification pipeline. Optionally filter to specific content source IDs.',\n ParameterSchema: {\n type: 'object',\n properties: {\n sourceIDs: { type: 'array', items: { type: 'string' }, description: 'Optional array of ContentSource IDs to process. Omit to run all.' },\n },\n },\n Handler: async (params: Record<string, unknown>) => {\n const sourceIDs = params['sourceIDs'] as string[] | undefined;\n await this.RunPipeline(sourceIDs);\n return { Success: true, Data: { PipelineStatus: 'running' } };\n },\n },\n {\n Name: 'SearchClassifyTags',\n Description: 'Filter the tag library by a search query',\n ParameterSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search text to filter tags by' },\n },\n required: ['query'],\n },\n Handler: async (params: Record<string, unknown>) => {\n // Ensure the Tag Library tab is active + rendered so its\n // ViewChild resolves, then delegate the search to it.\n await this.SwitchTab('tags');\n this.cdr.detectChanges();\n const matchCount = this.tagsTab?.ApplySearch(String(params['query'] ?? '')) ?? 0;\n return { Success: true, Data: { MatchCount: matchCount } };\n },\n },\n ]);\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Classify';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-tags';\n }\n\n // ── Tab switching ──\n\n /**\n * Wraps `NavItems` for `<mj-left-nav>`. Hardcoded \"Run History\" item goes\n * into a second `MJLeftNavSection` β€” the rail's natural section break\n * replaces the bespoke `.at-nav-divider` line.\n */\n public get navSections(): MJLeftNavSection[] {\n return [\n {\n items: this.NavItems.map(n => ({\n id: n.Tab,\n label: n.Label,\n icon: n.Icon,\n badge: n.BadgeText || undefined\n }))\n },\n {\n items: [\n {\n id: 'inbox',\n label: 'Inbox',\n icon: 'fa-solid fa-inbox',\n badge: this.InboxPendingCount > 0 ? String(this.InboxPendingCount) : undefined\n },\n {\n id: 'health',\n label: 'Health',\n icon: 'fa-solid fa-heart-pulse',\n badge: this.HealthPendingCount > 0 ? String(this.HealthPendingCount) : undefined\n },\n {\n id: 'history',\n label: 'Run History',\n icon: 'fa-solid fa-clock-rotate-left'\n }\n ]\n }\n ];\n }\n\n /**\n * Loads a lightweight count of Pending tag suggestions for the Inbox nav badge\n * so the badge shows even before the Inbox tab is first opened. Mirrors the\n * Inbox tab's default scope: excludes the 3 Health-owned reasons\n * (MergeCandidate / LowUsage / WideNode).\n */\n private async loadInboxPendingCount(): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: Tag Suggestions',\n ExtraFilter: `Status='Pending' AND Reason NOT IN ('MergeCandidate','LowUsage','WideNode')`,\n Fields: ['ID'],\n ResultType: 'simple',\n });\n this.InboxPendingCount = result.Success ? result.TotalRowCount : 0;\n }\n\n /**\n * Fired by the Inbox tab after a suggestion is approved/merged/rejected.\n * Refreshes the nav badge count.\n */\n public async onInboxResolved(): Promise<void> {\n await this.loadInboxPendingCount();\n this.emitAgentContext();\n this.cdr.detectChanges();\n }\n\n /**\n * Loads a lightweight count of Pending health-signal suggestions for the\n * Health nav badge β€” the 3 reasons the Inbox excludes (MergeCandidate /\n * LowUsage / WideNode), which the Tag Health tab owns.\n */\n private async loadHealthPendingCount(): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: Tag Suggestions',\n ExtraFilter: `Status='Pending' AND Reason IN ('MergeCandidate','LowUsage','WideNode')`,\n Fields: ['ID'],\n ResultType: 'simple',\n });\n this.HealthPendingCount = result.Success ? result.TotalRowCount : 0;\n }\n\n /**\n * Fired by the Health tab after a merge/deprecate/dismiss. Refreshes the\n * Health nav badge count.\n */\n public async onHealthResolved(): Promise<void> {\n await this.loadHealthPendingCount();\n this.emitAgentContext();\n this.cdr.detectChanges();\n }\n\n /**\n * Fired by the Health tab's \"Review in Taxonomy\" action with a tag ID. The\n * Taxonomy tab has no public select-tag input today, so this simply switches\n * to it; selecting the specific node is a future enhancement.\n */\n public onOpenInTaxonomyRequested(_tagID: string): void {\n void this.SwitchTab('taxonomy');\n }\n\n /** Adapter for `<mj-left-nav>`'s `(ItemClicked)` output. */\n public onNavItemClicked(item: MJLeftNavItem): void {\n void this.SwitchTab(item.id as TabName);\n }\n\n public async SwitchTab(tab: TabName): Promise<void> {\n if (tab === this.ActiveTab) return;\n this.ActiveTab = tab;\n this.persistClassifyPreferences();\n this.emitAgentContext();\n this.cdr.detectChanges();\n\n if (!this.tabDataLoaded.has(tab)) {\n await this.loadTabData(tab);\n this.tabDataLoaded.add(tab);\n this.cdr.detectChanges();\n }\n }\n\n private async loadTabData(tab: TabName): Promise<void> {\n switch (tab) {\n case 'pipeline':\n await this.LoadPipelineData();\n break;\n case 'sources':\n await this.loadSourcesData();\n break;\n case 'types':\n await this.loadContentTypesData();\n break;\n case 'tags':\n await this.loadTagLibraryData();\n break;\n case 'taxonomy':\n // The Taxonomy tab self-loads its own data in ngOnInit; nothing\n // host-side to fetch. Case present so the switch covers all tabs.\n break;\n case 'inbox':\n // The Inbox tab loads its own (transactional, uncached) data.\n // Trigger CD so the ViewChild resolves, then ask it to load.\n this.cdr.detectChanges();\n await this.inboxTab?.EnsureLoaded();\n break;\n case 'health':\n // The Health tab loads its own (transactional, uncached) data.\n // Trigger CD so the ViewChild resolves, then ask it to load.\n this.cdr.detectChanges();\n await this.healthTab?.EnsureLoaded();\n break;\n case 'history':\n await this.loadRunHistoryData();\n break;\n }\n }\n\n // ════════════════════════════════════════════\n // PIPELINE TAB β€” Data Loading & Building\n // ════════════════════════════════════════════\n\n public async LoadPipelineData(): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [sourcesResult, itemsResult, runsResult, tagsResult, sourceTypesResult, contentTypesResult] = await rv.RunViews([\n { EntityName: 'MJ: Content Sources', OrderBy: 'Name', ResultType: 'simple' },\n { EntityName: 'MJ: Content Items', OrderBy: '__mj_UpdatedAt DESC', MaxRows: 200, ResultType: 'simple', Fields: ['ID', 'Name', 'ContentSourceID', 'ContentSourceTypeID', 'ContentSource', 'ContentSourceType', 'ContentType', 'ContentFileType', 'URL', 'Text', 'Checksum', 'EntityRecordDocumentID', '__mj_CreatedAt', '__mj_UpdatedAt'] },\n { EntityName: 'MJ: Content Process Runs', OrderBy: 'StartTime DESC', MaxRows: 100, ResultType: 'simple' },\n { EntityName: 'MJ: Content Item Tags', ResultType: 'simple', Fields: ['ID', 'ItemID', 'Item', 'Tag', 'TagID', 'Weight', '__mj_CreatedAt'] },\n { EntityName: 'MJ: Content Source Types', ResultType: 'simple' },\n { EntityName: 'MJ: Content Types', ResultType: 'simple' }\n ]);\n\n this.contentSourcesRaw = sourcesResult.Success ? sourcesResult.Results : [];\n this.contentItemsRaw = itemsResult.Success ? itemsResult.Results : [];\n this.contentRunsRaw = runsResult.Success ? runsResult.Results : [];\n this.contentTagsRaw = tagsResult.Success ? tagsResult.Results : [];\n this.contentSourceTypesRaw = sourceTypesResult.Success ? sourceTypesResult.Results : [];\n this.contentTypesRaw = contentTypesResult.Success ? contentTypesResult.Results : [];\n\n // Use TotalRowCount for accurate KPI/badge counts (the Results arrays are\n // capped by MaxRows for feed display, but TotalRowCount reflects the full DB count)\n this.totalContentItemCount = itemsResult.Success ? itemsResult.TotalRowCount : 0;\n this.totalContentTagCount = tagsResult.Success ? tagsResult.TotalRowCount : 0;\n\n // Load ScheduledAction entities referenced by sources so cron descriptions are available\n await this.loadScheduledActionsForSources();\n\n this.buildNavItems();\n this.buildKPIMetrics();\n this.buildPipelineStages();\n this.buildFeedItems();\n this.buildSourceMinis();\n this.buildTrendingTags();\n } catch (error) {\n console.error('[Autotagging] Error loading pipeline data:', error);\n }\n }\n\n private buildNavItems(): void {\n // Classify dashboard owns the autotag pipeline run-management surface plus\n // the Tag Library + Taxonomy Governance curation surfaces (Governance /\n // Synonyms / Scope editors live on the Taxonomy tab). All curation tabs are\n // surfaced here so they're directly reachable, not just agent-reachable.\n this.NavItems = [\n { Tab: 'pipeline', Icon: 'fa-solid fa-gauge-high', Label: 'Pipeline', BadgeText: this.IsRunning ? 'Live' : '', BadgeClass: 'nav-badge-live' },\n { Tab: 'sources', Icon: 'fa-solid fa-database', Label: 'Sources', BadgeText: String(this.contentSourcesRaw.length), BadgeClass: '' },\n { Tab: 'types', Icon: 'fa-solid fa-sliders', Label: 'Content Types', BadgeText: String(this.contentTypesRaw.length), BadgeClass: '' },\n { Tab: 'tags', Icon: 'fa-solid fa-tags', Label: 'Tag Library', BadgeText: '', BadgeClass: '' },\n { Tab: 'taxonomy', Icon: 'fa-solid fa-sitemap', Label: 'Taxonomy', BadgeText: '', BadgeClass: '' },\n ];\n }\n\n private buildKPIMetrics(): void {\n const sourceCount = this.contentSourcesRaw.length;\n const itemCount = this.totalContentItemCount;\n const tagCount = this.totalContentTagCount;\n const errorCount = this.contentRunsRaw.filter(r => (r['Status'] as string)?.toLowerCase() === 'error' || (r['Status'] as string)?.toLowerCase() === 'failed').length;\n\n this.KPIMetrics = [\n { Label: 'Active Sources', Value: sourceCount, Icon: 'fa-solid fa-satellite-dish', Trend: '', TrendUp: true },\n { Label: 'Content Items', Value: itemCount, Icon: 'fa-solid fa-file-lines', Trend: '', TrendUp: true },\n { Label: 'Tags Generated', Value: tagCount, Icon: 'fa-solid fa-tags', Trend: tagCount > 0 && itemCount > 0 ? `${(tagCount / itemCount).toFixed(1)} avg/item` : '', TrendUp: true },\n { Label: 'Errors', Value: errorCount, Icon: 'fa-solid fa-circle-exclamation', Trend: '', TrendUp: false }\n ];\n }\n\n private buildPipelineStages(): void {\n this.PipelineStages = [\n { Name: 'Ingest', Icon: 'fa-solid fa-download', Status: 'idle', Count: '\\u2014' },\n { Name: 'Extract', Icon: 'fa-solid fa-file-lines', Status: 'idle', Count: '\\u2014' },\n { Name: 'Chunk', Icon: 'fa-solid fa-scissors', Status: 'idle', Count: '\\u2014' },\n { Name: 'Tag', Icon: 'fa-solid fa-tags', Status: 'idle', Count: '\\u2014' },\n { Name: 'Vectorize', Icon: 'fa-solid fa-vector-square', Status: 'idle', Count: '\\u2014' }\n ];\n }\n\n private buildFeedItems(): void {\n const tagsByItem = this.countTagsByItem();\n\n this.FeedItems = this.contentItemsRaw.map(item => {\n const itemId = item['ID'] as string;\n const normalizedId = NormalizeUUID(itemId);\n const itemTags = this.getTopTagsForItem(itemId, 3);\n return {\n Name: (item['Name'] as string) ?? 'Unnamed Item',\n SourceName: (item['ContentSource'] as string) ?? 'Unknown',\n Tags: itemTags,\n TimeAgo: this.formatRelativeTime(item['__mj_UpdatedAt'] as string),\n Status: this.inferItemStatus(tagsByItem.get(normalizedId) ?? 0)\n };\n });\n }\n\n private buildSourceMinis(): void {\n // When items are capped by MaxRows, countItemsBySource() undercounts.\n // For a single source, use the accurate totalContentItemCount instead.\n const singleSource = this.contentSourcesRaw.length === 1;\n const itemCountBySource = singleSource ? null : this.countItemsBySource();\n this.SourceMinis = this.contentSourcesRaw.map(source => {\n const id = source['ID'] as string;\n const itemCount = singleSource ? this.totalContentItemCount : (itemCountBySource!.get(id) ?? 0);\n const typeName = (source['ContentSourceType'] as string) ?? 'Unknown';\n return {\n ID: id,\n Name: (source['Name'] as string) ?? 'Unnamed',\n Icon: getSourceTypeIcon(typeName),\n Meta: `${formatNumber(itemCount)} items`,\n StatusClass: 'active' as const\n };\n });\n }\n\n /**\n * D6: Build trending tags weighted by recency (last 7 days).\n * Counts tags from ContentItemTag records created in the last 7 days\n * and weights by frequency. Falls back to all-time data if no recent tags.\n */\n private buildTrendingTags(): void {\n const sevenDaysAgo = new Date(Date.now() - 7 * 86400000);\n const recentTags = this.contentTagsRaw.filter(tag => {\n const d = tag['__mj_CreatedAt'] as string | undefined;\n return d && new Date(d) >= sevenDaysAgo;\n });\n\n const scored = this.computeTrendingFromTags(recentTags.length > 0 ? recentTags : this.contentTagsRaw);\n const maxScore = scored.length > 0 ? scored[0].score : 1;\n\n this.TrendingTags = scored.map(s => ({\n Tag: s.tag,\n AvgWeight: s.weight,\n SizeClass: s.score >= maxScore * 0.7 ? 'large' : s.score >= maxScore * 0.3 ? '' : 'small'\n }));\n }\n\n /**\n * Compute scored trending tags from a given set of tag records.\n * Returns top 12 tags sorted by score (frequency x avg weight).\n */\n private computeTrendingFromTags(tags: Record<string, unknown>[]): { tag: string; count: number; weight: number; score: number }[] {\n const counts = new Map<string, number>();\n const weightSums = new Map<string, number>();\n for (const tag of tags) {\n const t = tag['Tag'] as string;\n const w = Number(tag['Weight'] ?? 0.5);\n if (t) {\n counts.set(t, (counts.get(t) ?? 0) + 1);\n weightSums.set(t, (weightSums.get(t) ?? 0) + w);\n }\n }\n return Array.from(counts.entries()).map(([tag, count]) => {\n const weight = count > 0 ? (weightSums.get(tag) ?? 0) / count : 1.0;\n return { tag, count, weight, score: count * weight };\n }).sort((a, b) => b.score - a.score).slice(0, 12);\n }\n\n // ════════════════════════════════════════════\n // SOURCES TAB\n // ════════════════════════════════════════════\n\n private async loadSourcesData(): Promise<void> {\n // Just ensure the shared raw data is loaded; ClassifySourcesTabComponent\n // rebuilds its source cards from its [Sources]/[Items]/[Tags]/[Runs] inputs.\n await this.ensureBaseDataLoaded();\n }\n\n // buildSourceCards() + the source-detail/schedule helpers\n // (resolveEntityRecordID, resolveEntityName, countTagsBySource,\n // getLastRunBySource, getScheduledActionCron, resolveEmbeddingModelName,\n // resolveVectorIndexName, loadContentItemsForSource, loadRunHistoryForSource)\n // moved to ClassifySourcesTabComponent.\n\n /** Check if a source type's Configuration says RequiresFileType !== false */\n private sourceTypeRequiresFileType(sourceTypeID: string): boolean {\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const st = engine.ContentSourceTypes.find(t => UUIDsEqual(t.ID, sourceTypeID));\n return st?.ConfigurationObject?.RequiresFileType !== false;\n } catch {\n return true;\n }\n }\n\n // ════════════════════════════════════════════\n // CONTENT TYPES TAB\n // ════════════════════════════════════════════\n\n private async loadContentTypesData(): Promise<void> {\n if (this.contentTypesRaw.length === 0) {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({ EntityName: 'MJ: Content Types', ResultType: 'simple' });\n if (result.Success) this.contentTypesRaw = result.Results;\n }\n await this.ensureBaseDataLoaded();\n // Card building lives in ClassifyTypesTabComponent, which rebuilds from\n // its [ContentTypes]/[Sources]/[Items]/[TotalItemCount] inputs.\n }\n\n // ════════════════════════════════════════════\n // TAG LIBRARY TAB\n // ════════════════════════════════════════════\n\n private async loadTagLibraryData(): Promise<void> {\n // Just ensure the shared raw data is loaded; ClassifyTagsTabComponent\n // rebuilds its view models from the [ContentTags]/[ContentItems] inputs.\n await this.ensureBaseDataLoaded();\n }\n\n // ToCompositeKey / FromCompositeKey tree-dropdown helpers moved to\n // ClassifySourceTypeFormDialogComponent (only the slide-in form used them).\n\n // ════════════════════════════════════════════\n // RUN HISTORY TAB\n // ════════════════════════════════════════════\n\n private async loadRunHistoryData(): Promise<void> {\n if (this.contentRunsRaw.length === 0) {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({\n EntityName: 'MJ: Content Process Runs',\n OrderBy: 'StartTime DESC',\n MaxRows: 200,\n ResultType: 'simple'\n });\n if (result.Success) this.contentRunsRaw = result.Results;\n }\n }\n\n /**\n * D2: Load live per-source progress for the currently running pipeline.\n * Called when the pipeline is actively running.\n */\n public async LoadLiveRunDetails(): Promise<void> {\n // Find the most recent running pipeline run\n const runningRun = this.contentRunsRaw.find(r => {\n const status = String(r['Status'] || '').toLowerCase();\n return status === 'running' || status === 'processing' || status === 'in progress';\n });\n if (!runningRun) {\n this.LiveRunDetailRows = [];\n return;\n }\n\n this.IsLoadingLiveDetails = true;\n this.cdr.detectChanges();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({\n EntityName: 'MJ: Content Process Run Details',\n ExtraFilter: `ContentProcessRunID='${String(runningRun['ID'])}'`,\n OrderBy: 'ContentSource',\n ResultType: 'simple',\n });\n if (result.Success) {\n this.LiveRunDetailRows = mapRunDetailRecords(result.Results);\n }\n\n this.IsLoadingLiveDetails = false;\n this.cdr.detectChanges();\n }\n\n // ════════════════════════════════════════════\n // SLIDE-IN FORM β€” thin delegators to ClassifySourceTypeFormDialogComponent\n // ════════════════════════════════════════════\n //\n // The Sources/Types tabs still emit (AddSourceRequested) etc.; these handlers\n // forward the request to the slide-in form dialog (the @ViewChild) which owns\n // all form state, validation, and persistence. After a successful save the\n // dialog emits (Saved) β†’ onFormSaved() reloads the right shared data.\n\n public OpenAddSourceForm(): void {\n // Feed the dialog the raw source rows so edit can hydrate Configuration JSON.\n if (this.formDialog) this.formDialog.RawSources = this.contentSourcesRaw;\n void this.formDialog?.OpenAddSource();\n }\n\n public OpenEditSourceForm(card: SourceCard): void {\n if (this.formDialog) this.formDialog.RawSources = this.contentSourcesRaw;\n void this.formDialog?.OpenEditSource(card);\n }\n\n public OpenAddTypeForm(): void {\n void this.formDialog?.OpenAddType();\n }\n\n public OpenEditTypeForm(card: ContentTypeCard): void {\n void this.formDialog?.OpenEditType(card);\n }\n\n /**\n * Reload the relevant shared data after the slide-in form saves. The form\n * dialog closes itself; the host only re-pulls the cards' source data.\n */\n public async onFormSaved(event: { kind: 'source' | 'type' }): Promise<void> {\n if (event.kind === 'source') {\n await this.refreshSourcesTab();\n } else {\n await this.refreshContentTypesTab();\n }\n }\n\n /**\n * The form dialog's \"Open advanced settings\" link bubbles up here so the host\n * (which owns NavigationService) can open the full entity form.\n */\n public async onFormNavigateToRecord(event: { entityName: string; key: CompositeKey }): Promise<void> {\n await this.navigationService.OpenEntityRecord(event.entityName, event.key);\n }\n\n // DeleteSource(), the quick-schedule dialog (Open/Close/Save/Remove + cron\n // label/preview helpers + getScheduledActionCron, findAutotagActionID,\n // createSourceIDParam, linkScheduleToSource) moved to\n // ClassifySourcesTabComponent. loadScheduledActionsForSources() stays here\n // because the host's LoadPipelineData / refreshSourcesTab populate the cache\n // it exposes to the tab via [ScheduledActions].\n\n /**\n * Loads ScheduledAction entities referenced by content sources into the local cache.\n * Called during initial data load so cron descriptions are available for card rendering.\n */\n private async loadScheduledActionsForSources(): Promise<void> {\n const actionIDs = this.contentSourcesRaw\n .map(s => s['ScheduledActionID'] as string | null)\n .filter((id): id is string => id != null);\n\n if (actionIDs.length === 0) return;\n\n const uniqueIDs = [...new Set(actionIDs.map(id => NormalizeUUID(id)))];\n // Skip IDs already cached\n const toLoad = uniqueIDs.filter(id => !this.scheduledActionsCache.has(id));\n if (toLoad.length === 0) return;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const filter = toLoad.map(id => `'${id}'`).join(',');\n const result = await rv.RunView<MJScheduledActionEntity>({\n EntityName: 'MJ: Scheduled Actions',\n ExtraFilter: `ID IN (${filter})`,\n ResultType: 'entity_object',\n });\n\n if (result.Success) {\n for (const action of result.Results) {\n this.scheduledActionsCache.set(NormalizeUUID(action.ID), action);\n }\n }\n }\n\n // SLIDE-IN FORM β€” Content Types: open/save/close logic + the source open/save\n // logic moved to ClassifySourceTypeFormDialogComponent (see thin delegators\n // above).\n\n // ════════════════════════════════════════════\n // PIPELINE RUN\n // ════════════════════════════════════════════\n\n /**\n * Run the pipeline for a specific content source only.\n */\n public async RunPipelineForSource(contentSourceID: string): Promise<void> {\n return this.RunPipeline([contentSourceID]);\n }\n\n public async RunPipeline(contentSourceIDs?: string[]): Promise<void> {\n if (this.IsRunning) return;\n\n const provider = this.ProviderToUse as GraphQLDataProvider;\n if (!provider) return;\n\n this.IsRunning = true;\n this.IsPaused = false;\n this.RunProgress = 0;\n this.RunStage = 'Starting...';\n this.RunCurrentItem = '';\n this.CurrentPipelineRunID = null;\n this.CurrentProcessRunID = null;\n this.cdr.detectChanges();\n\n try {\n const aiClient = new GraphQLAIClient(provider);\n const result = await aiClient.RunAutotagPipeline(\n contentSourceIDs ? { contentSourceIDs } : undefined\n );\n\n if (!result.Success || !result.PipelineRunID) {\n this.IsRunning = false;\n this.RunStage = '';\n MJNotificationService.Instance.CreateSimpleNotification(\n `Pipeline failed: ${result.ErrorMessage ?? 'Unknown error'}`, 'error', 5000\n );\n this.cdr.detectChanges();\n return;\n }\n\n this.CurrentPipelineRunID = result.PipelineRunID;\n this.subscribeToPipelineProgress(result.PipelineRunID);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[Autotagging] Error starting pipeline:', msg);\n this.IsRunning = false;\n this.RunStage = '';\n MJNotificationService.Instance.CreateSimpleNotification(`Pipeline error: ${msg}`, 'error', 5000);\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Pause a running classification pipeline. The server sets CancellationRequested\n * on the process run so the engine pauses gracefully after the current batch.\n */\n public async PausePipeline(): Promise<void> {\n if (!this.IsRunning || this.IsPaused || !this.CurrentProcessRunID) return;\n\n const provider = this.ProviderToUse as GraphQLDataProvider;\n if (!provider) return;\n\n try {\n const aiClient = new GraphQLAIClient(provider);\n const result = await aiClient.PauseClassificationPipeline(this.CurrentProcessRunID);\n if (result.Success) {\n this.IsPaused = true;\n this.RunStage = 'Pausing...';\n MJNotificationService.Instance.CreateSimpleNotification('Pipeline pause requested', 'info', 3000);\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Pause failed: ${result.ErrorMessage ?? 'Unknown error'}`, 'error', 4000\n );\n }\n this.cdr.detectChanges();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Pause error: ${msg}`, 'error', 4000);\n }\n }\n\n /**\n * Resume a paused classification pipeline from its last completed offset.\n */\n public async ResumePipeline(): Promise<void> {\n if (!this.IsPaused || !this.CurrentProcessRunID) return;\n\n const provider = this.ProviderToUse as GraphQLDataProvider;\n if (!provider) return;\n\n try {\n const aiClient = new GraphQLAIClient(provider);\n const result = await aiClient.ResumeClassificationPipeline(this.CurrentProcessRunID);\n if (result.Success) {\n this.IsPaused = false;\n this.IsRunning = true;\n this.RunStage = 'Resuming...';\n if (result.PipelineRunID) {\n this.CurrentPipelineRunID = result.PipelineRunID;\n this.subscribeToPipelineProgress(result.PipelineRunID);\n }\n MJNotificationService.Instance.CreateSimpleNotification('Pipeline resumed', 'success', 3000);\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Resume failed: ${result.ErrorMessage ?? 'Unknown error'}`, 'error', 4000\n );\n }\n this.cdr.detectChanges();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Resume error: ${msg}`, 'error', 4000);\n }\n }\n\n /**\n * Cancel a running or paused pipeline. Uses pause mechanism and resets UI state.\n */\n public async CancelPipeline(): Promise<void> {\n if (!this.CurrentProcessRunID && !this.IsRunning) return;\n\n const provider = this.ProviderToUse as GraphQLDataProvider;\n if (!provider) return;\n\n // If we have a process run ID, request server-side cancellation\n if (this.CurrentProcessRunID) {\n try {\n const aiClient = new GraphQLAIClient(provider);\n await aiClient.PauseClassificationPipeline(this.CurrentProcessRunID);\n } catch {\n // Best-effort cancellation β€” proceed with UI reset regardless\n }\n }\n\n this.IsRunning = false;\n this.IsPaused = false;\n this.RunProgress = 0;\n this.RunStage = '';\n this.RunCurrentItem = '';\n this.CurrentPipelineRunID = null;\n this.CurrentProcessRunID = null;\n MJNotificationService.Instance.CreateSimpleNotification('Pipeline cancelled', 'info', 3000);\n this.cdr.detectChanges();\n }\n\n private subscribeToPipelineProgress(pipelineRunID: 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 CurrentItem\n PercentComplete\n ElapsedMs\n }\n }\n `;\n\n let idleTimer: ReturnType<typeof setTimeout> | null = null;\n\n const finishPipeline = (success: boolean) => {\n if (idleTimer) clearTimeout(idleTimer);\n rxSub?.unsubscribe();\n\n Promise.resolve().then(async () => {\n this.IsRunning = false;\n this.IsPaused = false;\n this.RunStage = success ? 'Complete' : 'Error';\n this.RunProgress = success ? 100 : 0;\n this.CurrentPipelineRunID = null;\n this.CurrentProcessRunID = null;\n\n for (const stage of this.PipelineStages) {\n stage.Status = 'idle';\n stage.Count = '\\u2014';\n }\n\n if (success) {\n this.tabDataLoaded.clear();\n // Reload pipeline data AND refresh ERD cache (new EntityRecordDocuments\n // may have been created by the pipeline for entity sources)\n this.entityRecordDocCache.clear();\n await Promise.all([\n this.LoadPipelineData(),\n this.loadEntityRecordDocCache(),\n ]);\n this.tabDataLoaded.add('pipeline');\n MJNotificationService.Instance.CreateSimpleNotification('Pipeline complete', 'success', 3000);\n }\n this.cdr.detectChanges();\n });\n };\n\n const resetIdleTimer = () => {\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => {\n if (this.IsRunning) finishPipeline(true);\n }, 30000);\n };\n\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 const currentItem = progress['CurrentItem'] as string | undefined;\n\n this.RunProgress = Math.min(100, Math.max(0, pct));\n this.RunStage = this.formatStageName(stage);\n this.RunCurrentItem = currentItem ?? '';\n this.updateStagesForActiveRun(stage);\n this.cdr.detectChanges();\n\n if (stage === 'complete') {\n finishPipeline(true);\n } else if (stage === 'error') {\n finishPipeline(false);\n } else {\n resetIdleTimer();\n }\n },\n error: (err: unknown) => {\n console.error('[Autotagging] Pipeline subscription error:', err);\n finishPipeline(false);\n }\n });\n }\n\n private updateStagesForActiveRun(activeStageCode: string): void {\n const stageCodeToName: Record<string, string> = {\n 'ingest': 'Ingest', 'extract': 'Extract', 'chunk': 'Chunk',\n 'tag': 'Tag', 'autotag': 'Tag', 'vectorize': 'Vectorize'\n };\n const activeName = stageCodeToName[activeStageCode] ?? '';\n let passedActive = false;\n\n for (const stage of this.PipelineStages) {\n if (stage.Name === activeName) {\n stage.Status = 'active';\n passedActive = true;\n } else if (!passedActive) {\n stage.Status = 'complete';\n } else {\n stage.Status = 'idle';\n }\n }\n }\n\n private formatStageName(stage: string): string {\n const map: Record<string, string> = {\n 'extract': 'Extracting content', 'autotag': 'Running classifiers',\n 'vectorize': 'Vectorizing content', 'complete': 'Complete',\n 'error': 'Error', 'ingest': 'Ingesting', 'chunk': 'Chunking',\n 'tag': 'Tagging'\n };\n return map[stage] ?? stage;\n }\n\n // ════════════════════════════════════════════\n // HELPER β€” Aggregation utilities\n // ════════════════════════════════════════════\n\n private countTagsByItem(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const tag of this.contentTagsRaw) {\n const itemId = NormalizeUUID(tag['ItemID'] as string);\n if (itemId) counts.set(itemId, (counts.get(itemId) ?? 0) + 1);\n }\n return counts;\n }\n\n private getTopTagsForItem(itemId: string, max: number): string[] {\n const tags: string[] = [];\n for (const tag of this.contentTagsRaw) {\n if (UUIDsEqual(tag['ItemID'] as string, itemId)) {\n tags.push(tag['Tag'] as string);\n if (tags.length >= max) break;\n }\n }\n return tags;\n }\n\n private countItemsBySource(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const item of this.contentItemsRaw) {\n const sourceId = item['ContentSourceID'] as string;\n if (sourceId) counts.set(sourceId, (counts.get(sourceId) ?? 0) + 1);\n }\n return counts;\n }\n\n // countTagsBySource() / getLastRunBySource() moved to\n // ClassifySourcesTabComponent (only the source cards used them).\n // countSourcesByContentType() / countItemsByContentType() moved to\n // ClassifyTypesTabComponent along with buildContentTypeCards().\n\n private inferItemStatus(tagCount: number): 'complete' | 'processing' | 'error' {\n return tagCount > 0 ? 'complete' : 'processing';\n }\n\n // ════════════════════════════════════════════\n // HELPER β€” Formatting\n // ════════════════════════════════════════════\n\n public formatRelativeTime(dateStr: string | null | undefined): string {\n if (!dateStr) return 'Never';\n const now = new Date();\n const then = new Date(dateStr);\n const diffMs = now.getTime() - then.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n\n if (diffMins < 1) return 'Just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n const diffHours = Math.floor(diffMins / 60);\n if (diffHours < 24) return `${diffHours}h ago`;\n const diffDays = Math.floor(diffHours / 24);\n return `${diffDays}d ago`;\n }\n\n // formatNumber / formatDate / getSourceTypeIcon / mapRunDetailRecords are now\n // imported from shared/classify.format.ts (DRY β€” single implementation shared\n // with the tab components). formatShortDate / computeDuration / displayStatus /\n // tagFontSize / formatWeight also live there; the host no longer keeps copies.\n\n // ════════════════════════════════════════════\n // HELPER β€” Data loading\n // ════════════════════════════════════════════\n\n private async ensureBaseDataLoaded(): Promise<void> {\n if (this.contentSourcesRaw.length > 0 && this.contentItemsRaw.length > 0) return;\n await this.LoadPipelineData();\n }\n\n // ensureFormDropdownsLoaded / resetSourceForm / resetTypeForm moved to\n // ClassifySourceTypeFormDialogComponent (they only served the slide-in form).\n\n private async refreshSourcesTab(): Promise<void> {\n this.tabDataLoaded.delete('sources');\n this.tabDataLoaded.delete('pipeline');\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({ EntityName: 'MJ: Content Sources', OrderBy: 'Name', ResultType: 'simple' });\n if (result.Success) this.contentSourcesRaw = result.Results;\n await this.loadScheduledActionsForSources();\n // The new contentSourcesRaw reference flows to ClassifySourcesTabComponent\n // via [Sources]=\"ContentSourcesRaw\", which rebuilds its cards on input change.\n this.buildNavItems();\n this.cdr.detectChanges();\n }\n\n private async refreshContentTypesTab(): Promise<void> {\n this.tabDataLoaded.delete('types');\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({ EntityName: 'MJ: Content Types', ResultType: 'simple' });\n if (result.Success) this.contentTypesRaw = result.Results;\n // The new contentTypesRaw reference flows to ClassifyTypesTabComponent via\n // [ContentTypes]=\"ContentTypesRaw\", which rebuilds its cards on input change.\n this.cdr.detectChanges();\n }\n\n // ════════════════════════════════════════════\n // DETAIL PANELS β€” Feed Item / Content Item\n // ════════════════════════════════════════════\n\n public OpenFeedItemDetail(index: number): void {\n const feed = this.FeedItems[index];\n if (!feed) return;\n\n const rawItem = this.contentItemsRaw[index];\n if (!rawItem) return;\n\n const itemId = rawItem['ID'] as string;\n const allTags = this.getAllWeightedTagsForItem(itemId);\n const tagCount = allTags.length;\n\n const contentSourceTypeID = (rawItem['ContentSourceTypeID'] as string) ?? '';\n const requiresContentType = this.sourceTypeRequiresFileType(contentSourceTypeID);\n\n // For entity sources, resolve the entity record ID from the EntityRecordDocument\n let entityRecordID: string | null = null;\n let entityName: string | null = null;\n if (!requiresContentType) {\n const source = this.contentSourcesRaw.find(s => UUIDsEqual(s['ID'] as string, rawItem['ContentSourceID'] as string));\n if (source) {\n const entityID = source['EntityID'] as string | null;\n if (entityID) {\n const md = this.ProviderToUse;\n const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, entityID));\n entityName = entityInfo?.Name ?? null;\n // Get RecordID from the EntityRecordDocument linked to this content item\n const erdID = rawItem['EntityRecordDocumentID'] as string | null;\n if (erdID) {\n const erd = this.entityRecordDocCache.get(NormalizeUUID(erdID));\n entityRecordID = erd ?? null;\n }\n }\n }\n }\n\n const statuses = this.inferPipelineStatuses(rawItem, tagCount);\n this.SelectedFeedItem = {\n ID: itemId,\n Name: feed.Name,\n SourceName: feed.SourceName,\n SourceTypeName: (rawItem['ContentSourceType'] as string) ?? 'Unknown',\n ContentTypeName: (rawItem['ContentType'] as string) ?? 'Unknown',\n FileTypeName: (rawItem['ContentFileType'] as string) ?? '',\n URL: (rawItem['URL'] as string) ?? '',\n TextContent: (rawItem['Text'] as string) ?? '',\n Checksum: (rawItem['Checksum'] as string) ?? '',\n Tags: allTags,\n CreatedAt: formatDate((rawItem['__mj_CreatedAt'] as string) ?? ''),\n UpdatedAt: formatDate((rawItem['__mj_UpdatedAt'] as string) ?? ''),\n ContentSourceID: (rawItem['ContentSourceID'] as string) ?? '',\n ContentSourceTypeID: contentSourceTypeID,\n StatusDot: feed.Status,\n TagCount: tagCount,\n RequiresContentType: requiresContentType,\n EntityRecordID: entityRecordID,\n EntityName: entityName,\n EmbeddingStatus: statuses.EmbeddingStatus,\n TaggingStatus: statuses.TaggingStatus,\n };\n this.ShowItemDetail = true;\n this.cdr.detectChanges();\n }\n\n public OpenContentItemDetail(item: ContentItemDetail): void {\n this.SelectedFeedItem = item;\n this.ShowItemDetail = true;\n this.cdr.detectChanges();\n }\n\n /** Open content item detail slide-in by content item ID (used from tag drill-down) */\n public OpenItemDetailByID(contentItemID: string): void {\n const rawIndex = this.contentItemsRaw.findIndex(i => UUIDsEqual(i['ID'] as string, contentItemID));\n if (rawIndex < 0) return;\n\n const rawItem = this.contentItemsRaw[rawIndex];\n const itemId = rawItem['ID'] as string;\n const allTags = this.getAllWeightedTagsForItem(itemId);\n const contentSourceTypeID = (rawItem['ContentSourceTypeID'] as string) ?? '';\n const requiresContentType = this.sourceTypeRequiresFileType(contentSourceTypeID);\n\n let entityRecordID: string | null = null;\n let entityName: string | null = null;\n if (!requiresContentType) {\n const source = this.contentSourcesRaw.find(s => UUIDsEqual(s['ID'] as string, rawItem['ContentSourceID'] as string));\n if (source) {\n const entityID = source['EntityID'] as string | null;\n if (entityID) {\n const md = this.ProviderToUse;\n const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, entityID));\n entityName = entityInfo?.Name ?? null;\n const erdID = rawItem['EntityRecordDocumentID'] as string | null;\n if (erdID) {\n entityRecordID = this.entityRecordDocCache.get(NormalizeUUID(erdID)) ?? null;\n }\n }\n }\n }\n\n const statuses2 = this.inferPipelineStatuses(rawItem, allTags.length);\n this.SelectedFeedItem = {\n ID: itemId,\n Name: (rawItem['Name'] as string) ?? 'Unnamed',\n SourceName: (rawItem['ContentSource'] as string) ?? 'Unknown',\n SourceTypeName: (rawItem['ContentSourceType'] as string) ?? 'Unknown',\n ContentTypeName: (rawItem['ContentType'] as string) ?? 'Unknown',\n FileTypeName: (rawItem['ContentFileType'] as string) ?? '',\n URL: (rawItem['URL'] as string) ?? '',\n TextContent: (rawItem['Text'] as string) ?? '',\n Checksum: (rawItem['Checksum'] as string) ?? '',\n Tags: allTags,\n CreatedAt: formatDate((rawItem['__mj_CreatedAt'] as string) ?? ''),\n UpdatedAt: formatDate((rawItem['__mj_UpdatedAt'] as string) ?? ''),\n ContentSourceID: (rawItem['ContentSourceID'] as string) ?? '',\n ContentSourceTypeID: contentSourceTypeID,\n StatusDot: allTags.length > 0 ? 'complete' : 'processing',\n TagCount: allTags.length,\n RequiresContentType: requiresContentType,\n EntityRecordID: entityRecordID,\n EntityName: entityName,\n EmbeddingStatus: statuses2.EmbeddingStatus,\n TaggingStatus: statuses2.TaggingStatus,\n };\n this.ShowItemDetail = true;\n this.cdr.detectChanges();\n }\n\n public CloseItemDetail(): void {\n this.ShowItemDetail = false;\n this.SelectedFeedItem = null;\n this.cdr.detectChanges();\n }\n\n public OpenRecordFromItem(item: ContentItemDetail): void {\n const md = this.ProviderToUse;\n const pkey = new CompositeKey();\n\n // For entity sources: navigate to the actual entity record, not the ContentItem\n if (item.EntityName && item.EntityRecordID) {\n const entityInfo = md.Entities.find(e => e.Name === item.EntityName);\n if (entityInfo) {\n pkey.LoadFromURLSegment(entityInfo, item.EntityRecordID);\n } else {\n pkey.KeyValuePairs = [{ FieldName: 'ID', Value: item.EntityRecordID }];\n }\n this.navigationService.OpenEntityRecord(item.EntityName, pkey);\n } else {\n // For non-entity sources: open the ContentItem record\n pkey.KeyValuePairs = [{ FieldName: 'ID', Value: item.ID }];\n this.navigationService.OpenEntityRecord('MJ: Content Items', pkey);\n }\n }\n\n /** Cache: EntityRecordDocument ID β†’ RecordID */\n private entityRecordDocCache = new Map<string, string>();\n\n /** Load ERD RecordIDs for entity-sourced content items */\n private async loadEntityRecordDocCache(): Promise<void> {\n if (this.entityRecordDocCache.size > 0) return;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{ ID: string; RecordID: string }>({\n EntityName: 'MJ: Entity Record Documents',\n ResultType: 'simple',\n Fields: ['ID', 'RecordID'],\n });\n if (result.Success) {\n for (const erd of result.Results) {\n this.entityRecordDocCache.set(NormalizeUUID(erd.ID), erd.RecordID);\n }\n }\n }\n\n private getAllWeightedTagsForItem(itemId: string): WeightedTag[] {\n const tags: WeightedTag[] = [];\n for (const tag of this.contentTagsRaw) {\n if (UUIDsEqual(tag['ItemID'] as string, itemId)) {\n tags.push({\n Tag: tag['Tag'] as string,\n Weight: Number(tag['Weight'] ?? 1),\n });\n }\n }\n return tags.sort((a, b) => b.Weight - a.Weight);\n }\n\n /**\n * D4: Infer embedding and tagging pipeline statuses for a content item.\n * Uses tag count and run history heuristics since dedicated status columns\n * are not yet available on the ContentItem entity.\n */\n private inferPipelineStatuses(\n rawItem: Record<string, unknown>,\n tagCount: number\n ): { EmbeddingStatus: ItemPipelineStatus; TaggingStatus: ItemPipelineStatus } {\n const explicitEmbedding = rawItem['EmbeddingStatus'] as string | undefined;\n const explicitTagging = rawItem['TaggingStatus'] as string | undefined;\n if (explicitEmbedding || explicitTagging) {\n return {\n EmbeddingStatus: this.mapStatusString(explicitEmbedding),\n TaggingStatus: this.mapStatusString(explicitTagging),\n };\n }\n\n const hasChecksum = !!(rawItem['Checksum'] as string);\n const hasText = !!((rawItem['Text'] as string)?.trim());\n const sourceID = rawItem['ContentSourceID'] as string;\n const lastRun = this.contentRunsRaw.find(r => r['SourceID'] as string === sourceID);\n const lastRunFailed = lastRun &&\n ((lastRun['Status'] as string)?.toLowerCase() === 'error' ||\n (lastRun['Status'] as string)?.toLowerCase() === 'failed');\n\n let embeddingStatus: ItemPipelineStatus = 'Pending';\n if (hasChecksum || hasText) embeddingStatus = 'Complete';\n else if (lastRunFailed) embeddingStatus = 'Failed';\n\n let taggingStatus: ItemPipelineStatus = 'Pending';\n if (tagCount > 0) taggingStatus = 'Complete';\n else if (embeddingStatus === 'Complete') taggingStatus = lastRunFailed ? 'Failed' : 'Pending';\n else if (lastRunFailed) taggingStatus = 'Failed';\n\n return { EmbeddingStatus: embeddingStatus, TaggingStatus: taggingStatus };\n }\n\n /** Map a raw status string to the ItemPipelineStatus union */\n private mapStatusString(status: string | undefined): ItemPipelineStatus {\n if (!status) return 'Pending';\n const lower = status.toLowerCase();\n if (lower === 'complete' || lower === 'completed' || lower === 'done') return 'Complete';\n if (lower === 'processing' || lower === 'running') return 'Processing';\n if (lower === 'failed' || lower === 'error') return 'Failed';\n return 'Pending';\n }\n\n // ════════════════════════════════════════════\n // CONTENT ITEM DUPLICATES (G3)\n // ════════════════════════════════════════════\n\n /** Load pending content item duplicates for review */\n public async LoadContentDuplicates(): Promise<void> {\n this.IsLoadingDuplicates = true;\n this.cdr.detectChanges();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{\n ID: string; ContentItemA: string; ContentItemB: string;\n ContentItemAID: string; ContentItemBID: string;\n SimilarityScore: number; DetectionMethod: string; Status: string;\n }>({\n EntityName: 'MJ: Content Item Duplicates',\n ExtraFilter: `Status = 'Pending'`,\n OrderBy: 'SimilarityScore DESC',\n MaxRows: 100,\n ResultType: 'simple'\n });\n\n if (result.Success) {\n // Look up source names for items\n const itemIDs = new Set<string>();\n for (const row of result.Results) {\n itemIDs.add(row.ContentItemAID);\n itemIDs.add(row.ContentItemBID);\n }\n\n const sourceNameMap = await this.resolveItemSourceNames(Array.from(itemIDs));\n\n this.ContentDuplicates = result.Results.map(row => ({\n ID: row.ID,\n ItemAName: row.ContentItemA || 'Unknown',\n ItemASource: sourceNameMap.get(row.ContentItemAID) ?? 'Unknown',\n ItemBName: row.ContentItemB || 'Unknown',\n ItemBSource: sourceNameMap.get(row.ContentItemBID) ?? 'Unknown',\n SimilarityScore: row.SimilarityScore,\n DetectionMethod: row.DetectionMethod,\n Status: row.Status as ContentDuplicateRow['Status'],\n }));\n }\n } catch (error) {\n console.error('[Classify] Error loading content duplicates:', error);\n } finally {\n this.IsLoadingDuplicates = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Resolve content source names for a list of content item IDs */\n private async resolveItemSourceNames(itemIDs: string[]): Promise<Map<string, string>> {\n const map = new Map<string, string>();\n if (itemIDs.length === 0) return map;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const idFilter = itemIDs.map(id => `ID='${id}'`).join(' OR ');\n const result = await rv.RunView<{ ID: string; ContentSource: string }>({\n EntityName: 'MJ: Content Items',\n ExtraFilter: `(${idFilter})`,\n Fields: ['ID', 'ContentSource'],\n ResultType: 'simple'\n });\n\n if (result.Success) {\n for (const row of result.Results) {\n map.set(row.ID, row.ContentSource || 'Unknown');\n }\n }\n return map;\n }\n\n /** Confirm a content duplicate pair */\n public async ConfirmContentDuplicate(dupRow: ContentDuplicateRow): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<MJContentItemDuplicateEntity>('MJ: Content Item Duplicates');\n const loaded = await entity.Load(dupRow.ID);\n if (!loaded) return;\n\n entity.Status = 'Confirmed';\n const saved = await entity.Save();\n if (saved) {\n this.ContentDuplicates = this.ContentDuplicates.filter(d => !UUIDsEqual(d.ID, dupRow.ID));\n MJNotificationService.Instance.CreateSimpleNotification('Duplicate confirmed', 'success', 2000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 3000);\n }\n this.cdr.detectChanges();\n }\n\n /** Dismiss a content duplicate pair */\n public async DismissContentDuplicate(dupRow: ContentDuplicateRow): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<MJContentItemDuplicateEntity>('MJ: Content Item Duplicates');\n const loaded = await entity.Load(dupRow.ID);\n if (!loaded) return;\n\n entity.Status = 'Dismissed';\n entity.Resolution = 'NotDuplicate';\n const saved = await entity.Save();\n if (saved) {\n this.ContentDuplicates = this.ContentDuplicates.filter(d => !UUIDsEqual(d.ID, dupRow.ID));\n MJNotificationService.Instance.CreateSimpleNotification('Duplicate dismissed', 'success', 2000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 3000);\n }\n this.cdr.detectChanges();\n }\n}\n\nexport function LoadAutotaggingPipelineResource(): void {\n // Prevents tree-shaking\n}\n","<mj-page-layout>\n <mj-page-header\n Title=\"Classify\"\n Icon=\"fa-solid fa-tags\"\n Subtitle=\"Content classification, taxonomy, and the classifier pipeline\">\n <div actions>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"RunPipeline()\" [disabled]=\"IsRunning\">\n @if (IsRunning) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> <span class=\"action-btn-label\">Running…</span>\n } @else {\n <i class=\"fa-solid fa-play\"></i> <span class=\"action-btn-label\">Run Pipeline</span>\n }\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\" [Padding]=\"false\">\n <!-- Content Classification Dashboard -->\n <div class=\"at-dashboard\">\n\n <mj-left-nav\n MobileTitle=\"Sections\"\n [Sections]=\"navSections\"\n [ActiveId]=\"ActiveTab\"\n (ItemClicked)=\"onNavItemClicked($event)\">\n </mj-left-nav>\n\n <mj-left-nav-content>\n\n @switch (ActiveTab) {\n @case ('history') {\n <classify-history-tab [Runs]=\"ContentRunsRaw\" [Provider]=\"ProviderToUse\"></classify-history-tab>\n }\n @case ('types') {\n <classify-types-tab\n [ContentTypes]=\"ContentTypesRaw\"\n [Sources]=\"ContentSourcesRaw\"\n [Items]=\"ContentItemsRaw\"\n [TotalItemCount]=\"TotalContentItemCount\"\n [Provider]=\"ProviderToUse\"\n (AddTypeRequested)=\"OpenAddTypeForm()\"\n (EditTypeRequested)=\"OpenEditTypeForm($event)\">\n </classify-types-tab>\n }\n @case ('tags') {\n <classify-tags-tab\n [ContentTags]=\"ContentTagsRaw\"\n [ContentItems]=\"ContentItemsRaw\"\n [Provider]=\"ProviderToUse\"\n (OpenItemDetailRequested)=\"OpenItemDetailByID($event)\">\n </classify-tags-tab>\n }\n @case ('sources') {\n <classify-sources-tab #sourcesTab\n [Sources]=\"ContentSourcesRaw\"\n [Items]=\"ContentItemsRaw\"\n [Tags]=\"ContentTagsRaw\"\n [Runs]=\"ContentRunsRaw\"\n [TotalItemCount]=\"TotalContentItemCount\"\n [TotalTagCount]=\"TotalContentTagCount\"\n [ScheduledActions]=\"ScheduledActionsCache\"\n [EntityRecordDocCache]=\"EntityRecordDocCacheMap\"\n [Provider]=\"ProviderToUse\"\n (AddSourceRequested)=\"OpenAddSourceForm()\"\n (EditSourceRequested)=\"OpenEditSourceForm($event)\"\n (RunSourceRequested)=\"RunPipelineForSource($event)\"\n (OpenContentItemRequested)=\"OpenContentItemDetail($event)\"\n (DataChanged)=\"OnSourcesDataChanged()\">\n </classify-sources-tab>\n\n <!-- Content Item Duplicates Section (host-owned; taxonomy/duplicates area) -->\n <div class=\"at-page-body\">\n <div class=\"at-dedup-section\">\n <div class=\"at-dedup-header\">\n <div>\n <h3 class=\"at-dedup-title\">\n <i class=\"fa-solid fa-clone\"></i>\n Content Duplicates\n </h3>\n <span class=\"at-dedup-subtitle\">Review detected duplicate content items across sources</span>\n </div>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"LoadContentDuplicates()\" [disabled]=\"IsLoadingDuplicates\">\n @if (IsLoadingDuplicates) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading...\n } @else {\n <i class=\"fa-solid fa-arrows-rotate\"></i> Load Duplicates\n }\n </button>\n </div>\n\n @if (ContentDuplicates.length > 0) {\n <div class=\"at-dedup-list\">\n @for (dup of ContentDuplicates; track dup.ID) {\n <div class=\"at-dedup-card\">\n <div class=\"at-dedup-pair\">\n <div class=\"at-dedup-item\">\n <span class=\"at-dedup-item-name\">{{ dup.ItemAName }}</span>\n <span class=\"at-dedup-item-source\">{{ dup.ItemASource }}</span>\n </div>\n <div class=\"at-dedup-vs\">\n <i class=\"fa-solid fa-arrows-left-right\"></i>\n </div>\n <div class=\"at-dedup-item\">\n <span class=\"at-dedup-item-name\">{{ dup.ItemBName }}</span>\n <span class=\"at-dedup-item-source\">{{ dup.ItemBSource }}</span>\n </div>\n </div>\n <div class=\"at-dedup-meta\">\n <span class=\"at-dedup-score\">{{ (dup.SimilarityScore * 100).toFixed(0) }}% match</span>\n <span class=\"at-dedup-method\">{{ dup.DetectionMethod }}</span>\n </div>\n <div class=\"at-dedup-actions\">\n <button class=\"at-action-btn at-primary-btn at-dedup-confirm\" (click)=\"ConfirmContentDuplicate(dup)\">\n <i class=\"fa-solid fa-check\"></i> Confirm\n </button>\n <button class=\"at-action-btn at-secondary-btn at-dedup-dismiss\" (click)=\"DismissContentDuplicate(dup)\">\n <i class=\"fa-solid fa-times\"></i> Dismiss\n </button>\n </div>\n </div>\n }\n </div>\n } @else if (!IsLoadingDuplicates) {\n <div class=\"at-dedup-empty\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <p>No pending duplicates. Click \"Load Duplicates\" to check.</p>\n </div>\n }\n </div>\n </div>\n }\n @case ('pipeline') {\n <classify-pipeline-tab\n [KPIMetrics]=\"KPIMetrics\"\n [PipelineStages]=\"PipelineStages\"\n [FeedItems]=\"FeedItems\"\n [SourceMinis]=\"SourceMinis\"\n [TrendingTags]=\"TrendingTags\"\n [LiveRunDetailRows]=\"LiveRunDetailRows\"\n [IsRunning]=\"IsRunning\"\n [IsPaused]=\"IsPaused\"\n [RunProgress]=\"RunProgress\"\n [RunStage]=\"RunStage\"\n [RunCurrentItem]=\"RunCurrentItem\"\n [CurrentProcessRunID]=\"CurrentProcessRunID\"\n [PipelineConfig]=\"PipelineConfig\"\n [ShowPipelineConfig]=\"ShowPipelineConfig\"\n [Provider]=\"ProviderToUse\"\n (RefreshRequested)=\"LoadPipelineData()\"\n (PauseRequested)=\"PausePipeline()\"\n (ResumeRequested)=\"ResumePipeline()\"\n (CancelRequested)=\"CancelPipeline()\"\n (LoadLiveRunDetailsRequested)=\"LoadLiveRunDetails()\"\n (FeedItemClicked)=\"OpenFeedItemDetail($event)\"\n (ConfigToggled)=\"TogglePipelineConfig()\">\n </classify-pipeline-tab>\n }\n @case ('inbox') {\n <classify-inbox-tab\n (Resolved)=\"onInboxResolved()\"\n [Provider]=\"ProviderToUse\">\n </classify-inbox-tab>\n }\n @case ('health') {\n <classify-health-tab\n (Resolved)=\"onHealthResolved()\"\n (OpenInTaxonomyRequested)=\"onOpenInTaxonomyRequested($event)\"\n [Provider]=\"ProviderToUse\">\n </classify-health-tab>\n }\n @case ('taxonomy') {\n <classify-taxonomy-tab\n [ContentTags]=\"ContentTagsRaw\"\n [Provider]=\"ProviderToUse\"\n (DataChanged)=\"OnTaxonomyDataChanged()\">\n </classify-taxonomy-tab>\n }\n }\n </mj-left-nav-content>\n\n <!-- ══════ SLIDE-IN FORM (Source + Content Type CRUD) ══════ -->\n <classify-source-type-form-dialog #formDialog\n [Provider]=\"ProviderToUse\"\n (Saved)=\"onFormSaved($event)\"\n (ContentTypeMissing)=\"ShowNoContentTypeWarning = true\"\n (NavigateToRecordRequested)=\"onFormNavigateToRecord($event)\">\n </classify-source-type-form-dialog>\n\n <!-- ══════ ITEM DETAIL SLIDE-IN ══════ -->\n <classify-item-detail-dialog\n [Item]=\"SelectedFeedItem\"\n [Show]=\"ShowItemDetail\"\n (Closed)=\"CloseItemDetail()\"\n (OpenRecordRequested)=\"OpenRecordFromItem($event)\"\n [Provider]=\"ProviderToUse\"></classify-item-detail-dialog>\n\n <!-- No Content Types Warning Dialog (z-index above slide-in panel) -->\n <classify-no-content-type-warning\n [Show]=\"ShowNoContentTypeWarning\"\n (GoToTypes)=\"ShowNoContentTypeWarning=false; formDialog.CloseForm(); SwitchTab('types')\"\n (Dismissed)=\"ShowNoContentTypeWarning=false\"></classify-no-content-type-warning>\n </div>\n </mj-page-body>\n</mj-page-layout>\n"]}
1
+ {"version":3,"file":"autotagging-pipeline-resource.component.js","sourceRoot":"","sources":["../../../../src/AI/components/autotagging/autotagging-pipeline-resource.component.ts","../../../../src/AI/components/autotagging/autotagging-pipeline-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Content Autotagging Dashboard\n *\n * Full dashboard for the content autotagging pipeline with left-nav and 5 tabs:\n * Pipeline Monitor, Sources Management, Content Types, Tag Library, Run History.\n * Supports CRUD on sources and content types via slide-in forms,\n * pipeline triggering with real-time GraphQL subscription progress.\n */\n\nimport { Component, ChangeDetectorRef, OnDestroy, AfterViewInit, inject, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { BaseEntity, BaseEntityEvent, CompositeKey, RunView } from '@memberjunction/core';\nimport { ResourceData, KnowledgeHubMetadataEngine, MJScheduledActionEntity, MJContentItemDuplicateEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { RegisterClass, UUIDsEqual, NormalizeUUID, MJGlobal, MJEventType } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService, ActivityService } from '@memberjunction/ng-shared';\nimport { MJLeftNavItem, MJLeftNavSection } from '@memberjunction/ng-ui-components';\nimport { GraphQLDataProvider, GraphQLAIClient } from '@memberjunction/graphql-dataprovider';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { ClassifyTagsTabComponent } from './tabs/tags-tab.component';\nimport { ClassifyInboxTabComponent } from './tabs/inbox-tab.component';\nimport { ClassifyHealthTabComponent } from './tabs/health-tab.component';\nimport { ClassifySourceTypeFormDialogComponent } from './dialogs/source-type-form.dialog.component';\nimport { ClassifySetupWizardComponent } from './dialogs/classify-setup-wizard.component';\n\n\n// ── Shared types (extracted to ./shared/classify.types.ts) ──\nimport { TabName, NavItem, KPIMetric, PipelineStageInfo, FeedItem, SourceMini, SourceCard, ContentTypeCard, TagCloudItem, ContentDuplicateRow, RunDetailRow, WeightedTag, ItemPipelineStatus, ContentItemDetail } from './shared/classify.types';\nimport { formatNumber, formatDate, getSourceTypeIcon, mapRunDetailRecords, deriveDisplayName } from './shared/classify.format';\n\n@RegisterClass(BaseResourceComponent, 'AutotaggingPipelineResource')\n@Component({\n standalone: false,\n selector: 'app-autotagging-pipeline-resource',\n templateUrl: './autotagging-pipeline-resource.component.html',\n styleUrls: ['./autotagging-pipeline-resource.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class AutotaggingPipelineResourceComponent extends BaseResourceComponent implements AfterViewInit, OnDestroy {\n protected override destroy$ = new Subject<void>();\n private cdr = inject(ChangeDetectorRef);\n private activityService = inject(ActivityService);\n /** Activity-tracker id for the currently running pipeline (P3). */\n private pipelineActivityID: string | null = null;\n\n /** Debounced bus of entity names that changed externally; drives targeted reloads. */\n private entityChange$ = new Subject<string>();\n protected override navigationService = inject(NavigationService);\n\n // ── Global state ──\n public IsLoading = true;\n\n // ── Accurate total counts from TotalRowCount (not capped by MaxRows) ──\n private totalContentItemCount = 0;\n private totalContentTagCount = 0;\n private totalRunHistoryCount = 0;\n\n // ── Pagination windows (no silent truncation; user can Load more) ──\n private static readonly CONTENT_ITEMS_PAGE_SIZE = 200;\n private static readonly RUN_HISTORY_PAGE_SIZE = 200;\n /** Current number of `MJ: Content Items` rows loaded into the feed window. */\n private contentItemsPageSize = AutotaggingPipelineResourceComponent.CONTENT_ITEMS_PAGE_SIZE;\n /** Current number of `MJ: Content Process Runs` rows loaded into the history window. */\n private runHistoryWindowSize = AutotaggingPipelineResourceComponent.RUN_HISTORY_PAGE_SIZE;\n /** True while a \"Load more\" fetch is in flight. */\n public IsLoadingMoreItems = false;\n public IsLoadingMoreRuns = false;\n\n // ── Tab state ──\n private _activeTab: TabName = 'pipeline';\n /** True once the view exists (after ngAfterViewInit), so the setter can safely run CD. */\n private viewReady = false;\n /**\n * The active tab. Backed by a setter that, once the view is ready, synchronously\n * flushes change detection whenever the value changes. The left-nav binds\n * `[ActiveId]=\"ActiveTab\"`; mutating this during an async gap in init (e.g. between\n * the await in ngAfterViewInit and the next CD pass) previously surfaced an NG0100\n * (`Previous value: 'pipeline'. Current value: 'sources'`). Flushing in the setter\n * keeps the bound value stable across the check that follows.\n */\n public get ActiveTab(): TabName {\n return this._activeTab;\n }\n public set ActiveTab(value: TabName) {\n // Tag-vocabulary tabs moved to the dedicated Tags surface; coerce any\n // stale saved/deep-linked value for a removed tab back to the cockpit.\n const v: TabName = AutotaggingPipelineResourceComponent.VALID_TABS.includes(value) ? value : 'pipeline';\n if (v === this._activeTab) return;\n this._activeTab = v;\n if (this.viewReady) {\n this.cdr.detectChanges();\n }\n }\n private tabDataLoaded = new Set<TabName>();\n\n /** Live reference to the Tag Library tab (for deep-link + agent-tool search). */\n @ViewChild(ClassifyTagsTabComponent) private tagsTab?: ClassifyTagsTabComponent;\n\n // ── Left nav ──\n public NavItems: NavItem[] = [];\n\n // ── Pipeline tab ──\n public KPIMetrics: KPIMetric[] = [];\n public PipelineStages: PipelineStageInfo[] = [];\n public FeedItems: FeedItem[] = [];\n public SourceMinis: SourceMini[] = [];\n public TrendingTags: TagCloudItem[] = [];\n\n // Pipeline feed search/sort/pagination moved to ClassifyPipelineTabComponent\n // (tab-local presentational state). The host still builds FeedItems and owns\n // OpenFeedItemDetail(index) β€” the tab emits the original index back up.\n\n // Pipeline run state\n private _isRunning = false;\n /**\n * True while a classification pipeline run is in flight. Backed by a setter\n * that flushes change detection once the view is ready, so the `[disabled]=\"IsRunning\"`\n * Run button binding stays stable across the check that follows a within-cycle\n * flip (run starting / instantly completing on an empty source) β€” eliminating\n * the NG0100 (`Previous value: 'true'. Current value: 'false'`). Mirrors the\n * `ActiveTab` setter pattern above.\n */\n public get IsRunning(): boolean {\n return this._isRunning;\n }\n public set IsRunning(value: boolean) {\n if (value === this._isRunning) return;\n this._isRunning = value;\n if (this.viewReady) {\n this.cdr.detectChanges();\n }\n }\n public IsPaused = false;\n public RunProgress = 0;\n public RunStage = '';\n public RunCurrentItem = '';\n /** The current pipeline run ID (from GraphQL subscription) */\n public CurrentPipelineRunID: string | null = null;\n /** The process run ID (server-side ContentProcessRun) for pause/cancel/resume */\n public CurrentProcessRunID: string | null = null;\n\n // ── Pipeline Config Widget ──\n public ShowPipelineConfig = false;\n public PipelineConfig: {\n Pipeline?: { BatchSize?: number; MaxConcurrentBatches?: number; DelayBetweenBatchesMs?: number; ResumeFromLastBatch?: boolean; ErrorThresholdPercent?: number };\n RateLimits?: { LLM?: { RequestsPerMinute?: number; TokensPerMinute?: number }; Embedding?: { RequestsPerMinute?: number; TokensPerMinute?: number }; VectorDB?: { RequestsPerMinute?: number } };\n } = {\n Pipeline: { BatchSize: 100, MaxConcurrentBatches: 1, DelayBetweenBatchesMs: 200, ResumeFromLastBatch: true, ErrorThresholdPercent: 20 },\n RateLimits: { LLM: { RequestsPerMinute: 60, TokensPerMinute: 100000 }, Embedding: { RequestsPerMinute: 300, TokensPerMinute: 500000 }, VectorDB: { RequestsPerMinute: 200 } }\n };\n\n public TogglePipelineConfig(): void {\n this.ShowPipelineConfig = !this.ShowPipelineConfig;\n this.persistClassifyPreferences();\n }\n\n private persistClassifyPreferences(): void {\n const prefs = JSON.stringify({\n ActiveTab: this.ActiveTab,\n ShowPipelineConfig: this.ShowPipelineConfig,\n });\n UserInfoEngine.Instance.SetSettingDebounced(AutotaggingPipelineResourceComponent.PREFS_KEY, prefs);\n }\n\n private loadClassifyPreferences(): void {\n const raw = UserInfoEngine.Instance.GetSetting(AutotaggingPipelineResourceComponent.PREFS_KEY);\n if (raw) {\n try {\n const prefs = JSON.parse(raw);\n // Guard against stale persisted state that doesn't match the\n // current Classify rail (e.g. 'tags'/'taxonomy' from when those\n // surfaces lived here, or a value seeded by a sibling dashboard).\n if (prefs.ActiveTab && AutotaggingPipelineResourceComponent.VALID_TABS.includes(prefs.ActiveTab)) {\n this.ActiveTab = prefs.ActiveTab;\n }\n if (prefs.ShowPipelineConfig != null) this.ShowPipelineConfig = prefs.ShowPipelineConfig;\n } catch { /* ignore */ }\n }\n }\n\n // FormatTokenCount moved to ClassifyPipelineTabComponent (only the pipeline\n // config panel used it; the tab uses formatTokenCount from shared).\n\n // ── Sources tab ──\n // SourceCards + buildSourceCards() + the source-detail slide-in + the\n // quick-schedule dialog moved to ClassifySourcesTabComponent. The host still\n // owns the Content Duplicates section (rendered alongside the sources tab).\n public ContentDuplicates: ContentDuplicateRow[] = [];\n public IsLoadingDuplicates = false;\n\n // ── Content Types tab ──\n // ContentTypeCards + buildContentTypeCards() moved to ClassifyTypesTabComponent.\n\n // ── Tag Library tab ──\n // State + view-model building moved to ClassifyTagsTabComponent, which\n // rebuilds from its [ContentTags]/[ContentItems] inputs.\n\n // D2: Pipeline Monitor β€” live per-source progress\n public LiveRunDetailRows: RunDetailRow[] = [];\n public IsLoadingLiveDetails = false;\n\n // ── Slide-in form (Source + Content Type CRUD) ──\n // ALL form state, dropdown getters, dynamic-field logic, and the open/save/\n // close lifecycle moved to ClassifySourceTypeFormDialogComponent. The host\n // keeps only the no-content-type warning toggle (the warning dialog is\n // host-owned and triggered by the form dialog's (ContentTypeMissing) output),\n // and a @ViewChild to drive the form dialog from the tab add/edit events.\n public ShowNoContentTypeWarning = false;\n\n /** Live reference to the slide-in CRUD form dialog (driven from tab events). */\n @ViewChild('formDialog') private formDialog?: ClassifySourceTypeFormDialogComponent;\n @ViewChild('setupWizard') private setupWizard?: ClassifySetupWizardComponent;\n\n // ── Schedule dialog ──\n // The quick-schedule dialog (state + save/remove logic) moved to\n // ClassifySourcesTabComponent.\n\n /** Cached ScheduledAction entities, keyed by normalized ID */\n private scheduledActionsCache = new Map<string, MJScheduledActionEntity>();\n\n // ── Detail panels ──\n // The Source Detail slide-in (state, pagination, status filter, retry, badge\n // class) moved to ClassifySourcesTabComponent. The item-detail slide-in below\n // stays in the host (shared by the pipeline feed + tag drill-down + sources).\n public SelectedFeedItem: ContentItemDetail | null = null;\n public ShowItemDetail = false;\n\n // ── Phase 4: Item drilldown slide-in (audit/analytics) ──\n /** ID of the content item shown in the drilldown slide-in, or null when closed. */\n public DrilldownItemID: string | null = null;\n public ShowItemDrilldown = false;\n\n // Form dropdown options + tree-dropdown configs (SourceType/ContentType/\n // FileType/AIModel/EmbeddingModel/VectorIndex options and the AI-model vendor\n // tree configs) moved to ClassifySourceTypeFormDialogComponent.\n\n // ── Raw data cache ──\n private contentSourcesRaw: Record<string, unknown>[] = [];\n private contentItemsRaw: Record<string, unknown>[] = [];\n private contentTagsRaw: Record<string, unknown>[] = [];\n private contentRunsRaw: Record<string, unknown>[] = [];\n /** Exposes the raw run rows to the Run History tab component via `[Runs]`. */\n public get ContentRunsRaw(): Record<string, unknown>[] {\n return this.contentRunsRaw;\n }\n private contentSourceTypesRaw: Record<string, unknown>[] = [];\n private contentTypesRaw: Record<string, unknown>[] = [];\n private contentFileTypesRaw: Record<string, unknown>[] = [];\n private aiModelsRaw: Record<string, unknown>[] = [];\n\n /** Exposes raw content types to the Content Types tab via `[ContentTypes]`. */\n public get ContentTypesRaw(): Record<string, unknown>[] {\n return this.contentTypesRaw;\n }\n /** Exposes raw content sources to the Content Types tab via `[Sources]`. */\n public get ContentSourcesRaw(): Record<string, unknown>[] {\n return this.contentSourcesRaw;\n }\n /** Exposes raw content items to the Content Types / Tag Library tabs via `[Items]`/`[ContentItems]`. */\n public get ContentItemsRaw(): Record<string, unknown>[] {\n return this.contentItemsRaw;\n }\n /** Exposes raw content item tags to the Tag Library tab via `[ContentTags]`. */\n public get ContentTagsRaw(): Record<string, unknown>[] {\n return this.contentTagsRaw;\n }\n /** Exposes the accurate total item count to the Content Types / Sources tabs via `[TotalItemCount]`. */\n public get TotalContentItemCount(): number {\n return this.totalContentItemCount;\n }\n /** Exposes the accurate total tag count to the Sources tab via `[TotalTagCount]`. */\n public get TotalContentTagCount(): number {\n return this.totalContentTagCount;\n }\n /** Exposes the accurate total run-history count to the Run History tab via `[TotalRunCount]`. */\n public get TotalRunHistoryCount(): number {\n return this.totalRunHistoryCount;\n }\n /** Exposes the cached ScheduledAction entities to the Sources tab via `[ScheduledActions]`. */\n public get ScheduledActionsCache(): Map<string, MJScheduledActionEntity> {\n return this.scheduledActionsCache;\n }\n /** Exposes the EntityRecordDocument IDβ†’RecordID cache to the Sources tab via `[EntityRecordDocCache]`. */\n public get EntityRecordDocCacheMap(): Map<string, string> {\n return this.entityRecordDocCache;\n }\n\n /**\n * Reload the shared source list after the Sources tab mutates a source\n * (delete / schedule change). Rebinding `contentSourcesRaw` flows through the\n * tab's `[Sources]` input setter, which rebuilds its cards.\n */\n public async OnSourcesDataChanged(): Promise<void> {\n await this.refreshSourcesTab();\n }\n\n /**\n * Hook for the Taxonomy tab's `(DataChanged)` output. The taxonomy tab owns\n * and reloads its own data; the host has no shared taxonomy surface to\n * refresh today, so this is a no-op placeholder kept for future cross-tab wiring.\n */\n public OnTaxonomyDataChanged(): void {\n // No host-owned taxonomy surface to refresh; the tab manages its own data.\n }\n\n // ── Lifecycle ──\n\n private static readonly PREFS_KEY = 'KH_Classify_Preferences';\n // Classify is now the pipeline-operator workspace only. Tag Library / Taxonomy\n // / Inbox / Health moved to the dedicated Tags surface (no more overlap).\n private static readonly VALID_TABS: TabName[] = ['pipeline', 'sources', 'types', 'history'];\n\n /** Lightweight count of Pending tag suggestions for the Inbox nav badge. */\n public InboxPendingCount = 0;\n\n /** Lightweight count of Pending health-signal suggestions for the Health nav badge. */\n public HealthPendingCount = 0;\n\n /** Live reference to the Suggestions Inbox tab (for refresh after host actions). */\n @ViewChild(ClassifyInboxTabComponent) private inboxTab?: ClassifyInboxTabComponent;\n\n /** Live reference to the Tag Health tab (for refresh after host actions). */\n @ViewChild(ClassifyHealthTabComponent) private healthTab?: ClassifyHealthTabComponent;\n\n async ngAfterViewInit(): Promise<void> {\n this.viewReady = true;\n await Promise.all([\n KnowledgeHubMetadataEngine.Instance.Config(false),\n UserInfoEngine.Instance.Config(false),\n ]);\n this.loadClassifyPreferences();\n this.applyIncomingConfiguration();\n await Promise.all([this.LoadPipelineData(), this.loadEntityRecordDocCache(), this.loadInboxPendingCount(), this.loadHealthPendingCount()]);\n this.tabDataLoaded.add('pipeline');\n this.buildNavItems();\n\n // If user preferences or incoming config set a non-pipeline initial tab,\n // eagerly load that tab's data so it is not blank on first render.\n if (this.ActiveTab !== 'pipeline' && !this.tabDataLoaded.has(this.ActiveTab)) {\n await this.loadTabData(this.ActiveTab);\n this.tabDataLoaded.add(this.ActiveTab);\n }\n\n this.IsLoading = false;\n this.subscribeToEntityChanges();\n this.registerAgentTools();\n this.emitAgentContext();\n\n // D9: If navigated with tagSearch, switch to tags tab and pre-fill search\n await this.handleInitialTagSearch();\n\n this.cdr.detectChanges();\n this.NotifyLoadComplete();\n }\n\n /**\n * D9: Read incoming configuration from ResourceData (e.g. from Analytics tag navigation).\n * Sets the initial tab and tag search query if provided.\n */\n private applyIncomingConfiguration(): void {\n const config = this.Data?.Configuration as Record<string, unknown> | undefined;\n if (!config) return;\n\n const initialTab = config['initialTab'] as TabName | undefined;\n if (initialTab) {\n this.ActiveTab = initialTab;\n }\n }\n\n /**\n * Tag browsing/search now lives on the dedicated Tags surface, so the Classify\n * cockpit no longer hosts a `tagSearch` deep-link target. Kept as a no-op to\n * preserve the call site. (Re-targeting Analytics' tag drill-down to the Tags\n * surface is a tracked follow-up.)\n */\n private async handleInitialTagSearch(): Promise<void> {\n return;\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n this.entityChange$.complete();\n }\n\n /** Lowercased names of the entities whose external changes should refresh this dashboard. */\n private static readonly REACTIVE_ENTITIES = new Set<string>([\n 'mj: content sources',\n 'mj: content types',\n 'mj: content items',\n 'mj: content item tags',\n 'mj: content process runs',\n 'mj: tags',\n ]);\n\n /**\n * Lightweight reactivity: listen for BaseEntity save/delete/remote-invalidate\n * events on the entities this dashboard renders, debounce them (~300ms to\n * coalesce bursts), and re-call the matching host load method. Reloads never\n * call Save(), so this cannot create a reload loop.\n */\n private subscribeToEntityChanges(): void {\n MJGlobal.Instance.GetEventListener(true)\n .pipe(takeUntil(this.destroy$))\n .subscribe(event => {\n if (event.event !== MJEventType.ComponentEvent || event.eventCode !== BaseEntity.BaseEventCode) return;\n const beEvent = event.args as BaseEntityEvent | undefined;\n if (!beEvent) return;\n if (beEvent.type !== 'save' && beEvent.type !== 'delete' && beEvent.type !== 'remote-invalidate') return;\n const entityName = beEvent.entityName?.toLowerCase().trim();\n if (entityName && AutotaggingPipelineResourceComponent.REACTIVE_ENTITIES.has(entityName)) {\n this.entityChange$.next(entityName);\n }\n });\n\n this.entityChange$\n .pipe(debounceTime(300), takeUntil(this.destroy$))\n .subscribe(entityName => void this.reloadForEntity(entityName));\n }\n\n /** Re-run the host load method(s) affected by an external change to `entityName`. */\n private async reloadForEntity(entityName: string): Promise<void> {\n switch (entityName) {\n case 'mj: content sources':\n await this.refreshSourcesTab();\n break;\n case 'mj: content types':\n await this.refreshContentTypesTab();\n break;\n case 'mj: content items':\n case 'mj: content item tags':\n case 'mj: tags':\n // Items + tags both feed the pipeline / tag-library view models;\n // reload the shared base data so all dependent tabs rebuild.\n await this.LoadPipelineData();\n break;\n case 'mj: content process runs':\n await this.loadRunHistoryData(true);\n break;\n }\n this.cdr.detectChanges();\n }\n\n /** Report current classify dashboard state to the agent */\n private emitAgentContext(): void {\n this.navigationService.SetAgentContext(this, {\n ActiveTab: this.ActiveTab,\n SourceCount: this.contentSourcesRaw.length,\n ContentItemCount: this.contentItemsRaw.length,\n TagCount: this.contentTagsRaw.length,\n PipelineStatus: this.IsRunning ? 'running' : 'idle',\n PipelineProgress: this.RunProgress,\n ShowPipelineConfig: this.ShowPipelineConfig,\n InboxPendingCount: this.InboxPendingCount,\n });\n }\n\n /** Register client tools the agent can invoke on the Classify dashboard */\n private registerAgentTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'SwitchClassifyTab',\n Description: 'Switch to a specific tab in the Classify dashboard',\n ParameterSchema: {\n type: 'object',\n properties: {\n tab: { type: 'string', enum: ['pipeline', 'sources', 'types', 'tags', 'taxonomy', 'inbox', 'health', 'history'], description: 'The tab to switch to' },\n },\n required: ['tab'],\n },\n Handler: async (params: Record<string, unknown>) => {\n await this.SwitchTab(params['tab'] as TabName);\n return { Success: true, Data: { ActiveTab: this.ActiveTab } };\n },\n },\n {\n Name: 'RunClassificationPipeline',\n Description: 'Trigger the content classification pipeline. Optionally filter to specific content source IDs.',\n ParameterSchema: {\n type: 'object',\n properties: {\n sourceIDs: { type: 'array', items: { type: 'string' }, description: 'Optional array of ContentSource IDs to process. Omit to run all.' },\n },\n },\n Handler: async (params: Record<string, unknown>) => {\n const sourceIDs = params['sourceIDs'] as string[] | undefined;\n await this.RunPipeline(sourceIDs);\n return { Success: true, Data: { PipelineStatus: 'running' } };\n },\n },\n {\n Name: 'SearchClassifyTags',\n Description: 'Filter the tag library by a search query',\n ParameterSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search text to filter tags by' },\n },\n required: ['query'],\n },\n Handler: async (params: Record<string, unknown>) => {\n // Ensure the Tag Library tab is active + rendered so its\n // ViewChild resolves, then delegate the search to it.\n await this.SwitchTab('tags');\n this.cdr.detectChanges();\n const matchCount = this.tagsTab?.ApplySearch(String(params['query'] ?? '')) ?? 0;\n return { Success: true, Data: { MatchCount: matchCount } };\n },\n },\n ]);\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Classify';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-tags';\n }\n\n // ── Tab switching ──\n\n /** Memoized backing store + input signature for {@link navSections}. */\n private _navSections: MJLeftNavSection[] = [];\n private _navSectionsSignature = '';\n\n /**\n * Wraps `NavItems` for `<mj-left-nav>`. Hardcoded \"Run History\" item goes\n * into a second `MJLeftNavSection` β€” the rail's natural section break\n * replaces the bespoke `.at-nav-divider` line.\n *\n * Memoized: the array (and its element objects) are rebuilt only when one of\n * the inputs actually changes. Returning a fresh array on every change-detection\n * pass made `<mj-left-nav>` see a new `[Sections]` reference each cycle, which\n * triggered `ExpressionChangedAfterItHasBeenCheckedError` (NG0100) during rapid\n * tab switching (badge counts / IsRunning resolving mid-CD-cycle). A stable\n * reference until inputs change eliminates that.\n */\n public get navSections(): MJLeftNavSection[] {\n const signature = this.computeNavSectionsSignature();\n if (signature !== this._navSectionsSignature) {\n this._navSectionsSignature = signature;\n this._navSections = this.buildNavSections();\n }\n return this._navSections;\n }\n\n /** Cheap stable fingerprint of every value that feeds {@link buildNavSections}. */\n private computeNavSectionsSignature(): string {\n const items = this.NavItems.map(n => `${n.Tab}|${n.Label}|${n.Icon}|${n.BadgeText}`).join(';');\n return `${items}#${this.InboxPendingCount}#${this.HealthPendingCount}`;\n }\n\n /** Constructs the left-nav section model from current state (see {@link navSections}). */\n private buildNavSections(): MJLeftNavSection[] {\n return [\n {\n items: this.NavItems.map(n => ({\n id: n.Tab,\n label: n.Label,\n icon: n.Icon,\n badge: n.BadgeText || undefined\n }))\n },\n {\n items: [\n {\n id: 'history',\n label: 'Run History',\n icon: 'fa-solid fa-clock-rotate-left'\n }\n ]\n }\n ];\n }\n\n /**\n * Loads a lightweight count of Pending tag suggestions for the Inbox nav badge\n * so the badge shows even before the Inbox tab is first opened. Mirrors the\n * Inbox tab's default scope: excludes the 3 Health-owned reasons\n * (MergeCandidate / LowUsage / WideNode).\n */\n private async loadInboxPendingCount(): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: Tag Suggestions',\n ExtraFilter: `Status='Pending' AND Reason NOT IN ('MergeCandidate','LowUsage','WideNode')`,\n Fields: ['ID'],\n ResultType: 'simple',\n });\n this.InboxPendingCount = result.Success ? result.TotalRowCount : 0;\n }\n\n /**\n * Fired by the Inbox tab after a suggestion is approved/merged/rejected.\n * Refreshes the nav badge count.\n */\n public async onInboxResolved(): Promise<void> {\n await this.loadInboxPendingCount();\n this.emitAgentContext();\n this.cdr.detectChanges();\n }\n\n /**\n * Loads a lightweight count of Pending health-signal suggestions for the\n * Health nav badge β€” the 3 reasons the Inbox excludes (MergeCandidate /\n * LowUsage / WideNode), which the Tag Health tab owns.\n */\n private async loadHealthPendingCount(): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: Tag Suggestions',\n ExtraFilter: `Status='Pending' AND Reason IN ('MergeCandidate','LowUsage','WideNode')`,\n Fields: ['ID'],\n ResultType: 'simple',\n });\n this.HealthPendingCount = result.Success ? result.TotalRowCount : 0;\n }\n\n /**\n * Fired by the Health tab after a merge/deprecate/dismiss. Refreshes the\n * Health nav badge count.\n */\n public async onHealthResolved(): Promise<void> {\n await this.loadHealthPendingCount();\n this.emitAgentContext();\n this.cdr.detectChanges();\n }\n\n /**\n * Fired by the Health tab's \"Review in Taxonomy\" action with a tag ID. The\n * Taxonomy tab has no public select-tag input today, so this simply switches\n * to it; selecting the specific node is a future enhancement.\n */\n public onOpenInTaxonomyRequested(_tagID: string): void {\n void this.SwitchTab('taxonomy');\n }\n\n /** Adapter for `<mj-left-nav>`'s `(ItemClicked)` output. */\n public onNavItemClicked(item: MJLeftNavItem): void {\n void this.SwitchTab(item.id as TabName);\n }\n\n public async SwitchTab(tab: TabName): Promise<void> {\n if (tab === this.ActiveTab) return;\n this.ActiveTab = tab;\n this.persistClassifyPreferences();\n this.emitAgentContext();\n this.cdr.detectChanges();\n\n if (!this.tabDataLoaded.has(tab)) {\n await this.loadTabData(tab);\n this.tabDataLoaded.add(tab);\n this.cdr.detectChanges();\n }\n }\n\n private async loadTabData(tab: TabName): Promise<void> {\n switch (tab) {\n case 'pipeline':\n await this.LoadPipelineData();\n break;\n case 'sources':\n await this.loadSourcesData();\n break;\n case 'types':\n await this.loadContentTypesData();\n break;\n case 'tags':\n await this.loadTagLibraryData();\n break;\n case 'taxonomy':\n // The Taxonomy tab self-loads its own data in ngOnInit; nothing\n // host-side to fetch. Case present so the switch covers all tabs.\n break;\n case 'inbox':\n // The Inbox tab loads its own (transactional, uncached) data.\n // Trigger CD so the ViewChild resolves, then ask it to load.\n this.cdr.detectChanges();\n await this.inboxTab?.EnsureLoaded();\n break;\n case 'health':\n // The Health tab loads its own (transactional, uncached) data.\n // Trigger CD so the ViewChild resolves, then ask it to load.\n this.cdr.detectChanges();\n await this.healthTab?.EnsureLoaded();\n break;\n case 'history':\n await this.loadRunHistoryData();\n break;\n }\n }\n\n // ════════════════════════════════════════════\n // PIPELINE TAB β€” Data Loading & Building\n // ════════════════════════════════════════════\n\n public async LoadPipelineData(): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [sourcesResult, itemsResult, runsResult, tagsResult, sourceTypesResult, contentTypesResult] = await rv.RunViews([\n { EntityName: 'MJ: Content Sources', OrderBy: 'Name', ResultType: 'simple' },\n { EntityName: 'MJ: Content Items', OrderBy: '__mj_UpdatedAt DESC', MaxRows: this.contentItemsPageSize, StartRow: 0, ResultType: 'simple', Fields: ['ID', 'Name', 'Description', 'ContentSourceID', 'ContentSourceTypeID', 'ContentSource', 'ContentSourceType', 'ContentType', 'ContentFileType', 'URL', 'Text', 'Checksum', 'EntityRecordDocumentID', '__mj_CreatedAt', '__mj_UpdatedAt'] },\n { EntityName: 'MJ: Content Process Runs', OrderBy: 'StartTime DESC', MaxRows: 100, ResultType: 'simple' },\n { EntityName: 'MJ: Content Item Tags', ResultType: 'simple', Fields: ['ID', 'ItemID', 'Item', 'Tag', 'TagID', 'Weight', '__mj_CreatedAt'] },\n { EntityName: 'MJ: Content Source Types', ResultType: 'simple' },\n { EntityName: 'MJ: Content Types', ResultType: 'simple' }\n ]);\n\n this.contentSourcesRaw = sourcesResult.Success ? sourcesResult.Results : [];\n this.contentItemsRaw = itemsResult.Success ? itemsResult.Results : [];\n this.contentRunsRaw = runsResult.Success ? runsResult.Results : [];\n this.contentTagsRaw = tagsResult.Success ? tagsResult.Results : [];\n this.contentSourceTypesRaw = sourceTypesResult.Success ? sourceTypesResult.Results : [];\n this.contentTypesRaw = contentTypesResult.Success ? contentTypesResult.Results : [];\n\n // Use TotalRowCount for accurate KPI/badge counts (the Results arrays are\n // capped by MaxRows for feed display, but TotalRowCount reflects the full DB count)\n this.totalContentItemCount = itemsResult.Success ? itemsResult.TotalRowCount : 0;\n this.totalContentTagCount = tagsResult.Success ? tagsResult.TotalRowCount : 0;\n this.totalRunHistoryCount = runsResult.Success ? runsResult.TotalRowCount : 0;\n\n // Load ScheduledAction entities referenced by sources so cron descriptions are available\n await this.loadScheduledActionsForSources();\n\n this.buildNavItems();\n this.buildKPIMetrics();\n this.buildPipelineStages();\n this.buildFeedItems();\n this.buildSourceMinis();\n this.buildTrendingTags();\n } catch (error) {\n console.error('[Autotagging] Error loading pipeline data:', error);\n }\n }\n\n /**\n * Widen the loaded content-item window by one page and reload, so the user can\n * see items previously truncated by the MaxRows cap. Wired to the pipeline\n * tab's `(LoadMoreItemsRequested)`.\n */\n public async LoadMoreContentItems(): Promise<void> {\n if (this.IsLoadingMoreItems) return;\n this.IsLoadingMoreItems = true;\n this.cdr.detectChanges();\n this.contentItemsPageSize += AutotaggingPipelineResourceComponent.CONTENT_ITEMS_PAGE_SIZE;\n await this.LoadPipelineData();\n this.IsLoadingMoreItems = false;\n this.cdr.detectChanges();\n }\n\n private buildNavItems(): void {\n // Classify dashboard owns the autotag pipeline run-management surface plus\n // the Tag Library + Taxonomy Governance curation surfaces (Governance /\n // Synonyms / Scope editors live on the Taxonomy tab). All curation tabs are\n // surfaced here so they're directly reachable, not just agent-reachable.\n // Classify is the content-pipeline operator workspace. Tag-vocabulary\n // curation (Tag Library, Taxonomy tree, Suggestions/Inbox review, Health)\n // lives on the dedicated \"Tags\" surface β€” we intentionally do NOT duplicate\n // those tabs here. See the deep-link to Tags β–Έ review from the pipeline.\n this.NavItems = [\n { Tab: 'pipeline', Icon: 'fa-solid fa-gauge-high', Label: 'Pipeline', BadgeText: this.IsRunning ? 'Live' : '', BadgeClass: 'nav-badge-live' },\n { Tab: 'sources', Icon: 'fa-solid fa-database', Label: 'Sources', BadgeText: String(this.contentSourcesRaw.length), BadgeClass: '' },\n { Tab: 'types', Icon: 'fa-solid fa-sliders', Label: 'Content Types', BadgeText: String(this.contentTypesRaw.length), BadgeClass: '' },\n ];\n }\n\n private buildKPIMetrics(): void {\n // Single canonical KPI row for the Pipeline Monitor. The Overview-analytics\n // child below renders charts only (its old duplicate KPI strip β€” Content\n // Items / Total Tags β€” was removed) so these five metrics are the one place\n // headline numbers appear: sources, volume, vocabulary throughput, errors.\n const sourceCount = this.contentSourcesRaw.length;\n const itemCount = this.totalContentItemCount;\n const tagCount = this.totalContentTagCount;\n const avgTagsPerItem = itemCount > 0 ? Math.round((tagCount / itemCount) * 10) / 10 : 0;\n const errorCount = this.contentRunsRaw.filter(r => (r['Status'] as string)?.toLowerCase() === 'error' || (r['Status'] as string)?.toLowerCase() === 'failed').length;\n\n this.KPIMetrics = [\n { Label: 'Active Sources', Value: sourceCount, Icon: 'fa-solid fa-satellite-dish', Trend: '', TrendUp: true },\n { Label: 'Content Items', Value: itemCount, Icon: 'fa-solid fa-file-lines', Trend: '', TrendUp: true },\n { Label: 'Total Tags', Value: tagCount, Icon: 'fa-solid fa-tags', Trend: '', TrendUp: true },\n { Label: 'Avg Tags / Item', Value: avgTagsPerItem, Icon: 'fa-solid fa-chart-simple', Trend: '', TrendUp: true },\n { Label: 'Errors', Value: errorCount, Icon: 'fa-solid fa-circle-exclamation', Trend: '', TrendUp: false }\n ];\n }\n\n private buildPipelineStages(): void {\n this.PipelineStages = [\n { Name: 'Ingest', Icon: 'fa-solid fa-download', Status: 'idle', Count: '\\u2014' },\n { Name: 'Extract', Icon: 'fa-solid fa-file-lines', Status: 'idle', Count: '\\u2014' },\n { Name: 'Chunk', Icon: 'fa-solid fa-scissors', Status: 'idle', Count: '\\u2014' },\n { Name: 'Tag', Icon: 'fa-solid fa-tags', Status: 'idle', Count: '\\u2014' },\n { Name: 'Vectorize', Icon: 'fa-solid fa-vector-square', Status: 'idle', Count: '\\u2014' }\n ];\n }\n\n private buildFeedItems(): void {\n const tagsByItem = this.countTagsByItem();\n\n this.FeedItems = this.contentItemsRaw.map(item => {\n const itemId = item['ID'] as string;\n const normalizedId = NormalizeUUID(itemId);\n const itemTags = this.getTopTagsForItem(itemId, 3);\n return {\n Name: deriveDisplayName({ Name: item['Name'] as string | null, Description: item['Description'] as string | null }),\n SourceName: (item['ContentSource'] as string) ?? 'Unknown',\n Tags: itemTags,\n TimeAgo: this.formatRelativeTime(item['__mj_UpdatedAt'] as string),\n Status: this.inferItemStatus(tagsByItem.get(normalizedId) ?? 0)\n };\n });\n }\n\n private buildSourceMinis(): void {\n // When items are capped by MaxRows, countItemsBySource() undercounts.\n // For a single source, use the accurate totalContentItemCount instead.\n const singleSource = this.contentSourcesRaw.length === 1;\n const itemCountBySource = singleSource ? null : this.countItemsBySource();\n this.SourceMinis = this.contentSourcesRaw.map(source => {\n const id = source['ID'] as string;\n const itemCount = singleSource ? this.totalContentItemCount : (itemCountBySource!.get(id) ?? 0);\n const typeName = (source['ContentSourceType'] as string) ?? 'Unknown';\n return {\n ID: id,\n Name: (source['Name'] as string) ?? 'Unnamed',\n Icon: getSourceTypeIcon(typeName),\n Meta: `${formatNumber(itemCount)} items`,\n StatusClass: 'active' as const\n };\n });\n }\n\n /**\n * D6: Build trending tags weighted by recency (last 7 days).\n * Counts tags from ContentItemTag records created in the last 7 days\n * and weights by frequency. Falls back to all-time data if no recent tags.\n */\n private buildTrendingTags(): void {\n const sevenDaysAgo = new Date(Date.now() - 7 * 86400000);\n const recentTags = this.contentTagsRaw.filter(tag => {\n const d = tag['__mj_CreatedAt'] as string | undefined;\n return d && new Date(d) >= sevenDaysAgo;\n });\n\n const scored = this.computeTrendingFromTags(recentTags.length > 0 ? recentTags : this.contentTagsRaw);\n const maxScore = scored.length > 0 ? scored[0].score : 1;\n\n this.TrendingTags = scored.map(s => ({\n Tag: s.tag,\n AvgWeight: s.weight,\n SizeClass: s.score >= maxScore * 0.7 ? 'large' : s.score >= maxScore * 0.3 ? '' : 'small'\n }));\n }\n\n /**\n * Compute scored trending tags from a given set of tag records.\n * Returns top 12 tags sorted by score (frequency x avg weight).\n */\n private computeTrendingFromTags(tags: Record<string, unknown>[]): { tag: string; count: number; weight: number; score: number }[] {\n const counts = new Map<string, number>();\n const weightSums = new Map<string, number>();\n for (const tag of tags) {\n const t = tag['Tag'] as string;\n const w = Number(tag['Weight'] ?? 0.5);\n if (t) {\n counts.set(t, (counts.get(t) ?? 0) + 1);\n weightSums.set(t, (weightSums.get(t) ?? 0) + w);\n }\n }\n return Array.from(counts.entries()).map(([tag, count]) => {\n const weight = count > 0 ? (weightSums.get(tag) ?? 0) / count : 1.0;\n return { tag, count, weight, score: count * weight };\n }).sort((a, b) => b.score - a.score).slice(0, 12);\n }\n\n // ════════════════════════════════════════════\n // SOURCES TAB\n // ════════════════════════════════════════════\n\n private async loadSourcesData(): Promise<void> {\n // Just ensure the shared raw data is loaded; ClassifySourcesTabComponent\n // rebuilds its source cards from its [Sources]/[Items]/[Tags]/[Runs] inputs.\n await this.ensureBaseDataLoaded();\n }\n\n // buildSourceCards() + the source-detail/schedule helpers\n // (resolveEntityRecordID, resolveEntityName, countTagsBySource,\n // getLastRunBySource, getScheduledActionCron, resolveEmbeddingModelName,\n // resolveVectorIndexName, loadContentItemsForSource, loadRunHistoryForSource)\n // moved to ClassifySourcesTabComponent.\n\n /** Check if a source type's Configuration says RequiresFileType !== false */\n private sourceTypeRequiresFileType(sourceTypeID: string): boolean {\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const st = engine.ContentSourceTypes.find(t => UUIDsEqual(t.ID, sourceTypeID));\n return st?.ConfigurationObject?.RequiresFileType !== false;\n } catch {\n return true;\n }\n }\n\n // ════════════════════════════════════════════\n // CONTENT TYPES TAB\n // ════════════════════════════════════════════\n\n private async loadContentTypesData(): Promise<void> {\n if (this.contentTypesRaw.length === 0) {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({ EntityName: 'MJ: Content Types', ResultType: 'simple' });\n if (result.Success) this.contentTypesRaw = result.Results;\n }\n await this.ensureBaseDataLoaded();\n // Card building lives in ClassifyTypesTabComponent, which rebuilds from\n // its [ContentTypes]/[Sources]/[Items]/[TotalItemCount] inputs.\n }\n\n // ════════════════════════════════════════════\n // TAG LIBRARY TAB\n // ════════════════════════════════════════════\n\n private async loadTagLibraryData(): Promise<void> {\n // Just ensure the shared raw data is loaded; ClassifyTagsTabComponent\n // rebuilds its view models from the [ContentTags]/[ContentItems] inputs.\n await this.ensureBaseDataLoaded();\n }\n\n // ToCompositeKey / FromCompositeKey tree-dropdown helpers moved to\n // ClassifySourceTypeFormDialogComponent (only the slide-in form used them).\n\n // ════════════════════════════════════════════\n // RUN HISTORY TAB\n // ════════════════════════════════════════════\n\n private async loadRunHistoryData(force = false): Promise<void> {\n if (force || this.contentRunsRaw.length === 0) {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({\n EntityName: 'MJ: Content Process Runs',\n OrderBy: 'StartTime DESC',\n MaxRows: this.runHistoryWindowSize,\n StartRow: 0,\n ResultType: 'simple'\n });\n if (result.Success) {\n this.contentRunsRaw = result.Results;\n this.totalRunHistoryCount = result.TotalRowCount;\n }\n }\n }\n\n /**\n * Host handler for the Run History tab's `(RefreshRequested)` output. Forces a\n * reload of `MJ: Content Process Runs`; the new array re-binds via `[Runs]`,\n * which rebuilds the tab's rows and clears its loading state.\n */\n public async ReloadRunHistory(): Promise<void> {\n this.runHistoryWindowSize = AutotaggingPipelineResourceComponent.RUN_HISTORY_PAGE_SIZE;\n await this.loadRunHistoryData(true);\n this.cdr.detectChanges();\n }\n\n /**\n * Host handler for the Run History tab's `(LoadMoreRequested)` output. Widens\n * the loaded window by one page and reloads, so the user can see the runs that\n * were previously truncated. The new array re-binds via `[Runs]`.\n */\n public async LoadMoreRunHistory(): Promise<void> {\n if (this.IsLoadingMoreRuns) return;\n this.IsLoadingMoreRuns = true;\n this.cdr.detectChanges();\n this.runHistoryWindowSize += AutotaggingPipelineResourceComponent.RUN_HISTORY_PAGE_SIZE;\n await this.loadRunHistoryData(true);\n this.IsLoadingMoreRuns = false;\n this.cdr.detectChanges();\n }\n\n /**\n * D2: Load live per-source progress for the currently running pipeline.\n * Called when the pipeline is actively running.\n */\n public async LoadLiveRunDetails(): Promise<void> {\n // Find the most recent running pipeline run\n const runningRun = this.contentRunsRaw.find(r => {\n const status = String(r['Status'] || '').toLowerCase();\n return status === 'running' || status === 'processing' || status === 'in progress';\n });\n if (!runningRun) {\n this.LiveRunDetailRows = [];\n return;\n }\n\n this.IsLoadingLiveDetails = true;\n this.cdr.detectChanges();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({\n EntityName: 'MJ: Content Process Run Details',\n ExtraFilter: `ContentProcessRunID='${String(runningRun['ID'])}'`,\n OrderBy: 'ContentSource',\n ResultType: 'simple',\n });\n if (result.Success) {\n this.LiveRunDetailRows = mapRunDetailRecords(result.Results);\n }\n\n this.IsLoadingLiveDetails = false;\n this.cdr.detectChanges();\n }\n\n // ════════════════════════════════════════════\n // SLIDE-IN FORM β€” thin delegators to ClassifySourceTypeFormDialogComponent\n // ════════════════════════════════════════════\n //\n // The Sources/Types tabs still emit (AddSourceRequested) etc.; these handlers\n // forward the request to the slide-in form dialog (the @ViewChild) which owns\n // all form state, validation, and persistence. After a successful save the\n // dialog emits (Saved) β†’ onFormSaved() reloads the right shared data.\n\n public OpenAddSourceForm(): void {\n // Feed the dialog the raw source rows so edit can hydrate Configuration JSON.\n if (this.formDialog) this.formDialog.RawSources = this.contentSourcesRaw;\n void this.formDialog?.OpenAddSource();\n }\n\n /** Open the guided setup wizard (empty-state CTA + \"Add Source (Guided)\"). */\n public OpenSetupWizard(): void {\n void this.setupWizard?.Open();\n }\n\n // ================================================================\n // First-run onboarding (P2)\n // ================================================================\n\n /** Show the guided onboarding checklist until content has been classified. */\n public get ShowOnboarding(): boolean {\n return this.TotalContentItemCount === 0;\n }\n\n /** Whether the onboarding card has been dismissed this session. */\n public OnboardingDismissed = false;\n\n /** Steps for the first-run onboarding checklist, with live completion state. */\n public get OnboardingSteps(): Array<{ N: number; Title: string; Desc: string; Done: boolean; Action: 'add' | 'run' | '' ; Cta: string }> {\n const hasSource = this.contentSourcesRaw.length > 0;\n const hasRun = this.TotalRunHistoryCount > 0;\n const hasItems = this.TotalContentItemCount > 0;\n return [\n { N: 1, Title: 'Add a content source', Desc: 'Connect where your content comes from β€” a website, files, RSS, email, or API.', Done: hasSource, Action: 'add', Cta: 'Add Source' },\n { N: 2, Title: 'Run the classification pipeline', Desc: 'Ingest and auto-tag your content. Tip: seed a starter taxonomy first for better tags.', Done: hasRun, Action: 'run', Cta: 'Run Pipeline' },\n { N: 3, Title: 'Review results', Desc: 'Inspect the generated tags, confidence scores, and analytics.', Done: hasItems, Action: '', Cta: '' },\n ];\n }\n\n /** Index of the first incomplete step (the \"active\" one). */\n public get OnboardingActiveStep(): number {\n const steps = this.OnboardingSteps;\n const idx = steps.findIndex(s => !s.Done);\n return idx < 0 ? steps.length : idx;\n }\n\n /** Handle an onboarding step CTA. */\n public OnOnboardingAction(action: 'add' | 'run' | 'seed'): void {\n if (action === 'add') {\n this.OpenSetupWizard();\n } else if (action === 'run') {\n void this.RunPipeline();\n } else if (action === 'seed') {\n void this.SwitchTab('taxonomy');\n }\n }\n\n /** Dismiss the onboarding card (until next load / still empty). */\n public DismissOnboarding(): void {\n this.OnboardingDismissed = true;\n }\n\n /** After the wizard creates a source, reload the shared source list. */\n public async onWizardCreated(_event: { SourceID: string }): Promise<void> {\n await this.refreshSourcesTab();\n }\n\n public OpenEditSourceForm(card: SourceCard): void {\n if (this.formDialog) this.formDialog.RawSources = this.contentSourcesRaw;\n void this.formDialog?.OpenEditSource(card);\n }\n\n public OpenAddTypeForm(): void {\n void this.formDialog?.OpenAddType();\n }\n\n public OpenEditTypeForm(card: ContentTypeCard): void {\n void this.formDialog?.OpenEditType(card);\n }\n\n /**\n * Reload the relevant shared data after the slide-in form saves. The form\n * dialog closes itself; the host only re-pulls the cards' source data.\n */\n public async onFormSaved(event: { kind: 'source' | 'type' }): Promise<void> {\n if (event.kind === 'source') {\n await this.refreshSourcesTab();\n } else {\n await this.refreshContentTypesTab();\n }\n }\n\n /**\n * The form dialog's \"Open advanced settings\" link bubbles up here so the host\n * (which owns NavigationService) can open the full entity form.\n */\n public async onFormNavigateToRecord(event: { entityName: string; key: CompositeKey }): Promise<void> {\n await this.navigationService.OpenEntityRecord(event.entityName, event.key);\n }\n\n // DeleteSource(), the quick-schedule dialog (Open/Close/Save/Remove + cron\n // label/preview helpers + getScheduledActionCron, findAutotagActionID,\n // createSourceIDParam, linkScheduleToSource) moved to\n // ClassifySourcesTabComponent. loadScheduledActionsForSources() stays here\n // because the host's LoadPipelineData / refreshSourcesTab populate the cache\n // it exposes to the tab via [ScheduledActions].\n\n /**\n * Loads ScheduledAction entities referenced by content sources into the local cache.\n * Called during initial data load so cron descriptions are available for card rendering.\n */\n private async loadScheduledActionsForSources(): Promise<void> {\n const actionIDs = this.contentSourcesRaw\n .map(s => s['ScheduledActionID'] as string | null)\n .filter((id): id is string => id != null);\n\n if (actionIDs.length === 0) return;\n\n const uniqueIDs = [...new Set(actionIDs.map(id => NormalizeUUID(id)))];\n // Skip IDs already cached\n const toLoad = uniqueIDs.filter(id => !this.scheduledActionsCache.has(id));\n if (toLoad.length === 0) return;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const filter = toLoad.map(id => `'${id}'`).join(',');\n const result = await rv.RunView<MJScheduledActionEntity>({\n EntityName: 'MJ: Scheduled Actions',\n ExtraFilter: `ID IN (${filter})`,\n ResultType: 'entity_object',\n });\n\n if (result.Success) {\n for (const action of result.Results) {\n this.scheduledActionsCache.set(NormalizeUUID(action.ID), action);\n }\n }\n }\n\n // SLIDE-IN FORM β€” Content Types: open/save/close logic + the source open/save\n // logic moved to ClassifySourceTypeFormDialogComponent (see thin delegators\n // above).\n\n // ════════════════════════════════════════════\n // PIPELINE RUN\n // ════════════════════════════════════════════\n\n /**\n * Run the pipeline for a specific content source only.\n */\n public async RunPipelineForSource(contentSourceID: string): Promise<void> {\n return this.RunPipeline([contentSourceID]);\n }\n\n public async RunPipeline(contentSourceIDs?: string[]): Promise<void> {\n if (this.IsRunning) return;\n\n const provider = this.ProviderToUse as GraphQLDataProvider;\n if (!provider) return;\n\n this.IsRunning = true;\n this.IsPaused = false;\n this.RunProgress = 0;\n this.RunStage = 'Starting...';\n this.RunCurrentItem = '';\n this.CurrentPipelineRunID = null;\n this.CurrentProcessRunID = null;\n this.cdr.detectChanges();\n\n try {\n const aiClient = new GraphQLAIClient(provider);\n const result = await aiClient.RunAutotagPipeline(\n contentSourceIDs ? { contentSourceIDs } : undefined\n );\n\n if (!result.Success || !result.PipelineRunID) {\n this.IsRunning = false;\n this.RunStage = '';\n MJNotificationService.Instance.CreateSimpleNotification(\n `Pipeline failed: ${result.ErrorMessage ?? 'Unknown error'}`, 'error', 5000\n );\n this.cdr.detectChanges();\n return;\n }\n\n this.CurrentPipelineRunID = result.PipelineRunID;\n this.pipelineActivityID = this.activityService.Start('Classify pipeline', {\n icon: 'fa-solid fa-bolt',\n detail: 'Starting…',\n progress: 0,\n });\n this.subscribeToPipelineProgress(result.PipelineRunID);\n MJNotificationService.Instance.CreateSimpleNotification('Classification pipeline started…', 'info', 3000);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[Autotagging] Error starting pipeline:', msg);\n this.IsRunning = false;\n this.RunStage = '';\n MJNotificationService.Instance.CreateSimpleNotification(`Pipeline error: ${msg}`, 'error', 5000);\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Pause a running classification pipeline. The server sets CancellationRequested\n * on the process run so the engine pauses gracefully after the current batch.\n */\n public async PausePipeline(): Promise<void> {\n if (!this.IsRunning || this.IsPaused || !this.CurrentProcessRunID) return;\n\n const provider = this.ProviderToUse as GraphQLDataProvider;\n if (!provider) return;\n\n try {\n const aiClient = new GraphQLAIClient(provider);\n const result = await aiClient.PauseClassificationPipeline(this.CurrentProcessRunID);\n if (result.Success) {\n this.IsPaused = true;\n this.RunStage = 'Pausing...';\n MJNotificationService.Instance.CreateSimpleNotification('Pipeline pause requested', 'info', 3000);\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Pause failed: ${result.ErrorMessage ?? 'Unknown error'}`, 'error', 4000\n );\n }\n this.cdr.detectChanges();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Pause error: ${msg}`, 'error', 4000);\n }\n }\n\n /**\n * Resume a paused classification pipeline from its last completed offset.\n */\n public async ResumePipeline(): Promise<void> {\n if (!this.IsPaused || !this.CurrentProcessRunID) return;\n\n const provider = this.ProviderToUse as GraphQLDataProvider;\n if (!provider) return;\n\n try {\n const aiClient = new GraphQLAIClient(provider);\n const result = await aiClient.ResumeClassificationPipeline(this.CurrentProcessRunID);\n if (result.Success) {\n this.IsPaused = false;\n this.IsRunning = true;\n this.RunStage = 'Resuming...';\n if (result.PipelineRunID) {\n this.CurrentPipelineRunID = result.PipelineRunID;\n this.subscribeToPipelineProgress(result.PipelineRunID);\n }\n MJNotificationService.Instance.CreateSimpleNotification('Pipeline resumed', 'success', 3000);\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Resume failed: ${result.ErrorMessage ?? 'Unknown error'}`, 'error', 4000\n );\n }\n this.cdr.detectChanges();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Resume error: ${msg}`, 'error', 4000);\n }\n }\n\n /**\n * Cancel a running or paused pipeline. Uses pause mechanism and resets UI state.\n */\n public async CancelPipeline(): Promise<void> {\n if (!this.CurrentProcessRunID && !this.IsRunning) return;\n\n const provider = this.ProviderToUse as GraphQLDataProvider;\n if (!provider) return;\n\n // If we have a process run ID, request server-side cancellation\n if (this.CurrentProcessRunID) {\n try {\n const aiClient = new GraphQLAIClient(provider);\n await aiClient.PauseClassificationPipeline(this.CurrentProcessRunID);\n } catch {\n // Best-effort cancellation β€” proceed with UI reset regardless\n }\n }\n\n this.IsRunning = false;\n this.IsPaused = false;\n this.RunProgress = 0;\n this.RunStage = '';\n this.RunCurrentItem = '';\n this.CurrentPipelineRunID = null;\n this.CurrentProcessRunID = null;\n MJNotificationService.Instance.CreateSimpleNotification('Pipeline cancelled', 'info', 3000);\n this.cdr.detectChanges();\n }\n\n private subscribeToPipelineProgress(pipelineRunID: 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 CurrentItem\n PercentComplete\n ElapsedMs\n }\n }\n `;\n\n let idleTimer: ReturnType<typeof setTimeout> | null = null;\n // Track the most recent processed-item count from the progress stream so the\n // completion toast can report it (and surface the \"no ingested content\" case).\n let lastProcessedItems = 0;\n\n const finishPipeline = (success: boolean) => {\n if (idleTimer) clearTimeout(idleTimer);\n rxSub?.unsubscribe();\n\n Promise.resolve().then(async () => {\n this.IsRunning = false;\n this.IsPaused = false;\n this.RunStage = success ? 'Complete' : 'Error';\n this.RunProgress = success ? 100 : 0;\n this.CurrentPipelineRunID = null;\n this.CurrentProcessRunID = null;\n if (this.pipelineActivityID) {\n this.activityService.Complete(this.pipelineActivityID, success ? 'success' : 'error',\n success ? 'Classification complete' : 'Pipeline failed');\n this.pipelineActivityID = null;\n }\n\n for (const stage of this.PipelineStages) {\n stage.Status = 'idle';\n stage.Count = '\\u2014';\n }\n\n if (success) {\n this.tabDataLoaded.clear();\n // Reload pipeline data AND refresh ERD cache (new EntityRecordDocuments\n // may have been created by the pipeline for entity sources)\n this.entityRecordDocCache.clear();\n await Promise.all([\n this.LoadPipelineData(),\n this.loadEntityRecordDocCache(),\n ]);\n this.tabDataLoaded.add('pipeline');\n if (lastProcessedItems > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Pipeline complete β€” ${lastProcessedItems} ${lastProcessedItems === 1 ? 'item' : 'items'} processed`,\n 'success', 4000\n );\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Pipeline complete β€” 0 items processed. This source has no ingested content yet; add/crawl & vectorize content first.',\n 'warning', 8000\n );\n }\n }\n this.cdr.detectChanges();\n });\n };\n\n const resetIdleTimer = () => {\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => {\n if (this.IsRunning) finishPipeline(true);\n }, 30000);\n };\n\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 const currentItem = progress['CurrentItem'] as string | undefined;\n const processedItems = progress['ProcessedItems'] as number | undefined;\n if (typeof processedItems === 'number') {\n lastProcessedItems = processedItems;\n }\n\n this.RunProgress = Math.min(100, Math.max(0, pct));\n this.RunStage = this.formatStageName(stage);\n this.RunCurrentItem = currentItem ?? '';\n this.updateStagesForActiveRun(stage);\n if (this.pipelineActivityID) {\n this.activityService.Update(this.pipelineActivityID, {\n Progress: this.RunProgress,\n Detail: this.RunCurrentItem || this.RunStage,\n });\n }\n this.cdr.detectChanges();\n\n if (stage === 'complete') {\n finishPipeline(true);\n } else if (stage === 'error') {\n finishPipeline(false);\n } else {\n resetIdleTimer();\n }\n },\n error: (err: unknown) => {\n console.error('[Autotagging] Pipeline subscription error:', err);\n finishPipeline(false);\n }\n });\n }\n\n private updateStagesForActiveRun(activeStageCode: string): void {\n const stageCodeToName: Record<string, string> = {\n 'ingest': 'Ingest', 'extract': 'Extract', 'chunk': 'Chunk',\n 'tag': 'Tag', 'autotag': 'Tag', 'vectorize': 'Vectorize'\n };\n const activeName = stageCodeToName[activeStageCode] ?? '';\n let passedActive = false;\n\n for (const stage of this.PipelineStages) {\n if (stage.Name === activeName) {\n stage.Status = 'active';\n passedActive = true;\n } else if (!passedActive) {\n stage.Status = 'complete';\n } else {\n stage.Status = 'idle';\n }\n }\n }\n\n private formatStageName(stage: string): string {\n const map: Record<string, string> = {\n 'extract': 'Extracting content', 'autotag': 'Running classifiers',\n 'vectorize': 'Vectorizing content', 'complete': 'Complete',\n 'error': 'Error', 'ingest': 'Ingesting', 'chunk': 'Chunking',\n 'tag': 'Tagging'\n };\n return map[stage] ?? stage;\n }\n\n // ════════════════════════════════════════════\n // HELPER β€” Aggregation utilities\n // ════════════════════════════════════════════\n\n private countTagsByItem(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const tag of this.contentTagsRaw) {\n const itemId = NormalizeUUID(tag['ItemID'] as string);\n if (itemId) counts.set(itemId, (counts.get(itemId) ?? 0) + 1);\n }\n return counts;\n }\n\n private getTopTagsForItem(itemId: string, max: number): string[] {\n const tags: string[] = [];\n for (const tag of this.contentTagsRaw) {\n if (UUIDsEqual(tag['ItemID'] as string, itemId)) {\n tags.push(tag['Tag'] as string);\n if (tags.length >= max) break;\n }\n }\n return tags;\n }\n\n private countItemsBySource(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const item of this.contentItemsRaw) {\n const sourceId = item['ContentSourceID'] as string;\n if (sourceId) counts.set(sourceId, (counts.get(sourceId) ?? 0) + 1);\n }\n return counts;\n }\n\n // countTagsBySource() / getLastRunBySource() moved to\n // ClassifySourcesTabComponent (only the source cards used them).\n // countSourcesByContentType() / countItemsByContentType() moved to\n // ClassifyTypesTabComponent along with buildContentTypeCards().\n\n private inferItemStatus(tagCount: number): 'complete' | 'processing' | 'error' {\n return tagCount > 0 ? 'complete' : 'processing';\n }\n\n // ════════════════════════════════════════════\n // HELPER β€” Formatting\n // ════════════════════════════════════════════\n\n public formatRelativeTime(dateStr: string | null | undefined): string {\n if (!dateStr) return 'Never';\n const now = new Date();\n const then = new Date(dateStr);\n const diffMs = now.getTime() - then.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n\n if (diffMins < 1) return 'Just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n const diffHours = Math.floor(diffMins / 60);\n if (diffHours < 24) return `${diffHours}h ago`;\n const diffDays = Math.floor(diffHours / 24);\n return `${diffDays}d ago`;\n }\n\n // formatNumber / formatDate / getSourceTypeIcon / mapRunDetailRecords are now\n // imported from shared/classify.format.ts (DRY β€” single implementation shared\n // with the tab components). formatShortDate / computeDuration / displayStatus /\n // tagFontSize / formatWeight also live there; the host no longer keeps copies.\n\n // ════════════════════════════════════════════\n // HELPER β€” Data loading\n // ════════════════════════════════════════════\n\n private async ensureBaseDataLoaded(): Promise<void> {\n if (this.contentSourcesRaw.length > 0 && this.contentItemsRaw.length > 0) return;\n await this.LoadPipelineData();\n }\n\n // ensureFormDropdownsLoaded / resetSourceForm / resetTypeForm moved to\n // ClassifySourceTypeFormDialogComponent (they only served the slide-in form).\n\n private async refreshSourcesTab(): Promise<void> {\n this.tabDataLoaded.delete('sources');\n this.tabDataLoaded.delete('pipeline');\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({ EntityName: 'MJ: Content Sources', OrderBy: 'Name', ResultType: 'simple' });\n if (result.Success) this.contentSourcesRaw = result.Results;\n await this.loadScheduledActionsForSources();\n // The new contentSourcesRaw reference flows to ClassifySourcesTabComponent\n // via [Sources]=\"ContentSourcesRaw\", which rebuilds its cards on input change.\n this.buildNavItems();\n this.cdr.detectChanges();\n }\n\n private async refreshContentTypesTab(): Promise<void> {\n this.tabDataLoaded.delete('types');\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({ EntityName: 'MJ: Content Types', ResultType: 'simple' });\n if (result.Success) this.contentTypesRaw = result.Results;\n // The new contentTypesRaw reference flows to ClassifyTypesTabComponent via\n // [ContentTypes]=\"ContentTypesRaw\", which rebuilds its cards on input change.\n this.cdr.detectChanges();\n }\n\n // ════════════════════════════════════════════\n // DETAIL PANELS β€” Feed Item / Content Item\n // ════════════════════════════════════════════\n\n public OpenFeedItemDetail(index: number): void {\n const feed = this.FeedItems[index];\n if (!feed) return;\n\n const rawItem = this.contentItemsRaw[index];\n if (!rawItem) return;\n\n const itemId = rawItem['ID'] as string;\n const allTags = this.getAllWeightedTagsForItem(itemId);\n const tagCount = allTags.length;\n\n const contentSourceTypeID = (rawItem['ContentSourceTypeID'] as string) ?? '';\n const requiresContentType = this.sourceTypeRequiresFileType(contentSourceTypeID);\n\n // For entity sources, resolve the entity record ID from the EntityRecordDocument\n let entityRecordID: string | null = null;\n let entityName: string | null = null;\n if (!requiresContentType) {\n const source = this.contentSourcesRaw.find(s => UUIDsEqual(s['ID'] as string, rawItem['ContentSourceID'] as string));\n if (source) {\n const entityID = source['EntityID'] as string | null;\n if (entityID) {\n const md = this.ProviderToUse;\n const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, entityID));\n entityName = entityInfo?.Name ?? null;\n // Get RecordID from the EntityRecordDocument linked to this content item\n const erdID = rawItem['EntityRecordDocumentID'] as string | null;\n if (erdID) {\n const erd = this.entityRecordDocCache.get(NormalizeUUID(erdID));\n entityRecordID = erd ?? null;\n }\n }\n }\n }\n\n const statuses = this.inferPipelineStatuses(rawItem, tagCount);\n this.SelectedFeedItem = {\n ID: itemId,\n Name: feed.Name,\n SourceName: feed.SourceName,\n SourceTypeName: (rawItem['ContentSourceType'] as string) ?? 'Unknown',\n ContentTypeName: (rawItem['ContentType'] as string) ?? 'Unknown',\n FileTypeName: (rawItem['ContentFileType'] as string) ?? '',\n URL: (rawItem['URL'] as string) ?? '',\n TextContent: (rawItem['Text'] as string) ?? '',\n Checksum: (rawItem['Checksum'] as string) ?? '',\n Tags: allTags,\n CreatedAt: formatDate((rawItem['__mj_CreatedAt'] as string) ?? ''),\n UpdatedAt: formatDate((rawItem['__mj_UpdatedAt'] as string) ?? ''),\n ContentSourceID: (rawItem['ContentSourceID'] as string) ?? '',\n ContentSourceTypeID: contentSourceTypeID,\n StatusDot: feed.Status,\n TagCount: tagCount,\n RequiresContentType: requiresContentType,\n EntityRecordID: entityRecordID,\n EntityName: entityName,\n EmbeddingStatus: statuses.EmbeddingStatus,\n TaggingStatus: statuses.TaggingStatus,\n };\n this.ShowItemDetail = true;\n this.cdr.detectChanges();\n }\n\n public OpenContentItemDetail(item: ContentItemDetail): void {\n this.SelectedFeedItem = item;\n this.ShowItemDetail = true;\n this.cdr.detectChanges();\n }\n\n /** Open content item detail slide-in by content item ID (used from tag drill-down) */\n public OpenItemDetailByID(contentItemID: string): void {\n const rawIndex = this.contentItemsRaw.findIndex(i => UUIDsEqual(i['ID'] as string, contentItemID));\n if (rawIndex < 0) return;\n\n const rawItem = this.contentItemsRaw[rawIndex];\n const itemId = rawItem['ID'] as string;\n const allTags = this.getAllWeightedTagsForItem(itemId);\n const contentSourceTypeID = (rawItem['ContentSourceTypeID'] as string) ?? '';\n const requiresContentType = this.sourceTypeRequiresFileType(contentSourceTypeID);\n\n let entityRecordID: string | null = null;\n let entityName: string | null = null;\n if (!requiresContentType) {\n const source = this.contentSourcesRaw.find(s => UUIDsEqual(s['ID'] as string, rawItem['ContentSourceID'] as string));\n if (source) {\n const entityID = source['EntityID'] as string | null;\n if (entityID) {\n const md = this.ProviderToUse;\n const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, entityID));\n entityName = entityInfo?.Name ?? null;\n const erdID = rawItem['EntityRecordDocumentID'] as string | null;\n if (erdID) {\n entityRecordID = this.entityRecordDocCache.get(NormalizeUUID(erdID)) ?? null;\n }\n }\n }\n }\n\n const statuses2 = this.inferPipelineStatuses(rawItem, allTags.length);\n this.SelectedFeedItem = {\n ID: itemId,\n Name: deriveDisplayName({ Name: rawItem['Name'] as string | null, Description: rawItem['Description'] as string | null }),\n SourceName: (rawItem['ContentSource'] as string) ?? 'Unknown',\n SourceTypeName: (rawItem['ContentSourceType'] as string) ?? 'Unknown',\n ContentTypeName: (rawItem['ContentType'] as string) ?? 'Unknown',\n FileTypeName: (rawItem['ContentFileType'] as string) ?? '',\n URL: (rawItem['URL'] as string) ?? '',\n TextContent: (rawItem['Text'] as string) ?? '',\n Checksum: (rawItem['Checksum'] as string) ?? '',\n Tags: allTags,\n CreatedAt: formatDate((rawItem['__mj_CreatedAt'] as string) ?? ''),\n UpdatedAt: formatDate((rawItem['__mj_UpdatedAt'] as string) ?? ''),\n ContentSourceID: (rawItem['ContentSourceID'] as string) ?? '',\n ContentSourceTypeID: contentSourceTypeID,\n StatusDot: allTags.length > 0 ? 'complete' : 'processing',\n TagCount: allTags.length,\n RequiresContentType: requiresContentType,\n EntityRecordID: entityRecordID,\n EntityName: entityName,\n EmbeddingStatus: statuses2.EmbeddingStatus,\n TaggingStatus: statuses2.TaggingStatus,\n };\n this.ShowItemDetail = true;\n this.cdr.detectChanges();\n }\n\n public CloseItemDetail(): void {\n this.ShowItemDetail = false;\n this.SelectedFeedItem = null;\n this.cdr.detectChanges();\n }\n\n // ── Phase 4: Item drilldown (opened from the History tab's per-run item grid) ──\n\n /** Open the audit/analytics drilldown slide-in for a content item. */\n public OpenItemDrilldown(itemID: string): void {\n this.DrilldownItemID = itemID;\n this.ShowItemDrilldown = true;\n this.cdr.detectChanges();\n }\n\n public CloseItemDrilldown(): void {\n this.ShowItemDrilldown = false;\n this.DrilldownItemID = null;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle a record-open intent bubbled up from the drilldown (item record,\n * source, prompt run, entity record document). The host owns NavigationService.\n */\n public OpenDrilldownRecord(event: { entityName: string; recordID: string }): void {\n const pkey = new CompositeKey();\n pkey.KeyValuePairs = [{ FieldName: 'ID', Value: event.recordID }];\n this.navigationService.OpenEntityRecord(event.entityName, pkey);\n }\n\n public OpenRecordFromItem(item: ContentItemDetail): void {\n const md = this.ProviderToUse;\n const pkey = new CompositeKey();\n\n // For entity sources: navigate to the actual entity record, not the ContentItem\n if (item.EntityName && item.EntityRecordID) {\n const entityInfo = md.Entities.find(e => e.Name === item.EntityName);\n if (entityInfo) {\n pkey.LoadFromURLSegment(entityInfo, item.EntityRecordID);\n } else {\n pkey.KeyValuePairs = [{ FieldName: 'ID', Value: item.EntityRecordID }];\n }\n this.navigationService.OpenEntityRecord(item.EntityName, pkey);\n } else {\n // For non-entity sources: open the ContentItem record\n pkey.KeyValuePairs = [{ FieldName: 'ID', Value: item.ID }];\n this.navigationService.OpenEntityRecord('MJ: Content Items', pkey);\n }\n }\n\n /** Cache: EntityRecordDocument ID β†’ RecordID */\n private entityRecordDocCache = new Map<string, string>();\n\n /** Load ERD RecordIDs for entity-sourced content items */\n private async loadEntityRecordDocCache(): Promise<void> {\n if (this.entityRecordDocCache.size > 0) return;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{ ID: string; RecordID: string }>({\n EntityName: 'MJ: Entity Record Documents',\n ResultType: 'simple',\n Fields: ['ID', 'RecordID'],\n });\n if (result.Success) {\n for (const erd of result.Results) {\n this.entityRecordDocCache.set(NormalizeUUID(erd.ID), erd.RecordID);\n }\n }\n }\n\n private getAllWeightedTagsForItem(itemId: string): WeightedTag[] {\n const tags: WeightedTag[] = [];\n for (const tag of this.contentTagsRaw) {\n if (UUIDsEqual(tag['ItemID'] as string, itemId)) {\n tags.push({\n Tag: tag['Tag'] as string,\n Weight: Number(tag['Weight'] ?? 1),\n });\n }\n }\n return tags.sort((a, b) => b.Weight - a.Weight);\n }\n\n /**\n * D4: Infer embedding and tagging pipeline statuses for a content item.\n * Uses tag count and run history heuristics since dedicated status columns\n * are not yet available on the ContentItem entity.\n */\n private inferPipelineStatuses(\n rawItem: Record<string, unknown>,\n tagCount: number\n ): { EmbeddingStatus: ItemPipelineStatus; TaggingStatus: ItemPipelineStatus } {\n const explicitEmbedding = rawItem['EmbeddingStatus'] as string | undefined;\n const explicitTagging = rawItem['TaggingStatus'] as string | undefined;\n if (explicitEmbedding || explicitTagging) {\n return {\n EmbeddingStatus: this.mapStatusString(explicitEmbedding),\n TaggingStatus: this.mapStatusString(explicitTagging),\n };\n }\n\n const hasChecksum = !!(rawItem['Checksum'] as string);\n const hasText = !!((rawItem['Text'] as string)?.trim());\n const sourceID = rawItem['ContentSourceID'] as string;\n const lastRun = this.contentRunsRaw.find(r => r['SourceID'] as string === sourceID);\n const lastRunFailed = lastRun &&\n ((lastRun['Status'] as string)?.toLowerCase() === 'error' ||\n (lastRun['Status'] as string)?.toLowerCase() === 'failed');\n\n let embeddingStatus: ItemPipelineStatus = 'Pending';\n if (hasChecksum || hasText) embeddingStatus = 'Complete';\n else if (lastRunFailed) embeddingStatus = 'Failed';\n\n let taggingStatus: ItemPipelineStatus = 'Pending';\n if (tagCount > 0) taggingStatus = 'Complete';\n else if (embeddingStatus === 'Complete') taggingStatus = lastRunFailed ? 'Failed' : 'Pending';\n else if (lastRunFailed) taggingStatus = 'Failed';\n\n return { EmbeddingStatus: embeddingStatus, TaggingStatus: taggingStatus };\n }\n\n /** Map a raw status string to the ItemPipelineStatus union */\n private mapStatusString(status: string | undefined): ItemPipelineStatus {\n if (!status) return 'Pending';\n const lower = status.toLowerCase();\n if (lower === 'complete' || lower === 'completed' || lower === 'done') return 'Complete';\n if (lower === 'processing' || lower === 'running') return 'Processing';\n if (lower === 'failed' || lower === 'error') return 'Failed';\n return 'Pending';\n }\n\n // ════════════════════════════════════════════\n // CONTENT ITEM DUPLICATES (G3)\n // ════════════════════════════════════════════\n\n /** Load pending content item duplicates for review */\n public async LoadContentDuplicates(): Promise<void> {\n this.IsLoadingDuplicates = true;\n this.cdr.detectChanges();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{\n ID: string; ContentItemA: string; ContentItemB: string;\n ContentItemAID: string; ContentItemBID: string;\n SimilarityScore: number; DetectionMethod: string; Status: string;\n }>({\n EntityName: 'MJ: Content Item Duplicates',\n ExtraFilter: `Status = 'Pending'`,\n OrderBy: 'SimilarityScore DESC',\n MaxRows: 100,\n ResultType: 'simple'\n });\n\n if (result.Success) {\n // Look up source names for items\n const itemIDs = new Set<string>();\n for (const row of result.Results) {\n itemIDs.add(row.ContentItemAID);\n itemIDs.add(row.ContentItemBID);\n }\n\n const sourceNameMap = await this.resolveItemSourceNames(Array.from(itemIDs));\n\n this.ContentDuplicates = result.Results.map(row => ({\n ID: row.ID,\n ItemAName: row.ContentItemA || 'Unknown',\n ItemASource: sourceNameMap.get(row.ContentItemAID) ?? 'Unknown',\n ItemBName: row.ContentItemB || 'Unknown',\n ItemBSource: sourceNameMap.get(row.ContentItemBID) ?? 'Unknown',\n SimilarityScore: row.SimilarityScore,\n DetectionMethod: row.DetectionMethod,\n Status: row.Status as ContentDuplicateRow['Status'],\n }));\n }\n } catch (error) {\n console.error('[Classify] Error loading content duplicates:', error);\n } finally {\n this.IsLoadingDuplicates = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Resolve content source names for a list of content item IDs */\n private async resolveItemSourceNames(itemIDs: string[]): Promise<Map<string, string>> {\n const map = new Map<string, string>();\n if (itemIDs.length === 0) return map;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const idFilter = itemIDs.map(id => `ID='${id}'`).join(' OR ');\n const result = await rv.RunView<{ ID: string; ContentSource: string }>({\n EntityName: 'MJ: Content Items',\n ExtraFilter: `(${idFilter})`,\n Fields: ['ID', 'ContentSource'],\n ResultType: 'simple'\n });\n\n if (result.Success) {\n for (const row of result.Results) {\n map.set(row.ID, row.ContentSource || 'Unknown');\n }\n }\n return map;\n }\n\n /** Confirm a content duplicate pair */\n public async ConfirmContentDuplicate(dupRow: ContentDuplicateRow): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<MJContentItemDuplicateEntity>('MJ: Content Item Duplicates');\n const loaded = await entity.Load(dupRow.ID);\n if (!loaded) return;\n\n entity.Status = 'Confirmed';\n const saved = await entity.Save();\n if (saved) {\n this.ContentDuplicates = this.ContentDuplicates.filter(d => !UUIDsEqual(d.ID, dupRow.ID));\n MJNotificationService.Instance.CreateSimpleNotification('Duplicate confirmed', 'success', 2000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 3000);\n }\n this.cdr.detectChanges();\n }\n\n /** Dismiss a content duplicate pair */\n public async DismissContentDuplicate(dupRow: ContentDuplicateRow): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<MJContentItemDuplicateEntity>('MJ: Content Item Duplicates');\n const loaded = await entity.Load(dupRow.ID);\n if (!loaded) return;\n\n entity.Status = 'Dismissed';\n entity.Resolution = 'NotDuplicate';\n const saved = await entity.Save();\n if (saved) {\n this.ContentDuplicates = this.ContentDuplicates.filter(d => !UUIDsEqual(d.ID, dupRow.ID));\n MJNotificationService.Instance.CreateSimpleNotification('Duplicate dismissed', 'success', 2000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 3000);\n }\n this.cdr.detectChanges();\n }\n}\n\nexport function LoadAutotaggingPipelineResource(): void {\n // Prevents tree-shaking\n}\n","<mj-page-layout>\n <mj-page-header\n Title=\"Classify\"\n Icon=\"fa-solid fa-tags\"\n Subtitle=\"Content classification, taxonomy, and the classifier pipeline\">\n <div actions>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"RunPipeline()\" [disabled]=\"IsRunning\">\n @if (IsRunning) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> <span class=\"action-btn-label\">Running…</span>\n } @else {\n <i class=\"fa-solid fa-play\"></i> <span class=\"action-btn-label\">Run Pipeline</span>\n }\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\" [Padding]=\"false\">\n <!-- Content Classification Dashboard -->\n <div class=\"at-dashboard\">\n\n <mj-left-nav\n MobileTitle=\"Sections\"\n [Sections]=\"navSections\"\n [ActiveId]=\"ActiveTab\"\n (ItemClicked)=\"onNavItemClicked($event)\">\n </mj-left-nav>\n\n <mj-left-nav-content>\n\n @switch (ActiveTab) {\n @case ('history') {\n <classify-history-tab\n [Runs]=\"ContentRunsRaw\"\n [TotalRunCount]=\"TotalRunHistoryCount\"\n [IsLoadingMore]=\"IsLoadingMoreRuns\"\n [Provider]=\"ProviderToUse\"\n (RefreshRequested)=\"ReloadRunHistory()\"\n (LoadMoreRequested)=\"LoadMoreRunHistory()\"\n (ItemSelected)=\"OpenItemDrilldown($event)\"></classify-history-tab>\n }\n @case ('types') {\n <classify-types-tab\n [ContentTypes]=\"ContentTypesRaw\"\n [Sources]=\"ContentSourcesRaw\"\n [Items]=\"ContentItemsRaw\"\n [TotalItemCount]=\"TotalContentItemCount\"\n [Provider]=\"ProviderToUse\"\n (AddTypeRequested)=\"OpenAddTypeForm()\"\n (EditTypeRequested)=\"OpenEditTypeForm($event)\">\n </classify-types-tab>\n }\n @case ('tags') {\n <classify-tags-tab\n [ContentTags]=\"ContentTagsRaw\"\n [ContentItems]=\"ContentItemsRaw\"\n [Provider]=\"ProviderToUse\"\n (OpenItemDetailRequested)=\"OpenItemDetailByID($event)\">\n </classify-tags-tab>\n }\n @case ('sources') {\n <classify-sources-tab #sourcesTab\n [Sources]=\"ContentSourcesRaw\"\n [Items]=\"ContentItemsRaw\"\n [Tags]=\"ContentTagsRaw\"\n [Runs]=\"ContentRunsRaw\"\n [TotalItemCount]=\"TotalContentItemCount\"\n [TotalTagCount]=\"TotalContentTagCount\"\n [ScheduledActions]=\"ScheduledActionsCache\"\n [EntityRecordDocCache]=\"EntityRecordDocCacheMap\"\n [Provider]=\"ProviderToUse\"\n (AddSourceRequested)=\"OpenAddSourceForm()\"\n (AddSourceGuidedRequested)=\"OpenSetupWizard()\"\n (EditSourceRequested)=\"OpenEditSourceForm($event)\"\n (RunSourceRequested)=\"RunPipelineForSource($event)\"\n (OpenContentItemRequested)=\"OpenContentItemDetail($event)\"\n (DataChanged)=\"OnSourcesDataChanged()\">\n </classify-sources-tab>\n\n <!-- Content Item Duplicates Section (host-owned; taxonomy/duplicates area) -->\n <div class=\"at-page-body\">\n <div class=\"at-dedup-section\">\n <div class=\"at-dedup-header\">\n <div>\n <h3 class=\"at-dedup-title\">\n <i class=\"fa-solid fa-clone\"></i>\n Content Duplicates\n </h3>\n <span class=\"at-dedup-subtitle\">Review detected duplicate content items across sources</span>\n </div>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"LoadContentDuplicates()\" [disabled]=\"IsLoadingDuplicates\">\n @if (IsLoadingDuplicates) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading...\n } @else {\n <i class=\"fa-solid fa-arrows-rotate\"></i> Load Duplicates\n }\n </button>\n </div>\n\n @if (ContentDuplicates.length > 0) {\n <div class=\"at-dedup-list\">\n @for (dup of ContentDuplicates; track dup.ID) {\n <div class=\"at-dedup-card\">\n <div class=\"at-dedup-pair\">\n <div class=\"at-dedup-item\">\n <span class=\"at-dedup-item-name\">{{ dup.ItemAName }}</span>\n <span class=\"at-dedup-item-source\">{{ dup.ItemASource }}</span>\n </div>\n <div class=\"at-dedup-vs\">\n <i class=\"fa-solid fa-arrows-left-right\"></i>\n </div>\n <div class=\"at-dedup-item\">\n <span class=\"at-dedup-item-name\">{{ dup.ItemBName }}</span>\n <span class=\"at-dedup-item-source\">{{ dup.ItemBSource }}</span>\n </div>\n </div>\n <div class=\"at-dedup-meta\">\n <span class=\"at-dedup-score\">{{ (dup.SimilarityScore * 100).toFixed(0) }}% match</span>\n <span class=\"at-dedup-method\">{{ dup.DetectionMethod }}</span>\n </div>\n <div class=\"at-dedup-actions\">\n <button class=\"at-action-btn at-primary-btn at-dedup-confirm\" (click)=\"ConfirmContentDuplicate(dup)\">\n <i class=\"fa-solid fa-check\"></i> Confirm\n </button>\n <button class=\"at-action-btn at-secondary-btn at-dedup-dismiss\" (click)=\"DismissContentDuplicate(dup)\">\n <i class=\"fa-solid fa-times\"></i> Dismiss\n </button>\n </div>\n </div>\n }\n </div>\n } @else if (!IsLoadingDuplicates) {\n <div class=\"at-dedup-empty\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <p>No pending duplicates. Click \"Load Duplicates\" to check.</p>\n </div>\n }\n </div>\n </div>\n }\n @case ('pipeline') {\n @if (ShowOnboarding && !OnboardingDismissed) {\n <div class=\"kh-onboarding\">\n <div class=\"kh-onboarding-head\">\n <div class=\"kh-onboarding-title\">\n <i class=\"fa-solid fa-rocket\"></i>\n <div>\n <h3>Let's get your Knowledge Hub classifying</h3>\n <p>Three quick steps to go from an empty hub to auto-tagged content.</p>\n </div>\n </div>\n <button class=\"kh-onboarding-dismiss\" (click)=\"DismissOnboarding()\" title=\"Dismiss\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"kh-onboarding-steps\">\n @for (step of OnboardingSteps; track step.N) {\n <div class=\"kh-step\"\n [class.kh-step-done]=\"step.Done\"\n [class.kh-step-active]=\"!step.Done && step.N - 1 === OnboardingActiveStep\">\n <div class=\"kh-step-marker\">\n @if (step.Done) { <i class=\"fa-solid fa-check\"></i> } @else { {{ step.N }} }\n </div>\n <div class=\"kh-step-body\">\n <div class=\"kh-step-title\">{{ step.Title }}</div>\n <div class=\"kh-step-desc\">{{ step.Desc }}</div>\n @if (step.Action && !step.Done && step.N - 1 === OnboardingActiveStep) {\n <div class=\"kh-step-actions\">\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"OnOnboardingAction(step.Action)\">{{ step.Cta }}</button>\n @if (step.Action === 'run') {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OnOnboardingAction('seed')\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Generate starter taxonomy\n </button>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <classify-pipeline-tab\n [KPIMetrics]=\"KPIMetrics\"\n [PipelineStages]=\"PipelineStages\"\n [FeedItems]=\"FeedItems\"\n [SourceMinis]=\"SourceMinis\"\n [TrendingTags]=\"TrendingTags\"\n [LiveRunDetailRows]=\"LiveRunDetailRows\"\n [TotalItemCount]=\"TotalContentItemCount\"\n [IsLoadingMoreItems]=\"IsLoadingMoreItems\"\n [IsRunning]=\"IsRunning\"\n [IsPaused]=\"IsPaused\"\n [RunProgress]=\"RunProgress\"\n [RunStage]=\"RunStage\"\n [RunCurrentItem]=\"RunCurrentItem\"\n [CurrentProcessRunID]=\"CurrentProcessRunID\"\n [PipelineConfig]=\"PipelineConfig\"\n [ShowPipelineConfig]=\"ShowPipelineConfig\"\n [Provider]=\"ProviderToUse\"\n (RefreshRequested)=\"LoadPipelineData()\"\n (LoadMoreItemsRequested)=\"LoadMoreContentItems()\"\n (PauseRequested)=\"PausePipeline()\"\n (ResumeRequested)=\"ResumePipeline()\"\n (CancelRequested)=\"CancelPipeline()\"\n (LoadLiveRunDetailsRequested)=\"LoadLiveRunDetails()\"\n (FeedItemClicked)=\"OpenFeedItemDetail($event)\"\n (ConfigToggled)=\"TogglePipelineConfig()\">\n </classify-pipeline-tab>\n }\n @case ('inbox') {\n <classify-inbox-tab\n (Resolved)=\"onInboxResolved()\"\n [Provider]=\"ProviderToUse\">\n </classify-inbox-tab>\n }\n @case ('health') {\n <classify-health-tab\n (Resolved)=\"onHealthResolved()\"\n (OpenInTaxonomyRequested)=\"onOpenInTaxonomyRequested($event)\"\n [Provider]=\"ProviderToUse\">\n </classify-health-tab>\n }\n @case ('taxonomy') {\n <classify-taxonomy-tab\n [ContentTags]=\"ContentTagsRaw\"\n [Provider]=\"ProviderToUse\"\n (DataChanged)=\"OnTaxonomyDataChanged()\">\n </classify-taxonomy-tab>\n }\n }\n </mj-left-nav-content>\n\n <!-- ══════ SLIDE-IN FORM (Source + Content Type CRUD) ══════ -->\n <classify-source-type-form-dialog #formDialog\n [Provider]=\"ProviderToUse\"\n (Saved)=\"onFormSaved($event)\"\n (ContentTypeMissing)=\"ShowNoContentTypeWarning = true\"\n (NavigateToRecordRequested)=\"onFormNavigateToRecord($event)\">\n </classify-source-type-form-dialog>\n\n <!-- ══════ GUIDED SETUP WIZARD ══════ -->\n <classify-setup-wizard #setupWizard\n [Provider]=\"ProviderToUse\"\n (Created)=\"onWizardCreated($event)\">\n </classify-setup-wizard>\n\n <!-- ══════ ITEM DETAIL SLIDE-IN ══════ -->\n <classify-item-detail-dialog\n [Item]=\"SelectedFeedItem\"\n [Show]=\"ShowItemDetail\"\n (Closed)=\"CloseItemDetail()\"\n (OpenRecordRequested)=\"OpenRecordFromItem($event)\"\n [Provider]=\"ProviderToUse\"></classify-item-detail-dialog>\n\n <!-- ══════ ITEM DRILLDOWN SLIDE-IN (Phase 4 audit/analytics) ══════ -->\n @if (ShowItemDrilldown && DrilldownItemID) {\n <div class=\"at-slide-overlay\" (click)=\"CloseItemDrilldown()\"></div>\n <div class=\"at-slide-panel at-detail-panel\">\n <div class=\"at-slide-header\">\n <h3><i class=\"fa-solid fa-magnifying-glass-chart\"></i> Item Drilldown</h3>\n <button class=\"at-slide-close\" aria-label=\"Close item drilldown\" (click)=\"CloseItemDrilldown()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-slide-body\">\n <classify-item-drilldown\n [ItemID]=\"DrilldownItemID\"\n [Provider]=\"ProviderToUse\"\n (OpenRecordRequested)=\"OpenDrilldownRecord($event)\"></classify-item-drilldown>\n </div>\n </div>\n }\n\n <!-- No Content Types Warning Dialog (z-index above slide-in panel) -->\n <classify-no-content-type-warning\n [Show]=\"ShowNoContentTypeWarning\"\n (GoToTypes)=\"ShowNoContentTypeWarning=false; formDialog.CloseForm(); SwitchTab('types')\"\n (Dismissed)=\"ShowNoContentTypeWarning=false\"></classify-no-content-type-warning>\n </div>\n </mj-page-body>\n</mj-page-layout>\n"]}