@memberjunction/ng-dashboards 5.28.0 → 5.30.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 (125) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  2. package/dist/AI/components/agents/agent-configuration.component.js +11 -9
  3. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  4. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.js +21 -19
  6. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  7. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +154 -154
  8. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  9. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  10. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +8 -0
  11. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  12. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +1 -1
  13. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  14. package/dist/AI/components/vectors/vector-management-resource.component.js +2 -2
  15. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  16. package/dist/APIKeys/api-applications-panel.component.d.ts +1 -1
  17. package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
  18. package/dist/APIKeys/api-applications-panel.component.js +15 -2
  19. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  20. package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
  21. package/dist/APIKeys/api-key-edit-panel.component.js +17 -5
  22. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  23. package/dist/Archiving/components/archive-config-resource.component.d.ts +20 -0
  24. package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -0
  25. package/dist/Archiving/components/archive-config-resource.component.js +46 -0
  26. package/dist/Archiving/components/archive-config-resource.component.js.map +1 -0
  27. package/dist/Archiving/components/archive-runs-resource.component.d.ts +20 -0
  28. package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -0
  29. package/dist/Archiving/components/archive-runs-resource.component.js +46 -0
  30. package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -0
  31. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  32. package/dist/Credentials/components/credentials-list-resource.component.js +56 -71
  33. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  34. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +0 -8
  35. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  36. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +73 -74
  37. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  38. package/dist/DashboardBrowser/dashboard-share-adapter.d.ts +25 -0
  39. package/dist/DashboardBrowser/dashboard-share-adapter.d.ts.map +1 -0
  40. package/dist/DashboardBrowser/dashboard-share-adapter.js +99 -0
  41. package/dist/DashboardBrowser/dashboard-share-adapter.js.map +1 -0
  42. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +21 -104
  43. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
  44. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +48 -530
  45. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  46. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +5 -0
  47. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  48. package/dist/DataExplorer/data-explorer-dashboard.component.js +17 -0
  49. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  50. package/dist/Integration/components/connections/connections.component.d.ts +18 -1
  51. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  52. package/dist/Integration/components/connections/connections.component.js +251 -199
  53. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  54. package/dist/Integration/services/integration-data.service.d.ts +7 -2
  55. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  56. package/dist/Integration/services/integration-data.service.js +10 -2
  57. package/dist/Integration/services/integration-data.service.js.map +1 -1
  58. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +144 -144
  59. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  60. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  61. package/dist/Lists/components/lists-operations-resource.component.js +12 -14
  62. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  63. package/dist/MCP/components/mcp-connection-dialog.component.js +1 -1
  64. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  65. package/dist/MCP/mcp-dashboard.component.d.ts +170 -0
  66. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  67. package/dist/MCP/mcp-dashboard.component.js +2521 -758
  68. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  69. package/dist/MCP/mcp-filter-panel.component.d.ts +16 -1
  70. package/dist/MCP/mcp-filter-panel.component.d.ts.map +1 -1
  71. package/dist/MCP/mcp-filter-panel.component.js +187 -60
  72. package/dist/MCP/mcp-filter-panel.component.js.map +1 -1
  73. package/dist/MCP/mcp-resource.component.d.ts +0 -9
  74. package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
  75. package/dist/MCP/mcp-resource.component.js +1 -10
  76. package/dist/MCP/mcp-resource.component.js.map +1 -1
  77. package/dist/MCP/mcp.module.d.ts +7 -6
  78. package/dist/MCP/mcp.module.d.ts.map +1 -1
  79. package/dist/MCP/mcp.module.js +4 -8
  80. package/dist/MCP/mcp.module.js.map +1 -1
  81. package/dist/Permissions/audit-log-resource.component.d.ts +38 -0
  82. package/dist/Permissions/audit-log-resource.component.d.ts.map +1 -0
  83. package/dist/Permissions/audit-log-resource.component.js +380 -0
  84. package/dist/Permissions/audit-log-resource.component.js.map +1 -0
  85. package/dist/Permissions/permissions-shared.d.ts +51 -0
  86. package/dist/Permissions/permissions-shared.d.ts.map +1 -0
  87. package/dist/Permissions/permissions-shared.js +91 -0
  88. package/dist/Permissions/permissions-shared.js.map +1 -0
  89. package/dist/Permissions/resource-access-resource.component.d.ts +45 -0
  90. package/dist/Permissions/resource-access-resource.component.d.ts.map +1 -0
  91. package/dist/Permissions/resource-access-resource.component.js +342 -0
  92. package/dist/Permissions/resource-access-resource.component.js.map +1 -0
  93. package/dist/Permissions/user-access-resource.component.d.ts +39 -0
  94. package/dist/Permissions/user-access-resource.component.d.ts.map +1 -0
  95. package/dist/Permissions/user-access-resource.component.js +346 -0
  96. package/dist/Permissions/user-access-resource.component.js.map +1 -0
  97. package/dist/QueryBrowser/query-browser-resource.component.d.ts +13 -3
  98. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  99. package/dist/QueryBrowser/query-browser-resource.component.js +186 -139
  100. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  101. package/dist/archiving-dashboards.module.d.ts +19 -0
  102. package/dist/archiving-dashboards.module.d.ts.map +1 -0
  103. package/dist/archiving-dashboards.module.js +52 -0
  104. package/dist/archiving-dashboards.module.js.map +1 -0
  105. package/dist/component-studio-dashboards.module.d.ts +1 -0
  106. package/dist/component-studio-dashboards.module.d.ts.map +1 -1
  107. package/dist/component-studio-dashboards.module.js +7 -0
  108. package/dist/component-studio-dashboards.module.js.map +1 -1
  109. package/dist/core-dashboards.module.d.ts +24 -19
  110. package/dist/core-dashboards.module.d.ts.map +1 -1
  111. package/dist/core-dashboards.module.js +30 -1
  112. package/dist/core-dashboards.module.js.map +1 -1
  113. package/dist/module.d.ts +13 -12
  114. package/dist/module.d.ts.map +1 -1
  115. package/dist/module.js +7 -0
  116. package/dist/module.js.map +1 -1
  117. package/dist/public-api.d.ts +7 -1
  118. package/dist/public-api.d.ts.map +1 -1
  119. package/dist/public-api.js +8 -0
  120. package/dist/public-api.js.map +1 -1
  121. package/dist/shared/pipes/highlight-search.pipe.d.ts +1 -1
  122. package/dist/shared/pipes/highlight-search.pipe.d.ts.map +1 -1
  123. package/dist/shared/pipes/highlight-search.pipe.js +14 -4
  124. package/dist/shared/pipes/highlight-search.pipe.js.map +1 -1
  125. package/package.json +52 -48
@@ -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, ViewEncapsulation } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { BaseEntity, CompositeKey, Metadata, RunQuery, RunView } from '@memberjunction/core';\nimport { TreeBranchConfig, TreeLeafConfig } from '@memberjunction/ng-trees';\nimport { ResourceData, KnowledgeHubMetadataEngine, MJContentSourceEntity, MJContentSourceTypeEntity_IContentSourceTypeField, MJScheduledActionEntity, MJScheduledActionParamEntity, MJContentItemDuplicateEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { RegisterClass, UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { GraphQLDataProvider, GraphQLAIClient } from '@memberjunction/graphql-dataprovider';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { WordCloudItem } from '@memberjunction/ng-word-cloud';\n\n// ── Tab type ──\n\ntype TabName = 'pipeline' | 'sources' | 'types' | 'tags' | 'taxonomy' | 'history';\n\n// ── Interfaces ──\n\ninterface NavItem {\n Tab: TabName;\n Icon: string;\n Label: string;\n BadgeText: string;\n BadgeClass: string;\n}\n\ninterface KPIMetric {\n Label: string;\n Value: number;\n Icon: string;\n Trend: string;\n TrendUp: boolean;\n}\n\ninterface PipelineStageInfo {\n Name: string;\n Icon: string;\n Status: 'idle' | 'active' | 'complete';\n Count: string;\n}\n\ninterface FeedItem {\n Name: string;\n SourceName: string;\n Tags: string[];\n TimeAgo: string;\n Status: 'complete' | 'processing' | 'error';\n}\n\ninterface SourceMini {\n ID: string;\n Name: string;\n Icon: string;\n Meta: string;\n StatusClass: 'active' | 'error' | 'inactive';\n}\n\ninterface SourceCard {\n ID: string;\n Name: string;\n SourceTypeName: string;\n ContentTypeName: string;\n FileTypeName: string;\n Icon: string;\n StatusClass: 'active' | 'error' | 'inactive';\n StatusLabel: string;\n URL: string;\n ItemCount: number;\n TagCount: number;\n AvgTags: string;\n LastRunAgo: string;\n ContentSourceTypeID: string;\n ContentTypeID: string;\n ContentFileTypeID: string;\n EmbeddingModelID: string;\n VectorIndexID: string;\n EntityID: string;\n EntityDocumentID: string;\n RequiresFileType: boolean;\n /** FK to ScheduledAction entity, null if no schedule configured */\n ScheduledActionID: string | null;\n /** Denormalized name of the linked ScheduledAction */\n ScheduledActionName: string | null;\n /** Human-readable schedule description (parsed from cron) */\n ScheduleDescription: string | null;\n}\n\ninterface ContentTypeCard {\n ID: string;\n Name: string;\n Description: string;\n AIModelName: string;\n AIModelID: string;\n MinTags: number;\n MaxTags: number;\n SourcesUsing: number;\n ItemsTagged: number;\n RangeLeftPct: number;\n RangeRightPct: number;\n EmbeddingModelID: string;\n VectorIndexID: string;\n}\n\ninterface TagRow {\n Tag: string;\n UsageCount: number;\n AvgWeight: number;\n BarWidthPct: number;\n TopSource: string;\n FirstSeen: string;\n}\n\ninterface TagCloudItem {\n Tag: string;\n AvgWeight: number;\n SizeClass: 'large' | '' | 'small';\n}\n\ninterface TagBySource {\n SourceName: string;\n Count: number;\n}\n\ninterface RunHistoryRow {\n ID: string;\n Status: string;\n StatusClass: string;\n SourceName: string;\n StartedDisplay: string;\n Duration: string;\n Items: string;\n Tags: string;\n Errors: string;\n ErrorClass: string;\n}\n\ninterface DropdownOption {\n ID: string;\n Name: string;\n}\n\n/** G3: Content item duplicate pair for review */\ninterface ContentDuplicateRow {\n ID: string;\n ItemAName: string;\n ItemASource: string;\n ItemBName: string;\n ItemBSource: string;\n SimilarityScore: number;\n DetectionMethod: string;\n Status: 'Pending' | 'Confirmed' | 'Dismissed' | 'Merged';\n}\n\n/** D2/D3/D8: Per-source detail row for a specific pipeline run */\ninterface RunDetailRow {\n SourceName: string;\n SourceType: string;\n Status: string;\n StatusClass: string;\n ItemsProcessed: number;\n ItemsTagged: number;\n ItemsVectorized: number;\n ErrorCount: number;\n TotalTokens: number;\n TotalCost: number;\n Duration: string;\n}\n\n// ── Taxonomy Governance interfaces ──\n\ntype TaxonomySubTab = 'tree' | 'duplicates' | 'orphans' | 'treemap' | 'audit';\n\ninterface TaxTreeNode {\n ID: string;\n Name: string;\n DisplayName: string;\n Description: string;\n ParentID: string | null;\n Depth: number;\n Children: TaxTreeNode[];\n ItemCount: number;\n AvgWeight: number;\n HealthColor: 'green' | 'yellow' | 'red';\n IsExpanded: boolean;\n IsSelected: boolean;\n FirstSeen: string;\n}\n\ninterface TaxDuplicatePair {\n TagA: string;\n TagB: string;\n TagAID: string;\n TagBID: string;\n Similarity: number;\n SeverityClass: 'high' | 'moderate';\n /** True when multiple Tag records share the same name (case-insensitive) */\n IsExactDuplicate: boolean;\n /** How many Tag records share this exact name (only set when IsExactDuplicate) */\n ExactDuplicateCount: number;\n /** All Tag IDs sharing the exact name (only set when IsExactDuplicate) */\n AllIDs: string[];\n}\n\ninterface TaxOrphanCard {\n ID: string;\n Name: string;\n UsageCount: number;\n AvgWeight: number;\n FirstSeen: string;\n LastSeen: string;\n IsSelected: boolean;\n}\n\ninterface TaxTreemapCell {\n ID: string;\n Name: string;\n ItemCount: number;\n ColorClass: string;\n RowSpan: number;\n}\n\n/** Supported audit action types — matches DB Action values (lowercased) */\ntype TaxAuditAction = 'created' | 'merged' | 'moved' | 'deleted' | 'renamed' | 'deprecated' | 'descriptionchanged' | 'reactivated' | 'split';\n\ninterface TaxAuditEvent {\n Type: TaxAuditAction;\n Description: string;\n TagRef: string;\n User: string;\n Timestamp: string;\n DayHeader: string;\n}\n\ninterface TaxHealthStat {\n Total: number;\n Healthy: number;\n NeedAttention: number;\n Orphaned: number;\n Duplicates: number;\n}\n\ninterface WeightedTag {\n Tag: string;\n Weight: number;\n}\n\n/** Status value for embedding or tagging pipeline phases */\ntype ItemPipelineStatus = 'Complete' | 'Processing' | 'Failed' | 'Pending';\n\ninterface ContentItemDetail {\n ID: string;\n Name: string;\n SourceName: string;\n SourceTypeName: string;\n ContentTypeName: string;\n FileTypeName: string;\n URL: string;\n TextContent: string;\n Checksum: string;\n Tags: WeightedTag[];\n CreatedAt: string;\n UpdatedAt: string;\n ContentSourceID: string;\n ContentSourceTypeID: string;\n StatusDot: 'complete' | 'processing' | 'error';\n TagCount: number;\n /** Whether this source type uses content/file type (false for Entity sources) */\n RequiresContentType: boolean;\n /** Entity record ID if source is entity type (for direct entity navigation) */\n EntityRecordID: string | null;\n /** Entity name if source is entity type */\n EntityName: string | null;\n /** Embedding pipeline status for this content item */\n EmbeddingStatus: ItemPipelineStatus;\n /** Tagging pipeline status for this content item */\n TaggingStatus: ItemPipelineStatus;\n}\n\ninterface SourceDetailInfo {\n ID: string;\n Name: string;\n SourceTypeName: string;\n FileTypeName: string;\n ContentTypeName: string;\n RequiresFileType: boolean;\n StatusClass: 'active' | 'error' | 'inactive';\n StatusLabel: string;\n Icon: string;\n URL: string;\n EmbeddingModelName: string;\n VectorIndexName: string;\n ItemCount: number;\n TagCount: number;\n AvgTags: string;\n LastRunAgo: string;\n ErrorCount: number;\n ContentItems: ContentItemDetail[];\n RunHistory: RunHistoryRow[];\n}\n\n// ── Slide-in form mode ──\n\ntype FormMode = 'none' | 'add-source' | 'edit-source' | 'add-type' | 'edit-type';\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 // ── 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 & pagination ──\n public FeedSearchQuery = '';\n public FeedPage = 0;\n public readonly FeedPageSize = 20;\n /** Sort order for the feed: 'newest' (default) or 'oldest' */\n public FeedSortOrder: 'newest' | 'oldest' = 'newest';\n\n /** Feed items filtered by search query and sorted */\n public get FilteredFeedItems(): FeedItem[] {\n let items = this.FeedItems;\n if (this.FeedSearchQuery.trim()) {\n const q = this.FeedSearchQuery.toLowerCase();\n items = items.filter(item =>\n item.Name.toLowerCase().includes(q) ||\n item.SourceName.toLowerCase().includes(q) ||\n item.Tags.some(t => t.toLowerCase().includes(q))\n );\n }\n if (this.FeedSortOrder === 'oldest') {\n return [...items].reverse();\n }\n return items;\n }\n\n /** Toggle feed sort order */\n public ToggleFeedSort(): void {\n this.FeedSortOrder = this.FeedSortOrder === 'newest' ? 'oldest' : 'newest';\n this.FeedPage = 0;\n this.cdr.detectChanges();\n }\n\n /** Paginated feed items for the current page */\n public get PaginatedFeedItems(): FeedItem[] {\n const items = this.FilteredFeedItems;\n const start = this.FeedPage * this.FeedPageSize;\n return items.slice(start, start + this.FeedPageSize);\n }\n\n /** Total pages for the feed */\n public get FeedTotalPages(): number {\n return Math.max(1, Math.ceil(this.FilteredFeedItems.length / this.FeedPageSize));\n }\n\n /** Handle feed search input change */\n public OnFeedSearchChange(): void {\n this.FeedPage = 0;\n this.cdr.detectChanges();\n }\n\n /** Navigate to previous feed page */\n public FeedPrevPage(): void {\n if (this.FeedPage > 0) {\n this.FeedPage--;\n this.cdr.detectChanges();\n }\n }\n\n /** Navigate to next feed page */\n public FeedNextPage(): void {\n if (this.FeedPage < this.FeedTotalPages - 1) {\n this.FeedPage++;\n this.cdr.detectChanges();\n }\n }\n\n /** Get the index in the original FeedItems array for a paginated item */\n public GetFeedItemOriginalIndex(item: FeedItem): number {\n return this.FeedItems.indexOf(item);\n }\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 if (prefs.ActiveTab) this.ActiveTab = prefs.ActiveTab;\n if (prefs.ShowPipelineConfig != null) this.ShowPipelineConfig = prefs.ShowPipelineConfig;\n } catch { /* ignore */ }\n }\n }\n\n public FormatTokenCount(tokens: number): string {\n if (tokens >= 1000000) return `${(tokens / 1000000).toFixed(1)}M`;\n if (tokens >= 1000) return `${(tokens / 1000).toFixed(0)}K`;\n return String(tokens);\n }\n\n // ── Sources tab ──\n public SourceCards: SourceCard[] = [];\n public ContentDuplicates: ContentDuplicateRow[] = [];\n public IsLoadingDuplicates = false;\n\n // ── Content Types tab ──\n public ContentTypeCards: ContentTypeCard[] = [];\n\n // ── Tag Library tab ──\n public TagRows: TagRow[] = [];\n public TagCloud: TagCloudItem[] = [];\n public TagCloudWordItems: WordCloudItem[] = [];\n public TagsBySource: TagBySource[] = [];\n public TagSearchQuery = '';\n public FilteredTagRows: TagRow[] = [];\n public SelectedDrillDownTag: string | null = null;\n public TagDrillDownItems: { ID: string; Name: string; SourceName: string; Weight: number; UpdatedAt: string; FeedIndex: number }[] = [];\n\n // ── Run History tab ──\n public RunHistoryRows: RunHistoryRow[] = [];\n public HistorySourceFilter = '';\n public HistoryStatusFilter = '';\n public FilteredRunRows: RunHistoryRow[] = [];\n public HistorySourceOptions: string[] = [];\n\n // D3/D8: Run History Detail slide-in\n public SelectedRunID: string | null = null;\n public RunDetailRows: RunDetailRow[] = [];\n public IsLoadingRunDetail = false;\n\n // D2: Pipeline Monitor — live per-source progress\n public LiveRunDetailRows: RunDetailRow[] = [];\n public IsLoadingLiveDetails = false;\n\n // ── Taxonomy Governance tab ──\n public TaxSubTab: TaxonomySubTab = 'tree';\n public TaxTreeNodes: TaxTreeNode[] = [];\n public TaxFlatNodes: TaxTreeNode[] = [];\n public TaxFilteredNodes: TaxTreeNode[] = [];\n public TaxSelectedNode: TaxTreeNode | null = null;\n public TaxTreeSearch = '';\n public TaxDuplicates: TaxDuplicatePair[] = [];\n public TaxOrphans: TaxOrphanCard[] = [];\n public TaxAllOrphansSelected = false;\n public TaxTreemapCells: TaxTreemapCell[] = [];\n public TaxAuditEvents: TaxAuditEvent[] = [];\n public TaxAuditFilterTypes = new Set<string>(['created', 'merged', 'moved', 'deleted', 'renamed', 'deprecated', 'descriptionchanged', 'reactivated', 'split']);\n public TaxHealth: TaxHealthStat = { Total: 0, Healthy: 0, NeedAttention: 0, Orphaned: 0, Duplicates: 0 };\n public TaxRecentItems: { Name: string; Weight: number; Date: string; Icon: string }[] = [];\n public TaxTreemapKPIs: { Label: string; Value: string }[] = [];\n public TaxIsEditing = false;\n\n // ── Create Tag Dialog ──\n public ShowCreateTagDialog = false;\n public CreateTagName = '';\n public CreateTagDescription = '';\n public CreateTagParentID: string | null = null;\n /** Label shown in the create dialog to indicate context (e.g., \"under AI Agent\") */\n public CreateTagParentLabel = '';\n\n // ── Multi-select for drag reparenting ──\n public TaxMultiSelectMode = false;\n public TaxSelectedIDs = new Set<string>();\n /** The node currently being dragged over (drop target highlight) */\n public TaxDragOverNodeID: string | null = null;\n /** True while a drag-reparent operation is saving */\n public TaxTreeSaving = false;\n\n /** Count of high-confidence duplicate pairs (>85% similarity) */\n public get TaxHighConfidenceDupeCount(): number {\n return this.TaxDuplicates.filter(d => d.SeverityClass === 'high').length;\n }\n\n /** Count of moderate-confidence duplicate pairs (70-85% similarity) */\n public get TaxModerateDupeCount(): number {\n return this.TaxDuplicates.filter(d => d.SeverityClass === 'moderate').length;\n }\n public TaxEditName = '';\n public TaxEditDescription = '';\n\n // Raw taxonomy data cache\n private tagsRaw: Record<string, unknown>[] = [];\n private taggedItemsRaw: Record<string, unknown>[] = [];\n private tagAuditLogsRaw: Record<string, unknown>[] = [];\n /** Cached per-tag aggregates from server-side SQL (weights + counts) */\n private tagAggregateWeights = new Map<string, number>();\n private tagAggregateCounts = new Map<string, number>();\n\n // ── Slide-in form ──\n public FormMode: FormMode = 'none';\n public FormSaving = false;\n public ShowNoContentTypeWarning = false;\n\n // Source form fields\n public FormSourceName = '';\n public FormSourceTypeID = '';\n public FormContentTypeID = '';\n public FormFileTypeID = '';\n public FormSourceURL = '';\n public EditingSourceID = '';\n\n // Content Type form fields\n public FormTypeName = '';\n public FormTypeDescription = '';\n public FormTypeAIModelID = '';\n public FormTypeMinTags = 1;\n public FormTypeMaxTags = 10;\n public EditingTypeID = '';\n\n // Embedding model + vector index form fields (Content Type)\n public FormTypeEmbeddingModelID = '';\n public FormTypeVectorIndexID = '';\n\n // Entity source fields (shown when source type is \"Entity\")\n public FormSourceEntityID = '';\n public FormSourceEntityDocID = '';\n\n // Embedding model + vector index form fields (Content Source overrides)\n public FormSourceEmbeddingModelID = '';\n public FormSourceVectorIndexID = '';\n\n // ── Schedule dialog ──\n /** Whether the schedule creation dialog is visible */\n public ShowScheduleDialog = false;\n /** Whether a schedule save operation is in progress */\n public ScheduleSaving = false;\n /** Source card currently being scheduled */\n public SchedulingSourceCard: SourceCard | null = null;\n /** Cron expression for the schedule form */\n public ScheduleCron = '0 2 * * *';\n /** Whether the schedule should be active immediately */\n public ScheduleEnabled = true;\n\n // ── Confirmation dialog state ──\n /** Whether a generic confirmation overlay is visible */\n public ShowConfirmDialog = false;\n /** Title text for the confirmation dialog */\n public ConfirmDialogTitle = '';\n /** Body message for the confirmation dialog */\n public ConfirmDialogMessage = '';\n /** Callback invoked when user confirms */\n private confirmDialogAction: (() => Promise<void>) | null = null;\n\n // ── Split dialog state ──\n /** Whether the split-tag dialog is visible */\n public ShowSplitDialog = false;\n /** Comma-separated new child tag names for the split operation */\n public SplitChildNames = '';\n /** The node currently being split */\n private splitTargetNode: TaxTreeNode | null = null;\n\n // ── Move dialog state ──\n /** Whether the move-tag dialog is visible */\n public ShowMoveDialog = false;\n /** Selected new parent tag ID for the move operation */\n public MoveNewParentID: string | null = null;\n /** The node currently being moved */\n private moveTargetNode: TaxTreeNode | null = null;\n\n // ── Merge Into dialog state ──\n public ShowMergeIntoDialog = false;\n public MergeSourceTag: TaxTreeNode | null = null;\n public MergeTargetID: string | null = null;\n public MergeTargetData: { ID: string; Label: string }[] = [];\n\n // ── Treemap drill-in state ──\n /** Whether the treemap drill-in panel is visible */\n public ShowTreemapDrillIn = false;\n /** Tag node currently displayed in treemap drill-in */\n public TreemapDrillInNode: TaxTreeNode | null = null;\n\n /** Cached ScheduledAction entities, keyed by normalized ID */\n private scheduledActionsCache = new Map<string, MJScheduledActionEntity>();\n\n /**\n * Whether the currently selected source type is \"Entity\", which switches\n * the URL field to Entity/EntityDocument pickers.\n */\n /** Whether the selected source type is the Entity type (name-based check) */\n public get IsEntitySourceTypeSelected(): boolean {\n if (!this.FormSourceTypeID) return false;\n const sourceType = this.SourceTypeOptions.find(o => UUIDsEqual(o.ID, this.FormSourceTypeID));\n return sourceType?.Name?.toLowerCase() === 'entity';\n }\n\n /** Whether the selected source type requires Content Type / File Type selection */\n public get SelectedSourceTypeRequiresContentType(): boolean {\n if (!this.FormSourceTypeID) return true;\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const st = engine.ContentSourceTypes.find(t => UUIDsEqual(t.ID, this.FormSourceTypeID));\n return st?.ConfigurationObject?.RequiresContentType !== false;\n } catch {\n return true;\n }\n }\n\n /** Entities that have at least one EntityDocument configured */\n public get EntitiesWithDocuments(): { ID: string; Name: string }[] {\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const docs = engine.GetActiveEntityDocuments();\n const entityMap = new Map<string, string>();\n const md = new Metadata();\n for (const doc of docs) {\n const entityName = doc.Get('Entity') as string;\n if (entityName) {\n const entityInfo = md.Entities.find(e => e.Name === entityName);\n if (entityInfo && !entityMap.has(entityInfo.ID)) {\n entityMap.set(entityInfo.ID, entityInfo.Name);\n }\n }\n }\n return Array.from(entityMap.entries())\n .map(([ID, Name]) => ({ ID, Name }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n } catch {\n return [];\n }\n }\n\n /** Entity documents for the selected entity */\n public get EntityDocOptionsForSelectedEntity(): { ID: string; Name: string }[] {\n if (!this.FormSourceEntityID) return [];\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const md = new Metadata();\n const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, this.FormSourceEntityID));\n if (!entityInfo) return [];\n return engine.GetActiveEntityDocuments()\n .filter(d => (d.Get('Entity') as string) === entityInfo.Name)\n .map(d => ({ ID: d.ID, Name: d.Name }));\n } catch {\n return [];\n }\n }\n\n // ── Dynamic source-type fields (metadata-driven) ──\n\n /** Stores source-type-specific config values keyed by RequiredFields[].Key */\n public FormSourceSpecificConfig: Record<string, string> = {};\n\n /** Available MJ Storage provider keys for the storage-provider-picker widget */\n public StorageProviderOptions: string[] = ['Azure Blob Storage', 'AWS S3', 'Google Cloud Storage', 'SharePoint', 'Dropbox', 'Box'];\n\n /**\n * The RequiredFields array from the selected source type's ConfigurationObject.\n * Drives dynamic form rendering — each field becomes a widget.\n */\n public get SelectedSourceTypeFields(): MJContentSourceTypeEntity_IContentSourceTypeField[] {\n if (!this.FormSourceTypeID) return [];\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const sourceType = engine.ContentSourceTypes.find(st => UUIDsEqual(st.ID, this.FormSourceTypeID));\n if (!sourceType) return [];\n const config = sourceType.ConfigurationObject;\n return config?.RequiredFields ?? [];\n } catch {\n return [];\n }\n }\n\n /**\n * Get dependent options for a field (e.g., entity-doc-picker depends on entity-picker).\n * Returns entity documents for the entity selected in the dependent field.\n */\n public GetDependentOptions(field: MJContentSourceTypeEntity_IContentSourceTypeField): { ID: string; Name: string }[] {\n if (field.Type === 'entity-doc-picker' && field.DependsOnField) {\n const entityID = this.FormSourceSpecificConfig[field.DependsOnField];\n if (!entityID) return [];\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const md = new Metadata();\n const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, entityID));\n if (!entityInfo) return [];\n return engine.GetActiveEntityDocuments()\n .filter(d => (d.Get('Entity') as string) === entityInfo.Name)\n .map(d => ({ ID: d.ID, Name: d.Name }));\n } catch {\n return [];\n }\n }\n return [];\n }\n\n /**\n * Handle a source-specific field value change.\n * For entity-picker: auto-select the first entity doc if only one exists.\n */\n public OnSourceFieldChanged(fieldKey: string): void {\n // Find fields that depend on this field\n for (const field of this.SelectedSourceTypeFields) {\n if (field.DependsOnField === fieldKey) {\n const options = this.GetDependentOptions(field);\n if (options.length === 1) {\n this.FormSourceSpecificConfig[field.Key] = options[0].ID;\n } else {\n this.FormSourceSpecificConfig[field.Key] = '';\n }\n }\n }\n }\n\n // ── Detail panels ──\n public SelectedFeedItem: ContentItemDetail | null = null;\n public ShowItemDetail = false;\n public SelectedSource: SourceDetailInfo | null = null;\n public ShowSourceDetail = false;\n public SourceDetailLoading = false;\n\n // ── D4: Source detail status filter ──\n /** Filter content items in source detail by pipeline status */\n public SourceDetailStatusFilter: ItemPipelineStatus | 'All' = 'All';\n /** Available status options for the filter dropdown */\n public readonly SourceDetailStatusOptions: (ItemPipelineStatus | 'All')[] = ['All', 'Complete', 'Processing', 'Failed', 'Pending'];\n\n // ── D7: Source detail pagination ──\n /** Current page index (0-based) for source detail content list */\n public SourceDetailPage = 0;\n /** Number of content items per page in source detail */\n public readonly SourceDetailPageSize = 10;\n\n /**\n * Returns source detail content items filtered by SourceDetailStatusFilter,\n * then sliced to the current page.\n */\n public get FilteredSourceDetailItems(): ContentItemDetail[] {\n if (!this.SelectedSource) return [];\n const items = this.SourceDetailStatusFilter === 'All'\n ? this.SelectedSource.ContentItems\n : this.SelectedSource.ContentItems.filter(\n ci => ci.EmbeddingStatus === this.SourceDetailStatusFilter ||\n ci.TaggingStatus === this.SourceDetailStatusFilter\n );\n const start = this.SourceDetailPage * this.SourceDetailPageSize;\n return items.slice(start, start + this.SourceDetailPageSize);\n }\n\n /** Total number of filtered items (before pagination) */\n public get FilteredSourceDetailTotal(): number {\n if (!this.SelectedSource) return 0;\n if (this.SourceDetailStatusFilter === 'All') return this.SelectedSource.ContentItems.length;\n return this.SelectedSource.ContentItems.filter(\n ci => ci.EmbeddingStatus === this.SourceDetailStatusFilter ||\n ci.TaggingStatus === this.SourceDetailStatusFilter\n ).length;\n }\n\n /** Total pages for source detail pagination */\n public get SourceDetailTotalPages(): number {\n return Math.max(1, Math.ceil(this.FilteredSourceDetailTotal / this.SourceDetailPageSize));\n }\n\n /** Navigate to the previous page in source detail content list */\n public SourceDetailPrevPage(): void {\n if (this.SourceDetailPage > 0) {\n this.SourceDetailPage--;\n this.cdr.detectChanges();\n }\n }\n\n /** Navigate to the next page in source detail content list */\n public SourceDetailNextPage(): void {\n if (this.SourceDetailPage < this.SourceDetailTotalPages - 1) {\n this.SourceDetailPage++;\n this.cdr.detectChanges();\n }\n }\n\n /** Handle change of the source detail status filter dropdown */\n public OnSourceDetailStatusFilterChange(): void {\n this.SourceDetailPage = 0;\n this.cdr.detectChanges();\n }\n\n /**\n * D4: Placeholder handler for retrying failed items in source detail.\n * Re-runs the pipeline for the current source. In the future this could\n * target only Failed items.\n */\n public RetryFailedItems(): void {\n if (!this.SelectedSource) return;\n const failedCount = this.SelectedSource.ContentItems.filter(\n ci => ci.EmbeddingStatus === 'Failed' || ci.TaggingStatus === 'Failed'\n ).length;\n if (failedCount === 0) {\n MJNotificationService.Instance.CreateSimpleNotification('No failed items to retry', 'info', 2500);\n return;\n }\n MJNotificationService.Instance.CreateSimpleNotification(\n `Retry queued for ${failedCount} failed item${failedCount > 1 ? 's' : ''}. Pipeline will re-process on next run.`,\n 'info',\n 3000\n );\n }\n\n /** Returns the CSS class for a pipeline status badge color */\n public GetStatusBadgeClass(status: ItemPipelineStatus): string {\n switch (status) {\n case 'Complete': return 'at-status-badge-complete';\n case 'Processing': return 'at-status-badge-processing';\n case 'Failed': return 'at-status-badge-failed';\n case 'Pending': return 'at-status-badge-pending';\n }\n }\n\n // Dropdown options for forms\n public SourceTypeOptions: DropdownOption[] = [];\n public ContentTypeOptions: DropdownOption[] = [];\n public FileTypeOptions: DropdownOption[] = [];\n public AIModelOptions: DropdownOption[] = [];\n public EmbeddingModelOptions: DropdownOption[] = [];\n public VectorIndexOptions: DropdownOption[] = [];\n\n // Tree-dropdown configs for AI model selection (vendor → model grouping)\n public AIModelVendorBranch: TreeBranchConfig = {\n EntityName: 'MJ: AI Vendors',\n DisplayField: 'Name',\n IDField: 'ID',\n DefaultIcon: 'fa-solid fa-building',\n OrderBy: 'Name ASC',\n };\n public AllModelsLeaf: TreeLeafConfig = {\n EntityName: 'MJ: AI Models',\n ParentField: '',\n DisplayField: 'Name',\n IDField: 'ID',\n DefaultIcon: 'fa-solid fa-brain',\n OrderBy: '__mj_CreatedAt DESC',\n JunctionConfig: {\n EntityName: 'MJ: AI Model Vendors',\n LeafForeignKey: 'ModelID',\n BranchForeignKey: 'VendorID',\n },\n };\n /** Branch config filtered to only vendors that have at least one embedding model */\n public EmbeddingVendorBranch: TreeBranchConfig = {\n EntityName: 'MJ: AI Vendors',\n DisplayField: 'Name',\n IDField: 'ID',\n DefaultIcon: 'fa-solid fa-building',\n OrderBy: 'Name ASC',\n ExtraFilter: `ID IN (SELECT mv.VendorID FROM [__mj].vwAIModelVendors mv JOIN [__mj].vwAIModels m ON mv.ModelID = m.ID WHERE m.AIModelType = 'Embeddings')`,\n };\n public EmbeddingModelsLeaf: TreeLeafConfig = {\n EntityName: 'MJ: AI Models',\n ParentField: '',\n DisplayField: 'Name',\n IDField: 'ID',\n DefaultIcon: 'fa-solid fa-vector-square',\n ExtraFilter: \"AIModelType = 'Embeddings'\",\n OrderBy: '__mj_CreatedAt DESC',\n JunctionConfig: {\n EntityName: 'MJ: AI Model Vendors',\n LeafForeignKey: 'ModelID',\n BranchForeignKey: 'VendorID',\n },\n };\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 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 // ── Lifecycle ──\n\n private static readonly PREFS_KEY = 'KH_Classify_Preferences';\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()]);\n this.tabDataLoaded.add('pipeline');\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 // Ensure tag data is loaded\n if (!this.tabDataLoaded.has('tags')) {\n await this.loadTabData('tags');\n this.tabDataLoaded.add('tags');\n }\n\n this.TagSearchQuery = tagSearch;\n this.FilterTags();\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 });\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', '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 this.TagSearchQuery = String(params['query'] ?? '');\n this.FilterTags();\n return { Success: true, Data: { MatchCount: this.FilteredTagRows.length } };\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 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 await this.loadTaxonomyData();\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 = new RunView();\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 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-tag', Label: 'Tag Library', BadgeText: String(this.totalContentTagCount), BadgeClass: '' },\n { Tab: 'taxonomy', Icon: 'fa-solid fa-sitemap', Label: 'Taxonomy', BadgeText: String(this.tagsRaw.length || ''), 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: this.GetSourceTypeIcon(typeName),\n Meta: `${this.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 await this.ensureBaseDataLoaded();\n this.buildSourceCards();\n }\n\n private buildSourceCards(): void {\n // When there's a single source, use the accurate total counts from TotalRowCount\n // instead of counting from the capped contentItemsRaw/contentTagsRaw arrays.\n const singleSource = this.contentSourcesRaw.length === 1;\n const itemCountBySource = singleSource ? null : this.countItemsBySource();\n const tagCountBySource = singleSource ? null : this.countTagsBySource();\n const lastRunBySource = this.getLastRunBySource();\n\n this.SourceCards = this.contentSourcesRaw.map(source => {\n const id = source['ID'] as string;\n const itemCount = singleSource ? this.totalContentItemCount : (itemCountBySource!.get(id) ?? 0);\n const tagCount = singleSource ? this.totalContentTagCount : (tagCountBySource!.get(id) ?? 0);\n const avgTags = itemCount > 0 ? (tagCount / itemCount).toFixed(1) : '0';\n const lastRun = lastRunBySource.get(id);\n const typeName = (source['ContentSourceType'] as string) ?? 'Unknown';\n const lastRunStatus = lastRun ? (lastRun['Status'] as string)?.toLowerCase() : null;\n const hasError = lastRunStatus === 'error' || lastRunStatus === 'failed';\n\n const scheduledActionID = (source['ScheduledActionID'] as string | null) ?? null;\n const scheduledActionName = (source['ScheduledAction'] as string | null) ?? null;\n const cronExpr = scheduledActionID ? this.getScheduledActionCron(scheduledActionID) : null;\n\n return {\n ID: id,\n Name: (source['Name'] as string) ?? 'Unnamed Source',\n SourceTypeName: typeName,\n ContentTypeName: (source['ContentType'] as string) ?? 'Unknown',\n FileTypeName: (source['ContentFileType'] as string) ?? 'Unknown',\n Icon: this.GetSourceTypeIcon(typeName),\n StatusClass: hasError ? 'error' as const : 'active' as const,\n StatusLabel: hasError ? 'Error' : 'Active',\n URL: (source['URL'] as string) ?? '',\n ItemCount: itemCount,\n TagCount: tagCount,\n AvgTags: avgTags,\n LastRunAgo: lastRun ? this.formatRelativeTime(lastRun['StartTime'] as string) : 'Never',\n ContentSourceTypeID: source['ContentSourceTypeID'] as string,\n ContentTypeID: source['ContentTypeID'] as string,\n ContentFileTypeID: source['ContentFileTypeID'] as string,\n EmbeddingModelID: (source['EmbeddingModelID'] as string) ?? '',\n VectorIndexID: (source['VectorIndexID'] as string) ?? '',\n EntityID: (source['EntityID'] as string) ?? '',\n EntityDocumentID: (source['EntityDocumentID'] as string) ?? '',\n RequiresFileType: this.sourceTypeRequiresFileType(source['ContentSourceTypeID'] as string),\n ScheduledActionID: scheduledActionID,\n ScheduledActionName: scheduledActionName,\n ScheduleDescription: cronExpr ? CronToHumanReadable(cronExpr) : null,\n };\n });\n }\n\n /** Resolve the entity record ID from the EntityRecordDocument for entity-sourced content items */\n private resolveEntityRecordID(item: Record<string, unknown>, sourceId: string): string | null {\n const erdID = item['EntityRecordDocumentID'] as string | null;\n if (!erdID) return null;\n return this.entityRecordDocCache.get(NormalizeUUID(erdID)) ?? null;\n }\n\n /** Resolve the entity name for an entity-sourced content source */\n private resolveEntityName(sourceId: string): string | null {\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const source = engine.ContentSources.find(cs => UUIDsEqual(cs.ID, sourceId));\n if (!source?.EntityID) return null;\n const md = new Metadata();\n const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, source.EntityID));\n return entityInfo?.Name ?? null;\n } catch {\n return null;\n }\n }\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 = new RunView();\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 this.buildContentTypeCards();\n }\n\n private buildContentTypeCards(): void {\n const sourcesUsingByType = this.countSourcesByContentType();\n // When items are capped by MaxRows, countItemsByContentType undercounts.\n // For a single content type, use the accurate totalContentItemCount.\n const singleType = this.contentTypesRaw.length === 1;\n const itemsByType = singleType ? null : this.countItemsByContentType();\n\n this.ContentTypeCards = this.contentTypesRaw.map(ct => {\n const id = ct['ID'] as string;\n const minTags = (ct['MinTags'] as number) ?? 1;\n const maxTags = (ct['MaxTags'] as number) ?? 10;\n const range = 15; // max possible\n return {\n ID: id,\n Name: (ct['Name'] as string) ?? 'Unnamed',\n Description: (ct['Description'] as string) ?? '',\n AIModelName: (ct['AIModel'] as string) ?? 'Default Model',\n AIModelID: (ct['AIModelID'] as string) ?? '',\n MinTags: minTags,\n MaxTags: maxTags,\n SourcesUsing: sourcesUsingByType.get(id) ?? 0,\n ItemsTagged: singleType ? this.totalContentItemCount : (itemsByType!.get(id) ?? 0),\n RangeLeftPct: Math.round((minTags / range) * 100),\n RangeRightPct: Math.round(100 - (maxTags / range) * 100),\n EmbeddingModelID: (ct['EmbeddingModelID'] as string) ?? '',\n VectorIndexID: (ct['VectorIndexID'] as string) ?? ''\n };\n });\n }\n\n // ════════════════════════════════════════════\n // TAG LIBRARY TAB\n // ════════════════════════════════════════════\n\n private async loadTagLibraryData(): Promise<void> {\n await this.ensureBaseDataLoaded();\n this.buildTagRows();\n this.buildTagCloud();\n this.buildTagsBySource();\n this.FilteredTagRows = this.TagRows;\n }\n\n private buildTagRows(): void {\n const tagCounts = this.countAllTags();\n const avgWeights = this.computeAvgWeights();\n const tagSourceMap = this.getTopSourcePerTag();\n const tagFirstSeen = this.getFirstSeenPerTag();\n const sorted = Array.from(tagCounts.entries()).sort((a, b) => b[1] - a[1]);\n const maxCount = sorted.length > 0 ? sorted[0][1] : 1;\n\n this.TagRows = sorted.map(([tag, count]) => ({\n Tag: tag,\n UsageCount: count,\n AvgWeight: avgWeights.get(tag) ?? 1.0,\n BarWidthPct: Math.round((count / maxCount) * 100),\n TopSource: tagSourceMap.get(tag) ?? 'Unknown',\n FirstSeen: tagFirstSeen.get(tag) ?? ''\n }));\n }\n\n private buildTagCloud(): void {\n const tagCounts = this.countAllTags();\n const avgWeights = this.computeAvgWeights();\n // Sort by a combined score: usage count * avg weight (so high-weight, high-count tags bubble up)\n const scored = Array.from(tagCounts.entries()).map(([tag, count]) => {\n const weight = avgWeights.get(tag) ?? 1.0;\n return { tag, count, weight, score: count * weight };\n }).sort((a, b) => b.score - a.score).slice(0, 20);\n const maxScore = scored.length > 0 ? scored[0].score : 1;\n\n this.TagCloud = 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 // Build WordCloudItem[] for the mj-word-cloud component\n this.TagCloudWordItems = scored.map(s => ({\n Text: s.tag,\n Weight: maxScore > 0 ? s.score / maxScore : 0,\n Metadata: { Count: s.count, AvgWeight: s.weight }\n }));\n }\n\n private buildTagsBySource(): void {\n const sourceTagCounts = new Map<string, number>();\n const itemSourceMap = new Map<string, string>();\n for (const item of this.contentItemsRaw) {\n itemSourceMap.set(item['ID'] as string, (item['ContentSource'] as string) ?? 'Unknown');\n }\n for (const tag of this.contentTagsRaw) {\n const source = itemSourceMap.get(tag['ItemID'] as string) ?? 'Unknown';\n sourceTagCounts.set(source, (sourceTagCounts.get(source) ?? 0) + 1);\n }\n this.TagsBySource = Array.from(sourceTagCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([name, count]) => ({ SourceName: name, Count: count }));\n }\n\n /** Convert a string ID to a CompositeKey for tree-dropdown binding */\n public ToCompositeKey(id: string | null | undefined): CompositeKey | null {\n if (!id) return null;\n return new CompositeKey([{ FieldName: 'ID', Value: id }]);\n }\n\n /** Extract the ID string from a CompositeKey (from tree-dropdown ValueChange) */\n public FromCompositeKey(key: CompositeKey | CompositeKey[] | null): string {\n if (!key) return '';\n const ck = Array.isArray(key) ? key[0] : key;\n if (!ck?.KeyValuePairs?.length) return '';\n return String(ck.KeyValuePairs[0].Value || '');\n }\n\n public FilterTags(): void {\n const q = this.TagSearchQuery.toLowerCase().trim();\n this.FilteredTagRows = q\n ? this.TagRows.filter(r => r.Tag.toLowerCase().includes(q))\n : this.TagRows;\n this.cdr.detectChanges();\n }\n\n /** Drill down into content items matching a specific tag */\n public DrillDownTag(tagName: string): void {\n if (this.SelectedDrillDownTag === tagName) {\n this.CloseDrillDownTag();\n return;\n }\n this.SelectedDrillDownTag = tagName;\n\n // Find all content items that have this tag\n const matchingItemIDs = new Map<string, number>(); // itemID → weight\n for (const tag of this.contentTagsRaw) {\n if ((tag['Tag'] as string) === tagName) {\n matchingItemIDs.set(\n NormalizeUUID(tag['ItemID'] as string),\n Number(tag['Weight'] ?? 1)\n );\n }\n }\n\n this.TagDrillDownItems = [];\n for (let i = 0; i < this.contentItemsRaw.length; i++) {\n const item = this.contentItemsRaw[i];\n const normalizedID = NormalizeUUID(item['ID'] as string);\n const weight = matchingItemIDs.get(normalizedID);\n if (weight !== undefined) {\n this.TagDrillDownItems.push({\n ID: item['ID'] as string,\n Name: (item['Name'] as string) ?? 'Unnamed',\n SourceName: (item['ContentSource'] as string) ?? 'Unknown',\n Weight: weight,\n UpdatedAt: this.formatShortDate((item['__mj_UpdatedAt'] as string) ?? ''),\n FeedIndex: i,\n });\n }\n }\n\n // Sort by weight descending\n this.TagDrillDownItems.sort((a, b) => b.Weight - a.Weight);\n this.cdr.detectChanges();\n }\n\n public CloseDrillDownTag(): void {\n this.SelectedDrillDownTag = null;\n this.TagDrillDownItems = [];\n this.cdr.detectChanges();\n }\n\n // ════════════════════════════════════════════\n // RUN HISTORY TAB\n // ════════════════════════════════════════════\n\n private async loadRunHistoryData(): Promise<void> {\n if (this.contentRunsRaw.length === 0) {\n const rv = new RunView();\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 this.buildRunHistoryRows();\n this.buildHistorySourceOptions();\n this.FilteredRunRows = this.RunHistoryRows;\n }\n\n private buildRunHistoryRows(): void {\n this.RunHistoryRows = this.contentRunsRaw.map(run => {\n const status = (run['Status'] as string) ?? 'Unknown';\n const startTime = run['StartTime'] as string | null;\n const endTime = run['EndTime'] as string | null;\n const duration = this.computeDuration(startTime, endTime);\n const processedItems = run['ProcessedItems'] as number | null;\n const errorCount = run['ErrorCount'] as number | null;\n const statusLower = status.toLowerCase();\n const isFailed = statusLower === 'error' || statusLower === 'failed';\n const isRunning = statusLower === 'running' || statusLower === 'processing';\n const hasErrors = (errorCount ?? 0) > 0;\n\n return {\n ID: run['ID'] as string,\n Status: this.displayStatus(status),\n StatusClass: isFailed ? 'failed' : isRunning ? 'running' : 'complete',\n SourceName: (run['Source'] as string) ?? 'Unknown',\n StartedDisplay: startTime ? this.formatDate(startTime) : '\\u2014',\n Duration: duration,\n Items: processedItems != null ? this.formatNumber(processedItems) : '\\u2014',\n Tags: '\\u2014',\n Errors: hasErrors ? this.formatNumber(errorCount!) : (isFailed ? status : '0'),\n ErrorClass: isFailed || hasErrors ? 'run-error-text' : ''\n };\n });\n }\n\n private buildHistorySourceOptions(): void {\n const sources = new Set<string>();\n for (const run of this.contentRunsRaw) {\n const s = run['Source'] as string;\n if (s) sources.add(s);\n }\n this.HistorySourceOptions = Array.from(sources).sort();\n }\n\n public FilterRunHistory(): void {\n this.FilteredRunRows = this.RunHistoryRows.filter(row => {\n if (this.HistorySourceFilter && row.SourceName !== this.HistorySourceFilter) return false;\n if (this.HistoryStatusFilter && row.StatusClass !== this.HistoryStatusFilter) return false;\n return true;\n });\n this.cdr.detectChanges();\n }\n\n // ════════════════════════════════════════════\n // D3/D8: RUN HISTORY DETAIL SLIDE-IN\n // ════════════════════════════════════════════\n\n /**\n * D3/D8: Open the detail view for a specific run, loading ContentProcessRunDetail records.\n */\n public async OpenRunDetail(runID: string): Promise<void> {\n if (this.SelectedRunID === runID) {\n this.CloseRunDetail();\n return;\n }\n this.SelectedRunID = runID;\n this.IsLoadingRunDetail = true;\n this.RunDetailRows = [];\n this.cdr.detectChanges();\n\n await this.loadRunDetailRows(runID);\n\n this.IsLoadingRunDetail = false;\n this.cdr.detectChanges();\n }\n\n /** D3/D8: Close the run detail slide-in */\n public CloseRunDetail(): void {\n this.SelectedRunID = null;\n this.RunDetailRows = [];\n this.IsLoadingRunDetail = false;\n this.cdr.detectChanges();\n }\n\n /**\n * D2/D3/D8: Load ContentProcessRunDetail records for a given run and map to RunDetailRow[].\n */\n private async loadRunDetailRows(runID: string): Promise<void> {\n const rv = new RunView();\n const result = await rv.RunView({\n EntityName: 'MJ: Content Process Run Details',\n ExtraFilter: `ContentProcessRunID='${runID}'`,\n OrderBy: 'ContentSource',\n ResultType: 'simple',\n });\n if (result.Success) {\n this.RunDetailRows = this.mapRunDetailRecords(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 = new RunView();\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 = this.mapRunDetailRecords(result.Results);\n }\n\n this.IsLoadingLiveDetails = false;\n this.cdr.detectChanges();\n }\n\n /** Map raw ContentProcessRunDetail records to RunDetailRow[] */\n private mapRunDetailRecords(records: Record<string, unknown>[]): RunDetailRow[] {\n return records.map(d => {\n const status = String(d['Status'] || 'Pending');\n const statusLower = status.toLowerCase();\n const isFailed = statusLower === 'failed' || statusLower === 'error';\n const isRunning = statusLower === 'running' || statusLower === 'processing';\n const startTime = d['StartTime'] ? new Date(String(d['StartTime'])) : null;\n const endTime = d['EndTime'] ? new Date(String(d['EndTime'])) : null;\n const durationMs = startTime && endTime ? endTime.getTime() - startTime.getTime() : 0;\n const durationStr = durationMs > 60000 ? `${Math.round(durationMs / 60000)}m` : `${Math.round(durationMs / 1000)}s`;\n\n return {\n SourceName: String(d['ContentSource'] || 'Unknown'),\n SourceType: String(d['ContentSourceType'] || ''),\n Status: this.displayStatus(status),\n StatusClass: isFailed ? 'failed' : isRunning ? 'running' : 'complete',\n ItemsProcessed: Number(d['ItemsProcessed'] || 0),\n ItemsTagged: Number(d['ItemsTagged'] || 0),\n ItemsVectorized: Number(d['ItemsVectorized'] || 0),\n ErrorCount: Number(d['ErrorCount'] || 0),\n TotalTokens: Number(d['TotalTokensUsed'] || 0),\n TotalCost: Number(d['TotalCost'] || 0),\n Duration: durationStr,\n };\n });\n }\n\n // ════════════════════════════════════════════\n // SLIDE-IN FORM — Sources\n // ════════════════════════════════════════════\n\n public async OpenAddSourceForm(): Promise<void> {\n await this.ensureFormDropdownsLoaded();\n this.resetSourceForm();\n this.FormMode = 'add-source';\n this.cdr.detectChanges();\n }\n\n public async OpenEditSourceForm(card: SourceCard): Promise<void> {\n await this.ensureFormDropdownsLoaded();\n this.FormSourceName = card.Name;\n this.FormSourceTypeID = card.ContentSourceTypeID;\n this.FormContentTypeID = card.ContentTypeID;\n this.FormFileTypeID = card.ContentFileTypeID;\n this.FormSourceURL = card.URL;\n this.FormSourceEntityID = card.EntityID ?? '';\n this.FormSourceEntityDocID = card.EntityDocumentID ?? '';\n this.FormSourceEmbeddingModelID = card.EmbeddingModelID ?? '';\n this.FormSourceVectorIndexID = card.VectorIndexID ?? '';\n this.EditingSourceID = card.ID;\n\n // Populate FormSourceSpecificConfig from existing Configuration JSON\n this.FormSourceSpecificConfig = {};\n const rawSource = this.contentSourcesRaw.find(s => UUIDsEqual(s['ID'] as string, card.ID));\n if (rawSource) {\n const configStr = rawSource['Configuration'] as string | null;\n if (configStr) {\n try {\n const parsed = JSON.parse(configStr);\n const specific = parsed?.SourceSpecificConfiguration as Record<string, string> | undefined;\n if (specific) {\n this.FormSourceSpecificConfig = { ...specific };\n }\n } catch {\n // Configuration not valid JSON, ignore\n }\n }\n }\n\n this.FormMode = 'edit-source';\n this.cdr.detectChanges();\n }\n\n public async SaveSource(): Promise<void> {\n if (this.FormSaving) return;\n\n // Validate required fields before saving\n if (!this.FormSourceName.trim()) {\n MJNotificationService.Instance.CreateSimpleNotification('Please enter a source name.', 'warning', 3000);\n return;\n }\n if (!this.FormSourceTypeID) {\n MJNotificationService.Instance.CreateSimpleNotification('Please select a source type.', 'warning', 3000);\n return;\n }\n\n // For non-Entity source types, ContentType is required\n if (!this.IsEntitySourceTypeSelected && this.SelectedSourceTypeRequiresContentType) {\n if (!this.FormContentTypeID) {\n if (this.ContentTypeOptions.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'No content types are configured. Please create a content type first in the Content Types section.',\n 'warning', 5000\n );\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please select a content type.',\n 'warning', 3000\n );\n }\n return;\n }\n }\n\n this.FormSaving = true;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<MJContentSourceEntity>('MJ: Content Sources');\n\n if (this.FormMode === 'edit-source' && this.EditingSourceID) {\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: this.EditingSourceID }]));\n } else {\n entity.NewRecord();\n }\n\n entity.Name = this.FormSourceName;\n entity.ContentSourceTypeID = this.FormSourceTypeID;\n\n // For Entity source type, ContentType and FileType are not relevant\n // but the DB columns are NOT NULL, so default to the first available value\n if (this.IsEntitySourceTypeSelected) {\n const engine = KnowledgeHubMetadataEngine.Instance;\n if (!entity.ContentTypeID) {\n if (engine.ContentTypes.length === 0) {\n this.FormSaving = false;\n this.cdr.detectChanges();\n this.ShowNoContentTypeWarning = true;\n return;\n }\n entity.ContentTypeID = engine.ContentTypes[0].ID;\n }\n if (!entity.ContentFileTypeID && engine.ContentFileTypes.length > 0) {\n entity.ContentFileTypeID = engine.ContentFileTypes[0].ID;\n }\n } else {\n entity.ContentTypeID = this.FormContentTypeID;\n entity.ContentFileTypeID = this.FormFileTypeID;\n }\n\n // Store source-type-specific values from the dynamic form\n // For Entity type: EntityID and EntityDocumentID go on the entity directly\n if (this.IsEntitySourceTypeSelected) {\n entity.EntityID = this.FormSourceSpecificConfig['EntityID'] || null;\n const entityDocID = this.FormSourceSpecificConfig['EntityDocumentID'];\n if (entityDocID) {\n entity.EntityDocumentID = entityDocID;\n } else {\n // Auto-select first doc if only one exists\n const docField = this.SelectedSourceTypeFields.find(f => f.Type === 'entity-doc-picker');\n const docs = docField ? this.GetDependentOptions(docField) : [];\n entity.EntityDocumentID = docs.length > 0 ? docs[0].ID : null;\n }\n entity.URL = '';\n } else {\n entity.EntityID = null;\n entity.EntityDocumentID = null;\n // URL comes from dynamic fields for RSS/Website, or empty for others\n entity.URL = this.FormSourceSpecificConfig['URL'] || '';\n }\n\n // Store the full SourceSpecificConfiguration in the Configuration JSON\n const currentConfig = entity.ConfigurationObject ?? {};\n currentConfig.SourceSpecificConfiguration = { ...this.FormSourceSpecificConfig };\n entity.ConfigurationObject = currentConfig;\n\n entity.EmbeddingModelID = this.FormSourceEmbeddingModelID || null;\n entity.VectorIndexID = this.FormSourceVectorIndexID || null;\n\n const saved = await entity.Save();\n if (saved) {\n MJNotificationService.Instance.CreateSimpleNotification(\n this.FormMode === 'edit-source' ? 'Source updated' : 'Source created', 'success', 2500\n );\n this.CloseForm();\n await this.refreshSourcesTab();\n } else {\n // CP-4: Show detailed error from LatestResult\n const errorDetail = entity.LatestResult?.Message ?? 'Unknown error';\n console.error('[Classify] Save source failed:', entity.LatestResult);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to save source: ${errorDetail}`, 'error', 5000\n );\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[Classify] Save source exception:', error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);\n } finally {\n this.FormSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n public async DeleteSource(card: SourceCard): Promise<void> {\n if (!confirm(`Delete source \"${card.Name}\"? This cannot be undone.`)) return;\n\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Content Sources');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: card.ID }]));\n const deleted = await entity.Delete();\n if (deleted) {\n MJNotificationService.Instance.CreateSimpleNotification('Source deleted', 'success', 2500);\n await this.refreshSourcesTab();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to delete source', 'error', 3000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n\n // ════════════════════════════════════════════\n // SCHEDULE DIALOG — Quick Schedule for Source\n // ════════════════════════════════════════════\n\n /**\n * Opens the schedule dialog pre-filled for the given source card.\n * Defaults to a daily 2 AM cron expression.\n * @param card The source card to create a schedule for\n */\n public OpenScheduleDialog(card: SourceCard): void {\n this.SchedulingSourceCard = card;\n this.ScheduleCron = '0 2 * * *';\n this.ScheduleEnabled = true;\n this.ShowScheduleDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Closes the schedule dialog without saving */\n public CloseScheduleDialog(): void {\n this.ShowScheduleDialog = false;\n this.SchedulingSourceCard = null;\n this.cdr.detectChanges();\n }\n\n /**\n * Saves a new ScheduledAction for the current source, links it\n * via ContentSource.ScheduledActionID, and creates the default\n * action params for the Autotag and Vectorize action.\n */\n public async SaveSchedule(): Promise<void> {\n if (this.ScheduleSaving || !this.SchedulingSourceCard) return;\n this.ScheduleSaving = true;\n this.cdr.detectChanges();\n\n const card = this.SchedulingSourceCard;\n\n try {\n const md = new Metadata();\n\n // 1. Find the \"Autotag and Vectorize Content\" action\n const actionID = await this.findAutotagActionID();\n if (!actionID) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Could not find the \"Autotag and Vectorize Content\" action. Please check action configuration.',\n 'error', 5000\n );\n return;\n }\n\n // 2. Create the ScheduledAction\n const scheduledAction = await md.GetEntityObject<MJScheduledActionEntity>('MJ: Scheduled Actions');\n scheduledAction.NewRecord();\n scheduledAction.Name = `Autotag: ${card.Name}`;\n scheduledAction.Description = `Automated classification pipeline for content source \"${card.Name}\"`;\n scheduledAction.ActionID = actionID;\n scheduledAction.Type = 'Custom';\n scheduledAction.CronExpression = this.ScheduleCron;\n scheduledAction.CustomCronExpression = this.ScheduleCron;\n scheduledAction.Status = this.ScheduleEnabled ? 'Active' : 'Disabled';\n scheduledAction.Timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n const saved = await scheduledAction.Save();\n if (!saved) {\n const errorDetail = scheduledAction.LatestResult?.Message ?? 'Unknown error';\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to create schedule: ${errorDetail}`, 'error', 5000\n );\n return;\n }\n\n // 3. Create ScheduledActionParam for sourceIDs\n await this.createSourceIDParam(scheduledAction.ID, actionID, card.ID);\n\n // 4. Link ScheduledAction to ContentSource\n await this.linkScheduleToSource(card.ID, scheduledAction.ID);\n\n // 5. Cache the new action for cron display\n this.scheduledActionsCache.set(NormalizeUUID(scheduledAction.ID), scheduledAction);\n\n MJNotificationService.Instance.CreateSimpleNotification(\n `Schedule created: ${CronToHumanReadable(this.ScheduleCron)}`, 'success', 3000\n );\n\n this.CloseScheduleDialog();\n await this.refreshSourcesTab();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[Classify] Schedule creation error:', error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);\n } finally {\n this.ScheduleSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Removes the schedule from a source card by unlinking the ScheduledActionID.\n * @param card The source card to remove the schedule from\n */\n public async RemoveSchedule(card: SourceCard): Promise<void> {\n if (!card.ScheduledActionID) return;\n if (!confirm(`Remove the schedule \"${card.ScheduleDescription ?? 'schedule'}\" from \"${card.Name}\"?`)) return;\n\n try {\n await this.linkScheduleToSource(card.ID, null);\n MJNotificationService.Instance.CreateSimpleNotification('Schedule removed from source', 'success', 2500);\n await this.refreshSourcesTab();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n\n /**\n * Returns the human-readable schedule description for a source card.\n * Used in the template to display schedule indicators.\n */\n public GetScheduleLabel(card: SourceCard): string {\n return card.ScheduleDescription ?? 'Scheduled';\n }\n\n /**\n * Returns a human-readable preview of a cron expression for the schedule dialog.\n * @param cron The cron expression to preview\n */\n public GetCronPreview(cron: string): string {\n return CronToHumanReadable(cron);\n }\n\n /** Looks up the cron expression for a cached ScheduledAction by ID */\n private getScheduledActionCron(scheduledActionID: string): string | null {\n const cached = this.scheduledActionsCache.get(NormalizeUUID(scheduledActionID));\n return cached?.CronExpression ?? null;\n }\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 = new RunView();\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 /** Finds the Action ID for \"Autotag and Vectorize Content\" by querying actions */\n private async findAutotagActionID(): Promise<string | null> {\n const rv = new RunView();\n const result = await rv.RunView<{ ID: string }>({\n EntityName: 'Actions',\n ExtraFilter: `Name = 'Autotag and Vectorize Content'`,\n Fields: ['ID'],\n ResultType: 'simple',\n MaxRows: 1,\n });\n if (result.Success && result.Results.length > 0) {\n return result.Results[0].ID;\n }\n return null;\n }\n\n /**\n * Creates a ScheduledActionParam that passes the source ID to the action.\n * Looks up the \"EntityNames\" action param and sets the source ID as its value.\n */\n private async createSourceIDParam(scheduledActionID: string, actionID: string, sourceID: string): Promise<void> {\n // Find the \"EntityNames\" action param to get its ID\n const rv = new RunView();\n const paramResult = await rv.RunView<{ ID: string; Name: string }>({\n EntityName: 'Action Params',\n ExtraFilter: `ActionID = '${actionID}' AND Name = 'EntityNames'`,\n Fields: ['ID', 'Name'],\n ResultType: 'simple',\n MaxRows: 1,\n });\n\n if (!paramResult.Success || paramResult.Results.length === 0) {\n console.warn('[Classify] Could not find EntityNames action param for source ID scheduling');\n return;\n }\n\n const md = new Metadata();\n const param = await md.GetEntityObject<MJScheduledActionParamEntity>('MJ: Scheduled Action Params');\n param.NewRecord();\n param.ScheduledActionID = scheduledActionID;\n param.ActionParamID = paramResult.Results[0].ID;\n param.ValueType = 'Static';\n param.Value = sourceID;\n\n const saved = await param.Save();\n if (!saved) {\n console.warn('[Classify] Failed to save schedule param:', param.LatestResult?.Message);\n }\n }\n\n /**\n * Links (or unlinks) a ScheduledAction to a ContentSource by updating\n * the ContentSource.ScheduledActionID field.\n */\n private async linkScheduleToSource(sourceID: string, scheduledActionID: string | null): Promise<void> {\n const md = new Metadata();\n const entity = await md.GetEntityObject<MJContentSourceEntity>('MJ: Content Sources');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: sourceID }]));\n entity.ScheduledActionID = scheduledActionID;\n const saved = await entity.Save();\n if (!saved) {\n throw new Error(entity.LatestResult?.Message ?? 'Failed to update content source');\n }\n }\n\n // ════════════════════════════════════════════\n // SLIDE-IN FORM — Content Types\n // ════════════════════════════════════════════\n\n public async OpenAddTypeForm(): Promise<void> {\n await this.ensureFormDropdownsLoaded();\n this.resetTypeForm();\n this.FormMode = 'add-type';\n this.cdr.detectChanges();\n }\n\n public async OpenEditTypeForm(card: ContentTypeCard): Promise<void> {\n await this.ensureFormDropdownsLoaded();\n this.FormTypeName = card.Name;\n this.FormTypeDescription = card.Description;\n this.FormTypeAIModelID = card.AIModelID;\n this.FormTypeMinTags = card.MinTags;\n this.FormTypeMaxTags = card.MaxTags;\n this.FormTypeEmbeddingModelID = card.EmbeddingModelID ?? '';\n this.FormTypeVectorIndexID = card.VectorIndexID ?? '';\n this.EditingTypeID = card.ID;\n this.FormMode = 'edit-type';\n this.cdr.detectChanges();\n }\n\n public async SaveContentType(): Promise<void> {\n if (this.FormSaving) return;\n this.FormSaving = true;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Content Types');\n\n if (this.FormMode === 'edit-type' && this.EditingTypeID) {\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: this.EditingTypeID }]));\n } else {\n entity.NewRecord();\n }\n\n entity.Set('Name', this.FormTypeName);\n entity.Set('Description', this.FormTypeDescription);\n entity.Set('AIModelID', this.FormTypeAIModelID);\n entity.Set('MinTags', this.FormTypeMinTags);\n entity.Set('MaxTags', this.FormTypeMaxTags);\n entity.Set('EmbeddingModelID', this.FormTypeEmbeddingModelID || null);\n entity.Set('VectorIndexID', this.FormTypeVectorIndexID || null);\n\n const saved = await entity.Save();\n if (saved) {\n MJNotificationService.Instance.CreateSimpleNotification(\n this.FormMode === 'edit-type' ? 'Content type updated' : 'Content type created', 'success', 2500\n );\n this.CloseForm();\n await this.refreshContentTypesTab();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to save content type', 'error', 3000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n } finally {\n this.FormSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n public CloseForm(): void {\n this.FormMode = 'none';\n this.cdr.detectChanges();\n }\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 = Metadata.Provider 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 = Metadata.Provider 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 = Metadata.Provider 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 = Metadata.Provider 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 = Metadata.Provider as GraphQLDataProvider;\n const subscriptionQuery = `\n subscription PipelineProgress($pipelineRunID: String!) {\n PipelineProgress(pipelineRunID: $pipelineRunID) {\n PipelineRunID\n Stage\n TotalItems\n ProcessedItems\n 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 autotaggers',\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 private countTagsBySource(): Map<string, number> {\n const itemSourceMap = new Map<string, string>();\n for (const item of this.contentItemsRaw) {\n itemSourceMap.set(item['ID'] as string, item['ContentSourceID'] as string);\n }\n const counts = new Map<string, number>();\n for (const tag of this.contentTagsRaw) {\n const sourceId = itemSourceMap.get(tag['ItemID'] as string);\n if (sourceId) counts.set(sourceId, (counts.get(sourceId) ?? 0) + 1);\n }\n return counts;\n }\n\n private getLastRunBySource(): Map<string, Record<string, unknown>> {\n const map = new Map<string, Record<string, unknown>>();\n for (const run of this.contentRunsRaw) {\n const sourceId = run['SourceID'] as string;\n if (sourceId && !map.has(sourceId)) {\n map.set(sourceId, run);\n }\n }\n return map;\n }\n\n private countAllTags(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const tag of this.contentTagsRaw) {\n const t = tag['Tag'] as string;\n if (t) counts.set(t, (counts.get(t) ?? 0) + 1);\n }\n return counts;\n }\n\n /** Compute average weight per tag across all occurrences */\n private computeAvgWeights(): Map<string, number> {\n const sums = new Map<string, number>();\n const counts = new Map<string, number>();\n for (const tag of this.contentTagsRaw) {\n const t = tag['Tag'] as string;\n const w = Number(tag['Weight'] ?? 0.5);\n if (t) {\n sums.set(t, (sums.get(t) ?? 0) + w);\n counts.set(t, (counts.get(t) ?? 0) + 1);\n }\n }\n const avgs = new Map<string, number>();\n for (const [t, sum] of sums) {\n avgs.set(t, Math.round((sum / (counts.get(t) ?? 1)) * 100) / 100);\n }\n return avgs;\n }\n\n private getTopSourcePerTag(): Map<string, string> {\n const tagSourceCounts = new Map<string, Map<string, number>>();\n const itemSourceMap = new Map<string, string>();\n for (const item of this.contentItemsRaw) {\n itemSourceMap.set(item['ID'] as string, (item['ContentSource'] as string) ?? 'Unknown');\n }\n for (const tag of this.contentTagsRaw) {\n const t = tag['Tag'] as string;\n const source = itemSourceMap.get(tag['ItemID'] as string) ?? 'Unknown';\n if (!tagSourceCounts.has(t)) tagSourceCounts.set(t, new Map());\n const inner = tagSourceCounts.get(t)!;\n inner.set(source, (inner.get(source) ?? 0) + 1);\n }\n const result = new Map<string, string>();\n for (const [tag, sourceCounts] of tagSourceCounts) {\n let maxSource = 'Unknown';\n let maxCount = 0;\n for (const [source, count] of sourceCounts) {\n if (count > maxCount) { maxSource = source; maxCount = count; }\n }\n result.set(tag, maxSource);\n }\n return result;\n }\n\n private getFirstSeenPerTag(): Map<string, string> {\n const result = new Map<string, string>();\n for (const tag of this.contentTagsRaw) {\n const t = tag['Tag'] as string;\n if (t && !result.has(t)) {\n const date = tag['__mj_CreatedAt'] as string;\n result.set(t, date ? this.formatShortDate(date) : '');\n }\n }\n return result;\n }\n\n private countSourcesByContentType(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const source of this.contentSourcesRaw) {\n const typeId = source['ContentTypeID'] as string;\n if (typeId) counts.set(typeId, (counts.get(typeId) ?? 0) + 1);\n }\n return counts;\n }\n\n private countItemsByContentType(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const item of this.contentItemsRaw) {\n const typeId = item['ContentTypeID'] as string;\n if (typeId) counts.set(typeId, (counts.get(typeId) ?? 0) + 1);\n }\n return counts;\n }\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 public formatNumber(n: number): string {\n return n.toLocaleString();\n }\n\n /** Returns font size in rem for a tag based on its weight (0.0-1.0). Range: 0.7rem to 1.0rem */\n public TagFontSize(weight: number): string {\n const min = 0.7;\n const max = 1.0;\n return `${min + (max - min) * Math.min(1, Math.max(0, weight))}rem`;\n }\n\n /** Format weight as percentage for display in tag chip */\n public FormatWeight(weight: number): string {\n return `${Math.round(weight * 100)}%`;\n }\n\n private formatShortDate(dateStr: string): string {\n try {\n const d = new Date(dateStr);\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n } catch {\n return '';\n }\n }\n\n private formatDate(dateStr: string): string {\n try {\n const d = new Date(dateStr);\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' });\n } catch {\n return dateStr;\n }\n }\n\n private computeDuration(start: string | null, end: string | null): string {\n if (!start) return '\\u2014';\n const s = new Date(start);\n const e = end ? new Date(end) : new Date();\n const ms = e.getTime() - s.getTime();\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${Math.round(ms / 1000)}s`;\n const mins = Math.floor(ms / 60000);\n const secs = Math.round((ms % 60000) / 1000);\n return `${mins}m ${secs}s`;\n }\n\n private displayStatus(status: string): string {\n const lower = status.toLowerCase();\n if (lower === 'complete' || lower === 'completed' || lower === 'done') return 'Complete';\n if (lower === 'error' || lower === 'failed') return 'Failed';\n if (lower === 'running' || lower === 'processing') return 'Running';\n return status;\n }\n\n public GetSourceTypeIcon(typeName: string): string {\n const iconMap: Record<string, string> = {\n 'Web': 'fa-solid fa-globe', 'Web Crawler': 'fa-solid fa-globe',\n 'API': 'fa-solid fa-plug', 'Database': 'fa-solid fa-database',\n 'File': 'fa-solid fa-file-alt', 'Email': 'fa-solid fa-envelope',\n 'RSS': 'fa-solid fa-rss', 'RSS Feed': 'fa-solid fa-rss',\n 'CMS': 'fa-solid fa-newspaper', 'PDF': 'fa-solid fa-file-pdf'\n };\n return iconMap[typeName] ?? 'fa-solid fa-folder';\n }\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 private async ensureFormDropdownsLoaded(): Promise<void> {\n try {\n // Use KnowledgeHubMetadataEngine for cached reference data — instant, no RunView needed\n const engine = KnowledgeHubMetadataEngine.Instance;\n await engine.Config(false); // no-op if already loaded\n\n this.SourceTypeOptions = engine.ContentSourceTypes.map(t => ({ ID: t.ID, Name: t.Name }));\n this.ContentTypeOptions = engine.ContentTypes.map(t => ({ ID: t.ID, Name: t.Name }));\n this.FileTypeOptions = engine.ContentFileTypes.map(t => ({ ID: t.ID, Name: t.Name }));\n this.VectorIndexOptions = engine.VectorIndexes.map(vi => ({ ID: vi.ID, Name: vi.Name }));\n\n // AI Models from AIEngineBase (already cached)\n if (this.AIModelOptions.length === 0) {\n const aiEngine = AIEngineBase.Instance;\n await aiEngine.Config(false);\n this.AIModelOptions = aiEngine.Models.map(m => ({ ID: m.ID, Name: m.Name }));\n this.EmbeddingModelOptions = aiEngine.Models\n .filter(m => m.AIModelType?.trim().toLowerCase() === 'embeddings')\n .map(m => ({ ID: m.ID, Name: m.Name }));\n }\n } catch (error) {\n console.error('[Autotagging] Error loading form dropdowns:', error);\n }\n }\n\n private resetSourceForm(): void {\n this.FormSourceName = '';\n this.FormSourceTypeID = '';\n this.FormContentTypeID = '';\n this.FormFileTypeID = '';\n this.FormSourceURL = '';\n this.FormSourceEntityID = '';\n this.FormSourceEntityDocID = '';\n this.FormSourceEmbeddingModelID = '';\n this.FormSourceVectorIndexID = '';\n this.EditingSourceID = '';\n this.FormSourceSpecificConfig = {};\n }\n\n private resetTypeForm(): void {\n this.FormTypeName = '';\n this.FormTypeDescription = '';\n this.FormTypeAIModelID = '';\n this.FormTypeMinTags = 1;\n this.FormTypeMaxTags = 10;\n this.FormTypeEmbeddingModelID = '';\n this.FormTypeVectorIndexID = '';\n this.EditingTypeID = '';\n }\n\n private async refreshSourcesTab(): Promise<void> {\n this.tabDataLoaded.delete('sources');\n this.tabDataLoaded.delete('pipeline');\n const rv = new RunView();\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 this.buildSourceCards();\n this.buildNavItems();\n this.cdr.detectChanges();\n }\n\n private async refreshContentTypesTab(): Promise<void> {\n this.tabDataLoaded.delete('types');\n const rv = new RunView();\n const result = await rv.RunView({ EntityName: 'MJ: Content Types', ResultType: 'simple' });\n if (result.Success) this.contentTypesRaw = result.Results;\n this.buildContentTypeCards();\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 = new Metadata();\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: this.formatDate((rawItem['__mj_CreatedAt'] as string) ?? ''),\n UpdatedAt: this.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 = new Metadata();\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: this.formatDate((rawItem['__mj_CreatedAt'] as string) ?? ''),\n UpdatedAt: this.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 = new Metadata();\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 = new RunView();\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 // DETAIL PANELS — Source Detail\n // ════════════════════════════════════════════\n\n public async OpenSourceDetail(card: SourceCard): Promise<void> {\n this.SourceDetailLoading = true;\n this.SourceDetailPage = 0;\n this.SourceDetailStatusFilter = 'All';\n this.ShowSourceDetail = true;\n this.cdr.detectChanges();\n\n try {\n const sourceItems = await this.loadContentItemsForSource(card.ID);\n const sourceRuns = await this.loadRunHistoryForSource(card.ID);\n\n const embeddingModelName = this.resolveEmbeddingModelName(card.EmbeddingModelID);\n const vectorIndexName = this.resolveVectorIndexName(card.VectorIndexID);\n const errorCount = sourceRuns.filter(r => r.StatusClass === 'failed').length;\n\n this.SelectedSource = {\n ID: card.ID,\n Name: card.Name,\n SourceTypeName: card.SourceTypeName,\n FileTypeName: card.FileTypeName,\n ContentTypeName: card.ContentTypeName,\n RequiresFileType: card.RequiresFileType,\n StatusClass: card.StatusClass,\n StatusLabel: card.StatusLabel,\n Icon: card.Icon,\n URL: card.URL,\n EmbeddingModelName: embeddingModelName,\n VectorIndexName: vectorIndexName,\n ItemCount: card.ItemCount,\n TagCount: card.TagCount,\n AvgTags: card.AvgTags,\n LastRunAgo: card.LastRunAgo,\n ErrorCount: errorCount,\n ContentItems: sourceItems,\n RunHistory: sourceRuns\n };\n } catch (error) {\n console.error('[Autotagging] Error loading source detail:', error);\n } finally {\n this.SourceDetailLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n public CloseSourceDetail(): void {\n this.ShowSourceDetail = false;\n this.SelectedSource = null;\n this.cdr.detectChanges();\n }\n\n public OpenRecordFromSource(source: SourceDetailInfo): void {\n const pkey = new CompositeKey();\n pkey.KeyValuePairs = [{ FieldName: 'ID', Value: source.ID }];\n this.navigationService.OpenEntityRecord('MJ: Content Sources', pkey);\n }\n\n public OpenEditSourceFromDetail(): void {\n if (!this.SelectedSource) return;\n const card = this.SourceCards.find(c => UUIDsEqual(c.ID, this.SelectedSource!.ID));\n if (card) {\n this.CloseSourceDetail();\n this.OpenEditSourceForm(card);\n }\n }\n\n public async RunSourceFromDetail(): Promise<void> {\n this.CloseSourceDetail();\n await this.RunPipeline();\n }\n\n public async DeleteSourceFromDetail(): Promise<void> {\n if (!this.SelectedSource) return;\n const card = this.SourceCards.find(c => UUIDsEqual(c.ID, this.SelectedSource!.ID));\n if (card) {\n this.CloseSourceDetail();\n await this.DeleteSource(card);\n }\n }\n\n private async loadContentItemsForSource(sourceId: string): Promise<ContentItemDetail[]> {\n const rv = new RunView();\n const result = await rv.RunView({\n EntityName: 'MJ: Content Items',\n ExtraFilter: `ContentSourceID='${sourceId}'`,\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: 100,\n ResultType: 'simple'\n });\n\n if (!result.Success) return [];\n\n const tagsByItem = this.countTagsByItem();\n return result.Results.map(item => {\n const itemId = item['ID'] as string;\n const allTags = this.getAllWeightedTagsForItem(itemId);\n const tagCount = tagsByItem.get(itemId) ?? allTags.length;\n const contentSourceTypeID = (item['ContentSourceTypeID'] as string) ?? '';\n const itemStatuses = this.inferPipelineStatuses(item, tagCount);\n return {\n ID: itemId,\n Name: (item['Name'] as string) ?? 'Unnamed',\n SourceName: (item['ContentSource'] as string) ?? '',\n SourceTypeName: (item['ContentSourceType'] as string) ?? '',\n ContentTypeName: (item['ContentType'] as string) ?? '',\n FileTypeName: (item['ContentFileType'] as string) ?? '',\n URL: (item['URL'] as string) ?? '',\n TextContent: (item['Text'] as string) ?? '',\n Checksum: (item['Checksum'] as string) ?? '',\n Tags: allTags,\n CreatedAt: this.formatDate((item['__mj_CreatedAt'] as string) ?? ''),\n UpdatedAt: this.formatDate((item['__mj_UpdatedAt'] as string) ?? ''),\n ContentSourceID: sourceId,\n ContentSourceTypeID: contentSourceTypeID,\n StatusDot: tagCount > 0 ? 'complete' : 'processing',\n TagCount: tagCount,\n RequiresContentType: this.sourceTypeRequiresFileType(contentSourceTypeID),\n EntityRecordID: this.resolveEntityRecordID(item, sourceId),\n EntityName: this.resolveEntityName(sourceId),\n EmbeddingStatus: itemStatuses.EmbeddingStatus,\n TaggingStatus: itemStatuses.TaggingStatus,\n };\n });\n }\n\n private async loadRunHistoryForSource(sourceId: string): Promise<RunHistoryRow[]> {\n const rv = new RunView();\n const result = await rv.RunView({\n EntityName: 'MJ: Content Process Runs',\n ExtraFilter: `SourceID='${sourceId}'`,\n OrderBy: 'StartTime DESC',\n MaxRows: 10,\n ResultType: 'simple'\n });\n\n if (!result.Success) return [];\n\n return result.Results.map(run => {\n const status = (run['Status'] as string) ?? 'Unknown';\n const startTime = run['StartTime'] as string | null;\n const endTime = run['EndTime'] as string | null;\n const duration = this.computeDuration(startTime, endTime);\n const processedItems = run['ProcessedItems'] as number | null;\n const errorCount = run['ErrorCount'] as number | null;\n const statusLower = status.toLowerCase();\n const isFailed = statusLower === 'error' || statusLower === 'failed';\n const isRunning = statusLower === 'running' || statusLower === 'processing';\n const hasErrors = (errorCount ?? 0) > 0;\n\n return {\n ID: run['ID'] as string,\n Status: this.displayStatus(status),\n StatusClass: isFailed ? 'failed' : isRunning ? 'running' : 'complete',\n SourceName: (run['Source'] as string) ?? 'Unknown',\n StartedDisplay: startTime ? this.formatDate(startTime) : '\\u2014',\n Duration: duration,\n Items: processedItems != null ? this.formatNumber(processedItems) : '\\u2014',\n Tags: '\\u2014',\n Errors: hasErrors ? this.formatNumber(errorCount!) : (isFailed ? status : '0'),\n ErrorClass: isFailed || hasErrors ? 'run-error-text' : ''\n };\n });\n }\n\n private resolveEmbeddingModelName(modelId: string): string {\n if (!modelId) return 'System default';\n const aiEngine = AIEngineBase.Instance;\n const model = aiEngine.Models.find(m => UUIDsEqual(m.ID, modelId));\n return model ? model.Name : 'Unknown';\n }\n\n private resolveVectorIndexName(indexId: string): string {\n if (!indexId) return 'System default';\n const engine = KnowledgeHubMetadataEngine.Instance;\n const idx = engine.GetVectorIndexById(indexId);\n return idx ? idx.Name : 'Unknown';\n }\n\n // ════════════════════════════════════════════\n // TAXONOMY GOVERNANCE TAB\n // ════════════════════════════════════════════\n\n public SwitchTaxSubTab(sub: TaxonomySubTab): void {\n this.TaxSubTab = sub;\n this.cdr.detectChanges();\n }\n\n /**\n * Loads all data needed by the Taxonomy Governance sub-tabs:\n * Tags, Tagged Items, Tag Audit Logs, and cross-references content item tags.\n */\n private async loadTaxonomyData(): Promise<void> {\n try {\n const rv = new RunView();\n const [tagsResult, taggedItemsResult, auditResult] = await rv.RunViews([\n { EntityName: 'MJ: Tags', OrderBy: 'Name', ResultType: 'simple' },\n { EntityName: 'MJ: Tagged Items', ResultType: 'simple' },\n { EntityName: 'MJ: Tag Audit Logs', OrderBy: '__mj_CreatedAt DESC', MaxRows: 200, ResultType: 'simple' }\n ]);\n\n this.tagsRaw = tagsResult.Success ? tagsResult.Results : [];\n this.taggedItemsRaw = taggedItemsResult.Success ? taggedItemsResult.Results : [];\n this.tagAuditLogsRaw = auditResult.Success ? auditResult.Results : [];\n\n // Also ensure content item tags are loaded for cross-referencing\n await this.ensureBaseDataLoaded();\n\n // Load per-tag aggregates (weights + counts) via server-side SQL\n await this.loadTagAggregates();\n\n this.buildTaxTree();\n this.buildTaxDuplicates();\n this.buildTaxOrphans();\n this.buildTaxTreemap();\n this.buildTaxAuditLog();\n this.buildTaxHealth();\n } catch (error) {\n console.error('[Autotagging] Error loading taxonomy data:', error);\n }\n }\n\n // ── Tree View ──\n\n /**\n * Builds the taxonomy tree from raw tag data, wiring up parent-child\n * relationships and attaching item counts and average weights.\n */\n private buildTaxTree(): void {\n const tagMap = new Map<string, TaxTreeNode>();\n const tagItemCounts = this.tagAggregateCounts;\n const tagAvgWeights = this.tagAggregateWeights;\n\n // Create flat node list from raw tags (exclude merged/soft-deleted tags)\n const activeTags = this.tagsRaw.filter(t => (t['Status'] as string)?.toLowerCase() !== 'merged');\n for (const tag of activeTags) {\n const id = tag['ID'] as string;\n const normalizedId = NormalizeUUID(id);\n const name = (tag['Name'] as string) ?? 'Unnamed';\n const itemCount = tagItemCounts.get(normalizedId) ?? 0;\n const avgWeight = tagAvgWeights.get(normalizedId) ?? 0;\n\n tagMap.set(normalizedId, {\n ID: id,\n Name: name,\n DisplayName: (tag['DisplayName'] as string) ?? name,\n Description: (tag['Description'] as string) ?? '',\n ParentID: (tag['ParentID'] as string) ?? null,\n Depth: 0,\n Children: [],\n ItemCount: itemCount,\n AvgWeight: avgWeight,\n HealthColor: this.computeTagHealth(itemCount, avgWeight),\n IsExpanded: false,\n IsSelected: false,\n FirstSeen: this.formatShortDate((tag['__mj_CreatedAt'] as string) ?? '')\n });\n }\n\n // Build parent-child relationships\n const roots: TaxTreeNode[] = [];\n for (const node of tagMap.values()) {\n const normalizedParent = node.ParentID ? NormalizeUUID(node.ParentID) : null;\n if (normalizedParent && tagMap.has(normalizedParent)) {\n tagMap.get(normalizedParent)!.Children.push(node);\n } else {\n roots.push(node);\n }\n }\n\n // Compute depths and aggregate child counts\n this.computeTreeDepths(roots, 0);\n this.propagateItemCounts(roots);\n\n // Sort children alphabetically\n this.sortTreeNodes(roots);\n\n // Expand top two levels by default\n for (const root of roots) {\n root.IsExpanded = true;\n for (const child of root.Children) {\n child.IsExpanded = true;\n }\n }\n\n this.TaxTreeNodes = roots;\n this.TaxFlatNodes = this.flattenTree(roots);\n this.TaxFilteredNodes = this.TaxFlatNodes;\n\n // Select first node if available\n if (this.TaxFlatNodes.length > 0) {\n this.SelectTaxNode(this.TaxFlatNodes[0]);\n }\n }\n\n private computeTreeDepths(nodes: TaxTreeNode[], depth: number): void {\n for (const node of nodes) {\n node.Depth = depth;\n this.computeTreeDepths(node.Children, depth + 1);\n }\n }\n\n private propagateItemCounts(nodes: TaxTreeNode[]): number {\n let total = 0;\n for (const node of nodes) {\n const childCount = this.propagateItemCounts(node.Children);\n node.ItemCount = node.ItemCount + childCount;\n total += node.ItemCount;\n }\n return total;\n }\n\n private sortTreeNodes(nodes: TaxTreeNode[]): void {\n nodes.sort((a, b) => a.Name.localeCompare(b.Name));\n for (const node of nodes) {\n this.sortTreeNodes(node.Children);\n }\n }\n\n private flattenTree(nodes: TaxTreeNode[]): TaxTreeNode[] {\n const result: TaxTreeNode[] = [];\n for (const node of nodes) {\n result.push(node);\n if (node.IsExpanded && node.Children.length > 0) {\n result.push(...this.flattenTree(node.Children));\n }\n }\n return result;\n }\n\n private computeTagHealth(itemCount: number, avgWeight: number): 'green' | 'yellow' | 'red' {\n if (itemCount === 0) return 'red';\n if (itemCount <= 2 || avgWeight < 0.3) return 'yellow';\n return 'green';\n }\n\n /**\n * Counts the number of items referencing each tag, combining both\n * Tagged Items and Content Item Tags. Uses NormalizeUUID for\n * cross-platform UUID case consistency.\n */\n private countItemsByTag(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const ti of this.taggedItemsRaw) {\n const tagId = ti['TagID'] as string;\n if (tagId) {\n const key = NormalizeUUID(tagId);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n }\n // Also count from content item tags that reference TagID\n for (const cit of this.contentTagsRaw) {\n const tagId = cit['TagID'] as string;\n if (tagId) {\n const key = NormalizeUUID(tagId);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n }\n return counts;\n }\n\n /**\n * Loads per-tag average weights and item counts via a server-side SQL aggregation.\n * This avoids loading all 17K+ TaggedItem rows to the browser.\n */\n /**\n * Loads per-tag average weights and item counts via the \"Tag Aggregates\" saved query.\n * This runs a SQL GROUP BY on the server, avoiding loading 17K+ TaggedItem rows to the browser.\n */\n private async loadTagAggregates(): Promise<void> {\n this.tagAggregateWeights.clear();\n this.tagAggregateCounts.clear();\n try {\n const rq = new RunQuery();\n const result = await rq.RunQuery({\n QueryName: 'Tag Aggregates',\n CategoryPath: '/MJ/Tags'\n });\n if (result.Success) {\n for (const row of result.Results) {\n const tagId = row['TagID'] as string;\n if (tagId) {\n const key = NormalizeUUID(tagId);\n this.tagAggregateWeights.set(key, Number(row['AvgWeight'] ?? 0));\n this.tagAggregateCounts.set(key, Number(row['ItemCount'] ?? 0));\n }\n }\n }\n } catch (error) {\n console.error('[Autotagging] Error loading tag aggregates:', error);\n }\n }\n\n public ToggleTaxNode(node: TaxTreeNode): void {\n if (node.Children.length > 0) {\n node.IsExpanded = !node.IsExpanded;\n this.TaxFlatNodes = this.flattenTree(this.TaxTreeNodes);\n this.applyTaxTreeFilter();\n this.cdr.detectChanges();\n }\n }\n\n public SelectTaxNode(node: TaxTreeNode): void {\n // Deselect previous\n for (const n of this.TaxFlatNodes) {\n n.IsSelected = false;\n }\n node.IsSelected = true;\n this.TaxSelectedNode = node;\n this.TaxIsEditing = false;\n this.loadRecentItemsForTag(node);\n this.cdr.detectChanges();\n }\n\n public FilterTaxTree(): void {\n this.applyTaxTreeFilter();\n this.cdr.detectChanges();\n }\n\n private applyTaxTreeFilter(): void {\n const q = this.TaxTreeSearch.toLowerCase().trim();\n if (!q) {\n this.TaxFilteredNodes = this.TaxFlatNodes;\n } else {\n this.TaxFilteredNodes = this.TaxFlatNodes.filter(n =>\n n.Name.toLowerCase().includes(q) || n.DisplayName.toLowerCase().includes(q)\n );\n }\n }\n\n public GetTaxBreadcrumb(node: TaxTreeNode): { ID: string; Name: string }[] {\n const breadcrumb: { ID: string; Name: string }[] = [];\n const tagMap = new Map<string, Record<string, unknown>>();\n for (const t of this.tagsRaw) {\n tagMap.set(t['ID'] as string, t);\n }\n\n let currentID: string | null = node.ParentID;\n while (currentID) {\n const parent = tagMap.get(currentID);\n if (!parent) break;\n breadcrumb.unshift({ ID: currentID, Name: (parent['Name'] as string) ?? '' });\n currentID = (parent['ParentID'] as string) ?? null;\n }\n return breadcrumb;\n }\n\n public NavigateToBreadcrumb(tagId: string): void {\n const node = this.TaxFlatNodes.find(n => UUIDsEqual(n.ID, tagId));\n if (node) {\n this.SelectTaxNode(node);\n }\n }\n\n private loadRecentItemsForTag(node: TaxTreeNode): void {\n // Find content item tags that reference this tag's ID.\n // Use the 'Item' view field (ContentItem name) directly from the tag record\n // instead of looking up from the capped contentItemsRaw array.\n const matchingTags = this.contentTagsRaw.filter(cit =>\n UUIDsEqual(cit['TagID'] as string, node.ID)\n ).slice(0, 5);\n\n this.TaxRecentItems = matchingTags.map(cit => ({\n Name: (cit['Item'] as string) ?? 'Unnamed Item',\n Weight: Number(cit['Weight'] ?? 0.5),\n Date: this.formatShortDate((cit['__mj_CreatedAt'] as string) ?? ''),\n Icon: 'fa-solid fa-file-lines'\n }));\n }\n\n // ── Tag Operations ──\n\n public StartEditTag(): void {\n if (!this.TaxSelectedNode) return;\n this.TaxIsEditing = true;\n this.TaxEditName = this.TaxSelectedNode.Name;\n this.TaxEditDescription = this.TaxSelectedNode.Description;\n this.cdr.detectChanges();\n }\n\n public CancelEditTag(): void {\n this.TaxIsEditing = false;\n this.cdr.detectChanges();\n }\n\n public async SaveEditTag(): Promise<void> {\n if (!this.TaxSelectedNode) return;\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: this.TaxSelectedNode.ID }]));\n entity.Set('Name', this.TaxEditName);\n entity.Set('Description', this.TaxEditDescription);\n const saved = await entity.Save();\n if (saved) {\n this.TaxSelectedNode.Name = this.TaxEditName;\n this.TaxSelectedNode.DisplayName = this.TaxEditName;\n this.TaxSelectedNode.Description = this.TaxEditDescription;\n this.TaxIsEditing = false;\n this.addTaxAuditEntry('renamed', this.TaxEditName);\n MJNotificationService.Instance.CreateSimpleNotification('Tag updated', 'success', 2500);\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to update tag', 'error', 3000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n this.cdr.detectChanges();\n }\n\n public async MoveTag(node: TaxTreeNode, newParentId: string | null): Promise<void> {\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: node.ID }]));\n entity.Set('ParentID', newParentId);\n const saved = await entity.Save();\n if (saved) {\n this.addTaxAuditEntry('moved', node.Name);\n MJNotificationService.Instance.CreateSimpleNotification('Tag moved', 'success', 2500);\n await this.RefreshTaxonomyData();\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n\n public DeleteTag(node: TaxTreeNode): void {\n this.OpenConfirmDialog(\n 'Delete Tag',\n `Delete tag \"${node.Name}\"? This will also remove all tagged item associations.`,\n async () => {\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: node.ID }]));\n const deleted = await entity.Delete();\n if (deleted) {\n this.addTaxAuditEntry('deleted', node.Name);\n MJNotificationService.Instance.CreateSimpleNotification('Tag deleted', 'success', 2500);\n await this.RefreshTaxonomyData();\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n );\n }\n\n // ── Create Tag ──\n\n /** Open create tag dialog for a root-level tag */\n public OpenCreateRootTag(): void {\n this.CreateTagParentID = null;\n this.CreateTagParentLabel = 'Root level';\n this.CreateTagName = '';\n this.CreateTagDescription = '';\n this.ShowCreateTagDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Open create tag dialog as child of the selected node */\n public OpenCreateChildTag(): void {\n if (!this.TaxSelectedNode) return;\n this.OpenCreateChildTagFor(this.TaxSelectedNode);\n }\n\n /** Open create tag dialog as child of a specific node */\n public OpenCreateChildTagFor(node: TaxTreeNode): void {\n this.CreateTagParentID = node.ID;\n this.CreateTagParentLabel = `under \"${node.Name}\"`;\n this.CreateTagName = '';\n this.CreateTagDescription = '';\n this.ShowCreateTagDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Close create tag dialog */\n public CloseCreateTagDialog(): void {\n this.ShowCreateTagDialog = false;\n this.cdr.detectChanges();\n }\n\n /** Save the new tag */\n public async SaveNewTag(): Promise<void> {\n const name = this.CreateTagName.trim();\n if (!name) return;\n\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n entity.NewRecord();\n entity.Set('Name', name);\n entity.Set('DisplayName', name);\n entity.Set('Description', this.CreateTagDescription.trim() || null);\n entity.Set('ParentID', this.CreateTagParentID);\n const saved = await entity.Save();\n if (saved) {\n this.addTaxAuditEntry('created', name);\n MJNotificationService.Instance.CreateSimpleNotification(`Tag \"${name}\" created`, 'success', 2500);\n this.ShowCreateTagDialog = false;\n await this.RefreshTaxonomyData();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to save tag', 'error', 4000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n\n // ── Multi-Select & Drag Reparent ──\n\n /** Toggle multi-select mode on/off */\n public ToggleMultiSelectMode(): void {\n this.TaxMultiSelectMode = !this.TaxMultiSelectMode;\n if (!this.TaxMultiSelectMode) {\n this.TaxSelectedIDs.clear();\n }\n this.cdr.detectChanges();\n }\n\n /** Toggle a node's selection in multi-select mode */\n public ToggleNodeSelection(node: TaxTreeNode, event: Event): void {\n event.stopPropagation();\n if (this.TaxSelectedIDs.has(node.ID)) {\n this.TaxSelectedIDs.delete(node.ID);\n } else {\n this.TaxSelectedIDs.add(node.ID);\n }\n this.cdr.detectChanges();\n }\n\n /** Check if a node is selected in multi-select mode */\n public IsNodeMultiSelected(nodeID: string): boolean {\n return this.TaxSelectedIDs.has(nodeID);\n }\n\n /** Handle drag start on a tree node */\n public OnTreeNodeDragStart(event: DragEvent, node: TaxTreeNode): void {\n if (!event.dataTransfer) return;\n // If dragging a multi-selected node, drag all selected; otherwise just this one\n const dragIDs = this.TaxMultiSelectMode && this.TaxSelectedIDs.has(node.ID)\n ? [...this.TaxSelectedIDs]\n : [node.ID];\n event.dataTransfer.setData('text/plain', JSON.stringify(dragIDs));\n event.dataTransfer.effectAllowed = 'move';\n }\n\n /** Handle drag over a tree node (drop target) */\n public OnTreeNodeDragOver(event: DragEvent, node: TaxTreeNode): void {\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move';\n this.TaxDragOverNodeID = node.ID;\n }\n\n /** Handle drag leave */\n public OnTreeNodeDragLeave(): void {\n this.TaxDragOverNodeID = null;\n }\n\n /** Handle drop — reparent dragged node(s) under the drop target */\n public async OnTreeNodeDrop(event: DragEvent, targetNode: TaxTreeNode): Promise<void> {\n event.preventDefault();\n this.TaxDragOverNodeID = null;\n\n const data = event.dataTransfer?.getData('text/plain');\n if (!data) return;\n\n let dragIDs: string[];\n try { dragIDs = JSON.parse(data); } catch { return; }\n\n // Prevent dropping onto itself or a descendant\n const targetDescendants = this.collectDescendantIds(targetNode);\n const validIDs = dragIDs.filter(id =>\n !UUIDsEqual(id, targetNode.ID) && !targetDescendants.has(NormalizeUUID(id))\n );\n\n if (validIDs.length === 0) return;\n\n this.TaxTreeSaving = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n let movedCount = 0;\n for (const tagID of validIDs) {\n try {\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: tagID }]));\n entity.Set('ParentID', targetNode.ID);\n const saved = await entity.Save();\n if (saved) movedCount++;\n } catch {\n // continue with remaining\n }\n }\n\n if (movedCount > 0) {\n const label = movedCount === 1 ? '1 tag' : `${movedCount} tags`;\n MJNotificationService.Instance.CreateSimpleNotification(`Moved ${label} under \"${targetNode.Name}\"`, 'success', 2500);\n this.addTaxAuditEntry('moved', `${movedCount} tag(s) → ${targetNode.Name}`);\n this.TaxSelectedIDs.clear();\n await this.RefreshTaxonomyData();\n }\n\n this.TaxTreeSaving = false;\n this.cdr.detectChanges();\n }\n\n /** Handle drop on the \"Root\" drop zone (make root-level) */\n public async OnDropToRoot(event: DragEvent): Promise<void> {\n event.preventDefault();\n this.TaxDragOverNodeID = null;\n\n const data = event.dataTransfer?.getData('text/plain');\n if (!data) return;\n\n let dragIDs: string[];\n try { dragIDs = JSON.parse(data); } catch { return; }\n\n this.TaxTreeSaving = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n let movedCount = 0;\n for (const tagID of dragIDs) {\n try {\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: tagID }]));\n if (entity.Get('ParentID') != null) {\n entity.Set('ParentID', null);\n const saved = await entity.Save();\n if (saved) movedCount++;\n }\n } catch {\n // continue\n }\n }\n\n if (movedCount > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(`Moved ${movedCount} tag(s) to root`, 'success', 2500);\n this.addTaxAuditEntry('moved', `${movedCount} tag(s) → root`);\n this.TaxSelectedIDs.clear();\n await this.RefreshTaxonomyData();\n }\n\n this.TaxTreeSaving = false;\n this.cdr.detectChanges();\n }\n\n public IsMerging = false;\n\n public async MergeTags(sourceTagId: string, targetTagId: string, sourceName: string, targetName: string): Promise<void> {\n if (this.IsMerging) return; // Prevent duplicate calls from button spam\n this.IsMerging = true;\n this.cdr.detectChanges();\n\n try {\n // Re-parent tagged items from source to target\n const itemsToMove = this.taggedItemsRaw.filter(ti => (ti['TagID'] as string) === sourceTagId);\n const md = new Metadata();\n for (const ti of itemsToMove) {\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tagged Items');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: ti['ID'] as string }]));\n entity.Set('TagID', targetTagId);\n await entity.Save();\n }\n\n // Re-parent children of source under target\n const childTags = this.tagsRaw.filter(t => (t['ParentID'] as string) === sourceTagId);\n for (const child of childTags) {\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: child['ID'] as string }]));\n entity.Set('ParentID', targetTagId);\n await entity.Save();\n }\n\n // Clean up co-occurrence records before delete (FK constraint)\n await this.cleanupTagReferences(sourceTagId);\n\n // Delete source tag (original behavior — hard delete)\n const sourceEntity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await sourceEntity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: sourceTagId }]));\n await sourceEntity.Delete();\n\n this.addTaxAuditEntry('merged', `${sourceName} into ${targetName}`);\n MJNotificationService.Instance.CreateSimpleNotification(`Merged \"${sourceName}\" into \"${targetName}\"`, 'success', 3000);\n await this.RefreshTaxonomyData();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Merge error: ${msg}`, 'error', 4000);\n } finally {\n this.IsMerging = false;\n this.cdr.detectChanges();\n }\n }\n\n public async MakeChildTag(childTagId: string, parentTagId: string): Promise<void> {\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: childTagId }]));\n entity.Set('ParentID', parentTagId);\n const saved = await entity.Save();\n if (saved) {\n this.addTaxAuditEntry('moved', (entity.Get('Name') as string) ?? 'tag');\n MJNotificationService.Instance.CreateSimpleNotification('Tag reparented', 'success', 2500);\n await this.RefreshTaxonomyData();\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n\n public DismissDuplicate(pair: TaxDuplicatePair): void {\n this.TaxDuplicates = this.TaxDuplicates.filter(d => d !== pair);\n this.TaxHealth.Duplicates = this.TaxDuplicates.length;\n this.cdr.detectChanges();\n }\n\n // ── Duplicates ──\n\n private buildTaxDuplicates(): void {\n const tags = this.tagsRaw\n .filter(t => (t['Status'] as string)?.toLowerCase() !== 'merged')\n .map(t => ({\n ID: t['ID'] as string,\n Name: (t['Name'] as string) ?? ''\n }));\n\n const pairs: TaxDuplicatePair[] = [];\n\n // 1. Group exact-name duplicates (case-insensitive) into single entries\n const exactGroups = this.groupExactNameDuplicates(tags);\n const consumedIDs = new Set<string>();\n\n for (const [, group] of exactGroups) {\n if (group.length < 2) continue;\n // Emit one consolidated entry per group of exact-name duplicates\n pairs.push({\n TagA: group[0].Name,\n TagB: group[0].Name,\n TagAID: group[0].ID,\n TagBID: group[1].ID,\n Similarity: 100,\n SeverityClass: 'high',\n IsExactDuplicate: true,\n ExactDuplicateCount: group.length,\n AllIDs: group.map(t => t.ID)\n });\n for (const t of group) consumedIDs.add(t.ID);\n }\n\n // 2. Fuzzy/similar pairs — skip any tags already covered by exact-name groups\n for (let i = 0; i < tags.length; i++) {\n if (consumedIDs.has(tags[i].ID)) continue;\n for (let j = i + 1; j < tags.length; j++) {\n if (consumedIDs.has(tags[j].ID)) continue;\n const sim = this.computeStringSimilarity(tags[i].Name, tags[j].Name);\n if (sim >= 0.70) {\n pairs.push({\n TagA: tags[i].Name,\n TagB: tags[j].Name,\n TagAID: tags[i].ID,\n TagBID: tags[j].ID,\n Similarity: Math.round(sim * 100),\n SeverityClass: sim >= 0.85 ? 'high' : 'moderate',\n IsExactDuplicate: false,\n ExactDuplicateCount: 0,\n AllIDs: []\n });\n }\n }\n }\n\n pairs.sort((a, b) => b.Similarity - a.Similarity);\n this.TaxDuplicates = pairs;\n }\n\n /** Group tags by case-insensitive name, returning only groups with 2+ members */\n private groupExactNameDuplicates(tags: { ID: string; Name: string }[]): Map<string, { ID: string; Name: string }[]> {\n const groups = new Map<string, { ID: string; Name: string }[]>();\n for (const tag of tags) {\n const key = tag.Name.toLowerCase().trim();\n const group = groups.get(key);\n if (group) {\n group.push(tag);\n } else {\n groups.set(key, [tag]);\n }\n }\n return groups;\n }\n\n /**\n * Enhanced string similarity: separator normalization, abbreviation,\n * pluralization, token-overlap Jaccard, containment, and Levenshtein.\n * Returns the highest score among all heuristics.\n */\n private computeStringSimilarity(a: string, b: string): number {\n const la = a.toLowerCase().trim();\n const lb = b.toLowerCase().trim();\n if (la === lb) return 1.0;\n\n // Strip separators and compare\n const normA = la.replace(/[\\s\\-_&]+/g, '');\n const normB = lb.replace(/[\\s\\-_&]+/g, '');\n if (normA === normB) return 0.98;\n\n let best = 0;\n\n // Abbreviation\n if (this.isAbbreviationOf(la, lb) || this.isAbbreviationOf(lb, la)) {\n best = Math.max(best, 0.90);\n }\n\n // Pluralization\n best = Math.max(best, this.computePluralizationScore(la, lb));\n\n // Token Jaccard\n best = Math.max(best, this.computeTokenJaccardSimilarity(la, lb));\n\n // Containment\n if (lb.includes(la) || la.includes(lb)) {\n const shorter = la.length < lb.length ? la : lb;\n const longer = la.length < lb.length ? lb : la;\n best = Math.max(best, shorter.length / longer.length);\n }\n\n // Levenshtein\n const dist = this.levenshteinDistance(la, lb);\n const maxLen = Math.max(la.length, lb.length);\n if (maxLen > 0) {\n best = Math.max(best, 1 - dist / maxLen);\n }\n\n return best;\n }\n\n /** Scores simple English pluralization differences */\n private computePluralizationScore(a: string, b: string): number {\n const shorter = a.length <= b.length ? a : b;\n const longer = a.length <= b.length ? b : a;\n if (longer === shorter + 's') return 0.95;\n if (longer === shorter + 'es') return 0.95;\n if (shorter.endsWith('y') && longer === shorter.slice(0, -1) + 'ies') return 0.95;\n return 0;\n }\n\n /** Jaccard similarity on word tokens */\n private computeTokenJaccardSimilarity(a: string, b: string): number {\n const tokensA = new Set(a.split(/[\\s\\-_&]+/).filter(w => w.length > 0));\n const tokensB = new Set(b.split(/[\\s\\-_&]+/).filter(w => w.length > 0));\n if (tokensA.size === 0 || tokensB.size === 0) return 0;\n let intersection = 0;\n for (const token of tokensA) {\n if (tokensB.has(token)) intersection++;\n }\n const union = tokensA.size + tokensB.size - intersection;\n return union > 0 ? intersection / union : 0;\n }\n\n private isAbbreviationOf(short: string, long: string): boolean {\n if (short.length >= long.length) return false;\n if (short.length < 2) return false;\n\n // Check if short is initials of words in long\n const words = long.split(/[\\s\\-_&]+/).filter(w => w.length > 0);\n if (words.length < 2) return false;\n const initials = words.map(w => w[0]).join('');\n return initials === short;\n }\n\n private levenshteinDistance(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0) as number[]);\n\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost);\n }\n }\n return dp[m][n];\n }\n\n // ── Orphans ──\n\n /**\n * Finds orphan tags: no parent, no children, and zero usage.\n * A tag with even 1 connection is not orphaned — it's just a leaf.\n * Uses NormalizeUUID for consistent cross-platform UUID comparisons.\n */\n private buildTaxOrphans(): void {\n const tagItemCounts = this.tagAggregateCounts;\n const tagAvgWeights = this.tagAggregateWeights;\n const hasChildren = new Set<string>();\n for (const t of this.tagsRaw) {\n const pid = t['ParentID'] as string;\n if (pid) hasChildren.add(NormalizeUUID(pid));\n }\n\n this.TaxOrphans = this.tagsRaw\n .filter(t => {\n const normalizedId = NormalizeUUID(t['ID'] as string);\n const parentId = t['ParentID'] as string | null;\n const status = (t['Status'] as string)?.toLowerCase();\n const itemCount = tagItemCounts.get(normalizedId) ?? 0;\n // Skip merged tags — they're soft-deleted\n if (status === 'merged') return false;\n // Orphan: no parent, no children, and zero connections\n return !parentId && !hasChildren.has(normalizedId) && itemCount === 0;\n })\n .map(t => {\n const id = t['ID'] as string;\n const normalizedId = NormalizeUUID(id);\n const itemCount = tagItemCounts.get(normalizedId) ?? 0;\n return {\n ID: id,\n Name: (t['Name'] as string) ?? 'Unnamed',\n UsageCount: itemCount,\n AvgWeight: tagAvgWeights.get(normalizedId) ?? 0,\n FirstSeen: this.formatShortDate((t['__mj_CreatedAt'] as string) ?? ''),\n LastSeen: this.formatShortDate((t['__mj_UpdatedAt'] as string) ?? ''),\n IsSelected: false\n };\n })\n .sort((a, b) => a.UsageCount - b.UsageCount);\n }\n\n public ToggleOrphanSelection(orphan: TaxOrphanCard): void {\n orphan.IsSelected = !orphan.IsSelected;\n this.TaxAllOrphansSelected = this.TaxOrphans.every(o => o.IsSelected);\n this.cdr.detectChanges();\n }\n\n public ToggleAllOrphans(): void {\n this.TaxAllOrphansSelected = !this.TaxAllOrphansSelected;\n for (const o of this.TaxOrphans) {\n o.IsSelected = this.TaxAllOrphansSelected;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Clean up TagCoOccurrence records that reference a tag before deleting it.\n * Without this, the FK constraint on TagCoOccurrence blocks the delete.\n */\n private async cleanupTagReferences(tagId: string): Promise<void> {\n const rv = new RunView();\n const coOccResult = await rv.RunView<BaseEntity>({\n EntityName: 'MJ: Tag Co Occurrences',\n ExtraFilter: `TagAID='${tagId}' OR TagBID='${tagId}'`,\n ResultType: 'entity_object'\n });\n if (coOccResult.Success) {\n for (const coOcc of coOccResult.Results) {\n await coOcc.Delete();\n }\n }\n }\n\n public DeleteOrphan(orphan: TaxOrphanCard): void {\n this.OpenConfirmDialog(\n 'Delete Orphan Tag',\n `Delete orphan tag \"${orphan.Name}\"?`,\n async () => {\n try {\n await this.cleanupTagReferences(orphan.ID);\n const md = new Metadata();\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: orphan.ID }]));\n const deleted = await entity.Delete();\n if (deleted) {\n this.addTaxAuditEntry('deleted', orphan.Name);\n MJNotificationService.Instance.CreateSimpleNotification('Orphan tag deleted', 'success', 2500);\n this.TaxOrphans = this.TaxOrphans.filter(o => !UUIDsEqual(o.ID, orphan.ID));\n this.TaxHealth.Orphaned = this.TaxOrphans.length;\n this.cdr.detectChanges();\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n );\n }\n\n public BulkDeleteOrphans(): void {\n const selected = this.TaxOrphans.filter(o => o.IsSelected);\n if (selected.length === 0) return;\n\n this.OpenConfirmDialog(\n 'Bulk Delete Orphan Tags',\n `Delete ${selected.length} selected orphan tag${selected.length > 1 ? 's' : ''}? This cannot be undone.`,\n async () => {\n const md = new Metadata();\n let deletedCount = 0;\n for (const orphan of selected) {\n try {\n await this.cleanupTagReferences(orphan.ID);\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: orphan.ID }]));\n if (await entity.Delete()) {\n deletedCount++;\n this.addTaxAuditEntry('deleted', orphan.Name);\n }\n } catch {\n // continue with remaining\n }\n }\n\n MJNotificationService.Instance.CreateSimpleNotification(`Deleted ${deletedCount} tags`, 'success', 3000);\n this.TaxOrphans = this.TaxOrphans.filter(o => !o.IsSelected);\n this.TaxHealth.Orphaned = this.TaxOrphans.length;\n this.TaxAllOrphansSelected = false;\n this.cdr.detectChanges();\n }\n );\n }\n\n /** Delete all orphan tags at once with a styled confirmation dialog */\n public DeleteAllOrphans(): void {\n if (this.TaxOrphans.length === 0) return;\n this.OpenConfirmDialog(\n 'Delete All Orphaned Tags',\n `Delete all ${this.TaxOrphans.length} orphaned tag${this.TaxOrphans.length > 1 ? 's' : ''}? This cannot be undone.`,\n async () => {\n const md = new Metadata();\n let deletedCount = 0;\n for (const orphan of this.TaxOrphans) {\n try {\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: orphan.ID }]));\n if (await entity.Delete()) {\n deletedCount++;\n this.addTaxAuditEntry('deleted', orphan.Name);\n }\n } catch {\n // continue with remaining\n }\n }\n\n MJNotificationService.Instance.CreateSimpleNotification(`Deleted ${deletedCount} orphan tags`, 'success', 3000);\n this.TaxOrphans = [];\n this.TaxHealth.Orphaned = 0;\n this.TaxAllOrphansSelected = false;\n this.cdr.detectChanges();\n }\n );\n }\n\n // ── Treemap ──\n\n private buildTaxTreemap(): void {\n // Build treemap cells from root-level tags, sized by item count\n const tagItemCounts = this.countItemsByTag();\n\n // Group tags by root parent\n const rootGroups = new Map<string, { Name: string; TotalItems: number }>();\n for (const node of this.TaxTreeNodes) {\n rootGroups.set(node.ID, { Name: node.Name, TotalItems: node.ItemCount });\n }\n\n const colorFamilies = ['at-tm-blue', 'at-tm-green', 'at-tm-purple', 'at-tm-orange'];\n const cells: TaxTreemapCell[] = [];\n let colorIdx = 0;\n\n // For each root, add children as cells\n for (const root of this.TaxTreeNodes) {\n const family = colorFamilies[colorIdx % colorFamilies.length];\n let shadeIdx = 1;\n\n // Add root children (or the root itself if it has no children)\n const childNodes = root.Children.length > 0 ? root.Children : [root];\n const sortedChildren = [...childNodes].sort((a, b) => b.ItemCount - a.ItemCount);\n\n for (const child of sortedChildren.slice(0, 4)) {\n cells.push({\n ID: child.ID,\n Name: child.Name,\n ItemCount: child.ItemCount,\n ColorClass: `${family}-${shadeIdx}`,\n RowSpan: child.ItemCount > 10 ? 2 : 1\n });\n shadeIdx++;\n }\n colorIdx++;\n }\n\n this.TaxTreemapCells = cells;\n\n // KPIs\n const totalTags = this.tagsRaw.length;\n const maxDepth = this.TaxFlatNodes.length > 0\n ? Math.max(...this.TaxFlatNodes.map(n => n.Depth))\n : 0;\n const avgDepth = this.TaxFlatNodes.length > 0\n ? (this.TaxFlatNodes.reduce((sum, n) => sum + n.Depth, 0) / this.TaxFlatNodes.length).toFixed(1)\n : '0';\n const mostUsed = this.TaxFlatNodes.length > 0\n ? [...this.TaxFlatNodes].sort((a, b) => b.ItemCount - a.ItemCount)[0]?.Name ?? 'None'\n : 'None';\n\n this.TaxTreemapKPIs = [\n { Label: 'Total Tags', Value: String(totalTags) },\n { Label: 'Avg Depth', Value: avgDepth },\n { Label: 'Max Depth', Value: String(maxDepth) },\n { Label: 'Most Used Tag', Value: mostUsed }\n ];\n }\n\n // ── Audit Log ──\n\n /**\n * Builds the audit timeline from the MJ: Tag Audit Logs entity.\n * Falls back to synthesizing \"created\" events from tag creation dates\n * if no real audit log records exist yet.\n */\n private buildTaxAuditLog(): void {\n if (this.tagAuditLogsRaw.length > 0) {\n this.TaxAuditEvents = this.buildAuditEventsFromLogs();\n } else {\n this.TaxAuditEvents = this.synthesizeAuditEventsFromTags();\n }\n }\n\n /**\n * Maps real Tag Audit Log records into TaxAuditEvent objects.\n * Uses the view's denormalized Tag, PerformedByUser, and RelatedTag fields.\n */\n private buildAuditEventsFromLogs(): TaxAuditEvent[] {\n const events: TaxAuditEvent[] = [];\n\n for (const log of this.tagAuditLogsRaw) {\n const action = (log['Action'] as string) ?? '';\n const type = this.mapAuditActionToType(action);\n if (!type) continue;\n\n const tagName = (log['Tag'] as string) ?? 'Unknown';\n const relatedTag = (log['RelatedTag'] as string) ?? '';\n const user = (log['PerformedByUser'] as string) ?? 'System';\n const createdAt = (log['__mj_CreatedAt'] as string) ?? '';\n const details = this.parseAuditDetails(log['Details'] as string | null);\n\n events.push({\n Type: type,\n Description: this.buildAuditDescription(type, tagName, relatedTag, details),\n TagRef: tagName,\n User: user,\n Timestamp: this.formatDate(createdAt),\n DayHeader: this.formatDayHeader(createdAt)\n });\n }\n\n return events;\n }\n\n /**\n * Synthesizes audit events from tag __mj_CreatedAt dates when no\n * real audit log records exist. Used as a fallback only.\n */\n private synthesizeAuditEventsFromTags(): TaxAuditEvent[] {\n const events: TaxAuditEvent[] = [];\n for (const tag of this.tagsRaw) {\n const name = (tag['Name'] as string) ?? 'Unnamed';\n const createdAt = tag['__mj_CreatedAt'] as string;\n if (createdAt) {\n events.push({\n Type: 'created',\n Description: 'Tag created',\n TagRef: name,\n User: 'System',\n Timestamp: this.formatDate(createdAt),\n DayHeader: this.formatDayHeader(createdAt)\n });\n }\n }\n events.sort((a, b) => b.Timestamp.localeCompare(a.Timestamp));\n return events.slice(0, 50);\n }\n\n /**\n * Maps a PascalCase DB Action value (e.g. \"Renamed\") to the lowercase\n * TaxAuditAction type used in the UI. Returns null for unrecognized values.\n */\n private mapAuditActionToType(action: string): TaxAuditAction | null {\n const mapped = action.toLowerCase() as TaxAuditAction;\n const validTypes: Set<string> = new Set<string>([\n 'created', 'merged', 'moved', 'deleted', 'renamed',\n 'deprecated', 'descriptionchanged', 'reactivated', 'split'\n ]);\n return validTypes.has(mapped) ? mapped : null;\n }\n\n /**\n * Safely parses the JSON Details column from a Tag Audit Log record.\n * Returns an empty object on parse failure.\n */\n private parseAuditDetails(details: string | null): Record<string, string> {\n if (!details) return {};\n try {\n return JSON.parse(details) as Record<string, string>;\n } catch {\n return {};\n }\n }\n\n /**\n * Builds a human-readable description for an audit event based on the\n * action type and any additional context from the related tag or details JSON.\n */\n private buildAuditDescription(type: TaxAuditAction, tagName: string, relatedTag: string, details: Record<string, string>): string {\n switch (type) {\n case 'created':\n return 'Tag created';\n case 'renamed': {\n const oldName = details['OldName'];\n return oldName ? `Renamed from \"${oldName}\"` : 'Tag renamed';\n }\n case 'moved': {\n return 'Tag moved to new parent';\n }\n case 'merged':\n return relatedTag ? `Merged into \"${relatedTag}\"` : 'Tags merged';\n case 'split':\n return relatedTag ? `Split from \"${relatedTag}\"` : 'Tag split';\n case 'deleted':\n return 'Tag deleted';\n case 'deprecated':\n return 'Tag deprecated';\n case 'reactivated':\n return 'Tag reactivated';\n case 'descriptionchanged':\n return 'Description updated';\n default:\n return `Tag ${type}`;\n }\n }\n\n /**\n * Adds a local-only audit entry to the top of the timeline for\n * immediate UI feedback after a user action (merge, delete, etc.).\n */\n private addTaxAuditEntry(type: TaxAuditAction, tagRef: string): void {\n const now = new Date().toISOString();\n this.TaxAuditEvents.unshift({\n Type: type,\n Description: this.buildAuditDescription(type, tagRef, '', {}),\n TagRef: tagRef,\n User: 'You',\n Timestamp: this.formatDate(now),\n DayHeader: 'Today'\n });\n }\n\n public ToggleTaxAuditFilter(type: string): void {\n if (this.TaxAuditFilterTypes.has(type)) {\n this.TaxAuditFilterTypes.delete(type);\n } else {\n this.TaxAuditFilterTypes.add(type);\n }\n this.cdr.detectChanges();\n }\n\n public GetFilteredAuditEvents(): TaxAuditEvent[] {\n return this.TaxAuditEvents.filter(e => this.TaxAuditFilterTypes.has(e.Type));\n }\n\n private formatDayHeader(dateStr: string): string {\n try {\n const d = new Date(dateStr);\n const today = new Date();\n const yesterday = new Date(today);\n yesterday.setDate(yesterday.getDate() - 1);\n\n if (d.toDateString() === today.toDateString()) return 'Today';\n if (d.toDateString() === yesterday.toDateString()) return 'Yesterday';\n return d.toLocaleDateString('en-US', { weekday: 'long', month: 'long', day: 'numeric', year: 'numeric' });\n } catch {\n return '';\n }\n }\n\n // ── Health Stats ──\n\n private buildTaxHealth(): void {\n const total = this.tagsRaw.length;\n const orphaned = this.TaxOrphans.length;\n const duplicates = this.TaxDuplicates.length;\n const needAttention = this.TaxFlatNodes.filter(n => n.HealthColor === 'yellow').length;\n const healthy = total - orphaned - needAttention;\n\n this.TaxHealth = { Total: total, Healthy: Math.max(0, healthy), NeedAttention: needAttention, Orphaned: orphaned, Duplicates: duplicates };\n }\n\n /** Returns the Font Awesome icon class for an audit event action type. */\n public GetTaxAuditIcon(type: string): string {\n const map: Record<string, string> = {\n 'created': 'fa-solid fa-plus',\n 'merged': 'fa-solid fa-code-merge',\n 'moved': 'fa-solid fa-arrows-up-down',\n 'deleted': 'fa-solid fa-trash',\n 'renamed': 'fa-solid fa-pen',\n 'deprecated': 'fa-solid fa-ban',\n 'descriptionchanged': 'fa-solid fa-file-pen',\n 'reactivated': 'fa-solid fa-rotate-left',\n 'split': 'fa-solid fa-code-branch'\n };\n return map[type] ?? 'fa-solid fa-circle';\n }\n\n // ── Confirmation Dialog ──\n\n /** Opens a styled confirmation dialog, replacing browser `confirm()`. */\n public OpenConfirmDialog(title: string, message: string, action: () => Promise<void>): void {\n this.ConfirmDialogTitle = title;\n this.ConfirmDialogMessage = message;\n this.confirmDialogAction = action;\n this.ShowConfirmDialog = true;\n this.cdr.detectChanges();\n }\n\n /** User confirmed the dialog action */\n public async ConfirmDialogAccept(): Promise<void> {\n this.ShowConfirmDialog = false;\n if (this.confirmDialogAction) {\n await this.confirmDialogAction();\n }\n this.confirmDialogAction = null;\n this.cdr.detectChanges();\n }\n\n /** User cancelled the confirmation dialog */\n public ConfirmDialogCancel(): void {\n this.ShowConfirmDialog = false;\n this.confirmDialogAction = null;\n this.cdr.detectChanges();\n }\n\n // ── Split Dialog ──\n\n /** Opens the split-tag dialog for a given tree node */\n public OpenSplitDialog(node: TaxTreeNode): void {\n this.splitTargetNode = node;\n this.SplitChildNames = '';\n this.ShowSplitDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Closes the split-tag dialog without action */\n public CloseSplitDialog(): void {\n this.ShowSplitDialog = false;\n this.splitTargetNode = null;\n this.SplitChildNames = '';\n this.cdr.detectChanges();\n }\n\n /** Executes the split operation, creating child tags from comma-separated names */\n public async ExecuteSplit(): Promise<void> {\n if (!this.splitTargetNode || !this.SplitChildNames.trim()) return;\n const names = this.SplitChildNames.split(',')\n .map(n => n.trim())\n .filter(n => n.length > 0);\n if (names.length === 0) return;\n\n this.ShowSplitDialog = false;\n const nodeName = this.splitTargetNode.Name;\n const parentId = this.splitTargetNode.ParentID;\n\n try {\n const md = new Metadata();\n for (const name of names) {\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n entity.NewRecord();\n entity.Set('Name', name);\n entity.Set('DisplayName', name);\n entity.Set('ParentID', parentId);\n await entity.Save();\n }\n\n this.addTaxAuditEntry('split', `${nodeName} into ${names.join(', ')}`);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Split \"${nodeName}\" into ${names.length} new tags`, 'success', 3000\n );\n await this.RefreshTaxonomyData();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Split error: ${msg}`, 'error', 4000);\n }\n this.splitTargetNode = null;\n this.SplitChildNames = '';\n this.cdr.detectChanges();\n }\n\n // ── Move Dialog ──\n\n /** Opens the move-tag dialog for a given tree node */\n public OpenMoveDialog(node: TaxTreeNode): void {\n this.moveTargetNode = node;\n this.MoveNewParentID = node.ParentID;\n this.ShowMoveDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Closes the move-tag dialog without action */\n public CloseMoveDialog(): void {\n this.ShowMoveDialog = false;\n this.moveTargetNode = null;\n this.MoveNewParentID = null;\n this.cdr.detectChanges();\n }\n\n /** Returns flat list of tags eligible as move targets (excludes the node being moved and its descendants) */\n public GetMoveTargetOptions(): { ID: string; Name: string; Depth: number }[] {\n if (!this.moveTargetNode) return [];\n const excludeIds = this.collectDescendantIds(this.moveTargetNode);\n excludeIds.add(NormalizeUUID(this.moveTargetNode.ID));\n\n return this.TaxFlatNodes\n .filter(n => !excludeIds.has(NormalizeUUID(n.ID)))\n .map(n => ({ ID: n.ID, Name: n.Name, Depth: n.Depth }));\n }\n\n /** Collects IDs of all descendants of a node */\n private collectDescendantIds(node: TaxTreeNode): Set<string> {\n const ids = new Set<string>();\n for (const child of node.Children) {\n ids.add(NormalizeUUID(child.ID));\n for (const id of this.collectDescendantIds(child)) {\n ids.add(id);\n }\n }\n return ids;\n }\n\n /** Executes the move operation */\n public async ExecuteMove(): Promise<void> {\n if (!this.moveTargetNode) return;\n const newParent = this.MoveNewParentID;\n this.ShowMoveDialog = false;\n\n await this.MoveTag(this.moveTargetNode, newParent);\n this.moveTargetNode = null;\n this.MoveNewParentID = null;\n this.cdr.detectChanges();\n }\n\n // ── Merge Into Dialog ──\n\n public OpenMergeIntoDialog(node: TaxTreeNode): void {\n this.MergeSourceTag = node;\n this.MergeTargetID = null;\n this.MergeTargetData = this.GetMergeTargetOptions().map(o => ({\n ID: o.ID,\n Label: `${' '.repeat(o.Depth)}${o.Name} (${o.ItemCount})`\n }));\n this.ShowMergeIntoDialog = true;\n this.cdr.detectChanges();\n }\n\n public OnMergeTargetSelected(value: unknown): void {\n this.MergeTargetID = value != null ? String(value) : null;\n }\n\n public CloseMergeIntoDialog(): void {\n this.ShowMergeIntoDialog = false;\n this.MergeSourceTag = null;\n this.MergeTargetID = null;\n this.cdr.detectChanges();\n }\n\n /** Returns flat list of tags eligible as merge targets (excludes the source tag) */\n public GetMergeTargetOptions(): { ID: string; Name: string; Depth: number; ItemCount: number }[] {\n if (!this.MergeSourceTag) return [];\n const sourceNormalized = NormalizeUUID(this.MergeSourceTag.ID);\n\n return this.TaxFlatNodes\n .filter(n => NormalizeUUID(n.ID) !== sourceNormalized)\n .map(n => ({ ID: n.ID, Name: n.Name, Depth: n.Depth, ItemCount: n.ItemCount }));\n }\n\n public async ExecuteMergeInto(): Promise<void> {\n if (!this.MergeSourceTag || !this.MergeTargetID) return;\n const targetNode = this.TaxFlatNodes.find(n => UUIDsEqual(n.ID, this.MergeTargetID!));\n const targetName = targetNode?.Name ?? 'Unknown';\n const sourceName = this.MergeSourceTag.Name;\n const sourceId = this.MergeSourceTag.ID;\n const targetId = this.MergeTargetID;\n\n this.ShowMergeIntoDialog = false;\n await this.MergeTags(sourceId, targetId, sourceName, targetName);\n this.MergeSourceTag = null;\n this.MergeTargetID = null;\n }\n\n // ── Treemap Drill-In ──\n\n /** Opens treemap drill-in panel for the given cell */\n public OpenTreemapDrillIn(cell: TaxTreemapCell): void {\n const node = this.TaxFlatNodes.find(n => UUIDsEqual(n.ID, cell.ID));\n if (node) {\n this.TreemapDrillInNode = node;\n this.ShowTreemapDrillIn = true;\n this.loadRecentItemsForTag(node);\n this.cdr.detectChanges();\n }\n }\n\n /** Closes treemap drill-in panel */\n public CloseTreemapDrillIn(): void {\n this.ShowTreemapDrillIn = false;\n this.TreemapDrillInNode = null;\n this.cdr.detectChanges();\n }\n\n /** Navigate from treemap drill-in to the tag in the tree view */\n public DrillInToTreeView(node: TaxTreeNode): void {\n this.CloseTreemapDrillIn();\n this.SwitchTaxSubTab('tree');\n this.SelectTaxNode(node);\n }\n\n public async RefreshTaxonomyData(): Promise<void> {\n this.tabDataLoaded.delete('taxonomy');\n await this.loadTaxonomyData();\n this.cdr.detectChanges();\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 = new RunView();\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 = new RunView();\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 = new Metadata();\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 = new Metadata();\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\n// ================================================================\n// Cron-to-Human-Readable Utility\n// ================================================================\n\n/**\n * Converts a 5-part or 6-part cron expression to a human-readable English string.\n *\n * Handles common patterns:\n * `0 * * * *` -> \"Every hour\"\n * `0 2 * * *` -> \"Daily at 2:00 AM\"\n * `0 2 * * 1` -> \"Weekly on Monday at 2:00 AM\"\n * `star/15 * * * *` -> \"Every 15 minutes\" (where star = asterisk)\n * `0 0 1 * *` -> \"Monthly on day 1 at 12:00 AM\"\n *\n * Falls back to returning the raw cron string for unrecognized patterns.\n *\n * @param cron A cron expression string (5 or 6 parts)\n * @returns A human-readable description or the raw cron if unrecognized\n */\nexport function CronToHumanReadable(cron: string): string {\n if (!cron) return 'No schedule';\n\n const parts = cron.trim().split(/\\s+/);\n const p = parseCronParts(parts);\n if (!p) return cron;\n\n return formatCronParts(p) ?? cron;\n}\n\n/** Internal cron field tuple */\ninterface CronFields {\n Minute: string;\n Hour: string;\n DayOfMonth: string;\n Month: string;\n DayOfWeek: string;\n}\n\n/**\n * Parses 5-part or 6-part cron expressions into normalized fields.\n * 6-part expressions have a leading seconds field that is discarded.\n */\nfunction parseCronParts(parts: string[]): CronFields | null {\n if (parts.length === 5) {\n return { Minute: parts[0], Hour: parts[1], DayOfMonth: parts[2], Month: parts[3], DayOfWeek: parts[4] };\n }\n if (parts.length === 6) {\n return { Minute: parts[1], Hour: parts[2], DayOfMonth: parts[3], Month: parts[4], DayOfWeek: parts[5] };\n }\n return null;\n}\n\n/**\n * Attempts to map parsed cron fields to a human-readable string.\n * Returns null when the pattern is not recognized.\n */\nfunction formatCronParts(p: CronFields): string | null {\n // Every N minutes: */N * * * *\n if (p.Minute.startsWith('*/') && p.Hour === '*' && p.DayOfMonth === '*' && p.Month === '*' && p.DayOfWeek === '*') {\n const interval = parseInt(p.Minute.slice(2), 10);\n if (interval === 1) return 'Every minute';\n return `Every ${interval} minutes`;\n }\n\n // Every hour at minute M: M * * * *\n if (!p.Minute.includes('*') && !p.Minute.includes('/') && p.Hour === '*' && p.DayOfMonth === '*' && p.Month === '*' && p.DayOfWeek === '*') {\n return 'Every hour';\n }\n\n // Every N hours: 0 */N * * *\n if (!p.Minute.includes('*') && !p.Minute.includes('/') && p.Hour.startsWith('*/') && p.DayOfMonth === '*') {\n const interval = parseInt(p.Hour.slice(2), 10);\n if (interval === 1) return 'Every hour';\n return `Every ${interval} hours`;\n }\n\n // Specific hour + minute with wildcard or specific day fields\n if (!p.Minute.includes('*') && !p.Minute.includes('/') &&\n !p.Hour.includes('*') && !p.Hour.includes('/') &&\n p.Month === '*') {\n\n const hour = parseInt(p.Hour, 10);\n const minute = parseInt(p.Minute, 10);\n const timeStr = formatTimeOfDay(hour, minute);\n\n // Weekly: specific day of week\n if (p.DayOfWeek !== '*' && p.DayOfMonth === '*') {\n const dayName = dayOfWeekToName(p.DayOfWeek);\n return `Weekly on ${dayName} at ${timeStr}`;\n }\n\n // Monthly: specific day of month\n if (p.DayOfMonth !== '*' && p.DayOfWeek === '*') {\n return `Monthly on day ${p.DayOfMonth} at ${timeStr}`;\n }\n\n // Daily\n if (p.DayOfMonth === '*' && p.DayOfWeek === '*') {\n return `Daily at ${timeStr}`;\n }\n }\n\n return null;\n}\n\n/** Formats hour and minute to 12-hour AM/PM time string */\nfunction formatTimeOfDay(hour: number, minute: number): string {\n const ampm = hour >= 12 ? 'PM' : 'AM';\n const h = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;\n const m = minute.toString().padStart(2, '0');\n return `${h}:${m} ${ampm}`;\n}\n\n/** Maps day-of-week cron values (0-7 or SUN-SAT) to English names */\nfunction dayOfWeekToName(dow: string): string {\n const names: Record<string, string> = {\n '0': 'Sunday', '1': 'Monday', '2': 'Tuesday',\n '3': 'Wednesday', '4': 'Thursday', '5': 'Friday',\n '6': 'Saturday', '7': 'Sunday',\n 'SUN': 'Sunday', 'MON': 'Monday', 'TUE': 'Tuesday',\n 'WED': 'Wednesday', 'THU': 'Thursday', 'FRI': 'Friday',\n 'SAT': 'Saturday',\n };\n return names[dow.toUpperCase()] ?? dow;\n}\n","<!-- Content Classification Dashboard -->\n<div class=\"at-dashboard\">\n\n <!-- ══════ LEFT NAV ══════ -->\n <div class=\"at-left-nav\">\n <div class=\"at-left-nav-header\">\n <h2><i class=\"fa-solid fa-tags\"></i> Classify</h2>\n </div>\n <div class=\"at-left-nav-items\">\n @for (item of NavItems; track item.Tab) {\n <div class=\"at-nav-item\" [class.active]=\"ActiveTab === item.Tab\" (click)=\"SwitchTab(item.Tab)\">\n <i [class]=\"item.Icon\"></i> {{ item.Label }}\n @if (item.BadgeText) {\n <span class=\"at-nav-badge\" [class.at-nav-badge-live]=\"item.BadgeClass === 'nav-badge-live'\">{{ item.BadgeText }}</span>\n }\n </div>\n }\n <div class=\"at-nav-divider\"></div>\n <div class=\"at-nav-item\" [class.active]=\"ActiveTab === 'history'\" (click)=\"SwitchTab('history')\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i> Run History\n </div>\n </div>\n <div class=\"at-left-nav-footer\">\n <button class=\"at-run-pipeline-btn\" (click)=\"RunPipeline()\" [disabled]=\"IsRunning\">\n @if (IsRunning) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Running...\n } @else {\n <i class=\"fa-solid fa-play\"></i> Run Pipeline\n }\n </button>\n </div>\n </div>\n\n <!-- ══════ MAIN AREA ══════ -->\n <div class=\"at-main-area\">\n\n @if (IsLoading) {\n <div class=\"at-loading-overlay\">\n <mj-loading text=\"Loading autotagging data...\"></mj-loading>\n </div>\n }\n\n @if (!IsLoading) {\n\n <!-- ════════════════════════════════════════════ -->\n <!-- TAB 1: PIPELINE MONITOR -->\n <!-- ════════════════════════════════════════════ -->\n @if (ActiveTab === 'pipeline') {\n <div class=\"at-page-header\">\n <div>\n <div class=\"at-page-title\">Pipeline Monitor</div>\n <div class=\"at-page-subtitle\">Real-time processing status and recent activity</div>\n </div>\n <div class=\"at-page-actions\">\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"LoadPipelineData()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n </div>\n </div>\n <div class=\"at-page-body\">\n <!-- KPIs -->\n <div class=\"at-kpi-strip\">\n @for (kpi of KPIMetrics; track kpi.Label) {\n <div class=\"at-kpi-card\">\n <div class=\"at-kpi-value\" [class.at-kpi-error-value]=\"kpi.Label === 'Errors' && kpi.Value > 0\">{{ kpi.Value | number }}</div>\n <div class=\"at-kpi-label\">{{ kpi.Label }}</div>\n @if (kpi.Trend) {\n <div class=\"at-kpi-trend\" [class.up]=\"kpi.TrendUp\">\n @if (kpi.TrendUp) { <i class=\"fa-solid fa-arrow-up\"></i> }\n {{ kpi.Trend }}\n </div>\n }\n </div>\n }\n </div>\n\n <div class=\"at-pipeline-layout\">\n <div class=\"at-pipeline-center\">\n <!-- Pipeline stages visualization (only during active run) -->\n @if (PipelineStages.length > 0 && (IsRunning || IsPaused)) {\n <div class=\"at-pipeline-stages\">\n @for (stage of PipelineStages; track stage.Name; let last = $last) {\n <div class=\"at-pipeline-stage\"\n [class.stage-idle]=\"stage.Status === 'idle'\"\n [class.stage-active]=\"stage.Status === 'active'\"\n [class.stage-complete]=\"stage.Status === 'complete'\">\n <div class=\"at-pipeline-stage-icon\">\n @if (stage.Status === 'active') {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else if (stage.Status === 'complete') {\n <i class=\"fa-solid fa-check\"></i>\n } @else {\n <i [class]=\"stage.Icon\"></i>\n }\n </div>\n <div class=\"at-pipeline-stage-name\">{{ stage.Name }}</div>\n </div>\n @if (!last) {\n <div class=\"at-stage-connector\"\n [class.connector-complete]=\"stage.Status === 'complete'\">\n </div>\n }\n }\n </div>\n }\n\n <!-- Progress bar (visible during run or paused) -->\n @if (IsRunning || IsPaused) {\n <div class=\"at-progress-section\">\n <div class=\"at-progress-header\">\n <span class=\"at-progress-stage-label\">{{ RunStage }}</span>\n <span class=\"at-progress-pct\">{{ RunProgress | number:'1.0-0' }}%</span>\n </div>\n <div class=\"at-progress-bar\"><div class=\"at-progress-fill\" [style.width.%]=\"RunProgress\" [class.at-progress-fill-paused]=\"IsPaused\"></div></div>\n @if (RunCurrentItem) {\n <div class=\"at-progress-current\">{{ RunCurrentItem }}</div>\n }\n <div class=\"at-pipeline-controls\">\n @if (IsRunning && !IsPaused) {\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"PausePipeline()\" [disabled]=\"!CurrentProcessRunID\">\n <i class=\"fa-solid fa-pause\"></i> Pause\n </button>\n }\n @if (IsPaused) {\n <button class=\"at-action-btn at-primary-btn\" (click)=\"ResumePipeline()\">\n <i class=\"fa-solid fa-play\"></i> Resume\n </button>\n }\n <button class=\"at-action-btn at-danger-btn\" (click)=\"CancelPipeline()\">\n <i class=\"fa-solid fa-stop\"></i> Cancel\n </button>\n </div>\n </div>\n }\n\n <!-- D2: Live Per-Source Progress (visible during run) -->\n @if (IsRunning && LiveRunDetailRows.length > 0) {\n <div class=\"at-card\" style=\"margin-bottom: 12px;\">\n <div class=\"at-card-header\">\n <span class=\"at-card-title\"><i class=\"fa-solid fa-list-check\"></i> Per-Source Progress</span>\n <button class=\"at-action-btn at-secondary-btn\" style=\"font-size: 11px; padding: 3px 8px;\" (click)=\"LoadLiveRunDetails()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n </button>\n </div>\n <div class=\"at-card-body\" style=\"max-height: 200px; overflow-y: auto;\">\n <table class=\"at-run-table\">\n <thead>\n <tr>\n <th>Source</th>\n <th>Status</th>\n <th>Items</th>\n <th>Tagged</th>\n <th>Vectorized</th>\n <th>Errors</th>\n </tr>\n </thead>\n <tbody>\n @for (row of LiveRunDetailRows; track row.SourceName) {\n <tr>\n <td class=\"at-run-source-name\">{{ row.SourceName }}</td>\n <td>\n <span class=\"at-run-status-badge\" [class]=\"row.StatusClass\">\n @if (row.StatusClass === 'running') {\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 0.55rem\"></i>\n }\n {{ row.Status }}\n </span>\n </td>\n <td>{{ row.ItemsProcessed }}</td>\n <td>{{ row.ItemsTagged }}</td>\n <td>{{ row.ItemsVectorized }}</td>\n <td [class.run-error-text]=\"row.ErrorCount > 0\">{{ row.ErrorCount }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n\n <!-- Recent Processing Feed -->\n <div class=\"at-card at-feed-card\">\n <div class=\"at-card-header\">\n <span class=\"at-card-title\"><i class=\"fa-solid fa-bolt\"></i> Recent Processing</span>\n <div class=\"at-feed-header-actions\">\n <button class=\"at-feed-sort-btn\" (click)=\"ToggleFeedSort()\"\n [title]=\"FeedSortOrder === 'newest' ? 'Showing newest first' : 'Showing oldest first'\">\n <i class=\"fa-solid\" [class.fa-arrow-down-short-wide]=\"FeedSortOrder === 'newest'\"\n [class.fa-arrow-up-short-wide]=\"FeedSortOrder === 'oldest'\"></i>\n {{ FeedSortOrder === 'newest' ? 'Newest' : 'Oldest' }}\n </button>\n <span class=\"at-feed-count\">{{ FilteredFeedItems.length }} items</span>\n </div>\n </div>\n <!-- Feed search bar -->\n <div class=\"at-feed-search-bar\">\n <i class=\"fa-solid fa-search at-feed-search-icon\"></i>\n <input type=\"text\"\n class=\"mj-input at-feed-search-input\"\n placeholder=\"Search items, sources, or tags...\"\n [(ngModel)]=\"FeedSearchQuery\"\n (input)=\"OnFeedSearchChange()\">\n @if (FeedSearchQuery) {\n <button class=\"at-feed-search-clear\" (click)=\"FeedSearchQuery = ''; OnFeedSearchChange()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n <div class=\"at-card-body at-feed-scroll-body\">\n @if (FilteredFeedItems.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n @if (FeedSearchQuery) {\n <p>No items match \"{{ FeedSearchQuery }}\"</p>\n } @else {\n <p>No processed items yet.</p>\n }\n </div>\n }\n @for (item of PaginatedFeedItems; track item.Name + item.SourceName + item.TimeAgo) {\n <div class=\"at-feed-item at-feed-item-clickable\" (click)=\"OpenFeedItemDetail(GetFeedItemOriginalIndex(item))\">\n <div class=\"at-feed-status-dot\" [class]=\"item.Status\"></div>\n <div class=\"at-feed-item-content\">\n <span class=\"at-feed-item-name\">{{ item.Name }}</span>\n <span class=\"at-feed-item-source-label\">{{ item.SourceName }}</span>\n </div>\n <div class=\"at-feed-item-tags\">\n @for (tag of item.Tags; track tag) {\n <span class=\"at-feed-tag\">{{ tag }}</span>\n }\n </div>\n <span class=\"at-feed-item-time\">{{ item.TimeAgo }}</span>\n </div>\n }\n </div>\n <!-- Feed pagination -->\n @if (FeedTotalPages > 1) {\n <div class=\"at-feed-pagination\">\n <button class=\"at-action-btn at-secondary-btn\" [disabled]=\"FeedPage === 0\" (click)=\"FeedPrevPage()\">\n <i class=\"fa-solid fa-chevron-left\"></i>\n </button>\n <span class=\"at-feed-pagination-label\">Page {{ FeedPage + 1 }} of {{ FeedTotalPages }}</span>\n <button class=\"at-action-btn at-secondary-btn\" [disabled]=\"FeedPage >= FeedTotalPages - 1\" (click)=\"FeedNextPage()\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </button>\n </div>\n }\n </div>\n </div>\n\n <!-- Right sidebar -->\n <div class=\"at-pipeline-right\">\n <!-- Sources Quick List -->\n <div class=\"at-card\">\n <div class=\"at-card-header\">\n <span class=\"at-card-title\"><i class=\"fa-solid fa-database\"></i> Sources</span>\n </div>\n <div class=\"at-card-body\">\n @for (source of SourceMinis; track source.ID) {\n <div class=\"at-source-mini\">\n <div class=\"at-source-mini-icon\"><i [class]=\"source.Icon\"></i></div>\n <div class=\"at-source-mini-info\">\n <div class=\"at-source-mini-name\">{{ source.Name }}</div>\n <div class=\"at-source-mini-meta\">{{ source.Meta }}</div>\n </div>\n <div class=\"at-source-mini-status\" [class]=\"source.StatusClass\"></div>\n </div>\n }\n </div>\n </div>\n <!-- Trending Tags -->\n <div class=\"at-card at-tag-cloud-card\">\n <div class=\"at-card-title\" style=\"margin-bottom: 10px;\"><i class=\"fa-solid fa-chart-bar\"></i> Trending Tags</div>\n <div class=\"at-tag-cloud\">\n @for (tag of TrendingTags; track tag.Tag) {\n <span class=\"at-tag-pill\" [class]=\"tag.SizeClass\"\n [style.opacity]=\"0.4 + tag.AvgWeight * 0.6\"\n [title]=\"'Weight: ' + tag.AvgWeight.toFixed(2)\">{{ tag.Tag }}</span>\n }\n </div>\n </div>\n\n <!-- Pipeline Settings Widget -->\n <div class=\"at-card at-config-card\">\n <div class=\"at-card-header\" (click)=\"TogglePipelineConfig()\" style=\"cursor:pointer\">\n <span class=\"at-card-title\"><i class=\"fa-solid fa-sliders\"></i> Pipeline Settings</span>\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!ShowPipelineConfig\" [class.fa-chevron-up]=\"ShowPipelineConfig\" style=\"font-size:0.7rem; color:var(--mj-text-muted)\"></i>\n </div>\n @if (ShowPipelineConfig) {\n <div class=\"at-card-body at-config-body\">\n <div class=\"at-config-row\">\n <label class=\"at-config-label\">Batch Size</label>\n <div class=\"at-config-control\">\n <input type=\"number\" class=\"at-config-input\" min=\"10\" max=\"1000\" step=\"10\"\n [(ngModel)]=\"PipelineConfig.Pipeline!.BatchSize\">\n </div>\n </div>\n <div class=\"at-config-row\">\n <label class=\"at-config-label\">Throttle (ms)</label>\n <div class=\"at-config-control\">\n <input type=\"range\" class=\"at-config-slider\" min=\"0\" max=\"5000\" step=\"100\"\n [(ngModel)]=\"PipelineConfig.Pipeline!.DelayBetweenBatchesMs\">\n <span class=\"at-config-value\">{{ PipelineConfig.Pipeline!.DelayBetweenBatchesMs }}ms</span>\n </div>\n </div>\n <div class=\"at-config-row\">\n <label class=\"at-config-label\">Error Tolerance</label>\n <div class=\"at-config-control\">\n <input type=\"range\" class=\"at-config-slider\" min=\"5\" max=\"50\" step=\"5\"\n [(ngModel)]=\"PipelineConfig.Pipeline!.ErrorThresholdPercent\">\n <span class=\"at-config-value\">{{ PipelineConfig.Pipeline!.ErrorThresholdPercent }}%</span>\n </div>\n </div>\n <div class=\"at-config-row\">\n <label class=\"at-config-label\">Auto-resume</label>\n <div class=\"at-config-control\">\n <label class=\"at-config-toggle\">\n <input type=\"checkbox\" [(ngModel)]=\"PipelineConfig.Pipeline!.ResumeFromLastBatch\">\n <span class=\"at-toggle-track\"><span class=\"at-toggle-thumb\"></span></span>\n </label>\n </div>\n </div>\n <div class=\"at-config-divider\"></div>\n <div class=\"at-config-section-label\">LLM Rate Limits</div>\n <div class=\"at-config-row\">\n <label class=\"at-config-label\">Requests/min</label>\n <div class=\"at-config-control\">\n <input type=\"number\" class=\"at-config-input\" min=\"1\" max=\"500\"\n [(ngModel)]=\"PipelineConfig.RateLimits!.LLM!.RequestsPerMinute\">\n </div>\n </div>\n <div class=\"at-config-row\">\n <label class=\"at-config-label\">Tokens/min</label>\n <div class=\"at-config-control\">\n <input type=\"number\" class=\"at-config-input\" min=\"1000\" max=\"5000000\" step=\"10000\"\n [(ngModel)]=\"PipelineConfig.RateLimits!.LLM!.TokensPerMinute\">\n <span class=\"at-config-value\">{{ FormatTokenCount(PipelineConfig.RateLimits!.LLM!.TokensPerMinute ?? 0) }}</span>\n </div>\n </div>\n <div class=\"at-config-section-label\">Embedding Rate Limits</div>\n <div class=\"at-config-row\">\n <label class=\"at-config-label\">Requests/min</label>\n <div class=\"at-config-control\">\n <input type=\"number\" class=\"at-config-input\" min=\"1\" max=\"1000\"\n [(ngModel)]=\"PipelineConfig.RateLimits!.Embedding!.RequestsPerMinute\">\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- ════════════════════════════════════════════ -->\n <!-- TAB 2: SOURCES -->\n <!-- ════════════════════════════════════════════ -->\n @if (ActiveTab === 'sources') {\n <div class=\"at-page-header\">\n <div>\n <div class=\"at-page-title\">Content Sources</div>\n <div class=\"at-page-subtitle\">Configure where content is ingested from</div>\n </div>\n <div class=\"at-page-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"OpenAddSourceForm()\">\n <i class=\"fa-solid fa-plus\"></i> Add Source\n </button>\n </div>\n </div>\n <div class=\"at-page-body\">\n <div class=\"at-sources-grid\">\n @for (card of SourceCards; track card.ID) {\n <div class=\"at-source-card-full at-source-card-clickable\" (click)=\"OpenSourceDetail(card)\">\n <div class=\"at-source-card-header\">\n <div class=\"at-source-card-icon\"><i [class]=\"card.Icon\"></i></div>\n <div>\n <div class=\"at-source-card-title\">{{ card.Name }}</div>\n <div class=\"at-source-card-type\">{{ card.SourceTypeName }}@if (card.RequiresFileType) { · {{ card.FileTypeName }}}</div>\n </div>\n <div class=\"at-source-card-status\" [class]=\"card.StatusClass\">\n <div class=\"at-source-mini-status\" [class]=\"card.StatusClass\"></div>\n {{ card.StatusLabel }}\n </div>\n </div>\n @if (card.URL) {\n <div class=\"at-source-card-url\">{{ card.URL }}</div>\n }\n <div class=\"at-source-card-stats\">\n <div class=\"at-source-stat\">\n <div class=\"at-source-stat-value\">{{ formatNumber(card.ItemCount) }}</div>\n <div class=\"at-source-stat-label\">Items</div>\n </div>\n <div class=\"at-source-stat\">\n <div class=\"at-source-stat-value\">{{ formatNumber(card.TagCount) }}</div>\n <div class=\"at-source-stat-label\">Tags</div>\n </div>\n <div class=\"at-source-stat\">\n <div class=\"at-source-stat-value\">{{ card.AvgTags }}</div>\n <div class=\"at-source-stat-label\">Avg Tags</div>\n </div>\n <div class=\"at-source-stat\">\n <div class=\"at-source-stat-value\">{{ card.LastRunAgo }}</div>\n <div class=\"at-source-stat-label\">Last Run</div>\n </div>\n </div>\n <!-- Schedule indicator -->\n @if (card.ScheduledActionID) {\n <div class=\"at-schedule-indicator\" (click)=\"RemoveSchedule(card); $event.stopPropagation()\" title=\"Click to remove schedule\">\n <i class=\"fa-regular fa-clock\"></i>\n <span>{{ GetScheduleLabel(card) }}</span>\n </div>\n }\n <div class=\"at-source-card-actions\">\n <button class=\"at-source-action-btn\" (click)=\"OpenEditSourceForm(card); $event.stopPropagation()\"><i class=\"fa-solid fa-pen\"></i> Edit</button>\n <button class=\"at-source-action-btn\" (click)=\"RunPipelineForSource(card.ID); $event.stopPropagation()\"><i class=\"fa-solid fa-play\"></i> Run</button>\n @if (!card.ScheduledActionID) {\n <button class=\"at-source-action-btn at-source-schedule-btn\" (click)=\"OpenScheduleDialog(card); $event.stopPropagation()\"><i class=\"fa-regular fa-clock\"></i> Schedule</button>\n }\n <button class=\"at-source-action-btn at-source-delete-btn\" (click)=\"DeleteSource(card); $event.stopPropagation()\"><i class=\"fa-solid fa-trash\"></i> Delete</button>\n </div>\n </div>\n }\n\n <!-- Add Source Card -->\n <div class=\"at-add-source-card\" (click)=\"OpenAddSourceForm()\">\n <i class=\"fa-solid fa-plus-circle\"></i>\n <span style=\"font-size: 0.85rem; font-weight: 600;\">Add Content Source</span>\n <span style=\"font-size: 0.72rem;\">Web, RSS, Email, Files, API</span>\n </div>\n </div>\n\n <!-- Content Item Duplicates Section -->\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\n <!-- ════════════════════════════════════════════ -->\n <!-- TAB 3: CONTENT TYPES -->\n <!-- ════════════════════════════════════════════ -->\n @if (ActiveTab === 'types') {\n <div class=\"at-page-header\">\n <div>\n <div class=\"at-page-title\">Content Types</div>\n <div class=\"at-page-subtitle\">Configure AI tagging rules per content category</div>\n </div>\n <div class=\"at-page-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"OpenAddTypeForm()\">\n <i class=\"fa-solid fa-plus\"></i> Add Type\n </button>\n </div>\n </div>\n <div class=\"at-page-body\">\n <div class=\"at-ct-grid\">\n @for (card of ContentTypeCards; track card.ID) {\n <div class=\"at-ct-card\">\n <div class=\"at-ct-card-header\">\n <span class=\"at-ct-card-name\">{{ card.Name }}</span>\n <span class=\"at-ct-card-model\">{{ card.AIModelName }}</span>\n </div>\n <div class=\"at-ct-field\">\n <span class=\"at-ct-field-label\">Description</span>\n <span class=\"at-ct-field-value\">{{ card.Description || '\\u2014' }}</span>\n </div>\n <div class=\"at-ct-field\">\n <span class=\"at-ct-field-label\">Sources Using</span>\n <span class=\"at-ct-field-value\">{{ card.SourcesUsing }}</span>\n </div>\n <div class=\"at-ct-field\">\n <span class=\"at-ct-field-label\">Items Tagged</span>\n <span class=\"at-ct-field-value\">{{ formatNumber(card.ItemsTagged) }}</span>\n </div>\n <div class=\"at-ct-tag-range\">\n <i class=\"fa-solid fa-tags\"></i>\n <span>{{ card.MinTags }}</span>\n <div class=\"at-ct-tag-range-bar\">\n <div class=\"at-ct-tag-range-fill\" [style.left.%]=\"card.RangeLeftPct\" [style.right.%]=\"card.RangeRightPct\"></div>\n </div>\n <span>{{ card.MaxTags }}</span>\n <span class=\"at-ct-range-suffix\">tags/item</span>\n </div>\n <div class=\"at-source-card-actions\" style=\"margin-top: 10px;\">\n <button class=\"at-source-action-btn\" (click)=\"OpenEditTypeForm(card)\"><i class=\"fa-solid fa-pen\"></i> Edit</button>\n </div>\n </div>\n }\n <!-- Add Content Type Card -->\n <div class=\"at-add-type-card\" (click)=\"OpenAddTypeForm()\">\n <i class=\"fa-solid fa-plus-circle\"></i>\n <span style=\"font-size: 0.85rem; font-weight: 600;\">Add Content Type</span>\n <span style=\"font-size: 0.72rem;\">Configure tagging rules</span>\n </div>\n </div>\n </div>\n }\n\n <!-- ════════════════════════════════════════════ -->\n <!-- TAB 4: TAG LIBRARY -->\n <!-- ════════════════════════════════════════════ -->\n @if (ActiveTab === 'tags') {\n <div class=\"at-page-header\">\n <div>\n <div class=\"at-page-title\">Tag Library</div>\n <div class=\"at-page-subtitle\">{{ TagRows.length }} unique tags across all content sources</div>\n </div>\n <div class=\"at-page-actions\">\n <input type=\"text\" class=\"at-search-input\" placeholder=\"Search tags...\"\n [(ngModel)]=\"TagSearchQuery\" (input)=\"FilterTags()\">\n </div>\n </div>\n <div class=\"at-page-body\">\n <div class=\"at-tag-lib-layout\">\n <div class=\"at-tag-lib-main\">\n <div class=\"at-card\">\n <div class=\"at-card-body\" style=\"max-height: 500px; overflow-y: auto;\">\n <table class=\"at-tag-table\">\n <thead>\n <tr>\n <th>Tag</th>\n <th>Count</th>\n <th>Avg Weight</th>\n <th>Distribution</th>\n <th>Top Source</th>\n <th>First Seen</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredTagRows; track row.Tag) {\n <tr class=\"at-tag-row-clickable\" (click)=\"DrillDownTag(row.Tag)\"\n [class.at-tag-row-selected]=\"SelectedDrillDownTag === row.Tag\">\n <td class=\"at-tag-name-cell\">{{ row.Tag }}</td>\n <td>{{ row.UsageCount }}</td>\n <td>\n <div class=\"at-weight-indicator\">\n <div class=\"at-weight-bar\">\n <div class=\"at-weight-bar-fill\" [style.width.%]=\"row.AvgWeight * 100\"\n [class.at-weight-high]=\"row.AvgWeight >= 0.7\"\n [class.at-weight-medium]=\"row.AvgWeight >= 0.4 && row.AvgWeight < 0.7\"\n [class.at-weight-low]=\"row.AvgWeight < 0.4\"></div>\n </div>\n <span class=\"at-weight-value\">{{ row.AvgWeight.toFixed(2) }}</span>\n </div>\n </td>\n <td>\n <div class=\"at-tag-bar\">\n <div class=\"at-tag-bar-fill\" [style.width.%]=\"row.BarWidthPct\"></div>\n </div>\n </td>\n <td>{{ row.TopSource }}</td>\n <td>{{ row.FirstSeen }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n <!-- Tag drill-down: content items matching selected tag -->\n @if (SelectedDrillDownTag) {\n <div class=\"at-card\" style=\"margin-top: 12px;\">\n <div class=\"at-card-header\">\n <span class=\"at-card-title\">\n <i class=\"fa-solid fa-tag\"></i>\n Content items tagged \"{{ SelectedDrillDownTag }}\"\n ({{ TagDrillDownItems.length }})\n </span>\n <button class=\"at-slide-close\" (click)=\"CloseDrillDownTag()\" style=\"background:none;border:none;cursor:pointer;color:var(--mj-text-muted)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-card-body\" style=\"max-height: 300px; overflow-y: auto;\">\n @if (TagDrillDownItems.length === 0) {\n <div class=\"at-empty-state\"><p>No content items found for this tag.</p></div>\n } @else {\n <table class=\"at-tag-table\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Source</th>\n <th>Weight</th>\n <th>Updated</th>\n </tr>\n </thead>\n <tbody>\n @for (di of TagDrillDownItems; track di.ID) {\n <tr class=\"at-tag-row-clickable\" (click)=\"OpenItemDetailByID(di.ID)\">\n <td>{{ di.Name }}</td>\n <td>{{ di.SourceName }}</td>\n <td>{{ FormatWeight(di.Weight) }}</td>\n <td>{{ di.UpdatedAt }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n </div>\n }\n </div>\n <div class=\"at-tag-lib-sidebar\">\n <div class=\"at-card at-tag-cloud-card\">\n <div class=\"at-card-title\" style=\"margin-bottom: 12px;\"><i class=\"fa-solid fa-cloud\"></i> Tag Cloud</div>\n @if (TagCloudWordItems.length > 0) {\n <mj-word-cloud\n [Items]=\"TagCloudWordItems\"\n [MaxFontSize]=\"40\"\n [MinFontSize]=\"12\"\n [MaxItems]=\"20\"\n Layout=\"spiral\"\n ColorMode=\"weight-gradient\"\n [Interactive]=\"true\"\n [Animate]=\"true\">\n </mj-word-cloud>\n } @else {\n <div class=\"at-tag-cloud-empty\">No tags yet</div>\n }\n </div>\n <div class=\"at-card\" style=\"padding: 16px; margin-top: 12px;\">\n <div class=\"at-card-title\" style=\"margin-bottom: 10px;\"><i class=\"fa-solid fa-chart-pie\"></i> By Source</div>\n <div class=\"at-tags-by-source\">\n @for (s of TagsBySource; track s.SourceName) {\n <div class=\"at-tag-source-row\">\n <span>{{ s.SourceName }}</span>\n <strong>{{ s.Count }}</strong>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- ════════════════════════════════════════════ -->\n <!-- TAB 6: TAXONOMY GOVERNANCE -->\n <!-- ════════════════════════════════════════════ -->\n @if (ActiveTab === 'taxonomy') {\n <div class=\"at-page-header\">\n <div>\n <div class=\"at-page-title\">Taxonomy Governance</div>\n <div class=\"at-page-subtitle\">Manage tag hierarchy, resolve duplicates, and monitor taxonomy health &mdash; <strong>{{ TaxHealth.Total }} total tags</strong></div>\n </div>\n <div class=\"at-page-actions\">\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"RefreshTaxonomyData()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n </div>\n </div>\n\n <!-- Sub-tab strip -->\n <div class=\"at-tax-tab-strip\">\n <div class=\"at-tax-tab\" [class.active]=\"TaxSubTab === 'tree'\" (click)=\"SwitchTaxSubTab('tree')\">\n <i class=\"fa-solid fa-sitemap\"></i> Tree View\n </div>\n <div class=\"at-tax-tab\" [class.active]=\"TaxSubTab === 'duplicates'\" (click)=\"SwitchTaxSubTab('duplicates')\">\n <i class=\"fa-solid fa-link\"></i> Duplicates\n @if (TaxDuplicates.length > 0) {\n <span class=\"at-tax-tab-badge at-tax-badge-warning\">{{ TaxDuplicates.length }}</span>\n }\n </div>\n <div class=\"at-tax-tab\" [class.active]=\"TaxSubTab === 'orphans'\" (click)=\"SwitchTaxSubTab('orphans')\">\n <i class=\"fa-solid fa-ban\"></i> Orphans\n @if (TaxOrphans.length > 0) {\n <span class=\"at-tax-tab-badge at-tax-badge-error\">{{ TaxOrphans.length }}</span>\n }\n </div>\n <div class=\"at-tax-tab\" [class.active]=\"TaxSubTab === 'treemap'\" (click)=\"SwitchTaxSubTab('treemap')\">\n <i class=\"fa-solid fa-chart-tree-map\"></i> Treemap\n </div>\n <div class=\"at-tax-tab\" [class.active]=\"TaxSubTab === 'audit'\" (click)=\"SwitchTaxSubTab('audit')\">\n <i class=\"fa-solid fa-scroll\"></i> Audit Log\n </div>\n </div>\n\n <div class=\"at-page-body\">\n\n <!-- ══ SUB-TAB 1: TREE VIEW ══ -->\n @if (TaxSubTab === 'tree') {\n <div class=\"at-tax-split-view\">\n <!-- Tree panel -->\n <div class=\"at-tax-tree-panel\" style=\"position: relative;\">\n <div class=\"at-tax-tree-toolbar\">\n <input type=\"text\" class=\"at-search-input\" style=\"flex: 1;\" placeholder=\"Search tags...\"\n [(ngModel)]=\"TaxTreeSearch\" (input)=\"FilterTaxTree()\">\n <button class=\"at-tax-toolbar-btn\" title=\"Add root tag\" (click)=\"OpenCreateRootTag()\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n <button class=\"at-tax-toolbar-btn\" [class.active]=\"TaxMultiSelectMode\"\n title=\"Toggle multi-select for drag reparenting\" (click)=\"ToggleMultiSelectMode()\">\n <i class=\"fa-solid fa-check-double\"></i>\n </button>\n </div>\n <div class=\"at-tax-tree-body\"\n (dragover)=\"$event.preventDefault()\"\n (drop)=\"OnDropToRoot($event)\">\n @if (TaxFilteredNodes.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-sitemap\"></i>\n <p>No tags found</p>\n </div>\n }\n @for (node of TaxFilteredNodes; track node.ID) {\n <div class=\"at-tax-tree-node\"\n [class.at-tax-node-selected]=\"node.IsSelected\"\n [class.at-tax-node-drag-over]=\"TaxDragOverNodeID === node.ID\"\n [class.at-tax-node-multi-selected]=\"IsNodeMultiSelected(node.ID)\"\n [style.padding-left.px]=\"16 + node.Depth * 20\"\n [attr.draggable]=\"true\"\n (dragstart)=\"OnTreeNodeDragStart($event, node)\"\n (dragover)=\"OnTreeNodeDragOver($event, node)\"\n (dragleave)=\"OnTreeNodeDragLeave()\"\n (drop)=\"OnTreeNodeDrop($event, node); $event.stopPropagation()\"\n (click)=\"SelectTaxNode(node)\">\n @if (TaxMultiSelectMode) {\n <input type=\"checkbox\" class=\"at-tax-tree-checkbox\"\n [checked]=\"IsNodeMultiSelected(node.ID)\"\n (click)=\"ToggleNodeSelection(node, $event)\">\n }\n <span class=\"at-tax-tree-arrow\"\n [class.at-tax-arrow-expanded]=\"node.IsExpanded && node.Children.length > 0\"\n [class.at-tax-arrow-collapsed]=\"!node.IsExpanded && node.Children.length > 0\"\n [class.at-tax-arrow-leaf]=\"node.Children.length === 0\"\n (click)=\"ToggleTaxNode(node); $event.stopPropagation()\"></span>\n <span class=\"at-tax-health-dot\" [class]=\"node.HealthColor\"></span>\n <span class=\"at-tax-tree-label\" [class.at-tax-tree-label-selected]=\"node.IsSelected\">{{ node.Name }}</span>\n <span class=\"at-tax-tree-count\">({{ node.ItemCount }})</span>\n <span class=\"at-tax-tree-add-child\" title=\"Add child tag\"\n (click)=\"OpenCreateChildTagFor(node); $event.stopPropagation()\">\n <i class=\"fa-solid fa-plus\"></i>\n </span>\n </div>\n }\n </div>\n @if (TaxTreeSaving) {\n <div class=\"at-tax-tree-saving-overlay\">\n <mj-loading text=\"Moving tags...\" size=\"small\"></mj-loading>\n </div>\n }\n </div>\n\n <!-- Details panel -->\n <div class=\"at-tax-details-panel\">\n @if (TaxSelectedNode) {\n <div class=\"at-tax-details-header\">\n <!-- Breadcrumb -->\n <div class=\"at-tax-breadcrumb\">\n @for (bc of GetTaxBreadcrumb(TaxSelectedNode); track bc.ID) {\n <span class=\"at-tax-bc-link\" (click)=\"NavigateToBreadcrumb(bc.ID)\">{{ bc.Name }}</span>\n <span class=\"at-tax-bc-sep\">&rsaquo;</span>\n }\n <span class=\"at-tax-bc-current\">{{ TaxSelectedNode.Name }}</span>\n </div>\n\n @if (!TaxIsEditing) {\n <div class=\"at-tax-details-title\">\n {{ TaxSelectedNode.DisplayName }}\n <span class=\"at-tax-edit-icon\" (click)=\"StartEditTag()\" title=\"Edit name\">\n <i class=\"fa-solid fa-pen\"></i>\n </span>\n </div>\n @if (TaxSelectedNode.Description) {\n <div class=\"at-tax-details-desc\">{{ TaxSelectedNode.Description }}</div>\n }\n } @else {\n <div class=\"at-tax-edit-form\">\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"TaxEditName\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Description</label>\n <textarea class=\"at-form-textarea\" rows=\"3\" [(ngModel)]=\"TaxEditDescription\"></textarea>\n </div>\n <div class=\"at-form-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveEditTag()\">Save</button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CancelEditTag()\">Cancel</button>\n </div>\n </div>\n }\n </div>\n\n <!-- Stats row -->\n <div class=\"at-tax-stats-row\">\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.ItemCount }}</div>\n <div class=\"at-tax-stat-label\">Items Tagged</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.AvgWeight.toFixed(2) }}</div>\n <div class=\"at-tax-stat-label\">Avg Weight</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.Children.length }}</div>\n <div class=\"at-tax-stat-label\">Children</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.Depth }}</div>\n <div class=\"at-tax-stat-label\">Depth</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value at-tax-stat-date\">{{ TaxSelectedNode.FirstSeen }}</div>\n <div class=\"at-tax-stat-label\">First Seen</div>\n </div>\n </div>\n\n <!-- Action toolbar -->\n @if (!TaxIsEditing) {\n <div class=\"at-tax-action-toolbar\">\n <button class=\"at-tax-action-btn\" (click)=\"OpenCreateChildTag()\"><i class=\"fa-solid fa-plus\"></i> Add Child</button>\n <button class=\"at-tax-action-btn\" (click)=\"StartEditTag()\"><i class=\"fa-solid fa-pen\"></i> Rename</button>\n <button class=\"at-tax-action-btn\" (click)=\"OpenMoveDialog(TaxSelectedNode)\"><i class=\"fa-solid fa-arrows-up-down\"></i> Move</button>\n <button class=\"at-tax-action-btn\" (click)=\"OpenMergeIntoDialog(TaxSelectedNode)\"><i class=\"fa-solid fa-compress\"></i> Merge Into...</button>\n <button class=\"at-tax-action-btn\" (click)=\"OpenSplitDialog(TaxSelectedNode)\"><i class=\"fa-solid fa-code-branch\"></i> Split</button>\n <button class=\"at-tax-action-btn at-tax-action-danger\" (click)=\"DeleteTag(TaxSelectedNode)\"><i class=\"fa-solid fa-trash\"></i> Delete</button>\n </div>\n }\n\n <!-- Child tags -->\n @if (TaxSelectedNode.Children.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Child Tags</div>\n <div class=\"at-tax-child-chips\">\n @for (child of TaxSelectedNode.Children; track child.ID) {\n <span class=\"at-tax-child-chip\" (click)=\"SelectTaxNode(child)\">\n {{ child.Name }}\n <span class=\"at-tax-chip-count\">{{ child.ItemCount }}</span>\n </span>\n }\n </div>\n </div>\n }\n\n <!-- Recently tagged items -->\n @if (TaxRecentItems.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Recently Tagged Items</div>\n <div class=\"at-tax-recent-list\">\n @for (item of TaxRecentItems; track $index) {\n <div class=\"at-tax-recent-item\">\n <div class=\"at-tax-recent-icon\"><i [class]=\"item.Icon\"></i></div>\n <div class=\"at-tax-recent-name\">{{ item.Name }}</div>\n <div class=\"at-tax-recent-weight\">{{ item.Weight.toFixed(2) }}</div>\n <div class=\"at-tax-recent-date\">{{ item.Date }}</div>\n </div>\n }\n </div>\n </div>\n }\n } @else {\n <div class=\"at-empty-state\" style=\"height: 100%;\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n <p>Select a tag from the tree to view details</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Health bar -->\n <div class=\"at-tax-health-bar\">\n <span class=\"at-tax-health-label\">Taxonomy Health</span>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-total\"></span>\n <span class=\"at-tax-health-value\">{{ TaxHealth.Total }}</span>\n <span class=\"at-tax-health-text\">Total</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-healthy\"></span>\n <span class=\"at-tax-health-value at-tax-val-success\">{{ TaxHealth.Healthy }}</span>\n <span class=\"at-tax-health-text\">Healthy</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-attention\"></span>\n <span class=\"at-tax-health-value at-tax-val-warning\">{{ TaxHealth.NeedAttention }}</span>\n <span class=\"at-tax-health-text\">Need Attention</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-orphaned\"></span>\n <span class=\"at-tax-health-value at-tax-val-error\">{{ TaxHealth.Orphaned }}</span>\n <span class=\"at-tax-health-text\">Orphaned</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-duplicates\"></span>\n <span class=\"at-tax-health-value at-tax-val-info\">{{ TaxHealth.Duplicates }}</span>\n <span class=\"at-tax-health-text\">Duplicate Candidates</span>\n </div>\n </div>\n }\n\n <!-- ══ SUB-TAB 2: DUPLICATES ══ -->\n @if (TaxSubTab === 'duplicates') {\n <div class=\"at-tax-dup-stats-bar\">\n <div class=\"at-tax-dup-stat\"><strong>{{ TaxDuplicates.length }}</strong> candidates found</div>\n <div class=\"at-tax-dup-stat at-tax-dup-high\"><strong>{{ TaxHighConfidenceDupeCount }}</strong> high confidence (&gt;85%)</div>\n <div class=\"at-tax-dup-stat at-tax-dup-moderate\"><strong>{{ TaxModerateDupeCount }}</strong> moderate (70-85%)</div>\n </div>\n\n @if (TaxDuplicates.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <p>No duplicate tags detected</p>\n </div>\n }\n\n <div class=\"at-tax-dup-list\">\n @for (pair of TaxDuplicates; track $index) {\n <div class=\"at-tax-dup-card\" [class.at-tax-dup-high]=\"pair.SeverityClass === 'high'\" [class.at-tax-dup-moderate]=\"pair.SeverityClass === 'moderate'\">\n @if (pair.IsExactDuplicate) {\n <!-- Exact-name duplicates: show single tag name with count -->\n <div class=\"at-tax-dup-tag\">{{ pair.TagA }}</div>\n <div class=\"at-tax-dup-similarity\">\n <span class=\"at-tax-sim-percent high\">\n <i class=\"fa-solid fa-clone\"></i>&nbsp;{{ pair.ExactDuplicateCount }} identical records\n </span>\n </div>\n <div class=\"at-tax-dup-actions\">\n <button class=\"at-tax-dup-btn at-tax-dup-btn-primary\" (click)=\"MergeTags(pair.TagAID, pair.TagBID, pair.TagA, pair.TagB)\" [disabled]=\"IsMerging\">@if (IsMerging) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Merging... } @else { Merge }</button>\n <button class=\"at-tax-dup-btn\" (click)=\"DismissDuplicate(pair)\">Dismiss</button>\n </div>\n } @else {\n <!-- Similar (non-exact) pairs: show both tags with similarity -->\n <div class=\"at-tax-dup-tag\">{{ pair.TagA }}</div>\n <div class=\"at-tax-dup-arrow\"><i class=\"fa-solid fa-arrows-left-right\"></i></div>\n <div class=\"at-tax-dup-similarity\">\n <div class=\"at-tax-sim-bar-bg\">\n <div class=\"at-tax-sim-bar-fill\" [class]=\"pair.SeverityClass\" [style.width.%]=\"pair.Similarity\"></div>\n </div>\n <span class=\"at-tax-sim-percent\" [class]=\"pair.SeverityClass\">{{ pair.Similarity }}%</span>\n </div>\n <div class=\"at-tax-dup-arrow\"><i class=\"fa-solid fa-arrows-left-right\"></i></div>\n <div class=\"at-tax-dup-tag\">{{ pair.TagB }}</div>\n <div class=\"at-tax-dup-actions\">\n <button class=\"at-tax-dup-btn at-tax-dup-btn-primary\" (click)=\"MergeTags(pair.TagAID, pair.TagBID, pair.TagA, pair.TagB)\" [disabled]=\"IsMerging\">@if (IsMerging) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Merging... } @else { Merge }</button>\n <button class=\"at-tax-dup-btn\" (click)=\"MakeChildTag(pair.TagAID, pair.TagBID)\">Make Child</button>\n <button class=\"at-tax-dup-btn\" (click)=\"DismissDuplicate(pair)\">Dismiss</button>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- ══ SUB-TAB 3: ORPHANS ══ -->\n @if (TaxSubTab === 'orphans') {\n <div class=\"at-tax-orphan-toolbar\">\n <span class=\"at-tax-orphan-count\">{{ TaxOrphans.length }} orphaned tags</span>\n <span class=\"at-tax-orphan-desc\">&mdash; no parent, no children, low usage</span>\n <div class=\"at-tax-orphan-bulk\">\n <button class=\"at-tax-bulk-btn\" (click)=\"ToggleAllOrphans()\">\n @if (TaxAllOrphansSelected) { <i class=\"fa-solid fa-square-check\"></i> } @else { <i class=\"fa-regular fa-square\"></i> }\n Select All\n </button>\n <button class=\"at-tax-bulk-btn at-tax-bulk-danger\" (click)=\"BulkDeleteOrphans()\">\n <i class=\"fa-solid fa-trash\"></i> Bulk Delete\n </button>\n <button class=\"at-tax-bulk-btn at-tax-bulk-danger\" (click)=\"DeleteAllOrphans()\">\n <i class=\"fa-solid fa-trash-can\"></i> Delete All ({{ TaxOrphans.length }})\n </button>\n </div>\n </div>\n\n @if (TaxOrphans.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <p>No orphaned tags</p>\n </div>\n }\n\n <div class=\"at-tax-orphan-grid\">\n @for (orphan of TaxOrphans; track orphan.ID) {\n <div class=\"at-tax-orphan-card\">\n <div class=\"at-tax-orphan-header\">\n <span class=\"at-tax-orphan-name\">{{ orphan.Name }}</span>\n <input type=\"checkbox\" class=\"at-tax-orphan-checkbox\" [checked]=\"orphan.IsSelected\"\n (change)=\"ToggleOrphanSelection(orphan)\" (click)=\"$event.stopPropagation()\">\n </div>\n <div class=\"at-tax-orphan-stats\">\n <span>Usage: <strong>{{ orphan.UsageCount }}</strong></span>\n <span>Avg Weight: <strong>{{ orphan.AvgWeight.toFixed(2) }}</strong></span>\n </div>\n <div class=\"at-tax-orphan-dates\">\n <span>First: {{ orphan.FirstSeen }}</span>\n <span>Last: {{ orphan.LastSeen }}</span>\n </div>\n <div class=\"at-tax-orphan-actions\">\n <button class=\"at-tax-orphan-btn at-tax-orphan-delete\" (click)=\"DeleteOrphan(orphan)\">Delete</button>\n <button class=\"at-tax-orphan-btn\">Ignore</button>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- ══ SUB-TAB 4: TREEMAP ══ -->\n @if (TaxSubTab === 'treemap') {\n <div class=\"at-tax-treemap-kpi-strip\">\n @for (kpi of TaxTreemapKPIs; track kpi.Label) {\n <div class=\"at-tax-treemap-kpi\">\n <div class=\"at-tax-treemap-kpi-value\">{{ kpi.Value }}</div>\n <div class=\"at-tax-treemap-kpi-label\">{{ kpi.Label }}</div>\n </div>\n }\n </div>\n\n @if (TaxTreemapCells.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-chart-tree-map\"></i>\n <p>No taxonomy data to visualize</p>\n </div>\n } @else {\n <div class=\"at-tax-treemap-container\">\n @for (cell of TaxTreemapCells; track $index) {\n <div class=\"at-tax-treemap-cell at-tax-treemap-cell-clickable\" [class]=\"cell.ColorClass\"\n [style.grid-row]=\"cell.RowSpan > 1 ? 'span ' + cell.RowSpan : ''\"\n (click)=\"OpenTreemapDrillIn(cell)\">\n <span class=\"at-tax-cell-name\">{{ cell.Name }}</span>\n <span class=\"at-tax-cell-count\">{{ cell.ItemCount }} items</span>\n </div>\n }\n </div>\n }\n\n <!-- Treemap Drill-In Panel -->\n @if (ShowTreemapDrillIn && TreemapDrillInNode) {\n <div class=\"at-tax-drillin-overlay\" (click)=\"CloseTreemapDrillIn()\">\n <div class=\"at-tax-drillin-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-tax-drillin-header\">\n <h3><i class=\"fa-solid fa-tag\"></i> {{ TreemapDrillInNode.Name }}</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseTreemapDrillIn()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-tax-drillin-body\">\n <div class=\"at-tax-stats-row\">\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TreemapDrillInNode.ItemCount }}</div>\n <div class=\"at-tax-stat-label\">Items Tagged</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TreemapDrillInNode.AvgWeight.toFixed(2) }}</div>\n <div class=\"at-tax-stat-label\">Avg Weight</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TreemapDrillInNode.Children.length }}</div>\n <div class=\"at-tax-stat-label\">Children</div>\n </div>\n </div>\n\n @if (TreemapDrillInNode.Children.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Child Tags</div>\n <div class=\"at-tax-child-chips\">\n @for (child of TreemapDrillInNode.Children; track child.ID) {\n <span class=\"at-tax-child-chip\">{{ child.Name }} <span class=\"at-tax-chip-count\">{{ child.ItemCount }}</span></span>\n }\n </div>\n </div>\n }\n\n @if (TaxRecentItems.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Recently Tagged Items</div>\n <div class=\"at-tax-recent-list\">\n @for (item of TaxRecentItems; track $index) {\n <div class=\"at-tax-recent-item\">\n <div class=\"at-tax-recent-icon\"><i [class]=\"item.Icon\"></i></div>\n <div class=\"at-tax-recent-name\">{{ item.Name }}</div>\n <div class=\"at-tax-recent-weight\">{{ item.Weight.toFixed(2) }}</div>\n <div class=\"at-tax-recent-date\">{{ item.Date }}</div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n <div class=\"at-tax-drillin-footer\">\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"DrillInToTreeView(TreemapDrillInNode)\">\n <i class=\"fa-solid fa-sitemap\"></i> View in Tree\n </button>\n </div>\n </div>\n </div>\n }\n }\n\n <!-- ══ SUB-TAB 5: AUDIT LOG ══ -->\n @if (TaxSubTab === 'audit') {\n <div class=\"at-tax-audit-filters\">\n <span class=\"at-tax-audit-filter-label\">Filter</span>\n <div class=\"at-tax-audit-checkbox-group\">\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('created')\" (change)=\"ToggleTaxAuditFilter('created')\"> Created\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('merged')\" (change)=\"ToggleTaxAuditFilter('merged')\"> Merged\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('moved')\" (change)=\"ToggleTaxAuditFilter('moved')\"> Moved\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('deleted')\" (change)=\"ToggleTaxAuditFilter('deleted')\"> Deleted\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('renamed')\" (change)=\"ToggleTaxAuditFilter('renamed')\"> Renamed\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('deprecated')\" (change)=\"ToggleTaxAuditFilter('deprecated')\"> Deprecated\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('split')\" (change)=\"ToggleTaxAuditFilter('split')\"> Split\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('reactivated')\" (change)=\"ToggleTaxAuditFilter('reactivated')\"> Reactivated\n </label>\n </div>\n </div>\n\n @if (GetFilteredAuditEvents().length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-scroll\"></i>\n <p>No audit events match the current filters</p>\n </div>\n }\n\n <div class=\"at-tax-audit-timeline\">\n @for (event of GetFilteredAuditEvents(); track $index) {\n <div class=\"at-tax-audit-event\">\n <div class=\"at-tax-audit-event-icon\" [class]=\"event.Type\">\n <i [class]=\"GetTaxAuditIcon(event.Type)\"></i>\n </div>\n <div class=\"at-tax-audit-event-body\">\n <div class=\"at-tax-audit-event-desc\">\n {{ event.Description }} <span class=\"at-tax-tag-ref\">{{ event.TagRef }}</span>\n </div>\n <div class=\"at-tax-audit-event-meta\">\n <span>{{ event.User }}</span>\n <span>{{ event.Timestamp }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- ════════════════════════════════════════════ -->\n <!-- TAB 7: RUN HISTORY -->\n <!-- ════════════════════════════════════════════ -->\n @if (ActiveTab === 'history') {\n <div class=\"at-page-header\">\n <div>\n <div class=\"at-page-title\">Run History</div>\n <div class=\"at-page-subtitle\">Processing run log across all content sources</div>\n </div>\n <div class=\"at-page-actions\">\n <select class=\"at-filter-select\" [(ngModel)]=\"HistorySourceFilter\" (change)=\"FilterRunHistory()\">\n <option value=\"\">All Sources</option>\n @for (s of HistorySourceOptions; track s) {\n <option [value]=\"s\">{{ s }}</option>\n }\n </select>\n <select class=\"at-filter-select\" [(ngModel)]=\"HistoryStatusFilter\" (change)=\"FilterRunHistory()\">\n <option value=\"\">All Status</option>\n <option value=\"complete\">Complete</option>\n <option value=\"failed\">Failed</option>\n <option value=\"running\">Running</option>\n </select>\n </div>\n </div>\n <div class=\"at-page-body\">\n <div class=\"at-card\">\n <div class=\"at-card-body\" style=\"max-height: 600px; overflow-y: auto;\">\n <table class=\"at-run-table\">\n <thead>\n <tr>\n <th>Status</th>\n <th>Source</th>\n <th>Started</th>\n <th>Duration</th>\n <th>Items</th>\n <th>Tags</th>\n <th>Errors</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredRunRows; track row.ID) {\n <tr class=\"at-run-row-clickable\"\n [class.at-run-row-selected]=\"SelectedRunID === row.ID\"\n (click)=\"OpenRunDetail(row.ID)\">\n <td>\n <span class=\"at-run-status-badge\" [class]=\"row.StatusClass\">\n @if (row.StatusClass === 'running') {\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 0.55rem\"></i>\n }\n {{ row.Status }}\n </span>\n </td>\n <td class=\"at-run-source-name\">{{ row.SourceName }}</td>\n <td>{{ row.StartedDisplay }}</td>\n <td class=\"at-run-duration\">{{ row.Duration }}</td>\n <td>{{ row.Items }}</td>\n <td>{{ row.Tags }}</td>\n <td [class]=\"row.ErrorClass\">{{ row.Errors }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n <!-- D3/D8: Run Detail Slide-In Panel -->\n @if (SelectedRunID) {\n <div class=\"at-card\" style=\"margin-top: 12px;\">\n <div class=\"at-card-header\">\n <span class=\"at-card-title\">\n <i class=\"fa-solid fa-magnifying-glass-chart\"></i>\n Run Detail: {{ SelectedRunID.slice(0, 14) }}...\n </span>\n <button class=\"at-action-btn at-secondary-btn\" style=\"font-size: 11px; padding: 3px 8px;\" (click)=\"CloseRunDetail()\">\n <i class=\"fa-solid fa-times\"></i> Close\n </button>\n </div>\n <div class=\"at-card-body\">\n @if (IsLoadingRunDetail) {\n <mj-loading text=\"Loading run details...\" size=\"small\"></mj-loading>\n } @else if (RunDetailRows.length > 0) {\n <table class=\"at-run-table\">\n <thead>\n <tr>\n <th>Source</th>\n <th>Source Type</th>\n <th>Status</th>\n <th>Items</th>\n <th>Tagged</th>\n <th>Vectorized</th>\n <th>Errors</th>\n <th>Tokens</th>\n <th>Cost</th>\n <th>Duration</th>\n </tr>\n </thead>\n <tbody>\n @for (detail of RunDetailRows; track detail.SourceName) {\n <tr>\n <td class=\"at-run-source-name\">{{ detail.SourceName }}</td>\n <td>{{ detail.SourceType }}</td>\n <td>\n <span class=\"at-run-status-badge\" [class]=\"detail.StatusClass\">{{ detail.Status }}</span>\n </td>\n <td>{{ detail.ItemsProcessed }}</td>\n <td>{{ detail.ItemsTagged }}</td>\n <td>{{ detail.ItemsVectorized }}</td>\n <td [class.run-error-text]=\"detail.ErrorCount > 0\">{{ detail.ErrorCount }}</td>\n <td>{{ FormatTokenCount(detail.TotalTokens) }}</td>\n <td>{{ detail.TotalCost > 0 ? '$' + detail.TotalCost.toFixed(4) : '$0.00' }}</td>\n <td class=\"at-run-duration\">{{ detail.Duration }}</td>\n </tr>\n }\n </tbody>\n </table>\n } @else {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <p>No per-source detail records found for this run.</p>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n <!-- ══════ SLIDE-IN FORM OVERLAY ══════ -->\n @if (FormMode !== 'none') {\n <div class=\"at-slide-overlay\" (click)=\"CloseForm()\"></div>\n <div class=\"at-slide-panel\">\n <div class=\"at-slide-header\">\n <h3>\n @if (FormMode === 'add-source') { Add Content Source }\n @else if (FormMode === 'edit-source') { Edit Content Source }\n @else if (FormMode === 'add-type') { Add Content Type }\n @else if (FormMode === 'edit-type') { Edit Content Type }\n </h3>\n <button class=\"at-slide-close\" (click)=\"CloseForm()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n <div class=\"at-slide-body\">\n\n <!-- Source form -->\n @if (FormMode === 'add-source' || FormMode === 'edit-source') {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceName\" placeholder=\"Source name\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Source Type</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceTypeID\">\n <option value=\"\">Select source type...</option>\n @for (opt of SourceTypeOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n <!-- Content Type + File Type: hidden for Entity source type -->\n @if (SelectedSourceTypeRequiresContentType) {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Content Type</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormContentTypeID\">\n <option value=\"\">Select content type...</option>\n @for (opt of ContentTypeOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">File Type</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormFileTypeID\">\n <option value=\"\">Select file type...</option>\n @for (opt of FileTypeOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Dynamic source-type-specific fields from ConfigurationObject.RequiredFields -->\n @for (field of SelectedSourceTypeFields; track field.Key) {\n @if (!field.DependsOnField || FormSourceSpecificConfig[field.DependsOnField]) {\n @if (!field.ShowOnlyIfMultiple || GetDependentOptions(field).length > 1) {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">{{ field.Label }} @if (field.Required) { <span class=\"at-required\">*</span> }</label>\n @switch (field.Type) {\n @case ('url') {\n <input type=\"url\" class=\"at-form-input\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n [placeholder]=\"field.Description || 'https://...'\">\n }\n @case ('path') {\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n [placeholder]=\"field.Description || '/path/to/...'\">\n }\n @case ('text') {\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n [placeholder]=\"field.Description || ''\" [value]=\"field.DefaultValue || ''\">\n }\n @case ('entity-picker') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n (ngModelChange)=\"OnSourceFieldChanged(field.Key)\">\n <option value=\"\">Select entity...</option>\n @for (opt of EntitiesWithDocuments; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n }\n @case ('entity-doc-picker') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\">\n @for (opt of GetDependentOptions(field); track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n }\n @case ('storage-provider-picker') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\">\n <option value=\"\">Select provider...</option>\n @for (opt of StorageProviderOptions; track opt) {\n <option [value]=\"opt\">{{ opt }}</option>\n }\n </select>\n }\n @case ('dropdown') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\">\n <option value=\"\">Select...</option>\n @for (opt of field.Options || []; track opt.Value) {\n <option [value]=\"opt.Value\">{{ opt.Label }}</option>\n }\n </select>\n }\n }\n @if (field.Description) {\n <span class=\"at-form-hint\">{{ field.Description }}</span>\n }\n </div>\n }\n }\n }\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Embedding Model Override</label>\n <mj-tree-dropdown\n [BranchConfig]=\"EmbeddingVendorBranch\"\n [LeafConfig]=\"EmbeddingModelsLeaf\"\n SelectionMode=\"single\"\n SelectableTypes=\"leaf\"\n Placeholder=\"Use system default\"\n [Clearable]=\"true\"\n [Value]=\"ToCompositeKey(FormSourceEmbeddingModelID)\"\n (ValueChange)=\"FormSourceEmbeddingModelID = FromCompositeKey($event)\">\n </mj-tree-dropdown>\n <span class=\"at-form-hint\">Overrides Content Type default</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Vector Index Override</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceVectorIndexID\">\n <option value=\"\">Use system default</option>\n @for (opt of VectorIndexOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n <span class=\"at-form-hint\">Overrides Content Type default</span>\n </div>\n <div class=\"at-form-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveSource()\" [disabled]=\"FormSaving\">\n @if (FormSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving... }\n @else { <i class=\"fa-solid fa-check\"></i> Save }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseForm()\">Cancel</button>\n </div>\n }\n\n <!-- Content Type form -->\n @if (FormMode === 'add-type' || FormMode === 'edit-type') {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormTypeName\" placeholder=\"Content type name\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Description</label>\n <textarea class=\"at-form-textarea\" [(ngModel)]=\"FormTypeDescription\" rows=\"3\" placeholder=\"Description...\"></textarea>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">AI Model (for tagging)</label>\n <mj-tree-dropdown\n [BranchConfig]=\"AIModelVendorBranch\"\n [LeafConfig]=\"AllModelsLeaf\"\n SelectionMode=\"single\"\n SelectableTypes=\"leaf\"\n Placeholder=\"Select AI model...\"\n [Clearable]=\"true\"\n [Value]=\"ToCompositeKey(FormTypeAIModelID)\"\n (ValueChange)=\"FormTypeAIModelID = FromCompositeKey($event)\">\n </mj-tree-dropdown>\n </div>\n <div class=\"at-form-row\">\n <div class=\"at-form-group\" style=\"flex: 1;\">\n <label class=\"at-form-label\">Min Tags</label>\n <input type=\"number\" class=\"at-form-input\" [(ngModel)]=\"FormTypeMinTags\" min=\"0\">\n </div>\n <div class=\"at-form-group\" style=\"flex: 1;\">\n <label class=\"at-form-label\">Max Tags</label>\n <input type=\"number\" class=\"at-form-input\" [(ngModel)]=\"FormTypeMaxTags\" min=\"1\">\n </div>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Embedding Model</label>\n <mj-tree-dropdown\n [BranchConfig]=\"EmbeddingVendorBranch\"\n [LeafConfig]=\"EmbeddingModelsLeaf\"\n SelectionMode=\"single\"\n SelectableTypes=\"leaf\"\n Placeholder=\"Use system default\"\n [Clearable]=\"true\"\n [Value]=\"ToCompositeKey(FormTypeEmbeddingModelID)\"\n (ValueChange)=\"FormTypeEmbeddingModelID = FromCompositeKey($event)\">\n </mj-tree-dropdown>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Vector Index</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormTypeVectorIndexID\">\n <option value=\"\">Use system default</option>\n @for (opt of VectorIndexOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n <div class=\"at-form-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveContentType()\" [disabled]=\"FormSaving\">\n @if (FormSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving... }\n @else { <i class=\"fa-solid fa-check\"></i> Save }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseForm()\">Cancel</button>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- ══════ ITEM DETAIL SLIDE-IN ══════ -->\n @if (ShowItemDetail && SelectedFeedItem) {\n <div class=\"at-slide-overlay\" (click)=\"CloseItemDetail()\"></div>\n <div class=\"at-slide-panel at-detail-panel\">\n <div class=\"at-slide-header\">\n <h3><i class=\"fa-solid fa-file-lines\"></i> Content Item</h3>\n <button class=\"at-slide-close\" (click)=\"CloseItemDetail()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n <div class=\"at-slide-body\">\n <!-- Header -->\n <div class=\"at-detail-item-header\">\n <h4 class=\"at-detail-item-name\">{{ SelectedFeedItem.Name }}</h4>\n <div class=\"at-detail-badges\">\n <span class=\"at-detail-badge at-detail-badge-source\">{{ SelectedFeedItem.SourceName }}</span>\n @if (SelectedFeedItem.RequiresContentType) {\n <span class=\"at-detail-badge at-detail-badge-type\">{{ SelectedFeedItem.ContentTypeName }}</span>\n @if (SelectedFeedItem.FileTypeName) {\n <span class=\"at-detail-badge at-detail-badge-file\"><i class=\"fa-solid fa-file\"></i> {{ SelectedFeedItem.FileTypeName }}</span>\n }\n }\n </div>\n </div>\n\n <!-- URL -->\n @if (SelectedFeedItem.URL) {\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">URL</div>\n <a [href]=\"SelectedFeedItem.URL\" target=\"_blank\" class=\"at-detail-link\">\n {{ SelectedFeedItem.URL }}\n <i class=\"fa-solid fa-external-link-alt\" style=\"font-size: 0.65rem; margin-left: 4px;\"></i>\n </a>\n </div>\n }\n\n <!-- Text Preview -->\n @if (SelectedFeedItem.TextContent) {\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Content Preview</div>\n <div class=\"at-detail-text-preview\">{{ SelectedFeedItem.TextContent }}</div>\n </div>\n }\n\n <!-- Tags (weighted) -->\n @if (SelectedFeedItem.Tags.length > 0) {\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Tags ({{ SelectedFeedItem.Tags.length }})</div>\n <div class=\"at-detail-tags\">\n @for (wt of SelectedFeedItem.Tags; track wt.Tag) {\n <span class=\"at-tag-pill at-tag-weighted\" [style.font-size]=\"TagFontSize(wt.Weight)\">\n {{ wt.Tag }}\n <span class=\"at-tag-weight\">{{ FormatWeight(wt.Weight) }}</span>\n </span>\n }\n </div>\n </div>\n }\n\n <!-- Metadata -->\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Metadata</div>\n <div class=\"at-detail-meta-grid\">\n @if (SelectedFeedItem.Checksum) {\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Checksum</span>\n <span class=\"at-detail-meta-value at-detail-meta-mono\">{{ SelectedFeedItem.Checksum }}</span>\n </div>\n }\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Created</span>\n <span class=\"at-detail-meta-value\">{{ SelectedFeedItem.CreatedAt }}</span>\n </div>\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Updated</span>\n <span class=\"at-detail-meta-value\">{{ SelectedFeedItem.UpdatedAt }}</span>\n </div>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"at-detail-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"OpenRecordFromItem(SelectedFeedItem)\">\n <i class=\"fa-solid fa-external-link-alt\"></i> Open Record\n </button>\n <button class=\"at-action-btn at-secondary-btn\" disabled>\n <i class=\"fa-solid fa-magnifying-glass\"></i> See Similar Items\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- ══════ SOURCE DETAIL SLIDE-IN ══════ -->\n @if (ShowSourceDetail) {\n <div class=\"at-slide-overlay\" (click)=\"CloseSourceDetail()\"></div>\n <div class=\"at-slide-panel at-detail-panel\">\n <div class=\"at-slide-header\">\n <h3><i class=\"fa-solid fa-database\"></i> Source Detail</h3>\n <button class=\"at-slide-close\" (click)=\"CloseSourceDetail()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n <div class=\"at-slide-body\">\n @if (SourceDetailLoading) {\n <div class=\"at-loading-overlay\">\n <mj-loading text=\"Loading source details...\"></mj-loading>\n </div>\n }\n @if (!SourceDetailLoading && SelectedSource) {\n <!-- Source Header -->\n <div class=\"at-detail-source-header\">\n <div class=\"at-source-card-icon\"><i [class]=\"SelectedSource.Icon\"></i></div>\n <div>\n <h4 class=\"at-detail-item-name\">{{ SelectedSource.Name }}</h4>\n <div class=\"at-detail-badges\">\n <span class=\"at-detail-badge at-detail-badge-type\">{{ SelectedSource.SourceTypeName }}</span>\n <span class=\"at-detail-badge\" [class]=\"'at-detail-badge-status-' + SelectedSource.StatusClass\">\n {{ SelectedSource.StatusLabel }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Configuration -->\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Configuration</div>\n <div class=\"at-detail-meta-grid\">\n @if (SelectedSource.URL) {\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">URL</span>\n <a [href]=\"SelectedSource.URL\" target=\"_blank\" class=\"at-detail-link at-detail-meta-value\">{{ SelectedSource.URL }}</a>\n </div>\n }\n @if (SelectedSource.RequiresFileType) {\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Content Type</span>\n <span class=\"at-detail-meta-value\">{{ SelectedSource.ContentTypeName }}</span>\n </div>\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">File Type</span>\n <span class=\"at-detail-meta-value\">{{ SelectedSource.FileTypeName }}</span>\n </div>\n }\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Embedding Model</span>\n <span class=\"at-detail-meta-value\">{{ SelectedSource.EmbeddingModelName }}</span>\n </div>\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Vector Index</span>\n <span class=\"at-detail-meta-value\">{{ SelectedSource.VectorIndexName }}</span>\n </div>\n </div>\n </div>\n\n <!-- Stats -->\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Statistics</div>\n <div class=\"at-detail-stats-strip\">\n <div class=\"at-detail-stat\">\n <div class=\"at-detail-stat-value\">{{ formatNumber(SelectedSource.ItemCount) }}</div>\n <div class=\"at-detail-stat-label\">Items</div>\n </div>\n <div class=\"at-detail-stat\">\n <div class=\"at-detail-stat-value\">{{ formatNumber(SelectedSource.TagCount) }}</div>\n <div class=\"at-detail-stat-label\">Tags</div>\n </div>\n <div class=\"at-detail-stat\">\n <div class=\"at-detail-stat-value\">{{ SelectedSource.AvgTags }}</div>\n <div class=\"at-detail-stat-label\">Avg Tags</div>\n </div>\n <div class=\"at-detail-stat\">\n <div class=\"at-detail-stat-value\">{{ SelectedSource.LastRunAgo }}</div>\n <div class=\"at-detail-stat-label\">Last Run</div>\n </div>\n <div class=\"at-detail-stat\">\n <div class=\"at-detail-stat-value\" [class.at-kpi-error-value]=\"SelectedSource.ErrorCount > 0\">{{ SelectedSource.ErrorCount }}</div>\n <div class=\"at-detail-stat-label\">Errors</div>\n </div>\n </div>\n </div>\n\n <!-- Content Library (D4 status badges, D7 pagination) -->\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-header-row\">\n <div class=\"at-detail-section-label\">Content Library ({{ FilteredSourceDetailTotal }} of {{ SelectedSource.ItemCount | number }})</div>\n <div class=\"at-detail-section-controls\">\n <select class=\"at-detail-filter-select\" [(ngModel)]=\"SourceDetailStatusFilter\" (ngModelChange)=\"OnSourceDetailStatusFilterChange()\">\n @for (opt of SourceDetailStatusOptions; track opt) {\n <option [value]=\"opt\">{{ opt }}</option>\n }\n </select>\n <button class=\"at-action-btn at-retry-btn\" (click)=\"RetryFailedItems()\" title=\"Re-queue failed items for processing\">\n <i class=\"fa-solid fa-rotate-right\"></i> Retry Failed\n </button>\n </div>\n </div>\n <div class=\"at-detail-content-list\">\n @if (FilteredSourceDetailItems.length === 0) {\n <div class=\"at-empty-state\" style=\"padding: 16px;\">\n <p>{{ SourceDetailStatusFilter === 'All' ? 'No content items yet.' : 'No items match this filter.' }}</p>\n </div>\n }\n @for (ci of FilteredSourceDetailItems; track ci.ID) {\n <div class=\"at-detail-content-item\" (click)=\"OpenContentItemDetail(ci)\">\n <div class=\"at-feed-status-dot\" [class]=\"ci.StatusDot\"></div>\n <span class=\"at-detail-content-item-name\">{{ ci.Name }}</span>\n <span class=\"at-status-badge\" [class]=\"GetStatusBadgeClass(ci.EmbeddingStatus)\">E:{{ ci.EmbeddingStatus }}</span>\n <span class=\"at-status-badge\" [class]=\"GetStatusBadgeClass(ci.TaggingStatus)\">T:{{ ci.TaggingStatus }}</span>\n <span class=\"at-detail-content-item-tags\">{{ ci.TagCount }} tags</span>\n <span class=\"at-detail-content-item-time\">{{ ci.UpdatedAt }}</span>\n </div>\n }\n </div>\n <!-- Pagination -->\n @if (SourceDetailTotalPages > 1) {\n <div class=\"at-detail-pagination\">\n <button class=\"at-page-btn\" [disabled]=\"SourceDetailPage === 0\" (click)=\"SourceDetailPrevPage()\">\n <i class=\"fa-solid fa-chevron-left\"></i> Prev\n </button>\n <span class=\"at-page-info\">Page {{ SourceDetailPage + 1 }} of {{ SourceDetailTotalPages }}</span>\n <button class=\"at-page-btn\" [disabled]=\"SourceDetailPage >= SourceDetailTotalPages - 1\" (click)=\"SourceDetailNextPage()\">\n Next <i class=\"fa-solid fa-chevron-right\"></i>\n </button>\n </div>\n }\n </div>\n\n <!-- Run History -->\n @if (SelectedSource.RunHistory.length > 0) {\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Recent Runs</div>\n <div class=\"at-detail-run-history\">\n @for (run of SelectedSource.RunHistory; track run.ID) {\n <div class=\"at-detail-run-row\">\n <span class=\"at-run-status-badge\" [class]=\"run.StatusClass\">{{ run.Status }}</span>\n <span class=\"at-detail-run-time\">{{ run.StartedDisplay }}</span>\n <span class=\"at-detail-run-duration\">{{ run.Duration }}</span>\n <span class=\"at-detail-run-items\">{{ run.Items }} items</span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Actions -->\n <div class=\"at-detail-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"OpenEditSourceFromDetail()\">\n <i class=\"fa-solid fa-pen\"></i> Edit\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"RunSourceFromDetail()\">\n <i class=\"fa-solid fa-play\"></i> Run Now\n </button>\n <button class=\"at-action-btn at-secondary-btn at-source-delete-btn\" (click)=\"DeleteSourceFromDetail()\">\n <i class=\"fa-solid fa-trash\"></i> Delete\n </button>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- ══════ SCHEDULE DIALOG ══════ -->\n @if (ShowScheduleDialog && SchedulingSourceCard) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseScheduleDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-regular fa-clock\"></i> Schedule Pipeline</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseScheduleDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <div class=\"at-schedule-field\">\n <label>Source</label>\n <div class=\"at-schedule-source-name\">\n <i [class]=\"SchedulingSourceCard.Icon\"></i>\n {{ SchedulingSourceCard.Name }}\n </div>\n </div>\n <div class=\"at-schedule-field\">\n <label>Action</label>\n <div class=\"at-schedule-action-name\">Autotag and Vectorize Content</div>\n </div>\n <div class=\"at-schedule-field\">\n <label for=\"schedule-cron\">Cron Expression</label>\n <input id=\"schedule-cron\"\n type=\"text\"\n class=\"mj-input at-schedule-cron-input\"\n [(ngModel)]=\"ScheduleCron\"\n placeholder=\"0 2 * * *\" />\n <div class=\"at-schedule-cron-preview\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{ GetCronPreview(ScheduleCron) }}\n </div>\n </div>\n <div class=\"at-schedule-field at-schedule-toggle-row\">\n <label for=\"schedule-enabled\">Enabled</label>\n <input id=\"schedule-enabled\"\n type=\"checkbox\"\n class=\"mj-checkbox\"\n [(ngModel)]=\"ScheduleEnabled\" />\n </div>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveSchedule()\" [disabled]=\"ScheduleSaving\">\n @if (ScheduleSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-check\"></i> Create Schedule\n }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseScheduleDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n <!-- ══════ CONFIRMATION DIALOG ══════ -->\n @if (ShowConfirmDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"ConfirmDialogCancel()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-triangle-exclamation\"></i> {{ ConfirmDialogTitle }}</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"ConfirmDialogCancel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <p class=\"at-confirm-message\">{{ ConfirmDialogMessage }}</p>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-danger-btn\" (click)=\"ConfirmDialogAccept()\">\n <i class=\"fa-solid fa-check\"></i> Confirm\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"ConfirmDialogCancel()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n <!-- ══════ SPLIT DIALOG ══════ -->\n @if (ShowSplitDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseSplitDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-code-branch\"></i> Split Tag</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseSplitDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <div class=\"at-schedule-field\">\n <label>New tag names (comma-separated)</label>\n <input type=\"text\" class=\"mj-input\" style=\"width: 100%;\"\n [(ngModel)]=\"SplitChildNames\"\n placeholder=\"Tag A, Tag B, Tag C\" />\n </div>\n <p class=\"at-confirm-message\">New tags will be created as siblings of the original tag under the same parent.</p>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"ExecuteSplit()\" [disabled]=\"!SplitChildNames.trim()\">\n <i class=\"fa-solid fa-code-branch\"></i> Create Tags\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseSplitDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n <!-- ══════ MOVE DIALOG ══════ -->\n @if (ShowCreateTagDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseCreateTagDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-plus\"></i> Create Tag</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseCreateTagDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <div class=\"at-tax-create-context\">{{ CreateTagParentLabel }}</div>\n <div class=\"at-schedule-field\">\n <label>Name</label>\n <input type=\"text\" class=\"mj-input\" style=\"width: 100%;\" [(ngModel)]=\"CreateTagName\"\n placeholder=\"Tag name\" (keydown.enter)=\"SaveNewTag()\">\n </div>\n <div class=\"at-schedule-field\">\n <label>Description (optional)</label>\n <textarea class=\"mj-textarea\" rows=\"3\" style=\"width: 100%;\" [(ngModel)]=\"CreateTagDescription\"\n placeholder=\"Brief description of this tag\"></textarea>\n </div>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveNewTag()\" [disabled]=\"!CreateTagName.trim()\">\n <i class=\"fa-solid fa-check\"></i> Create\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseCreateTagDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n @if (ShowMoveDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseMoveDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-arrows-up-down\"></i> Move Tag</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseMoveDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <div class=\"at-schedule-field\">\n <label>New parent tag</label>\n <select class=\"mj-input\" style=\"width: 100%;\" [(ngModel)]=\"MoveNewParentID\">\n <option [ngValue]=\"null\">(Root level &mdash; no parent)</option>\n @for (opt of GetMoveTargetOptions(); track opt.ID) {\n <option [ngValue]=\"opt.ID\">{{ '\\u00A0\\u00A0'.repeat(opt.Depth) }}{{ opt.Name }}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"ExecuteMove()\">\n <i class=\"fa-solid fa-check\"></i> Move\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseMoveDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n @if (ShowMergeIntoDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseMergeIntoDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-compress\"></i> Merge \"{{ MergeSourceTag?.Name }}\" Into...</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseMergeIntoDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <p style=\"font-size: 0.85rem; color: var(--mj-text-secondary); margin: 0 0 12px;\">\n All tagged items will be moved to the target tag, then \"{{ MergeSourceTag?.Name }}\" will be deleted.\n </p>\n <div class=\"at-schedule-field\">\n <label>Merge into</label>\n <mj-combobox\n [Data]=\"MergeTargetData\"\n TextField=\"Label\"\n ValueField=\"ID\"\n [Filterable]=\"true\"\n [ValuePrimitive]=\"true\"\n Placeholder=\"Search and select a tag...\"\n (ValueChange)=\"OnMergeTargetSelected($event)\">\n </mj-combobox>\n </div>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"ExecuteMergeInto()\" [disabled]=\"!MergeTargetID || IsMerging\">\n @if (IsMerging) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Merging... } @else { <i class=\"fa-solid fa-compress\"></i> Merge }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseMergeIntoDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n <!-- No Content Types Warning Dialog (z-index above slide-in panel) -->\n @if (ShowNoContentTypeWarning) {\n <div class=\"at-schedule-dialog-overlay\" style=\"z-index: 10001;\" (click)=\"ShowNoContentTypeWarning = false\">\n <div class=\"at-schedule-dialog\" style=\"max-width: 440px; z-index: 10002;\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <span><i class=\"fa-solid fa-triangle-exclamation\" style=\"color: var(--mj-status-warning); margin-right: 8px;\"></i> Content Type Required</span>\n <button class=\"at-close-btn\" (click)=\"ShowNoContentTypeWarning = false\"><i class=\"fa-solid fa-xmark\"></i></button>\n </div>\n <div class=\"at-schedule-dialog-body\" style=\"text-align: center; padding: 24px;\">\n <p style=\"color: var(--mj-text-secondary); margin-bottom: 16px;\">\n No content types have been configured yet. At least one content type is required before you can create a content source.\n </p>\n <p style=\"color: var(--mj-text-muted); font-size: 13px;\">\n Go to the <strong>Content Types</strong> tab to create one.\n </p>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (mousedown)=\"ShowNoContentTypeWarning = false; CloseForm(); SwitchTab('types')\">\n <i class=\"fa-solid fa-arrow-right\"></i> Go to Content Types\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"ShowNoContentTypeWarning = false\">Close</button>\n </div>\n </div>\n </div>\n }\n</div>\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, ViewEncapsulation } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { BaseEntity, CompositeKey, Metadata, RunQuery, RunView } from '@memberjunction/core';\nimport { TreeBranchConfig, TreeLeafConfig } from '@memberjunction/ng-trees';\nimport { ResourceData, KnowledgeHubMetadataEngine, MJContentSourceEntity, MJContentSourceTypeEntity_IContentSourceTypeField, MJScheduledActionEntity, MJScheduledActionParamEntity, MJContentItemDuplicateEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { RegisterClass, UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { GraphQLDataProvider, GraphQLAIClient } from '@memberjunction/graphql-dataprovider';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { WordCloudItem } from '@memberjunction/ng-word-cloud';\n\n// ── Tab type ──\n\ntype TabName = 'pipeline' | 'sources' | 'types' | 'tags' | 'taxonomy' | 'history';\n\n// ── Interfaces ──\n\ninterface NavItem {\n Tab: TabName;\n Icon: string;\n Label: string;\n BadgeText: string;\n BadgeClass: string;\n}\n\ninterface KPIMetric {\n Label: string;\n Value: number;\n Icon: string;\n Trend: string;\n TrendUp: boolean;\n}\n\ninterface PipelineStageInfo {\n Name: string;\n Icon: string;\n Status: 'idle' | 'active' | 'complete';\n Count: string;\n}\n\ninterface FeedItem {\n Name: string;\n SourceName: string;\n Tags: string[];\n TimeAgo: string;\n Status: 'complete' | 'processing' | 'error';\n}\n\ninterface SourceMini {\n ID: string;\n Name: string;\n Icon: string;\n Meta: string;\n StatusClass: 'active' | 'error' | 'inactive';\n}\n\ninterface SourceCard {\n ID: string;\n Name: string;\n SourceTypeName: string;\n ContentTypeName: string;\n FileTypeName: string;\n Icon: string;\n StatusClass: 'active' | 'error' | 'inactive';\n StatusLabel: string;\n URL: string;\n ItemCount: number;\n TagCount: number;\n AvgTags: string;\n LastRunAgo: string;\n ContentSourceTypeID: string;\n ContentTypeID: string;\n ContentFileTypeID: string;\n EmbeddingModelID: string;\n VectorIndexID: string;\n EntityID: string;\n EntityDocumentID: string;\n RequiresFileType: boolean;\n /** FK to ScheduledAction entity, null if no schedule configured */\n ScheduledActionID: string | null;\n /** Denormalized name of the linked ScheduledAction */\n ScheduledActionName: string | null;\n /** Human-readable schedule description (parsed from cron) */\n ScheduleDescription: string | null;\n}\n\ninterface ContentTypeCard {\n ID: string;\n Name: string;\n Description: string;\n AIModelName: string;\n AIModelID: string;\n MinTags: number;\n MaxTags: number;\n SourcesUsing: number;\n ItemsTagged: number;\n RangeLeftPct: number;\n RangeRightPct: number;\n EmbeddingModelID: string;\n VectorIndexID: string;\n}\n\ninterface TagRow {\n Tag: string;\n UsageCount: number;\n AvgWeight: number;\n BarWidthPct: number;\n TopSource: string;\n FirstSeen: string;\n}\n\ninterface TagCloudItem {\n Tag: string;\n AvgWeight: number;\n SizeClass: 'large' | '' | 'small';\n}\n\ninterface TagBySource {\n SourceName: string;\n Count: number;\n}\n\ninterface RunHistoryRow {\n ID: string;\n Status: string;\n StatusClass: string;\n SourceName: string;\n StartedDisplay: string;\n Duration: string;\n Items: string;\n Tags: string;\n Errors: string;\n ErrorClass: string;\n}\n\ninterface DropdownOption {\n ID: string;\n Name: string;\n}\n\n/** G3: Content item duplicate pair for review */\ninterface ContentDuplicateRow {\n ID: string;\n ItemAName: string;\n ItemASource: string;\n ItemBName: string;\n ItemBSource: string;\n SimilarityScore: number;\n DetectionMethod: string;\n Status: 'Pending' | 'Confirmed' | 'Dismissed' | 'Merged';\n}\n\n/** D2/D3/D8: Per-source detail row for a specific pipeline run */\ninterface RunDetailRow {\n SourceName: string;\n SourceType: string;\n Status: string;\n StatusClass: string;\n ItemsProcessed: number;\n ItemsTagged: number;\n ItemsVectorized: number;\n ErrorCount: number;\n TotalTokens: number;\n TotalCost: number;\n Duration: string;\n}\n\n// ── Taxonomy Governance interfaces ──\n\ntype TaxonomySubTab = 'tree' | 'duplicates' | 'orphans' | 'treemap' | 'audit';\n\ninterface TaxTreeNode {\n ID: string;\n Name: string;\n DisplayName: string;\n Description: string;\n ParentID: string | null;\n Depth: number;\n Children: TaxTreeNode[];\n ItemCount: number;\n AvgWeight: number;\n HealthColor: 'green' | 'yellow' | 'red';\n IsExpanded: boolean;\n IsSelected: boolean;\n FirstSeen: string;\n}\n\ninterface TaxDuplicatePair {\n TagA: string;\n TagB: string;\n TagAID: string;\n TagBID: string;\n Similarity: number;\n SeverityClass: 'high' | 'moderate';\n /** True when multiple Tag records share the same name (case-insensitive) */\n IsExactDuplicate: boolean;\n /** How many Tag records share this exact name (only set when IsExactDuplicate) */\n ExactDuplicateCount: number;\n /** All Tag IDs sharing the exact name (only set when IsExactDuplicate) */\n AllIDs: string[];\n}\n\ninterface TaxOrphanCard {\n ID: string;\n Name: string;\n UsageCount: number;\n AvgWeight: number;\n FirstSeen: string;\n LastSeen: string;\n IsSelected: boolean;\n}\n\ninterface TaxTreemapCell {\n ID: string;\n Name: string;\n ItemCount: number;\n ColorClass: string;\n RowSpan: number;\n}\n\n/** Supported audit action types — matches DB Action values (lowercased) */\ntype TaxAuditAction = 'created' | 'merged' | 'moved' | 'deleted' | 'renamed' | 'deprecated' | 'descriptionchanged' | 'reactivated' | 'split';\n\ninterface TaxAuditEvent {\n Type: TaxAuditAction;\n Description: string;\n TagRef: string;\n User: string;\n Timestamp: string;\n DayHeader: string;\n}\n\ninterface TaxHealthStat {\n Total: number;\n Healthy: number;\n NeedAttention: number;\n Orphaned: number;\n Duplicates: number;\n}\n\ninterface WeightedTag {\n Tag: string;\n Weight: number;\n}\n\n/** Status value for embedding or tagging pipeline phases */\ntype ItemPipelineStatus = 'Complete' | 'Processing' | 'Failed' | 'Pending';\n\ninterface ContentItemDetail {\n ID: string;\n Name: string;\n SourceName: string;\n SourceTypeName: string;\n ContentTypeName: string;\n FileTypeName: string;\n URL: string;\n TextContent: string;\n Checksum: string;\n Tags: WeightedTag[];\n CreatedAt: string;\n UpdatedAt: string;\n ContentSourceID: string;\n ContentSourceTypeID: string;\n StatusDot: 'complete' | 'processing' | 'error';\n TagCount: number;\n /** Whether this source type uses content/file type (false for Entity sources) */\n RequiresContentType: boolean;\n /** Entity record ID if source is entity type (for direct entity navigation) */\n EntityRecordID: string | null;\n /** Entity name if source is entity type */\n EntityName: string | null;\n /** Embedding pipeline status for this content item */\n EmbeddingStatus: ItemPipelineStatus;\n /** Tagging pipeline status for this content item */\n TaggingStatus: ItemPipelineStatus;\n}\n\ninterface SourceDetailInfo {\n ID: string;\n Name: string;\n SourceTypeName: string;\n FileTypeName: string;\n ContentTypeName: string;\n RequiresFileType: boolean;\n StatusClass: 'active' | 'error' | 'inactive';\n StatusLabel: string;\n Icon: string;\n URL: string;\n EmbeddingModelName: string;\n VectorIndexName: string;\n ItemCount: number;\n TagCount: number;\n AvgTags: string;\n LastRunAgo: string;\n ErrorCount: number;\n ContentItems: ContentItemDetail[];\n RunHistory: RunHistoryRow[];\n}\n\n// ── Slide-in form mode ──\n\ntype FormMode = 'none' | 'add-source' | 'edit-source' | 'add-type' | 'edit-type';\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 // ── 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 & pagination ──\n public FeedSearchQuery = '';\n public FeedPage = 0;\n public readonly FeedPageSize = 20;\n /** Sort order for the feed: 'newest' (default) or 'oldest' */\n public FeedSortOrder: 'newest' | 'oldest' = 'newest';\n\n /** Feed items filtered by search query and sorted */\n public get FilteredFeedItems(): FeedItem[] {\n let items = this.FeedItems;\n if (this.FeedSearchQuery.trim()) {\n const q = this.FeedSearchQuery.toLowerCase();\n items = items.filter(item =>\n item.Name.toLowerCase().includes(q) ||\n item.SourceName.toLowerCase().includes(q) ||\n item.Tags.some(t => t.toLowerCase().includes(q))\n );\n }\n if (this.FeedSortOrder === 'oldest') {\n return [...items].reverse();\n }\n return items;\n }\n\n /** Toggle feed sort order */\n public ToggleFeedSort(): void {\n this.FeedSortOrder = this.FeedSortOrder === 'newest' ? 'oldest' : 'newest';\n this.FeedPage = 0;\n this.cdr.detectChanges();\n }\n\n /** Paginated feed items for the current page */\n public get PaginatedFeedItems(): FeedItem[] {\n const items = this.FilteredFeedItems;\n const start = this.FeedPage * this.FeedPageSize;\n return items.slice(start, start + this.FeedPageSize);\n }\n\n /** Total pages for the feed */\n public get FeedTotalPages(): number {\n return Math.max(1, Math.ceil(this.FilteredFeedItems.length / this.FeedPageSize));\n }\n\n /** Handle feed search input change */\n public OnFeedSearchChange(): void {\n this.FeedPage = 0;\n this.cdr.detectChanges();\n }\n\n /** Navigate to previous feed page */\n public FeedPrevPage(): void {\n if (this.FeedPage > 0) {\n this.FeedPage--;\n this.cdr.detectChanges();\n }\n }\n\n /** Navigate to next feed page */\n public FeedNextPage(): void {\n if (this.FeedPage < this.FeedTotalPages - 1) {\n this.FeedPage++;\n this.cdr.detectChanges();\n }\n }\n\n /** Get the index in the original FeedItems array for a paginated item */\n public GetFeedItemOriginalIndex(item: FeedItem): number {\n return this.FeedItems.indexOf(item);\n }\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 if (prefs.ActiveTab) this.ActiveTab = prefs.ActiveTab;\n if (prefs.ShowPipelineConfig != null) this.ShowPipelineConfig = prefs.ShowPipelineConfig;\n } catch { /* ignore */ }\n }\n }\n\n public FormatTokenCount(tokens: number): string {\n if (tokens >= 1000000) return `${(tokens / 1000000).toFixed(1)}M`;\n if (tokens >= 1000) return `${(tokens / 1000).toFixed(0)}K`;\n return String(tokens);\n }\n\n // ── Sources tab ──\n public SourceCards: SourceCard[] = [];\n public ContentDuplicates: ContentDuplicateRow[] = [];\n public IsLoadingDuplicates = false;\n\n // ── Content Types tab ──\n public ContentTypeCards: ContentTypeCard[] = [];\n\n // ── Tag Library tab ──\n public TagRows: TagRow[] = [];\n public TagCloud: TagCloudItem[] = [];\n public TagCloudWordItems: WordCloudItem[] = [];\n public TagsBySource: TagBySource[] = [];\n public TagSearchQuery = '';\n public FilteredTagRows: TagRow[] = [];\n public SelectedDrillDownTag: string | null = null;\n public TagDrillDownItems: { ID: string; Name: string; SourceName: string; Weight: number; UpdatedAt: string; FeedIndex: number }[] = [];\n\n // ── Run History tab ──\n public RunHistoryRows: RunHistoryRow[] = [];\n public HistorySourceFilter = '';\n public HistoryStatusFilter = '';\n public FilteredRunRows: RunHistoryRow[] = [];\n public HistorySourceOptions: string[] = [];\n\n // D3/D8: Run History Detail slide-in\n public SelectedRunID: string | null = null;\n public RunDetailRows: RunDetailRow[] = [];\n public IsLoadingRunDetail = false;\n\n // D2: Pipeline Monitor — live per-source progress\n public LiveRunDetailRows: RunDetailRow[] = [];\n public IsLoadingLiveDetails = false;\n\n // ── Taxonomy Governance tab ──\n public TaxSubTab: TaxonomySubTab = 'tree';\n public TaxTreeNodes: TaxTreeNode[] = [];\n public TaxFlatNodes: TaxTreeNode[] = [];\n public TaxFilteredNodes: TaxTreeNode[] = [];\n public TaxSelectedNode: TaxTreeNode | null = null;\n public TaxTreeSearch = '';\n public TaxDuplicates: TaxDuplicatePair[] = [];\n public TaxOrphans: TaxOrphanCard[] = [];\n public TaxAllOrphansSelected = false;\n public TaxTreemapCells: TaxTreemapCell[] = [];\n public TaxAuditEvents: TaxAuditEvent[] = [];\n public TaxAuditFilterTypes = new Set<string>(['created', 'merged', 'moved', 'deleted', 'renamed', 'deprecated', 'descriptionchanged', 'reactivated', 'split']);\n public TaxHealth: TaxHealthStat = { Total: 0, Healthy: 0, NeedAttention: 0, Orphaned: 0, Duplicates: 0 };\n public TaxRecentItems: { Name: string; Weight: number; Date: string; Icon: string }[] = [];\n public TaxTreemapKPIs: { Label: string; Value: string }[] = [];\n public TaxIsEditing = false;\n\n // ── Create Tag Dialog ──\n public ShowCreateTagDialog = false;\n public CreateTagName = '';\n public CreateTagDescription = '';\n public CreateTagParentID: string | null = null;\n /** Label shown in the create dialog to indicate context (e.g., \"under AI Agent\") */\n public CreateTagParentLabel = '';\n\n // ── Multi-select for drag reparenting ──\n public TaxMultiSelectMode = false;\n public TaxSelectedIDs = new Set<string>();\n /** The node currently being dragged over (drop target highlight) */\n public TaxDragOverNodeID: string | null = null;\n /** True while a drag-reparent operation is saving */\n public TaxTreeSaving = false;\n\n /** Count of high-confidence duplicate pairs (>85% similarity) */\n public get TaxHighConfidenceDupeCount(): number {\n return this.TaxDuplicates.filter(d => d.SeverityClass === 'high').length;\n }\n\n /** Count of moderate-confidence duplicate pairs (70-85% similarity) */\n public get TaxModerateDupeCount(): number {\n return this.TaxDuplicates.filter(d => d.SeverityClass === 'moderate').length;\n }\n public TaxEditName = '';\n public TaxEditDescription = '';\n\n // Raw taxonomy data cache\n private tagsRaw: Record<string, unknown>[] = [];\n private taggedItemsRaw: Record<string, unknown>[] = [];\n private tagAuditLogsRaw: Record<string, unknown>[] = [];\n /** Cached per-tag aggregates from server-side SQL (weights + counts) */\n private tagAggregateWeights = new Map<string, number>();\n private tagAggregateCounts = new Map<string, number>();\n\n // ── Slide-in form ──\n public FormMode: FormMode = 'none';\n public FormSaving = false;\n public ShowNoContentTypeWarning = false;\n\n // Source form fields\n public FormSourceName = '';\n public FormSourceTypeID = '';\n public FormContentTypeID = '';\n public FormFileTypeID = '';\n public FormSourceURL = '';\n public EditingSourceID = '';\n\n // Content Type form fields\n public FormTypeName = '';\n public FormTypeDescription = '';\n public FormTypeAIModelID = '';\n public FormTypeMinTags = 1;\n public FormTypeMaxTags = 10;\n public EditingTypeID = '';\n\n // Embedding model + vector index form fields (Content Type)\n public FormTypeEmbeddingModelID = '';\n public FormTypeVectorIndexID = '';\n\n // Entity source fields (shown when source type is \"Entity\")\n public FormSourceEntityID = '';\n public FormSourceEntityDocID = '';\n\n // Embedding model + vector index form fields (Content Source overrides)\n public FormSourceEmbeddingModelID = '';\n public FormSourceVectorIndexID = '';\n\n // ── Schedule dialog ──\n /** Whether the schedule creation dialog is visible */\n public ShowScheduleDialog = false;\n /** Whether a schedule save operation is in progress */\n public ScheduleSaving = false;\n /** Source card currently being scheduled */\n public SchedulingSourceCard: SourceCard | null = null;\n /** Cron expression for the schedule form */\n public ScheduleCron = '0 2 * * *';\n /** Whether the schedule should be active immediately */\n public ScheduleEnabled = true;\n\n // ── Confirmation dialog state ──\n /** Whether a generic confirmation overlay is visible */\n public ShowConfirmDialog = false;\n /** Title text for the confirmation dialog */\n public ConfirmDialogTitle = '';\n /** Body message for the confirmation dialog */\n public ConfirmDialogMessage = '';\n /** Callback invoked when user confirms */\n private confirmDialogAction: (() => Promise<void>) | null = null;\n\n // ── Split dialog state ──\n /** Whether the split-tag dialog is visible */\n public ShowSplitDialog = false;\n /** Comma-separated new child tag names for the split operation */\n public SplitChildNames = '';\n /** The node currently being split */\n private splitTargetNode: TaxTreeNode | null = null;\n\n // ── Move dialog state ──\n /** Whether the move-tag dialog is visible */\n public ShowMoveDialog = false;\n /** Selected new parent tag ID for the move operation */\n public MoveNewParentID: string | null = null;\n /** The node currently being moved */\n private moveTargetNode: TaxTreeNode | null = null;\n\n // ── Merge Into dialog state ──\n public ShowMergeIntoDialog = false;\n public MergeSourceTag: TaxTreeNode | null = null;\n public MergeTargetID: string | null = null;\n public MergeTargetData: { ID: string; Label: string }[] = [];\n\n // ── Treemap drill-in state ──\n /** Whether the treemap drill-in panel is visible */\n public ShowTreemapDrillIn = false;\n /** Tag node currently displayed in treemap drill-in */\n public TreemapDrillInNode: TaxTreeNode | null = null;\n\n /** Cached ScheduledAction entities, keyed by normalized ID */\n private scheduledActionsCache = new Map<string, MJScheduledActionEntity>();\n\n /**\n * Whether the currently selected source type is \"Entity\", which switches\n * the URL field to Entity/EntityDocument pickers.\n */\n /** Whether the selected source type is the Entity type (name-based check) */\n public get IsEntitySourceTypeSelected(): boolean {\n if (!this.FormSourceTypeID) return false;\n const sourceType = this.SourceTypeOptions.find(o => UUIDsEqual(o.ID, this.FormSourceTypeID));\n return sourceType?.Name?.toLowerCase() === 'entity';\n }\n\n /** Whether the selected source type requires Content Type / File Type selection */\n public get SelectedSourceTypeRequiresContentType(): boolean {\n if (!this.FormSourceTypeID) return true;\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const st = engine.ContentSourceTypes.find(t => UUIDsEqual(t.ID, this.FormSourceTypeID));\n return st?.ConfigurationObject?.RequiresContentType !== false;\n } catch {\n return true;\n }\n }\n\n /** Entities that have at least one EntityDocument configured */\n public get EntitiesWithDocuments(): { ID: string; Name: string }[] {\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const docs = engine.GetActiveEntityDocuments();\n const entityMap = new Map<string, string>();\n const md = new Metadata();\n for (const doc of docs) {\n const entityName = doc.Get('Entity') as string;\n if (entityName) {\n const entityInfo = md.Entities.find(e => e.Name === entityName);\n if (entityInfo && !entityMap.has(entityInfo.ID)) {\n entityMap.set(entityInfo.ID, entityInfo.Name);\n }\n }\n }\n return Array.from(entityMap.entries())\n .map(([ID, Name]) => ({ ID, Name }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n } catch {\n return [];\n }\n }\n\n /** Entity documents for the selected entity */\n public get EntityDocOptionsForSelectedEntity(): { ID: string; Name: string }[] {\n if (!this.FormSourceEntityID) return [];\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const md = new Metadata();\n const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, this.FormSourceEntityID));\n if (!entityInfo) return [];\n return engine.GetActiveEntityDocuments()\n .filter(d => (d.Get('Entity') as string) === entityInfo.Name)\n .map(d => ({ ID: d.ID, Name: d.Name }));\n } catch {\n return [];\n }\n }\n\n // ── Dynamic source-type fields (metadata-driven) ──\n\n /** Stores source-type-specific config values keyed by RequiredFields[].Key */\n public FormSourceSpecificConfig: Record<string, string> = {};\n\n /** Available MJ Storage provider keys for the storage-provider-picker widget */\n public StorageProviderOptions: string[] = ['Azure Blob Storage', 'AWS S3', 'Google Cloud Storage', 'SharePoint', 'Dropbox', 'Box'];\n\n /**\n * The RequiredFields array from the selected source type's ConfigurationObject.\n * Drives dynamic form rendering — each field becomes a widget.\n */\n public get SelectedSourceTypeFields(): MJContentSourceTypeEntity_IContentSourceTypeField[] {\n if (!this.FormSourceTypeID) return [];\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const sourceType = engine.ContentSourceTypes.find(st => UUIDsEqual(st.ID, this.FormSourceTypeID));\n if (!sourceType) return [];\n const config = sourceType.ConfigurationObject;\n return config?.RequiredFields ?? [];\n } catch {\n return [];\n }\n }\n\n /**\n * Get dependent options for a field (e.g., entity-doc-picker depends on entity-picker).\n * Returns entity documents for the entity selected in the dependent field.\n */\n public GetDependentOptions(field: MJContentSourceTypeEntity_IContentSourceTypeField): { ID: string; Name: string }[] {\n if (field.Type === 'entity-doc-picker' && field.DependsOnField) {\n const entityID = this.FormSourceSpecificConfig[field.DependsOnField];\n if (!entityID) return [];\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const md = new Metadata();\n const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, entityID));\n if (!entityInfo) return [];\n return engine.GetActiveEntityDocuments()\n .filter(d => (d.Get('Entity') as string) === entityInfo.Name)\n .map(d => ({ ID: d.ID, Name: d.Name }));\n } catch {\n return [];\n }\n }\n return [];\n }\n\n /**\n * Handle a source-specific field value change.\n * For entity-picker: auto-select the first entity doc if only one exists.\n */\n public OnSourceFieldChanged(fieldKey: string): void {\n // Find fields that depend on this field\n for (const field of this.SelectedSourceTypeFields) {\n if (field.DependsOnField === fieldKey) {\n const options = this.GetDependentOptions(field);\n if (options.length === 1) {\n this.FormSourceSpecificConfig[field.Key] = options[0].ID;\n } else {\n this.FormSourceSpecificConfig[field.Key] = '';\n }\n }\n }\n }\n\n // ── Detail panels ──\n public SelectedFeedItem: ContentItemDetail | null = null;\n public ShowItemDetail = false;\n public SelectedSource: SourceDetailInfo | null = null;\n public ShowSourceDetail = false;\n public SourceDetailLoading = false;\n\n // ── D4: Source detail status filter ──\n /** Filter content items in source detail by pipeline status */\n public SourceDetailStatusFilter: ItemPipelineStatus | 'All' = 'All';\n /** Available status options for the filter dropdown */\n public readonly SourceDetailStatusOptions: (ItemPipelineStatus | 'All')[] = ['All', 'Complete', 'Processing', 'Failed', 'Pending'];\n\n // ── D7: Source detail pagination ──\n /** Current page index (0-based) for source detail content list */\n public SourceDetailPage = 0;\n /** Number of content items per page in source detail */\n public readonly SourceDetailPageSize = 10;\n\n /**\n * Returns source detail content items filtered by SourceDetailStatusFilter,\n * then sliced to the current page.\n */\n public get FilteredSourceDetailItems(): ContentItemDetail[] {\n if (!this.SelectedSource) return [];\n const items = this.SourceDetailStatusFilter === 'All'\n ? this.SelectedSource.ContentItems\n : this.SelectedSource.ContentItems.filter(\n ci => ci.EmbeddingStatus === this.SourceDetailStatusFilter ||\n ci.TaggingStatus === this.SourceDetailStatusFilter\n );\n const start = this.SourceDetailPage * this.SourceDetailPageSize;\n return items.slice(start, start + this.SourceDetailPageSize);\n }\n\n /** Total number of filtered items (before pagination) */\n public get FilteredSourceDetailTotal(): number {\n if (!this.SelectedSource) return 0;\n if (this.SourceDetailStatusFilter === 'All') return this.SelectedSource.ContentItems.length;\n return this.SelectedSource.ContentItems.filter(\n ci => ci.EmbeddingStatus === this.SourceDetailStatusFilter ||\n ci.TaggingStatus === this.SourceDetailStatusFilter\n ).length;\n }\n\n /** Total pages for source detail pagination */\n public get SourceDetailTotalPages(): number {\n return Math.max(1, Math.ceil(this.FilteredSourceDetailTotal / this.SourceDetailPageSize));\n }\n\n /** Navigate to the previous page in source detail content list */\n public SourceDetailPrevPage(): void {\n if (this.SourceDetailPage > 0) {\n this.SourceDetailPage--;\n this.cdr.detectChanges();\n }\n }\n\n /** Navigate to the next page in source detail content list */\n public SourceDetailNextPage(): void {\n if (this.SourceDetailPage < this.SourceDetailTotalPages - 1) {\n this.SourceDetailPage++;\n this.cdr.detectChanges();\n }\n }\n\n /** Handle change of the source detail status filter dropdown */\n public OnSourceDetailStatusFilterChange(): void {\n this.SourceDetailPage = 0;\n this.cdr.detectChanges();\n }\n\n /**\n * D4: Placeholder handler for retrying failed items in source detail.\n * Re-runs the pipeline for the current source. In the future this could\n * target only Failed items.\n */\n public RetryFailedItems(): void {\n if (!this.SelectedSource) return;\n const failedCount = this.SelectedSource.ContentItems.filter(\n ci => ci.EmbeddingStatus === 'Failed' || ci.TaggingStatus === 'Failed'\n ).length;\n if (failedCount === 0) {\n MJNotificationService.Instance.CreateSimpleNotification('No failed items to retry', 'info', 2500);\n return;\n }\n MJNotificationService.Instance.CreateSimpleNotification(\n `Retry queued for ${failedCount} failed item${failedCount > 1 ? 's' : ''}. Pipeline will re-process on next run.`,\n 'info',\n 3000\n );\n }\n\n /** Returns the CSS class for a pipeline status badge color */\n public GetStatusBadgeClass(status: ItemPipelineStatus): string {\n switch (status) {\n case 'Complete': return 'at-status-badge-complete';\n case 'Processing': return 'at-status-badge-processing';\n case 'Failed': return 'at-status-badge-failed';\n case 'Pending': return 'at-status-badge-pending';\n }\n }\n\n // Dropdown options for forms\n public SourceTypeOptions: DropdownOption[] = [];\n public ContentTypeOptions: DropdownOption[] = [];\n public FileTypeOptions: DropdownOption[] = [];\n public AIModelOptions: DropdownOption[] = [];\n public EmbeddingModelOptions: DropdownOption[] = [];\n public VectorIndexOptions: DropdownOption[] = [];\n\n // Tree-dropdown configs for AI model selection (vendor → model grouping)\n public AIModelVendorBranch: TreeBranchConfig = {\n EntityName: 'MJ: AI Vendors',\n DisplayField: 'Name',\n IDField: 'ID',\n DefaultIcon: 'fa-solid fa-building',\n OrderBy: 'Name ASC',\n };\n public AllModelsLeaf: TreeLeafConfig = {\n EntityName: 'MJ: AI Models',\n ParentField: '',\n DisplayField: 'Name',\n IDField: 'ID',\n DefaultIcon: 'fa-solid fa-brain',\n OrderBy: '__mj_CreatedAt DESC',\n JunctionConfig: {\n EntityName: 'MJ: AI Model Vendors',\n LeafForeignKey: 'ModelID',\n BranchForeignKey: 'VendorID',\n },\n };\n /** Branch config filtered to only vendors that have at least one embedding model */\n public EmbeddingVendorBranch: TreeBranchConfig = {\n EntityName: 'MJ: AI Vendors',\n DisplayField: 'Name',\n IDField: 'ID',\n DefaultIcon: 'fa-solid fa-building',\n OrderBy: 'Name ASC',\n ExtraFilter: `ID IN (SELECT mv.VendorID FROM [__mj].vwAIModelVendors mv JOIN [__mj].vwAIModels m ON mv.ModelID = m.ID WHERE m.AIModelType = 'Embeddings')`,\n };\n public EmbeddingModelsLeaf: TreeLeafConfig = {\n EntityName: 'MJ: AI Models',\n ParentField: '',\n DisplayField: 'Name',\n IDField: 'ID',\n DefaultIcon: 'fa-solid fa-vector-square',\n ExtraFilter: \"AIModelType = 'Embeddings'\",\n OrderBy: '__mj_CreatedAt DESC',\n JunctionConfig: {\n EntityName: 'MJ: AI Model Vendors',\n LeafForeignKey: 'ModelID',\n BranchForeignKey: 'VendorID',\n },\n };\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 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 // ── Lifecycle ──\n\n private static readonly PREFS_KEY = 'KH_Classify_Preferences';\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()]);\n this.tabDataLoaded.add('pipeline');\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 // Ensure tag data is loaded\n if (!this.tabDataLoaded.has('tags')) {\n await this.loadTabData('tags');\n this.tabDataLoaded.add('tags');\n }\n\n this.TagSearchQuery = tagSearch;\n this.FilterTags();\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 });\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', '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 this.TagSearchQuery = String(params['query'] ?? '');\n this.FilterTags();\n return { Success: true, Data: { MatchCount: this.FilteredTagRows.length } };\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 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 await this.loadTaxonomyData();\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 = new RunView();\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 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-tag', Label: 'Tag Library', BadgeText: String(this.totalContentTagCount), BadgeClass: '' },\n { Tab: 'taxonomy', Icon: 'fa-solid fa-sitemap', Label: 'Taxonomy', BadgeText: String(this.tagsRaw.length || ''), 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: this.GetSourceTypeIcon(typeName),\n Meta: `${this.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 await this.ensureBaseDataLoaded();\n this.buildSourceCards();\n }\n\n private buildSourceCards(): void {\n // When there's a single source, use the accurate total counts from TotalRowCount\n // instead of counting from the capped contentItemsRaw/contentTagsRaw arrays.\n const singleSource = this.contentSourcesRaw.length === 1;\n const itemCountBySource = singleSource ? null : this.countItemsBySource();\n const tagCountBySource = singleSource ? null : this.countTagsBySource();\n const lastRunBySource = this.getLastRunBySource();\n\n this.SourceCards = this.contentSourcesRaw.map(source => {\n const id = source['ID'] as string;\n const itemCount = singleSource ? this.totalContentItemCount : (itemCountBySource!.get(id) ?? 0);\n const tagCount = singleSource ? this.totalContentTagCount : (tagCountBySource!.get(id) ?? 0);\n const avgTags = itemCount > 0 ? (tagCount / itemCount).toFixed(1) : '0';\n const lastRun = lastRunBySource.get(id);\n const typeName = (source['ContentSourceType'] as string) ?? 'Unknown';\n const lastRunStatus = lastRun ? (lastRun['Status'] as string)?.toLowerCase() : null;\n const hasError = lastRunStatus === 'error' || lastRunStatus === 'failed';\n\n const scheduledActionID = (source['ScheduledActionID'] as string | null) ?? null;\n const scheduledActionName = (source['ScheduledAction'] as string | null) ?? null;\n const cronExpr = scheduledActionID ? this.getScheduledActionCron(scheduledActionID) : null;\n\n return {\n ID: id,\n Name: (source['Name'] as string) ?? 'Unnamed Source',\n SourceTypeName: typeName,\n ContentTypeName: (source['ContentType'] as string) ?? 'Unknown',\n FileTypeName: (source['ContentFileType'] as string) ?? 'Unknown',\n Icon: this.GetSourceTypeIcon(typeName),\n StatusClass: hasError ? 'error' as const : 'active' as const,\n StatusLabel: hasError ? 'Error' : 'Active',\n URL: (source['URL'] as string) ?? '',\n ItemCount: itemCount,\n TagCount: tagCount,\n AvgTags: avgTags,\n LastRunAgo: lastRun ? this.formatRelativeTime(lastRun['StartTime'] as string) : 'Never',\n ContentSourceTypeID: source['ContentSourceTypeID'] as string,\n ContentTypeID: source['ContentTypeID'] as string,\n ContentFileTypeID: source['ContentFileTypeID'] as string,\n EmbeddingModelID: (source['EmbeddingModelID'] as string) ?? '',\n VectorIndexID: (source['VectorIndexID'] as string) ?? '',\n EntityID: (source['EntityID'] as string) ?? '',\n EntityDocumentID: (source['EntityDocumentID'] as string) ?? '',\n RequiresFileType: this.sourceTypeRequiresFileType(source['ContentSourceTypeID'] as string),\n ScheduledActionID: scheduledActionID,\n ScheduledActionName: scheduledActionName,\n ScheduleDescription: cronExpr ? CronToHumanReadable(cronExpr) : null,\n };\n });\n }\n\n /** Resolve the entity record ID from the EntityRecordDocument for entity-sourced content items */\n private resolveEntityRecordID(item: Record<string, unknown>, sourceId: string): string | null {\n const erdID = item['EntityRecordDocumentID'] as string | null;\n if (!erdID) return null;\n return this.entityRecordDocCache.get(NormalizeUUID(erdID)) ?? null;\n }\n\n /** Resolve the entity name for an entity-sourced content source */\n private resolveEntityName(sourceId: string): string | null {\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const source = engine.ContentSources.find(cs => UUIDsEqual(cs.ID, sourceId));\n if (!source?.EntityID) return null;\n const md = new Metadata();\n const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, source.EntityID));\n return entityInfo?.Name ?? null;\n } catch {\n return null;\n }\n }\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 = new RunView();\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 this.buildContentTypeCards();\n }\n\n private buildContentTypeCards(): void {\n const sourcesUsingByType = this.countSourcesByContentType();\n // When items are capped by MaxRows, countItemsByContentType undercounts.\n // For a single content type, use the accurate totalContentItemCount.\n const singleType = this.contentTypesRaw.length === 1;\n const itemsByType = singleType ? null : this.countItemsByContentType();\n\n this.ContentTypeCards = this.contentTypesRaw.map(ct => {\n const id = ct['ID'] as string;\n const minTags = (ct['MinTags'] as number) ?? 1;\n const maxTags = (ct['MaxTags'] as number) ?? 10;\n const range = 15; // max possible\n return {\n ID: id,\n Name: (ct['Name'] as string) ?? 'Unnamed',\n Description: (ct['Description'] as string) ?? '',\n AIModelName: (ct['AIModel'] as string) ?? 'Default Model',\n AIModelID: (ct['AIModelID'] as string) ?? '',\n MinTags: minTags,\n MaxTags: maxTags,\n SourcesUsing: sourcesUsingByType.get(id) ?? 0,\n ItemsTagged: singleType ? this.totalContentItemCount : (itemsByType!.get(id) ?? 0),\n RangeLeftPct: Math.round((minTags / range) * 100),\n RangeRightPct: Math.round(100 - (maxTags / range) * 100),\n EmbeddingModelID: (ct['EmbeddingModelID'] as string) ?? '',\n VectorIndexID: (ct['VectorIndexID'] as string) ?? ''\n };\n });\n }\n\n // ════════════════════════════════════════════\n // TAG LIBRARY TAB\n // ════════════════════════════════════════════\n\n private async loadTagLibraryData(): Promise<void> {\n await this.ensureBaseDataLoaded();\n this.buildTagRows();\n this.buildTagCloud();\n this.buildTagsBySource();\n this.FilteredTagRows = this.TagRows;\n }\n\n private buildTagRows(): void {\n const tagCounts = this.countAllTags();\n const avgWeights = this.computeAvgWeights();\n const tagSourceMap = this.getTopSourcePerTag();\n const tagFirstSeen = this.getFirstSeenPerTag();\n const sorted = Array.from(tagCounts.entries()).sort((a, b) => b[1] - a[1]);\n const maxCount = sorted.length > 0 ? sorted[0][1] : 1;\n\n this.TagRows = sorted.map(([tag, count]) => ({\n Tag: tag,\n UsageCount: count,\n AvgWeight: avgWeights.get(tag) ?? 1.0,\n BarWidthPct: Math.round((count / maxCount) * 100),\n TopSource: tagSourceMap.get(tag) ?? 'Unknown',\n FirstSeen: tagFirstSeen.get(tag) ?? ''\n }));\n }\n\n private buildTagCloud(): void {\n const tagCounts = this.countAllTags();\n const avgWeights = this.computeAvgWeights();\n // Sort by a combined score: usage count * avg weight (so high-weight, high-count tags bubble up)\n const scored = Array.from(tagCounts.entries()).map(([tag, count]) => {\n const weight = avgWeights.get(tag) ?? 1.0;\n return { tag, count, weight, score: count * weight };\n }).sort((a, b) => b.score - a.score).slice(0, 20);\n const maxScore = scored.length > 0 ? scored[0].score : 1;\n\n this.TagCloud = 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 // Build WordCloudItem[] for the mj-word-cloud component\n this.TagCloudWordItems = scored.map(s => ({\n Text: s.tag,\n Weight: maxScore > 0 ? s.score / maxScore : 0,\n Metadata: { Count: s.count, AvgWeight: s.weight }\n }));\n }\n\n private buildTagsBySource(): void {\n const sourceTagCounts = new Map<string, number>();\n const itemSourceMap = new Map<string, string>();\n for (const item of this.contentItemsRaw) {\n itemSourceMap.set(item['ID'] as string, (item['ContentSource'] as string) ?? 'Unknown');\n }\n for (const tag of this.contentTagsRaw) {\n const source = itemSourceMap.get(tag['ItemID'] as string) ?? 'Unknown';\n sourceTagCounts.set(source, (sourceTagCounts.get(source) ?? 0) + 1);\n }\n this.TagsBySource = Array.from(sourceTagCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([name, count]) => ({ SourceName: name, Count: count }));\n }\n\n /** Convert a string ID to a CompositeKey for tree-dropdown binding */\n public ToCompositeKey(id: string | null | undefined): CompositeKey | null {\n if (!id) return null;\n return new CompositeKey([{ FieldName: 'ID', Value: id }]);\n }\n\n /** Extract the ID string from a CompositeKey (from tree-dropdown ValueChange) */\n public FromCompositeKey(key: CompositeKey | CompositeKey[] | null): string {\n if (!key) return '';\n const ck = Array.isArray(key) ? key[0] : key;\n if (!ck?.KeyValuePairs?.length) return '';\n return String(ck.KeyValuePairs[0].Value || '');\n }\n\n public FilterTags(): void {\n const q = this.TagSearchQuery.toLowerCase().trim();\n this.FilteredTagRows = q\n ? this.TagRows.filter(r => r.Tag.toLowerCase().includes(q))\n : this.TagRows;\n this.cdr.detectChanges();\n }\n\n /** Drill down into content items matching a specific tag */\n public DrillDownTag(tagName: string): void {\n if (this.SelectedDrillDownTag === tagName) {\n this.CloseDrillDownTag();\n return;\n }\n this.SelectedDrillDownTag = tagName;\n\n // Find all content items that have this tag\n const matchingItemIDs = new Map<string, number>(); // itemID → weight\n for (const tag of this.contentTagsRaw) {\n if ((tag['Tag'] as string) === tagName) {\n matchingItemIDs.set(\n NormalizeUUID(tag['ItemID'] as string),\n Number(tag['Weight'] ?? 1)\n );\n }\n }\n\n this.TagDrillDownItems = [];\n for (let i = 0; i < this.contentItemsRaw.length; i++) {\n const item = this.contentItemsRaw[i];\n const normalizedID = NormalizeUUID(item['ID'] as string);\n const weight = matchingItemIDs.get(normalizedID);\n if (weight !== undefined) {\n this.TagDrillDownItems.push({\n ID: item['ID'] as string,\n Name: (item['Name'] as string) ?? 'Unnamed',\n SourceName: (item['ContentSource'] as string) ?? 'Unknown',\n Weight: weight,\n UpdatedAt: this.formatShortDate((item['__mj_UpdatedAt'] as string) ?? ''),\n FeedIndex: i,\n });\n }\n }\n\n // Sort by weight descending\n this.TagDrillDownItems.sort((a, b) => b.Weight - a.Weight);\n this.cdr.detectChanges();\n }\n\n public CloseDrillDownTag(): void {\n this.SelectedDrillDownTag = null;\n this.TagDrillDownItems = [];\n this.cdr.detectChanges();\n }\n\n // ════════════════════════════════════════════\n // RUN HISTORY TAB\n // ════════════════════════════════════════════\n\n private async loadRunHistoryData(): Promise<void> {\n if (this.contentRunsRaw.length === 0) {\n const rv = new RunView();\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 this.buildRunHistoryRows();\n this.buildHistorySourceOptions();\n this.FilteredRunRows = this.RunHistoryRows;\n }\n\n private buildRunHistoryRows(): void {\n this.RunHistoryRows = this.contentRunsRaw.map(run => {\n const status = (run['Status'] as string) ?? 'Unknown';\n const startTime = run['StartTime'] as string | null;\n const endTime = run['EndTime'] as string | null;\n const duration = this.computeDuration(startTime, endTime);\n const processedItems = run['ProcessedItems'] as number | null;\n const errorCount = run['ErrorCount'] as number | null;\n const statusLower = status.toLowerCase();\n const isFailed = statusLower === 'error' || statusLower === 'failed';\n const isRunning = statusLower === 'running' || statusLower === 'processing';\n const hasErrors = (errorCount ?? 0) > 0;\n\n return {\n ID: run['ID'] as string,\n Status: this.displayStatus(status),\n StatusClass: isFailed ? 'failed' : isRunning ? 'running' : 'complete',\n SourceName: (run['Source'] as string) ?? 'Unknown',\n StartedDisplay: startTime ? this.formatDate(startTime) : '\\u2014',\n Duration: duration,\n Items: processedItems != null ? this.formatNumber(processedItems) : '\\u2014',\n Tags: '\\u2014',\n Errors: hasErrors ? this.formatNumber(errorCount!) : (isFailed ? status : '0'),\n ErrorClass: isFailed || hasErrors ? 'run-error-text' : ''\n };\n });\n }\n\n private buildHistorySourceOptions(): void {\n const sources = new Set<string>();\n for (const run of this.contentRunsRaw) {\n const s = run['Source'] as string;\n if (s) sources.add(s);\n }\n this.HistorySourceOptions = Array.from(sources).sort();\n }\n\n public FilterRunHistory(): void {\n this.FilteredRunRows = this.RunHistoryRows.filter(row => {\n if (this.HistorySourceFilter && row.SourceName !== this.HistorySourceFilter) return false;\n if (this.HistoryStatusFilter && row.StatusClass !== this.HistoryStatusFilter) return false;\n return true;\n });\n this.cdr.detectChanges();\n }\n\n // ════════════════════════════════════════════\n // D3/D8: RUN HISTORY DETAIL SLIDE-IN\n // ════════════════════════════════════════════\n\n /**\n * D3/D8: Open the detail view for a specific run, loading ContentProcessRunDetail records.\n */\n public async OpenRunDetail(runID: string): Promise<void> {\n if (this.SelectedRunID === runID) {\n this.CloseRunDetail();\n return;\n }\n this.SelectedRunID = runID;\n this.IsLoadingRunDetail = true;\n this.RunDetailRows = [];\n this.cdr.detectChanges();\n\n await this.loadRunDetailRows(runID);\n\n this.IsLoadingRunDetail = false;\n this.cdr.detectChanges();\n }\n\n /** D3/D8: Close the run detail slide-in */\n public CloseRunDetail(): void {\n this.SelectedRunID = null;\n this.RunDetailRows = [];\n this.IsLoadingRunDetail = false;\n this.cdr.detectChanges();\n }\n\n /**\n * D2/D3/D8: Load ContentProcessRunDetail records for a given run and map to RunDetailRow[].\n */\n private async loadRunDetailRows(runID: string): Promise<void> {\n const rv = new RunView();\n const result = await rv.RunView({\n EntityName: 'MJ: Content Process Run Details',\n ExtraFilter: `ContentProcessRunID='${runID}'`,\n OrderBy: 'ContentSource',\n ResultType: 'simple',\n });\n if (result.Success) {\n this.RunDetailRows = this.mapRunDetailRecords(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 = new RunView();\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 = this.mapRunDetailRecords(result.Results);\n }\n\n this.IsLoadingLiveDetails = false;\n this.cdr.detectChanges();\n }\n\n /** Map raw ContentProcessRunDetail records to RunDetailRow[] */\n private mapRunDetailRecords(records: Record<string, unknown>[]): RunDetailRow[] {\n return records.map(d => {\n const status = String(d['Status'] || 'Pending');\n const statusLower = status.toLowerCase();\n const isFailed = statusLower === 'failed' || statusLower === 'error';\n const isRunning = statusLower === 'running' || statusLower === 'processing';\n const startTime = d['StartTime'] ? new Date(String(d['StartTime'])) : null;\n const endTime = d['EndTime'] ? new Date(String(d['EndTime'])) : null;\n const durationMs = startTime && endTime ? endTime.getTime() - startTime.getTime() : 0;\n const durationStr = durationMs > 60000 ? `${Math.round(durationMs / 60000)}m` : `${Math.round(durationMs / 1000)}s`;\n\n return {\n SourceName: String(d['ContentSource'] || 'Unknown'),\n SourceType: String(d['ContentSourceType'] || ''),\n Status: this.displayStatus(status),\n StatusClass: isFailed ? 'failed' : isRunning ? 'running' : 'complete',\n ItemsProcessed: Number(d['ItemsProcessed'] || 0),\n ItemsTagged: Number(d['ItemsTagged'] || 0),\n ItemsVectorized: Number(d['ItemsVectorized'] || 0),\n ErrorCount: Number(d['ErrorCount'] || 0),\n TotalTokens: Number(d['TotalTokensUsed'] || 0),\n TotalCost: Number(d['TotalCost'] || 0),\n Duration: durationStr,\n };\n });\n }\n\n // ════════════════════════════════════════════\n // SLIDE-IN FORM — Sources\n // ════════════════════════════════════════════\n\n public async OpenAddSourceForm(): Promise<void> {\n await this.ensureFormDropdownsLoaded();\n this.resetSourceForm();\n this.FormMode = 'add-source';\n this.cdr.detectChanges();\n }\n\n public async OpenEditSourceForm(card: SourceCard): Promise<void> {\n await this.ensureFormDropdownsLoaded();\n this.FormSourceName = card.Name;\n this.FormSourceTypeID = card.ContentSourceTypeID;\n this.FormContentTypeID = card.ContentTypeID;\n this.FormFileTypeID = card.ContentFileTypeID;\n this.FormSourceURL = card.URL;\n this.FormSourceEntityID = card.EntityID ?? '';\n this.FormSourceEntityDocID = card.EntityDocumentID ?? '';\n this.FormSourceEmbeddingModelID = card.EmbeddingModelID ?? '';\n this.FormSourceVectorIndexID = card.VectorIndexID ?? '';\n this.EditingSourceID = card.ID;\n\n // Populate FormSourceSpecificConfig from existing Configuration JSON\n this.FormSourceSpecificConfig = {};\n const rawSource = this.contentSourcesRaw.find(s => UUIDsEqual(s['ID'] as string, card.ID));\n if (rawSource) {\n const configStr = rawSource['Configuration'] as string | null;\n if (configStr) {\n try {\n const parsed = JSON.parse(configStr);\n const specific = parsed?.SourceSpecificConfiguration as Record<string, string> | undefined;\n if (specific) {\n this.FormSourceSpecificConfig = { ...specific };\n }\n } catch {\n // Configuration not valid JSON, ignore\n }\n }\n }\n\n this.FormMode = 'edit-source';\n this.cdr.detectChanges();\n }\n\n public async SaveSource(): Promise<void> {\n if (this.FormSaving) return;\n\n // Validate required fields before saving\n if (!this.FormSourceName.trim()) {\n MJNotificationService.Instance.CreateSimpleNotification('Please enter a source name.', 'warning', 3000);\n return;\n }\n if (!this.FormSourceTypeID) {\n MJNotificationService.Instance.CreateSimpleNotification('Please select a source type.', 'warning', 3000);\n return;\n }\n\n // For non-Entity source types, ContentType is required\n if (!this.IsEntitySourceTypeSelected && this.SelectedSourceTypeRequiresContentType) {\n if (!this.FormContentTypeID) {\n if (this.ContentTypeOptions.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'No content types are configured. Please create a content type first in the Content Types section.',\n 'warning', 5000\n );\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please select a content type.',\n 'warning', 3000\n );\n }\n return;\n }\n }\n\n this.FormSaving = true;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<MJContentSourceEntity>('MJ: Content Sources');\n\n if (this.FormMode === 'edit-source' && this.EditingSourceID) {\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: this.EditingSourceID }]));\n } else {\n entity.NewRecord();\n }\n\n entity.Name = this.FormSourceName;\n entity.ContentSourceTypeID = this.FormSourceTypeID;\n\n // For Entity source type, ContentType and FileType are not relevant\n // but the DB columns are NOT NULL, so default to the first available value\n if (this.IsEntitySourceTypeSelected) {\n const engine = KnowledgeHubMetadataEngine.Instance;\n if (!entity.ContentTypeID) {\n if (engine.ContentTypes.length === 0) {\n this.FormSaving = false;\n this.cdr.detectChanges();\n this.ShowNoContentTypeWarning = true;\n return;\n }\n entity.ContentTypeID = engine.ContentTypes[0].ID;\n }\n if (!entity.ContentFileTypeID && engine.ContentFileTypes.length > 0) {\n entity.ContentFileTypeID = engine.ContentFileTypes[0].ID;\n }\n } else {\n entity.ContentTypeID = this.FormContentTypeID;\n entity.ContentFileTypeID = this.FormFileTypeID;\n }\n\n // Store source-type-specific values from the dynamic form\n // For Entity type: EntityID and EntityDocumentID go on the entity directly\n if (this.IsEntitySourceTypeSelected) {\n entity.EntityID = this.FormSourceSpecificConfig['EntityID'] || null;\n const entityDocID = this.FormSourceSpecificConfig['EntityDocumentID'];\n if (entityDocID) {\n entity.EntityDocumentID = entityDocID;\n } else {\n // Auto-select first doc if only one exists\n const docField = this.SelectedSourceTypeFields.find(f => f.Type === 'entity-doc-picker');\n const docs = docField ? this.GetDependentOptions(docField) : [];\n entity.EntityDocumentID = docs.length > 0 ? docs[0].ID : null;\n }\n entity.URL = '';\n } else {\n entity.EntityID = null;\n entity.EntityDocumentID = null;\n // URL comes from dynamic fields for RSS/Website, or empty for others\n entity.URL = this.FormSourceSpecificConfig['URL'] || '';\n }\n\n // Store the full SourceSpecificConfiguration in the Configuration JSON\n const currentConfig = entity.ConfigurationObject ?? {};\n currentConfig.SourceSpecificConfiguration = { ...this.FormSourceSpecificConfig };\n entity.ConfigurationObject = currentConfig;\n\n entity.EmbeddingModelID = this.FormSourceEmbeddingModelID || null;\n entity.VectorIndexID = this.FormSourceVectorIndexID || null;\n\n const saved = await entity.Save();\n if (saved) {\n MJNotificationService.Instance.CreateSimpleNotification(\n this.FormMode === 'edit-source' ? 'Source updated' : 'Source created', 'success', 2500\n );\n this.CloseForm();\n await this.refreshSourcesTab();\n } else {\n // CP-4: Show detailed error from LatestResult\n const errorDetail = entity.LatestResult?.Message ?? 'Unknown error';\n console.error('[Classify] Save source failed:', entity.LatestResult);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to save source: ${errorDetail}`, 'error', 5000\n );\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[Classify] Save source exception:', error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);\n } finally {\n this.FormSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n public async DeleteSource(card: SourceCard): Promise<void> {\n if (!confirm(`Delete source \"${card.Name}\"? This cannot be undone.`)) return;\n\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Content Sources');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: card.ID }]));\n const deleted = await entity.Delete();\n if (deleted) {\n MJNotificationService.Instance.CreateSimpleNotification('Source deleted', 'success', 2500);\n await this.refreshSourcesTab();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to delete source', 'error', 3000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n\n // ════════════════════════════════════════════\n // SCHEDULE DIALOG — Quick Schedule for Source\n // ════════════════════════════════════════════\n\n /**\n * Opens the schedule dialog pre-filled for the given source card.\n * Defaults to a daily 2 AM cron expression.\n * @param card The source card to create a schedule for\n */\n public OpenScheduleDialog(card: SourceCard): void {\n this.SchedulingSourceCard = card;\n this.ScheduleCron = '0 2 * * *';\n this.ScheduleEnabled = true;\n this.ShowScheduleDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Closes the schedule dialog without saving */\n public CloseScheduleDialog(): void {\n this.ShowScheduleDialog = false;\n this.SchedulingSourceCard = null;\n this.cdr.detectChanges();\n }\n\n /**\n * Saves a new ScheduledAction for the current source, links it\n * via ContentSource.ScheduledActionID, and creates the default\n * action params for the Autotag and Vectorize action.\n */\n public async SaveSchedule(): Promise<void> {\n if (this.ScheduleSaving || !this.SchedulingSourceCard) return;\n this.ScheduleSaving = true;\n this.cdr.detectChanges();\n\n const card = this.SchedulingSourceCard;\n\n try {\n const md = new Metadata();\n\n // 1. Find the \"Autotag and Vectorize Content\" action\n const actionID = await this.findAutotagActionID();\n if (!actionID) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Could not find the \"Autotag and Vectorize Content\" action. Please check action configuration.',\n 'error', 5000\n );\n return;\n }\n\n // 2. Create the ScheduledAction\n const scheduledAction = await md.GetEntityObject<MJScheduledActionEntity>('MJ: Scheduled Actions');\n scheduledAction.NewRecord();\n scheduledAction.Name = `Autotag: ${card.Name}`;\n scheduledAction.Description = `Automated classification pipeline for content source \"${card.Name}\"`;\n scheduledAction.ActionID = actionID;\n scheduledAction.Type = 'Custom';\n scheduledAction.CronExpression = this.ScheduleCron;\n scheduledAction.CustomCronExpression = this.ScheduleCron;\n scheduledAction.Status = this.ScheduleEnabled ? 'Active' : 'Disabled';\n scheduledAction.Timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n const saved = await scheduledAction.Save();\n if (!saved) {\n const errorDetail = scheduledAction.LatestResult?.Message ?? 'Unknown error';\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to create schedule: ${errorDetail}`, 'error', 5000\n );\n return;\n }\n\n // 3. Create ScheduledActionParam for sourceIDs\n await this.createSourceIDParam(scheduledAction.ID, actionID, card.ID);\n\n // 4. Link ScheduledAction to ContentSource\n await this.linkScheduleToSource(card.ID, scheduledAction.ID);\n\n // 5. Cache the new action for cron display\n this.scheduledActionsCache.set(NormalizeUUID(scheduledAction.ID), scheduledAction);\n\n MJNotificationService.Instance.CreateSimpleNotification(\n `Schedule created: ${CronToHumanReadable(this.ScheduleCron)}`, 'success', 3000\n );\n\n this.CloseScheduleDialog();\n await this.refreshSourcesTab();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[Classify] Schedule creation error:', error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);\n } finally {\n this.ScheduleSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Removes the schedule from a source card by unlinking the ScheduledActionID.\n * @param card The source card to remove the schedule from\n */\n public async RemoveSchedule(card: SourceCard): Promise<void> {\n if (!card.ScheduledActionID) return;\n if (!confirm(`Remove the schedule \"${card.ScheduleDescription ?? 'schedule'}\" from \"${card.Name}\"?`)) return;\n\n try {\n await this.linkScheduleToSource(card.ID, null);\n MJNotificationService.Instance.CreateSimpleNotification('Schedule removed from source', 'success', 2500);\n await this.refreshSourcesTab();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n\n /**\n * Returns the human-readable schedule description for a source card.\n * Used in the template to display schedule indicators.\n */\n public GetScheduleLabel(card: SourceCard): string {\n return card.ScheduleDescription ?? 'Scheduled';\n }\n\n /**\n * Returns a human-readable preview of a cron expression for the schedule dialog.\n * @param cron The cron expression to preview\n */\n public GetCronPreview(cron: string): string {\n return CronToHumanReadable(cron);\n }\n\n /** Looks up the cron expression for a cached ScheduledAction by ID */\n private getScheduledActionCron(scheduledActionID: string): string | null {\n const cached = this.scheduledActionsCache.get(NormalizeUUID(scheduledActionID));\n return cached?.CronExpression ?? null;\n }\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 = new RunView();\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 /** Finds the Action ID for \"Autotag and Vectorize Content\" by querying actions */\n private async findAutotagActionID(): Promise<string | null> {\n const rv = new RunView();\n const result = await rv.RunView<{ ID: string }>({\n EntityName: 'Actions',\n ExtraFilter: `Name = 'Autotag and Vectorize Content'`,\n Fields: ['ID'],\n ResultType: 'simple',\n MaxRows: 1,\n });\n if (result.Success && result.Results.length > 0) {\n return result.Results[0].ID;\n }\n return null;\n }\n\n /**\n * Creates a ScheduledActionParam that passes the source ID to the action.\n * Looks up the \"EntityNames\" action param and sets the source ID as its value.\n */\n private async createSourceIDParam(scheduledActionID: string, actionID: string, sourceID: string): Promise<void> {\n // Find the \"EntityNames\" action param to get its ID\n const rv = new RunView();\n const paramResult = await rv.RunView<{ ID: string; Name: string }>({\n EntityName: 'Action Params',\n ExtraFilter: `ActionID = '${actionID}' AND Name = 'EntityNames'`,\n Fields: ['ID', 'Name'],\n ResultType: 'simple',\n MaxRows: 1,\n });\n\n if (!paramResult.Success || paramResult.Results.length === 0) {\n console.warn('[Classify] Could not find EntityNames action param for source ID scheduling');\n return;\n }\n\n const md = new Metadata();\n const param = await md.GetEntityObject<MJScheduledActionParamEntity>('MJ: Scheduled Action Params');\n param.NewRecord();\n param.ScheduledActionID = scheduledActionID;\n param.ActionParamID = paramResult.Results[0].ID;\n param.ValueType = 'Static';\n param.Value = sourceID;\n\n const saved = await param.Save();\n if (!saved) {\n console.warn('[Classify] Failed to save schedule param:', param.LatestResult?.Message);\n }\n }\n\n /**\n * Links (or unlinks) a ScheduledAction to a ContentSource by updating\n * the ContentSource.ScheduledActionID field.\n */\n private async linkScheduleToSource(sourceID: string, scheduledActionID: string | null): Promise<void> {\n const md = new Metadata();\n const entity = await md.GetEntityObject<MJContentSourceEntity>('MJ: Content Sources');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: sourceID }]));\n entity.ScheduledActionID = scheduledActionID;\n const saved = await entity.Save();\n if (!saved) {\n throw new Error(entity.LatestResult?.Message ?? 'Failed to update content source');\n }\n }\n\n // ════════════════════════════════════════════\n // SLIDE-IN FORM — Content Types\n // ════════════════════════════════════════════\n\n public async OpenAddTypeForm(): Promise<void> {\n await this.ensureFormDropdownsLoaded();\n this.resetTypeForm();\n this.FormMode = 'add-type';\n this.cdr.detectChanges();\n }\n\n public async OpenEditTypeForm(card: ContentTypeCard): Promise<void> {\n await this.ensureFormDropdownsLoaded();\n this.FormTypeName = card.Name;\n this.FormTypeDescription = card.Description;\n this.FormTypeAIModelID = card.AIModelID;\n this.FormTypeMinTags = card.MinTags;\n this.FormTypeMaxTags = card.MaxTags;\n this.FormTypeEmbeddingModelID = card.EmbeddingModelID ?? '';\n this.FormTypeVectorIndexID = card.VectorIndexID ?? '';\n this.EditingTypeID = card.ID;\n this.FormMode = 'edit-type';\n this.cdr.detectChanges();\n }\n\n public async SaveContentType(): Promise<void> {\n if (this.FormSaving) return;\n this.FormSaving = true;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Content Types');\n\n if (this.FormMode === 'edit-type' && this.EditingTypeID) {\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: this.EditingTypeID }]));\n } else {\n entity.NewRecord();\n }\n\n entity.Set('Name', this.FormTypeName);\n entity.Set('Description', this.FormTypeDescription);\n entity.Set('AIModelID', this.FormTypeAIModelID);\n entity.Set('MinTags', this.FormTypeMinTags);\n entity.Set('MaxTags', this.FormTypeMaxTags);\n entity.Set('EmbeddingModelID', this.FormTypeEmbeddingModelID || null);\n entity.Set('VectorIndexID', this.FormTypeVectorIndexID || null);\n\n const saved = await entity.Save();\n if (saved) {\n MJNotificationService.Instance.CreateSimpleNotification(\n this.FormMode === 'edit-type' ? 'Content type updated' : 'Content type created', 'success', 2500\n );\n this.CloseForm();\n await this.refreshContentTypesTab();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to save content type', 'error', 3000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n } finally {\n this.FormSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n public CloseForm(): void {\n this.FormMode = 'none';\n this.cdr.detectChanges();\n }\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 = Metadata.Provider 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 = Metadata.Provider 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 = Metadata.Provider 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 = Metadata.Provider 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 = Metadata.Provider as GraphQLDataProvider;\n const subscriptionQuery = `\n subscription PipelineProgress($pipelineRunID: String!) {\n PipelineProgress(pipelineRunID: $pipelineRunID) {\n PipelineRunID\n Stage\n TotalItems\n ProcessedItems\n 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 autotaggers',\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 private countTagsBySource(): Map<string, number> {\n const itemSourceMap = new Map<string, string>();\n for (const item of this.contentItemsRaw) {\n itemSourceMap.set(item['ID'] as string, item['ContentSourceID'] as string);\n }\n const counts = new Map<string, number>();\n for (const tag of this.contentTagsRaw) {\n const sourceId = itemSourceMap.get(tag['ItemID'] as string);\n if (sourceId) counts.set(sourceId, (counts.get(sourceId) ?? 0) + 1);\n }\n return counts;\n }\n\n private getLastRunBySource(): Map<string, Record<string, unknown>> {\n const map = new Map<string, Record<string, unknown>>();\n for (const run of this.contentRunsRaw) {\n const sourceId = run['SourceID'] as string;\n if (sourceId && !map.has(sourceId)) {\n map.set(sourceId, run);\n }\n }\n return map;\n }\n\n private countAllTags(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const tag of this.contentTagsRaw) {\n const t = tag['Tag'] as string;\n if (t) counts.set(t, (counts.get(t) ?? 0) + 1);\n }\n return counts;\n }\n\n /** Compute average weight per tag across all occurrences */\n private computeAvgWeights(): Map<string, number> {\n const sums = new Map<string, number>();\n const counts = new Map<string, number>();\n for (const tag of this.contentTagsRaw) {\n const t = tag['Tag'] as string;\n const w = Number(tag['Weight'] ?? 0.5);\n if (t) {\n sums.set(t, (sums.get(t) ?? 0) + w);\n counts.set(t, (counts.get(t) ?? 0) + 1);\n }\n }\n const avgs = new Map<string, number>();\n for (const [t, sum] of sums) {\n avgs.set(t, Math.round((sum / (counts.get(t) ?? 1)) * 100) / 100);\n }\n return avgs;\n }\n\n private getTopSourcePerTag(): Map<string, string> {\n const tagSourceCounts = new Map<string, Map<string, number>>();\n const itemSourceMap = new Map<string, string>();\n for (const item of this.contentItemsRaw) {\n itemSourceMap.set(item['ID'] as string, (item['ContentSource'] as string) ?? 'Unknown');\n }\n for (const tag of this.contentTagsRaw) {\n const t = tag['Tag'] as string;\n const source = itemSourceMap.get(tag['ItemID'] as string) ?? 'Unknown';\n if (!tagSourceCounts.has(t)) tagSourceCounts.set(t, new Map());\n const inner = tagSourceCounts.get(t)!;\n inner.set(source, (inner.get(source) ?? 0) + 1);\n }\n const result = new Map<string, string>();\n for (const [tag, sourceCounts] of tagSourceCounts) {\n let maxSource = 'Unknown';\n let maxCount = 0;\n for (const [source, count] of sourceCounts) {\n if (count > maxCount) { maxSource = source; maxCount = count; }\n }\n result.set(tag, maxSource);\n }\n return result;\n }\n\n private getFirstSeenPerTag(): Map<string, string> {\n const result = new Map<string, string>();\n for (const tag of this.contentTagsRaw) {\n const t = tag['Tag'] as string;\n if (t && !result.has(t)) {\n const date = tag['__mj_CreatedAt'] as string;\n result.set(t, date ? this.formatShortDate(date) : '');\n }\n }\n return result;\n }\n\n private countSourcesByContentType(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const source of this.contentSourcesRaw) {\n const typeId = source['ContentTypeID'] as string;\n if (typeId) counts.set(typeId, (counts.get(typeId) ?? 0) + 1);\n }\n return counts;\n }\n\n private countItemsByContentType(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const item of this.contentItemsRaw) {\n const typeId = item['ContentTypeID'] as string;\n if (typeId) counts.set(typeId, (counts.get(typeId) ?? 0) + 1);\n }\n return counts;\n }\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 public formatNumber(n: number): string {\n return n.toLocaleString();\n }\n\n /** Returns font size in rem for a tag based on its weight (0.0-1.0). Range: 0.7rem to 1.0rem */\n public TagFontSize(weight: number): string {\n const min = 0.7;\n const max = 1.0;\n return `${min + (max - min) * Math.min(1, Math.max(0, weight))}rem`;\n }\n\n /** Format weight as percentage for display in tag chip */\n public FormatWeight(weight: number): string {\n return `${Math.round(weight * 100)}%`;\n }\n\n private formatShortDate(dateStr: string): string {\n try {\n const d = new Date(dateStr);\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n } catch {\n return '';\n }\n }\n\n private formatDate(dateStr: string): string {\n try {\n const d = new Date(dateStr);\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' });\n } catch {\n return dateStr;\n }\n }\n\n private computeDuration(start: string | null, end: string | null): string {\n if (!start) return '\\u2014';\n const s = new Date(start);\n const e = end ? new Date(end) : new Date();\n const ms = e.getTime() - s.getTime();\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${Math.round(ms / 1000)}s`;\n const mins = Math.floor(ms / 60000);\n const secs = Math.round((ms % 60000) / 1000);\n return `${mins}m ${secs}s`;\n }\n\n private displayStatus(status: string): string {\n const lower = status.toLowerCase();\n if (lower === 'complete' || lower === 'completed' || lower === 'done') return 'Complete';\n if (lower === 'error' || lower === 'failed') return 'Failed';\n if (lower === 'running' || lower === 'processing') return 'Running';\n return status;\n }\n\n public GetSourceTypeIcon(typeName: string): string {\n const iconMap: Record<string, string> = {\n 'Web': 'fa-solid fa-globe', 'Web Crawler': 'fa-solid fa-globe',\n 'API': 'fa-solid fa-plug', 'Database': 'fa-solid fa-database',\n 'File': 'fa-solid fa-file-alt', 'Email': 'fa-solid fa-envelope',\n 'RSS': 'fa-solid fa-rss', 'RSS Feed': 'fa-solid fa-rss',\n 'CMS': 'fa-solid fa-newspaper', 'PDF': 'fa-solid fa-file-pdf'\n };\n return iconMap[typeName] ?? 'fa-solid fa-folder';\n }\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 private async ensureFormDropdownsLoaded(): Promise<void> {\n try {\n // Use KnowledgeHubMetadataEngine for cached reference data — instant, no RunView needed\n const engine = KnowledgeHubMetadataEngine.Instance;\n await engine.Config(false); // no-op if already loaded\n\n this.SourceTypeOptions = engine.ContentSourceTypes.map(t => ({ ID: t.ID, Name: t.Name }));\n this.ContentTypeOptions = engine.ContentTypes.map(t => ({ ID: t.ID, Name: t.Name }));\n this.FileTypeOptions = engine.ContentFileTypes.map(t => ({ ID: t.ID, Name: t.Name }));\n this.VectorIndexOptions = engine.VectorIndexes.map(vi => ({ ID: vi.ID, Name: vi.Name }));\n\n // AI Models from AIEngineBase (already cached)\n if (this.AIModelOptions.length === 0) {\n const aiEngine = AIEngineBase.Instance;\n await aiEngine.Config(false);\n this.AIModelOptions = aiEngine.Models.map(m => ({ ID: m.ID, Name: m.Name }));\n this.EmbeddingModelOptions = aiEngine.Models\n .filter(m => m.AIModelType?.trim().toLowerCase() === 'embeddings')\n .map(m => ({ ID: m.ID, Name: m.Name }));\n }\n } catch (error) {\n console.error('[Autotagging] Error loading form dropdowns:', error);\n }\n }\n\n private resetSourceForm(): void {\n this.FormSourceName = '';\n this.FormSourceTypeID = '';\n this.FormContentTypeID = '';\n this.FormFileTypeID = '';\n this.FormSourceURL = '';\n this.FormSourceEntityID = '';\n this.FormSourceEntityDocID = '';\n this.FormSourceEmbeddingModelID = '';\n this.FormSourceVectorIndexID = '';\n this.EditingSourceID = '';\n this.FormSourceSpecificConfig = {};\n }\n\n private resetTypeForm(): void {\n this.FormTypeName = '';\n this.FormTypeDescription = '';\n this.FormTypeAIModelID = '';\n this.FormTypeMinTags = 1;\n this.FormTypeMaxTags = 10;\n this.FormTypeEmbeddingModelID = '';\n this.FormTypeVectorIndexID = '';\n this.EditingTypeID = '';\n }\n\n private async refreshSourcesTab(): Promise<void> {\n this.tabDataLoaded.delete('sources');\n this.tabDataLoaded.delete('pipeline');\n const rv = new RunView();\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 this.buildSourceCards();\n this.buildNavItems();\n this.cdr.detectChanges();\n }\n\n private async refreshContentTypesTab(): Promise<void> {\n this.tabDataLoaded.delete('types');\n const rv = new RunView();\n const result = await rv.RunView({ EntityName: 'MJ: Content Types', ResultType: 'simple' });\n if (result.Success) this.contentTypesRaw = result.Results;\n this.buildContentTypeCards();\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 = new Metadata();\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: this.formatDate((rawItem['__mj_CreatedAt'] as string) ?? ''),\n UpdatedAt: this.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 = new Metadata();\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: this.formatDate((rawItem['__mj_CreatedAt'] as string) ?? ''),\n UpdatedAt: this.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 = new Metadata();\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 = new RunView();\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 // DETAIL PANELS — Source Detail\n // ════════════════════════════════════════════\n\n public async OpenSourceDetail(card: SourceCard): Promise<void> {\n this.SourceDetailLoading = true;\n this.SourceDetailPage = 0;\n this.SourceDetailStatusFilter = 'All';\n this.ShowSourceDetail = true;\n this.cdr.detectChanges();\n\n try {\n const sourceItems = await this.loadContentItemsForSource(card.ID);\n const sourceRuns = await this.loadRunHistoryForSource(card.ID);\n\n const embeddingModelName = this.resolveEmbeddingModelName(card.EmbeddingModelID);\n const vectorIndexName = this.resolveVectorIndexName(card.VectorIndexID);\n const errorCount = sourceRuns.filter(r => r.StatusClass === 'failed').length;\n\n this.SelectedSource = {\n ID: card.ID,\n Name: card.Name,\n SourceTypeName: card.SourceTypeName,\n FileTypeName: card.FileTypeName,\n ContentTypeName: card.ContentTypeName,\n RequiresFileType: card.RequiresFileType,\n StatusClass: card.StatusClass,\n StatusLabel: card.StatusLabel,\n Icon: card.Icon,\n URL: card.URL,\n EmbeddingModelName: embeddingModelName,\n VectorIndexName: vectorIndexName,\n ItemCount: card.ItemCount,\n TagCount: card.TagCount,\n AvgTags: card.AvgTags,\n LastRunAgo: card.LastRunAgo,\n ErrorCount: errorCount,\n ContentItems: sourceItems,\n RunHistory: sourceRuns\n };\n } catch (error) {\n console.error('[Autotagging] Error loading source detail:', error);\n } finally {\n this.SourceDetailLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n public CloseSourceDetail(): void {\n this.ShowSourceDetail = false;\n this.SelectedSource = null;\n this.cdr.detectChanges();\n }\n\n public OpenRecordFromSource(source: SourceDetailInfo): void {\n const pkey = new CompositeKey();\n pkey.KeyValuePairs = [{ FieldName: 'ID', Value: source.ID }];\n this.navigationService.OpenEntityRecord('MJ: Content Sources', pkey);\n }\n\n public OpenEditSourceFromDetail(): void {\n if (!this.SelectedSource) return;\n const card = this.SourceCards.find(c => UUIDsEqual(c.ID, this.SelectedSource!.ID));\n if (card) {\n this.CloseSourceDetail();\n this.OpenEditSourceForm(card);\n }\n }\n\n public async RunSourceFromDetail(): Promise<void> {\n this.CloseSourceDetail();\n await this.RunPipeline();\n }\n\n public async DeleteSourceFromDetail(): Promise<void> {\n if (!this.SelectedSource) return;\n const card = this.SourceCards.find(c => UUIDsEqual(c.ID, this.SelectedSource!.ID));\n if (card) {\n this.CloseSourceDetail();\n await this.DeleteSource(card);\n }\n }\n\n private async loadContentItemsForSource(sourceId: string): Promise<ContentItemDetail[]> {\n const rv = new RunView();\n const result = await rv.RunView({\n EntityName: 'MJ: Content Items',\n ExtraFilter: `ContentSourceID='${sourceId}'`,\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: 100,\n ResultType: 'simple'\n });\n\n if (!result.Success) return [];\n\n const tagsByItem = this.countTagsByItem();\n return result.Results.map(item => {\n const itemId = item['ID'] as string;\n const allTags = this.getAllWeightedTagsForItem(itemId);\n const tagCount = tagsByItem.get(itemId) ?? allTags.length;\n const contentSourceTypeID = (item['ContentSourceTypeID'] as string) ?? '';\n const itemStatuses = this.inferPipelineStatuses(item, tagCount);\n return {\n ID: itemId,\n Name: (item['Name'] as string) ?? 'Unnamed',\n SourceName: (item['ContentSource'] as string) ?? '',\n SourceTypeName: (item['ContentSourceType'] as string) ?? '',\n ContentTypeName: (item['ContentType'] as string) ?? '',\n FileTypeName: (item['ContentFileType'] as string) ?? '',\n URL: (item['URL'] as string) ?? '',\n TextContent: (item['Text'] as string) ?? '',\n Checksum: (item['Checksum'] as string) ?? '',\n Tags: allTags,\n CreatedAt: this.formatDate((item['__mj_CreatedAt'] as string) ?? ''),\n UpdatedAt: this.formatDate((item['__mj_UpdatedAt'] as string) ?? ''),\n ContentSourceID: sourceId,\n ContentSourceTypeID: contentSourceTypeID,\n StatusDot: tagCount > 0 ? 'complete' : 'processing',\n TagCount: tagCount,\n RequiresContentType: this.sourceTypeRequiresFileType(contentSourceTypeID),\n EntityRecordID: this.resolveEntityRecordID(item, sourceId),\n EntityName: this.resolveEntityName(sourceId),\n EmbeddingStatus: itemStatuses.EmbeddingStatus,\n TaggingStatus: itemStatuses.TaggingStatus,\n };\n });\n }\n\n private async loadRunHistoryForSource(sourceId: string): Promise<RunHistoryRow[]> {\n const rv = new RunView();\n const result = await rv.RunView({\n EntityName: 'MJ: Content Process Runs',\n ExtraFilter: `SourceID='${sourceId}'`,\n OrderBy: 'StartTime DESC',\n MaxRows: 10,\n ResultType: 'simple'\n });\n\n if (!result.Success) return [];\n\n return result.Results.map(run => {\n const status = (run['Status'] as string) ?? 'Unknown';\n const startTime = run['StartTime'] as string | null;\n const endTime = run['EndTime'] as string | null;\n const duration = this.computeDuration(startTime, endTime);\n const processedItems = run['ProcessedItems'] as number | null;\n const errorCount = run['ErrorCount'] as number | null;\n const statusLower = status.toLowerCase();\n const isFailed = statusLower === 'error' || statusLower === 'failed';\n const isRunning = statusLower === 'running' || statusLower === 'processing';\n const hasErrors = (errorCount ?? 0) > 0;\n\n return {\n ID: run['ID'] as string,\n Status: this.displayStatus(status),\n StatusClass: isFailed ? 'failed' : isRunning ? 'running' : 'complete',\n SourceName: (run['Source'] as string) ?? 'Unknown',\n StartedDisplay: startTime ? this.formatDate(startTime) : '\\u2014',\n Duration: duration,\n Items: processedItems != null ? this.formatNumber(processedItems) : '\\u2014',\n Tags: '\\u2014',\n Errors: hasErrors ? this.formatNumber(errorCount!) : (isFailed ? status : '0'),\n ErrorClass: isFailed || hasErrors ? 'run-error-text' : ''\n };\n });\n }\n\n private resolveEmbeddingModelName(modelId: string): string {\n if (!modelId) return 'System default';\n const aiEngine = AIEngineBase.Instance;\n const model = aiEngine.Models.find(m => UUIDsEqual(m.ID, modelId));\n return model ? model.Name : 'Unknown';\n }\n\n private resolveVectorIndexName(indexId: string): string {\n if (!indexId) return 'System default';\n const engine = KnowledgeHubMetadataEngine.Instance;\n const idx = engine.GetVectorIndexById(indexId);\n return idx ? idx.Name : 'Unknown';\n }\n\n // ════════════════════════════════════════════\n // TAXONOMY GOVERNANCE TAB\n // ════════════════════════════════════════════\n\n public SwitchTaxSubTab(sub: TaxonomySubTab): void {\n this.TaxSubTab = sub;\n this.cdr.detectChanges();\n }\n\n /**\n * Loads all data needed by the Taxonomy Governance sub-tabs:\n * Tags, Tagged Items, Tag Audit Logs, and cross-references content item tags.\n */\n private async loadTaxonomyData(): Promise<void> {\n try {\n const rv = new RunView();\n const [tagsResult, taggedItemsResult, auditResult] = await rv.RunViews([\n { EntityName: 'MJ: Tags', OrderBy: 'Name', ResultType: 'simple' },\n { EntityName: 'MJ: Tagged Items', ResultType: 'simple' },\n { EntityName: 'MJ: Tag Audit Logs', OrderBy: '__mj_CreatedAt DESC', MaxRows: 200, ResultType: 'simple' }\n ]);\n\n this.tagsRaw = tagsResult.Success ? tagsResult.Results : [];\n this.taggedItemsRaw = taggedItemsResult.Success ? taggedItemsResult.Results : [];\n this.tagAuditLogsRaw = auditResult.Success ? auditResult.Results : [];\n\n // Also ensure content item tags are loaded for cross-referencing\n await this.ensureBaseDataLoaded();\n\n // Load per-tag aggregates (weights + counts) via server-side SQL\n await this.loadTagAggregates();\n\n this.buildTaxTree();\n this.buildTaxDuplicates();\n this.buildTaxOrphans();\n this.buildTaxTreemap();\n this.buildTaxAuditLog();\n this.buildTaxHealth();\n } catch (error) {\n console.error('[Autotagging] Error loading taxonomy data:', error);\n }\n }\n\n // ── Tree View ──\n\n /**\n * Builds the taxonomy tree from raw tag data, wiring up parent-child\n * relationships and attaching item counts and average weights.\n */\n private buildTaxTree(): void {\n const tagMap = new Map<string, TaxTreeNode>();\n const tagItemCounts = this.tagAggregateCounts;\n const tagAvgWeights = this.tagAggregateWeights;\n\n // Create flat node list from raw tags (exclude merged/soft-deleted tags)\n const activeTags = this.tagsRaw.filter(t => (t['Status'] as string)?.toLowerCase() !== 'merged');\n for (const tag of activeTags) {\n const id = tag['ID'] as string;\n const normalizedId = NormalizeUUID(id);\n const name = (tag['Name'] as string) ?? 'Unnamed';\n const itemCount = tagItemCounts.get(normalizedId) ?? 0;\n const avgWeight = tagAvgWeights.get(normalizedId) ?? 0;\n\n tagMap.set(normalizedId, {\n ID: id,\n Name: name,\n DisplayName: (tag['DisplayName'] as string) ?? name,\n Description: (tag['Description'] as string) ?? '',\n ParentID: (tag['ParentID'] as string) ?? null,\n Depth: 0,\n Children: [],\n ItemCount: itemCount,\n AvgWeight: avgWeight,\n HealthColor: this.computeTagHealth(itemCount, avgWeight),\n IsExpanded: false,\n IsSelected: false,\n FirstSeen: this.formatShortDate((tag['__mj_CreatedAt'] as string) ?? '')\n });\n }\n\n // Build parent-child relationships\n const roots: TaxTreeNode[] = [];\n for (const node of tagMap.values()) {\n const normalizedParent = node.ParentID ? NormalizeUUID(node.ParentID) : null;\n if (normalizedParent && tagMap.has(normalizedParent)) {\n tagMap.get(normalizedParent)!.Children.push(node);\n } else {\n roots.push(node);\n }\n }\n\n // Compute depths and aggregate child counts\n this.computeTreeDepths(roots, 0);\n this.propagateItemCounts(roots);\n\n // Sort children alphabetically\n this.sortTreeNodes(roots);\n\n // Expand top two levels by default\n for (const root of roots) {\n root.IsExpanded = true;\n for (const child of root.Children) {\n child.IsExpanded = true;\n }\n }\n\n this.TaxTreeNodes = roots;\n this.TaxFlatNodes = this.flattenTree(roots);\n this.TaxFilteredNodes = this.TaxFlatNodes;\n\n // Select first node if available\n if (this.TaxFlatNodes.length > 0) {\n this.SelectTaxNode(this.TaxFlatNodes[0]);\n }\n }\n\n private computeTreeDepths(nodes: TaxTreeNode[], depth: number): void {\n for (const node of nodes) {\n node.Depth = depth;\n this.computeTreeDepths(node.Children, depth + 1);\n }\n }\n\n private propagateItemCounts(nodes: TaxTreeNode[]): number {\n let total = 0;\n for (const node of nodes) {\n const childCount = this.propagateItemCounts(node.Children);\n node.ItemCount = node.ItemCount + childCount;\n total += node.ItemCount;\n }\n return total;\n }\n\n private sortTreeNodes(nodes: TaxTreeNode[]): void {\n nodes.sort((a, b) => a.Name.localeCompare(b.Name));\n for (const node of nodes) {\n this.sortTreeNodes(node.Children);\n }\n }\n\n private flattenTree(nodes: TaxTreeNode[]): TaxTreeNode[] {\n const result: TaxTreeNode[] = [];\n for (const node of nodes) {\n result.push(node);\n if (node.IsExpanded && node.Children.length > 0) {\n result.push(...this.flattenTree(node.Children));\n }\n }\n return result;\n }\n\n private computeTagHealth(itemCount: number, avgWeight: number): 'green' | 'yellow' | 'red' {\n if (itemCount === 0) return 'red';\n if (itemCount <= 2 || avgWeight < 0.3) return 'yellow';\n return 'green';\n }\n\n /**\n * Counts the number of items referencing each tag, combining both\n * Tagged Items and Content Item Tags. Uses NormalizeUUID for\n * cross-platform UUID case consistency.\n */\n private countItemsByTag(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const ti of this.taggedItemsRaw) {\n const tagId = ti['TagID'] as string;\n if (tagId) {\n const key = NormalizeUUID(tagId);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n }\n // Also count from content item tags that reference TagID\n for (const cit of this.contentTagsRaw) {\n const tagId = cit['TagID'] as string;\n if (tagId) {\n const key = NormalizeUUID(tagId);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n }\n return counts;\n }\n\n /**\n * Loads per-tag average weights and item counts via a server-side SQL aggregation.\n * This avoids loading all 17K+ TaggedItem rows to the browser.\n */\n /**\n * Loads per-tag average weights and item counts via the \"Tag Aggregates\" saved query.\n * This runs a SQL GROUP BY on the server, avoiding loading 17K+ TaggedItem rows to the browser.\n */\n private async loadTagAggregates(): Promise<void> {\n this.tagAggregateWeights.clear();\n this.tagAggregateCounts.clear();\n try {\n const rq = new RunQuery();\n const result = await rq.RunQuery({\n QueryName: 'Tag Aggregates',\n CategoryPath: '/MJ/Tags'\n });\n if (result.Success) {\n for (const row of result.Results) {\n const tagId = row['TagID'] as string;\n if (tagId) {\n const key = NormalizeUUID(tagId);\n this.tagAggregateWeights.set(key, Number(row['AvgWeight'] ?? 0));\n this.tagAggregateCounts.set(key, Number(row['ItemCount'] ?? 0));\n }\n }\n }\n } catch (error) {\n console.error('[Autotagging] Error loading tag aggregates:', error);\n }\n }\n\n public ToggleTaxNode(node: TaxTreeNode): void {\n if (node.Children.length > 0) {\n node.IsExpanded = !node.IsExpanded;\n this.TaxFlatNodes = this.flattenTree(this.TaxTreeNodes);\n this.applyTaxTreeFilter();\n this.cdr.detectChanges();\n }\n }\n\n public SelectTaxNode(node: TaxTreeNode): void {\n // Deselect previous\n for (const n of this.TaxFlatNodes) {\n n.IsSelected = false;\n }\n node.IsSelected = true;\n this.TaxSelectedNode = node;\n this.TaxIsEditing = false;\n this.loadRecentItemsForTag(node);\n this.cdr.detectChanges();\n }\n\n public FilterTaxTree(): void {\n this.applyTaxTreeFilter();\n this.cdr.detectChanges();\n }\n\n private applyTaxTreeFilter(): void {\n const q = this.TaxTreeSearch.toLowerCase().trim();\n if (!q) {\n this.TaxFilteredNodes = this.TaxFlatNodes;\n } else {\n this.TaxFilteredNodes = this.TaxFlatNodes.filter(n =>\n n.Name.toLowerCase().includes(q) || n.DisplayName.toLowerCase().includes(q)\n );\n }\n }\n\n public GetTaxBreadcrumb(node: TaxTreeNode): { ID: string; Name: string }[] {\n const breadcrumb: { ID: string; Name: string }[] = [];\n const tagMap = new Map<string, Record<string, unknown>>();\n for (const t of this.tagsRaw) {\n tagMap.set(t['ID'] as string, t);\n }\n\n let currentID: string | null = node.ParentID;\n while (currentID) {\n const parent = tagMap.get(currentID);\n if (!parent) break;\n breadcrumb.unshift({ ID: currentID, Name: (parent['Name'] as string) ?? '' });\n currentID = (parent['ParentID'] as string) ?? null;\n }\n return breadcrumb;\n }\n\n public NavigateToBreadcrumb(tagId: string): void {\n const node = this.TaxFlatNodes.find(n => UUIDsEqual(n.ID, tagId));\n if (node) {\n this.SelectTaxNode(node);\n }\n }\n\n private loadRecentItemsForTag(node: TaxTreeNode): void {\n // Find content item tags that reference this tag's ID.\n // Use the 'Item' view field (ContentItem name) directly from the tag record\n // instead of looking up from the capped contentItemsRaw array.\n const matchingTags = this.contentTagsRaw.filter(cit =>\n UUIDsEqual(cit['TagID'] as string, node.ID)\n ).slice(0, 5);\n\n this.TaxRecentItems = matchingTags.map(cit => ({\n Name: (cit['Item'] as string) ?? 'Unnamed Item',\n Weight: Number(cit['Weight'] ?? 0.5),\n Date: this.formatShortDate((cit['__mj_CreatedAt'] as string) ?? ''),\n Icon: 'fa-solid fa-file-lines'\n }));\n }\n\n // ── Tag Operations ──\n\n public StartEditTag(): void {\n if (!this.TaxSelectedNode) return;\n this.TaxIsEditing = true;\n this.TaxEditName = this.TaxSelectedNode.Name;\n this.TaxEditDescription = this.TaxSelectedNode.Description;\n this.cdr.detectChanges();\n }\n\n public CancelEditTag(): void {\n this.TaxIsEditing = false;\n this.cdr.detectChanges();\n }\n\n public async SaveEditTag(): Promise<void> {\n if (!this.TaxSelectedNode) return;\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: this.TaxSelectedNode.ID }]));\n entity.Set('Name', this.TaxEditName);\n entity.Set('Description', this.TaxEditDescription);\n const saved = await entity.Save();\n if (saved) {\n this.TaxSelectedNode.Name = this.TaxEditName;\n this.TaxSelectedNode.DisplayName = this.TaxEditName;\n this.TaxSelectedNode.Description = this.TaxEditDescription;\n this.TaxIsEditing = false;\n this.addTaxAuditEntry('renamed', this.TaxEditName);\n MJNotificationService.Instance.CreateSimpleNotification('Tag updated', 'success', 2500);\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to update tag', 'error', 3000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n this.cdr.detectChanges();\n }\n\n public async MoveTag(node: TaxTreeNode, newParentId: string | null): Promise<void> {\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: node.ID }]));\n entity.Set('ParentID', newParentId);\n const saved = await entity.Save();\n if (saved) {\n this.addTaxAuditEntry('moved', node.Name);\n MJNotificationService.Instance.CreateSimpleNotification('Tag moved', 'success', 2500);\n await this.RefreshTaxonomyData();\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n\n public DeleteTag(node: TaxTreeNode): void {\n this.OpenConfirmDialog(\n 'Delete Tag',\n `Delete tag \"${node.Name}\"? This will also remove all tagged item associations.`,\n async () => {\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: node.ID }]));\n const deleted = await entity.Delete();\n if (deleted) {\n this.addTaxAuditEntry('deleted', node.Name);\n MJNotificationService.Instance.CreateSimpleNotification('Tag deleted', 'success', 2500);\n await this.RefreshTaxonomyData();\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n );\n }\n\n // ── Create Tag ──\n\n /** Open create tag dialog for a root-level tag */\n public OpenCreateRootTag(): void {\n this.CreateTagParentID = null;\n this.CreateTagParentLabel = 'Root level';\n this.CreateTagName = '';\n this.CreateTagDescription = '';\n this.ShowCreateTagDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Open create tag dialog as child of the selected node */\n public OpenCreateChildTag(): void {\n if (!this.TaxSelectedNode) return;\n this.OpenCreateChildTagFor(this.TaxSelectedNode);\n }\n\n /** Open create tag dialog as child of a specific node */\n public OpenCreateChildTagFor(node: TaxTreeNode): void {\n this.CreateTagParentID = node.ID;\n this.CreateTagParentLabel = `under \"${node.Name}\"`;\n this.CreateTagName = '';\n this.CreateTagDescription = '';\n this.ShowCreateTagDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Close create tag dialog */\n public CloseCreateTagDialog(): void {\n this.ShowCreateTagDialog = false;\n this.cdr.detectChanges();\n }\n\n /** Save the new tag */\n public async SaveNewTag(): Promise<void> {\n const name = this.CreateTagName.trim();\n if (!name) return;\n\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n entity.NewRecord();\n entity.Set('Name', name);\n entity.Set('DisplayName', name);\n entity.Set('Description', this.CreateTagDescription.trim() || null);\n entity.Set('ParentID', this.CreateTagParentID);\n const saved = await entity.Save();\n if (saved) {\n this.addTaxAuditEntry('created', name);\n MJNotificationService.Instance.CreateSimpleNotification(`Tag \"${name}\" created`, 'success', 2500);\n this.ShowCreateTagDialog = false;\n await this.RefreshTaxonomyData();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to save tag', 'error', 4000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n\n // ── Multi-Select & Drag Reparent ──\n\n /** Toggle multi-select mode on/off */\n public ToggleMultiSelectMode(): void {\n this.TaxMultiSelectMode = !this.TaxMultiSelectMode;\n if (!this.TaxMultiSelectMode) {\n this.TaxSelectedIDs.clear();\n }\n this.cdr.detectChanges();\n }\n\n /** Toggle a node's selection in multi-select mode */\n public ToggleNodeSelection(node: TaxTreeNode, event: Event): void {\n event.stopPropagation();\n if (this.TaxSelectedIDs.has(node.ID)) {\n this.TaxSelectedIDs.delete(node.ID);\n } else {\n this.TaxSelectedIDs.add(node.ID);\n }\n this.cdr.detectChanges();\n }\n\n /** Check if a node is selected in multi-select mode */\n public IsNodeMultiSelected(nodeID: string): boolean {\n return this.TaxSelectedIDs.has(nodeID);\n }\n\n /** Handle drag start on a tree node */\n public OnTreeNodeDragStart(event: DragEvent, node: TaxTreeNode): void {\n if (!event.dataTransfer) return;\n // If dragging a multi-selected node, drag all selected; otherwise just this one\n const dragIDs = this.TaxMultiSelectMode && this.TaxSelectedIDs.has(node.ID)\n ? [...this.TaxSelectedIDs]\n : [node.ID];\n event.dataTransfer.setData('text/plain', JSON.stringify(dragIDs));\n event.dataTransfer.effectAllowed = 'move';\n }\n\n /** Handle drag over a tree node (drop target) */\n public OnTreeNodeDragOver(event: DragEvent, node: TaxTreeNode): void {\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move';\n this.TaxDragOverNodeID = node.ID;\n }\n\n /** Handle drag leave */\n public OnTreeNodeDragLeave(): void {\n this.TaxDragOverNodeID = null;\n }\n\n /** Handle drop — reparent dragged node(s) under the drop target */\n public async OnTreeNodeDrop(event: DragEvent, targetNode: TaxTreeNode): Promise<void> {\n event.preventDefault();\n this.TaxDragOverNodeID = null;\n\n const data = event.dataTransfer?.getData('text/plain');\n if (!data) return;\n\n let dragIDs: string[];\n try { dragIDs = JSON.parse(data); } catch { return; }\n\n // Prevent dropping onto itself or a descendant\n const targetDescendants = this.collectDescendantIds(targetNode);\n const validIDs = dragIDs.filter(id =>\n !UUIDsEqual(id, targetNode.ID) && !targetDescendants.has(NormalizeUUID(id))\n );\n\n if (validIDs.length === 0) return;\n\n this.TaxTreeSaving = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n let movedCount = 0;\n for (const tagID of validIDs) {\n try {\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: tagID }]));\n entity.Set('ParentID', targetNode.ID);\n const saved = await entity.Save();\n if (saved) movedCount++;\n } catch {\n // continue with remaining\n }\n }\n\n if (movedCount > 0) {\n const label = movedCount === 1 ? '1 tag' : `${movedCount} tags`;\n MJNotificationService.Instance.CreateSimpleNotification(`Moved ${label} under \"${targetNode.Name}\"`, 'success', 2500);\n this.addTaxAuditEntry('moved', `${movedCount} tag(s) → ${targetNode.Name}`);\n this.TaxSelectedIDs.clear();\n await this.RefreshTaxonomyData();\n }\n\n this.TaxTreeSaving = false;\n this.cdr.detectChanges();\n }\n\n /** Handle drop on the \"Root\" drop zone (make root-level) */\n public async OnDropToRoot(event: DragEvent): Promise<void> {\n event.preventDefault();\n this.TaxDragOverNodeID = null;\n\n const data = event.dataTransfer?.getData('text/plain');\n if (!data) return;\n\n let dragIDs: string[];\n try { dragIDs = JSON.parse(data); } catch { return; }\n\n this.TaxTreeSaving = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n let movedCount = 0;\n for (const tagID of dragIDs) {\n try {\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: tagID }]));\n if (entity.Get('ParentID') != null) {\n entity.Set('ParentID', null);\n const saved = await entity.Save();\n if (saved) movedCount++;\n }\n } catch {\n // continue\n }\n }\n\n if (movedCount > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(`Moved ${movedCount} tag(s) to root`, 'success', 2500);\n this.addTaxAuditEntry('moved', `${movedCount} tag(s) → root`);\n this.TaxSelectedIDs.clear();\n await this.RefreshTaxonomyData();\n }\n\n this.TaxTreeSaving = false;\n this.cdr.detectChanges();\n }\n\n public IsMerging = false;\n\n public async MergeTags(sourceTagId: string, targetTagId: string, sourceName: string, targetName: string): Promise<void> {\n if (this.IsMerging) return; // Prevent duplicate calls from button spam\n this.IsMerging = true;\n this.cdr.detectChanges();\n\n try {\n // Re-parent tagged items from source to target\n const itemsToMove = this.taggedItemsRaw.filter(ti => (ti['TagID'] as string) === sourceTagId);\n const md = new Metadata();\n for (const ti of itemsToMove) {\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tagged Items');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: ti['ID'] as string }]));\n entity.Set('TagID', targetTagId);\n await entity.Save();\n }\n\n // Re-parent children of source under target\n const childTags = this.tagsRaw.filter(t => (t['ParentID'] as string) === sourceTagId);\n for (const child of childTags) {\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: child['ID'] as string }]));\n entity.Set('ParentID', targetTagId);\n await entity.Save();\n }\n\n // Clean up co-occurrence records before delete (FK constraint)\n await this.cleanupTagReferences(sourceTagId);\n\n // Delete source tag (original behavior — hard delete)\n const sourceEntity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await sourceEntity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: sourceTagId }]));\n await sourceEntity.Delete();\n\n this.addTaxAuditEntry('merged', `${sourceName} into ${targetName}`);\n MJNotificationService.Instance.CreateSimpleNotification(`Merged \"${sourceName}\" into \"${targetName}\"`, 'success', 3000);\n await this.RefreshTaxonomyData();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Merge error: ${msg}`, 'error', 4000);\n } finally {\n this.IsMerging = false;\n this.cdr.detectChanges();\n }\n }\n\n public async MakeChildTag(childTagId: string, parentTagId: string): Promise<void> {\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: childTagId }]));\n entity.Set('ParentID', parentTagId);\n const saved = await entity.Save();\n if (saved) {\n this.addTaxAuditEntry('moved', (entity.Get('Name') as string) ?? 'tag');\n MJNotificationService.Instance.CreateSimpleNotification('Tag reparented', 'success', 2500);\n await this.RefreshTaxonomyData();\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n\n public DismissDuplicate(pair: TaxDuplicatePair): void {\n this.TaxDuplicates = this.TaxDuplicates.filter(d => d !== pair);\n this.TaxHealth.Duplicates = this.TaxDuplicates.length;\n this.cdr.detectChanges();\n }\n\n // ── Duplicates ──\n\n private buildTaxDuplicates(): void {\n const tags = this.tagsRaw\n .filter(t => (t['Status'] as string)?.toLowerCase() !== 'merged')\n .map(t => ({\n ID: t['ID'] as string,\n Name: (t['Name'] as string) ?? ''\n }));\n\n const pairs: TaxDuplicatePair[] = [];\n\n // 1. Group exact-name duplicates (case-insensitive) into single entries\n const exactGroups = this.groupExactNameDuplicates(tags);\n const consumedIDs = new Set<string>();\n\n for (const [, group] of exactGroups) {\n if (group.length < 2) continue;\n // Emit one consolidated entry per group of exact-name duplicates\n pairs.push({\n TagA: group[0].Name,\n TagB: group[0].Name,\n TagAID: group[0].ID,\n TagBID: group[1].ID,\n Similarity: 100,\n SeverityClass: 'high',\n IsExactDuplicate: true,\n ExactDuplicateCount: group.length,\n AllIDs: group.map(t => t.ID)\n });\n for (const t of group) consumedIDs.add(t.ID);\n }\n\n // 2. Fuzzy/similar pairs — skip any tags already covered by exact-name groups\n for (let i = 0; i < tags.length; i++) {\n if (consumedIDs.has(tags[i].ID)) continue;\n for (let j = i + 1; j < tags.length; j++) {\n if (consumedIDs.has(tags[j].ID)) continue;\n const sim = this.computeStringSimilarity(tags[i].Name, tags[j].Name);\n if (sim >= 0.70) {\n pairs.push({\n TagA: tags[i].Name,\n TagB: tags[j].Name,\n TagAID: tags[i].ID,\n TagBID: tags[j].ID,\n Similarity: Math.round(sim * 100),\n SeverityClass: sim >= 0.85 ? 'high' : 'moderate',\n IsExactDuplicate: false,\n ExactDuplicateCount: 0,\n AllIDs: []\n });\n }\n }\n }\n\n pairs.sort((a, b) => b.Similarity - a.Similarity);\n this.TaxDuplicates = pairs;\n }\n\n /** Group tags by case-insensitive name, returning only groups with 2+ members */\n private groupExactNameDuplicates(tags: { ID: string; Name: string }[]): Map<string, { ID: string; Name: string }[]> {\n const groups = new Map<string, { ID: string; Name: string }[]>();\n for (const tag of tags) {\n const key = tag.Name.toLowerCase().trim();\n const group = groups.get(key);\n if (group) {\n group.push(tag);\n } else {\n groups.set(key, [tag]);\n }\n }\n return groups;\n }\n\n /**\n * Enhanced string similarity: separator normalization, abbreviation,\n * pluralization, token-overlap Jaccard, containment, and Levenshtein.\n * Returns the highest score among all heuristics.\n */\n private computeStringSimilarity(a: string, b: string): number {\n const la = a.toLowerCase().trim();\n const lb = b.toLowerCase().trim();\n if (la === lb) return 1.0;\n\n // Strip separators and compare\n const normA = la.replace(/[\\s\\-_&]+/g, '');\n const normB = lb.replace(/[\\s\\-_&]+/g, '');\n if (normA === normB) return 0.98;\n\n let best = 0;\n\n // Abbreviation\n if (this.isAbbreviationOf(la, lb) || this.isAbbreviationOf(lb, la)) {\n best = Math.max(best, 0.90);\n }\n\n // Pluralization\n best = Math.max(best, this.computePluralizationScore(la, lb));\n\n // Token Jaccard\n best = Math.max(best, this.computeTokenJaccardSimilarity(la, lb));\n\n // Containment\n if (lb.includes(la) || la.includes(lb)) {\n const shorter = la.length < lb.length ? la : lb;\n const longer = la.length < lb.length ? lb : la;\n best = Math.max(best, shorter.length / longer.length);\n }\n\n // Levenshtein\n const dist = this.levenshteinDistance(la, lb);\n const maxLen = Math.max(la.length, lb.length);\n if (maxLen > 0) {\n best = Math.max(best, 1 - dist / maxLen);\n }\n\n return best;\n }\n\n /** Scores simple English pluralization differences */\n private computePluralizationScore(a: string, b: string): number {\n const shorter = a.length <= b.length ? a : b;\n const longer = a.length <= b.length ? b : a;\n if (longer === shorter + 's') return 0.95;\n if (longer === shorter + 'es') return 0.95;\n if (shorter.endsWith('y') && longer === shorter.slice(0, -1) + 'ies') return 0.95;\n return 0;\n }\n\n /** Jaccard similarity on word tokens */\n private computeTokenJaccardSimilarity(a: string, b: string): number {\n const tokensA = new Set(a.split(/[\\s\\-_&]+/).filter(w => w.length > 0));\n const tokensB = new Set(b.split(/[\\s\\-_&]+/).filter(w => w.length > 0));\n if (tokensA.size === 0 || tokensB.size === 0) return 0;\n let intersection = 0;\n for (const token of tokensA) {\n if (tokensB.has(token)) intersection++;\n }\n const union = tokensA.size + tokensB.size - intersection;\n return union > 0 ? intersection / union : 0;\n }\n\n private isAbbreviationOf(short: string, long: string): boolean {\n if (short.length >= long.length) return false;\n if (short.length < 2) return false;\n\n // Check if short is initials of words in long\n const words = long.split(/[\\s\\-_&]+/).filter(w => w.length > 0);\n if (words.length < 2) return false;\n const initials = words.map(w => w[0]).join('');\n return initials === short;\n }\n\n private levenshteinDistance(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0) as number[]);\n\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost);\n }\n }\n return dp[m][n];\n }\n\n // ── Orphans ──\n\n /**\n * Finds orphan tags: no parent, no children, and zero usage.\n * A tag with even 1 connection is not orphaned — it's just a leaf.\n * Uses NormalizeUUID for consistent cross-platform UUID comparisons.\n */\n private buildTaxOrphans(): void {\n const tagItemCounts = this.tagAggregateCounts;\n const tagAvgWeights = this.tagAggregateWeights;\n const hasChildren = new Set<string>();\n for (const t of this.tagsRaw) {\n const pid = t['ParentID'] as string;\n if (pid) hasChildren.add(NormalizeUUID(pid));\n }\n\n this.TaxOrphans = this.tagsRaw\n .filter(t => {\n const normalizedId = NormalizeUUID(t['ID'] as string);\n const parentId = t['ParentID'] as string | null;\n const status = (t['Status'] as string)?.toLowerCase();\n const itemCount = tagItemCounts.get(normalizedId) ?? 0;\n // Skip merged tags — they're soft-deleted\n if (status === 'merged') return false;\n // Orphan: no parent, no children, and zero connections\n return !parentId && !hasChildren.has(normalizedId) && itemCount === 0;\n })\n .map(t => {\n const id = t['ID'] as string;\n const normalizedId = NormalizeUUID(id);\n const itemCount = tagItemCounts.get(normalizedId) ?? 0;\n return {\n ID: id,\n Name: (t['Name'] as string) ?? 'Unnamed',\n UsageCount: itemCount,\n AvgWeight: tagAvgWeights.get(normalizedId) ?? 0,\n FirstSeen: this.formatShortDate((t['__mj_CreatedAt'] as string) ?? ''),\n LastSeen: this.formatShortDate((t['__mj_UpdatedAt'] as string) ?? ''),\n IsSelected: false\n };\n })\n .sort((a, b) => a.UsageCount - b.UsageCount);\n }\n\n public ToggleOrphanSelection(orphan: TaxOrphanCard): void {\n orphan.IsSelected = !orphan.IsSelected;\n this.TaxAllOrphansSelected = this.TaxOrphans.every(o => o.IsSelected);\n this.cdr.detectChanges();\n }\n\n public ToggleAllOrphans(): void {\n this.TaxAllOrphansSelected = !this.TaxAllOrphansSelected;\n for (const o of this.TaxOrphans) {\n o.IsSelected = this.TaxAllOrphansSelected;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Clean up TagCoOccurrence records that reference a tag before deleting it.\n * Without this, the FK constraint on TagCoOccurrence blocks the delete.\n */\n private async cleanupTagReferences(tagId: string): Promise<void> {\n const rv = new RunView();\n const coOccResult = await rv.RunView<BaseEntity>({\n EntityName: 'MJ: Tag Co Occurrences',\n ExtraFilter: `TagAID='${tagId}' OR TagBID='${tagId}'`,\n ResultType: 'entity_object'\n });\n if (coOccResult.Success) {\n for (const coOcc of coOccResult.Results) {\n await coOcc.Delete();\n }\n }\n }\n\n public DeleteOrphan(orphan: TaxOrphanCard): void {\n this.OpenConfirmDialog(\n 'Delete Orphan Tag',\n `Delete orphan tag \"${orphan.Name}\"?`,\n async () => {\n try {\n await this.cleanupTagReferences(orphan.ID);\n const md = new Metadata();\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: orphan.ID }]));\n const deleted = await entity.Delete();\n if (deleted) {\n this.addTaxAuditEntry('deleted', orphan.Name);\n MJNotificationService.Instance.CreateSimpleNotification('Orphan tag deleted', 'success', 2500);\n this.TaxOrphans = this.TaxOrphans.filter(o => !UUIDsEqual(o.ID, orphan.ID));\n this.TaxHealth.Orphaned = this.TaxOrphans.length;\n this.cdr.detectChanges();\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n );\n }\n\n public BulkDeleteOrphans(): void {\n const selected = this.TaxOrphans.filter(o => o.IsSelected);\n if (selected.length === 0) return;\n\n this.OpenConfirmDialog(\n 'Bulk Delete Orphan Tags',\n `Delete ${selected.length} selected orphan tag${selected.length > 1 ? 's' : ''}? This cannot be undone.`,\n async () => {\n const md = new Metadata();\n let deletedCount = 0;\n for (const orphan of selected) {\n try {\n await this.cleanupTagReferences(orphan.ID);\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: orphan.ID }]));\n if (await entity.Delete()) {\n deletedCount++;\n this.addTaxAuditEntry('deleted', orphan.Name);\n }\n } catch {\n // continue with remaining\n }\n }\n\n MJNotificationService.Instance.CreateSimpleNotification(`Deleted ${deletedCount} tags`, 'success', 3000);\n this.TaxOrphans = this.TaxOrphans.filter(o => !o.IsSelected);\n this.TaxHealth.Orphaned = this.TaxOrphans.length;\n this.TaxAllOrphansSelected = false;\n this.cdr.detectChanges();\n }\n );\n }\n\n /** Delete all orphan tags at once with a styled confirmation dialog */\n public DeleteAllOrphans(): void {\n if (this.TaxOrphans.length === 0) return;\n this.OpenConfirmDialog(\n 'Delete All Orphaned Tags',\n `Delete all ${this.TaxOrphans.length} orphaned tag${this.TaxOrphans.length > 1 ? 's' : ''}? This cannot be undone.`,\n async () => {\n const md = new Metadata();\n let deletedCount = 0;\n for (const orphan of this.TaxOrphans) {\n try {\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: orphan.ID }]));\n if (await entity.Delete()) {\n deletedCount++;\n this.addTaxAuditEntry('deleted', orphan.Name);\n }\n } catch {\n // continue with remaining\n }\n }\n\n MJNotificationService.Instance.CreateSimpleNotification(`Deleted ${deletedCount} orphan tags`, 'success', 3000);\n this.TaxOrphans = [];\n this.TaxHealth.Orphaned = 0;\n this.TaxAllOrphansSelected = false;\n this.cdr.detectChanges();\n }\n );\n }\n\n // ── Treemap ──\n\n private buildTaxTreemap(): void {\n // Build treemap cells from root-level tags, sized by item count\n const tagItemCounts = this.countItemsByTag();\n\n // Group tags by root parent\n const rootGroups = new Map<string, { Name: string; TotalItems: number }>();\n for (const node of this.TaxTreeNodes) {\n rootGroups.set(node.ID, { Name: node.Name, TotalItems: node.ItemCount });\n }\n\n const colorFamilies = ['at-tm-blue', 'at-tm-green', 'at-tm-purple', 'at-tm-orange'];\n const cells: TaxTreemapCell[] = [];\n let colorIdx = 0;\n\n // For each root, add children as cells\n for (const root of this.TaxTreeNodes) {\n const family = colorFamilies[colorIdx % colorFamilies.length];\n let shadeIdx = 1;\n\n // Add root children (or the root itself if it has no children)\n const childNodes = root.Children.length > 0 ? root.Children : [root];\n const sortedChildren = [...childNodes].sort((a, b) => b.ItemCount - a.ItemCount);\n\n for (const child of sortedChildren.slice(0, 4)) {\n cells.push({\n ID: child.ID,\n Name: child.Name,\n ItemCount: child.ItemCount,\n ColorClass: `${family}-${shadeIdx}`,\n RowSpan: child.ItemCount > 10 ? 2 : 1\n });\n shadeIdx++;\n }\n colorIdx++;\n }\n\n this.TaxTreemapCells = cells;\n\n // KPIs\n const totalTags = this.tagsRaw.length;\n const maxDepth = this.TaxFlatNodes.length > 0\n ? Math.max(...this.TaxFlatNodes.map(n => n.Depth))\n : 0;\n const avgDepth = this.TaxFlatNodes.length > 0\n ? (this.TaxFlatNodes.reduce((sum, n) => sum + n.Depth, 0) / this.TaxFlatNodes.length).toFixed(1)\n : '0';\n const mostUsed = this.TaxFlatNodes.length > 0\n ? [...this.TaxFlatNodes].sort((a, b) => b.ItemCount - a.ItemCount)[0]?.Name ?? 'None'\n : 'None';\n\n this.TaxTreemapKPIs = [\n { Label: 'Total Tags', Value: String(totalTags) },\n { Label: 'Avg Depth', Value: avgDepth },\n { Label: 'Max Depth', Value: String(maxDepth) },\n { Label: 'Most Used Tag', Value: mostUsed }\n ];\n }\n\n // ── Audit Log ──\n\n /**\n * Builds the audit timeline from the MJ: Tag Audit Logs entity.\n * Falls back to synthesizing \"created\" events from tag creation dates\n * if no real audit log records exist yet.\n */\n private buildTaxAuditLog(): void {\n if (this.tagAuditLogsRaw.length > 0) {\n this.TaxAuditEvents = this.buildAuditEventsFromLogs();\n } else {\n this.TaxAuditEvents = this.synthesizeAuditEventsFromTags();\n }\n }\n\n /**\n * Maps real Tag Audit Log records into TaxAuditEvent objects.\n * Uses the view's denormalized Tag, PerformedByUser, and RelatedTag fields.\n */\n private buildAuditEventsFromLogs(): TaxAuditEvent[] {\n const events: TaxAuditEvent[] = [];\n\n for (const log of this.tagAuditLogsRaw) {\n const action = (log['Action'] as string) ?? '';\n const type = this.mapAuditActionToType(action);\n if (!type) continue;\n\n const tagName = (log['Tag'] as string) ?? 'Unknown';\n const relatedTag = (log['RelatedTag'] as string) ?? '';\n const user = (log['PerformedByUser'] as string) ?? 'System';\n const createdAt = (log['__mj_CreatedAt'] as string) ?? '';\n const details = this.parseAuditDetails(log['Details'] as string | null);\n\n events.push({\n Type: type,\n Description: this.buildAuditDescription(type, tagName, relatedTag, details),\n TagRef: tagName,\n User: user,\n Timestamp: this.formatDate(createdAt),\n DayHeader: this.formatDayHeader(createdAt)\n });\n }\n\n return events;\n }\n\n /**\n * Synthesizes audit events from tag __mj_CreatedAt dates when no\n * real audit log records exist. Used as a fallback only.\n */\n private synthesizeAuditEventsFromTags(): TaxAuditEvent[] {\n const events: TaxAuditEvent[] = [];\n for (const tag of this.tagsRaw) {\n const name = (tag['Name'] as string) ?? 'Unnamed';\n const createdAt = tag['__mj_CreatedAt'] as string;\n if (createdAt) {\n events.push({\n Type: 'created',\n Description: 'Tag created',\n TagRef: name,\n User: 'System',\n Timestamp: this.formatDate(createdAt),\n DayHeader: this.formatDayHeader(createdAt)\n });\n }\n }\n events.sort((a, b) => b.Timestamp.localeCompare(a.Timestamp));\n return events.slice(0, 50);\n }\n\n /**\n * Maps a PascalCase DB Action value (e.g. \"Renamed\") to the lowercase\n * TaxAuditAction type used in the UI. Returns null for unrecognized values.\n */\n private mapAuditActionToType(action: string): TaxAuditAction | null {\n const mapped = action.toLowerCase() as TaxAuditAction;\n const validTypes: Set<string> = new Set<string>([\n 'created', 'merged', 'moved', 'deleted', 'renamed',\n 'deprecated', 'descriptionchanged', 'reactivated', 'split'\n ]);\n return validTypes.has(mapped) ? mapped : null;\n }\n\n /**\n * Safely parses the JSON Details column from a Tag Audit Log record.\n * Returns an empty object on parse failure.\n */\n private parseAuditDetails(details: string | null): Record<string, string> {\n if (!details) return {};\n try {\n return JSON.parse(details) as Record<string, string>;\n } catch {\n return {};\n }\n }\n\n /**\n * Builds a human-readable description for an audit event based on the\n * action type and any additional context from the related tag or details JSON.\n */\n private buildAuditDescription(type: TaxAuditAction, tagName: string, relatedTag: string, details: Record<string, string>): string {\n switch (type) {\n case 'created':\n return 'Tag created';\n case 'renamed': {\n const oldName = details['OldName'];\n return oldName ? `Renamed from \"${oldName}\"` : 'Tag renamed';\n }\n case 'moved': {\n return 'Tag moved to new parent';\n }\n case 'merged':\n return relatedTag ? `Merged into \"${relatedTag}\"` : 'Tags merged';\n case 'split':\n return relatedTag ? `Split from \"${relatedTag}\"` : 'Tag split';\n case 'deleted':\n return 'Tag deleted';\n case 'deprecated':\n return 'Tag deprecated';\n case 'reactivated':\n return 'Tag reactivated';\n case 'descriptionchanged':\n return 'Description updated';\n default:\n return `Tag ${type}`;\n }\n }\n\n /**\n * Adds a local-only audit entry to the top of the timeline for\n * immediate UI feedback after a user action (merge, delete, etc.).\n */\n private addTaxAuditEntry(type: TaxAuditAction, tagRef: string): void {\n const now = new Date().toISOString();\n this.TaxAuditEvents.unshift({\n Type: type,\n Description: this.buildAuditDescription(type, tagRef, '', {}),\n TagRef: tagRef,\n User: 'You',\n Timestamp: this.formatDate(now),\n DayHeader: 'Today'\n });\n }\n\n public ToggleTaxAuditFilter(type: string): void {\n if (this.TaxAuditFilterTypes.has(type)) {\n this.TaxAuditFilterTypes.delete(type);\n } else {\n this.TaxAuditFilterTypes.add(type);\n }\n this.cdr.detectChanges();\n }\n\n public GetFilteredAuditEvents(): TaxAuditEvent[] {\n return this.TaxAuditEvents.filter(e => this.TaxAuditFilterTypes.has(e.Type));\n }\n\n private formatDayHeader(dateStr: string): string {\n try {\n const d = new Date(dateStr);\n const today = new Date();\n const yesterday = new Date(today);\n yesterday.setDate(yesterday.getDate() - 1);\n\n if (d.toDateString() === today.toDateString()) return 'Today';\n if (d.toDateString() === yesterday.toDateString()) return 'Yesterday';\n return d.toLocaleDateString('en-US', { weekday: 'long', month: 'long', day: 'numeric', year: 'numeric' });\n } catch {\n return '';\n }\n }\n\n // ── Health Stats ──\n\n private buildTaxHealth(): void {\n const total = this.tagsRaw.length;\n const orphaned = this.TaxOrphans.length;\n const duplicates = this.TaxDuplicates.length;\n const needAttention = this.TaxFlatNodes.filter(n => n.HealthColor === 'yellow').length;\n const healthy = total - orphaned - needAttention;\n\n this.TaxHealth = { Total: total, Healthy: Math.max(0, healthy), NeedAttention: needAttention, Orphaned: orphaned, Duplicates: duplicates };\n }\n\n /** Returns the Font Awesome icon class for an audit event action type. */\n public GetTaxAuditIcon(type: string): string {\n const map: Record<string, string> = {\n 'created': 'fa-solid fa-plus',\n 'merged': 'fa-solid fa-code-merge',\n 'moved': 'fa-solid fa-arrows-up-down',\n 'deleted': 'fa-solid fa-trash',\n 'renamed': 'fa-solid fa-pen',\n 'deprecated': 'fa-solid fa-ban',\n 'descriptionchanged': 'fa-solid fa-file-pen',\n 'reactivated': 'fa-solid fa-rotate-left',\n 'split': 'fa-solid fa-code-branch'\n };\n return map[type] ?? 'fa-solid fa-circle';\n }\n\n // ── Confirmation Dialog ──\n\n /** Opens a styled confirmation dialog, replacing browser `confirm()`. */\n public OpenConfirmDialog(title: string, message: string, action: () => Promise<void>): void {\n this.ConfirmDialogTitle = title;\n this.ConfirmDialogMessage = message;\n this.confirmDialogAction = action;\n this.ShowConfirmDialog = true;\n this.cdr.detectChanges();\n }\n\n /** User confirmed the dialog action */\n public async ConfirmDialogAccept(): Promise<void> {\n this.ShowConfirmDialog = false;\n if (this.confirmDialogAction) {\n await this.confirmDialogAction();\n }\n this.confirmDialogAction = null;\n this.cdr.detectChanges();\n }\n\n /** User cancelled the confirmation dialog */\n public ConfirmDialogCancel(): void {\n this.ShowConfirmDialog = false;\n this.confirmDialogAction = null;\n this.cdr.detectChanges();\n }\n\n // ── Split Dialog ──\n\n /** Opens the split-tag dialog for a given tree node */\n public OpenSplitDialog(node: TaxTreeNode): void {\n this.splitTargetNode = node;\n this.SplitChildNames = '';\n this.ShowSplitDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Closes the split-tag dialog without action */\n public CloseSplitDialog(): void {\n this.ShowSplitDialog = false;\n this.splitTargetNode = null;\n this.SplitChildNames = '';\n this.cdr.detectChanges();\n }\n\n /** Executes the split operation, creating child tags from comma-separated names */\n public async ExecuteSplit(): Promise<void> {\n if (!this.splitTargetNode || !this.SplitChildNames.trim()) return;\n const names = this.SplitChildNames.split(',')\n .map(n => n.trim())\n .filter(n => n.length > 0);\n if (names.length === 0) return;\n\n this.ShowSplitDialog = false;\n const nodeName = this.splitTargetNode.Name;\n const parentId = this.splitTargetNode.ParentID;\n\n try {\n const md = new Metadata();\n for (const name of names) {\n const entity = await md.GetEntityObject<BaseEntity>('MJ: Tags');\n entity.NewRecord();\n entity.Set('Name', name);\n entity.Set('DisplayName', name);\n entity.Set('ParentID', parentId);\n await entity.Save();\n }\n\n this.addTaxAuditEntry('split', `${nodeName} into ${names.join(', ')}`);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Split \"${nodeName}\" into ${names.length} new tags`, 'success', 3000\n );\n await this.RefreshTaxonomyData();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Split error: ${msg}`, 'error', 4000);\n }\n this.splitTargetNode = null;\n this.SplitChildNames = '';\n this.cdr.detectChanges();\n }\n\n // ── Move Dialog ──\n\n /** Opens the move-tag dialog for a given tree node */\n public OpenMoveDialog(node: TaxTreeNode): void {\n this.moveTargetNode = node;\n this.MoveNewParentID = node.ParentID;\n this.ShowMoveDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Closes the move-tag dialog without action */\n public CloseMoveDialog(): void {\n this.ShowMoveDialog = false;\n this.moveTargetNode = null;\n this.MoveNewParentID = null;\n this.cdr.detectChanges();\n }\n\n /** Returns flat list of tags eligible as move targets (excludes the node being moved and its descendants) */\n public GetMoveTargetOptions(): { ID: string; Name: string; Depth: number }[] {\n if (!this.moveTargetNode) return [];\n const excludeIds = this.collectDescendantIds(this.moveTargetNode);\n excludeIds.add(NormalizeUUID(this.moveTargetNode.ID));\n\n return this.TaxFlatNodes\n .filter(n => !excludeIds.has(NormalizeUUID(n.ID)))\n .map(n => ({ ID: n.ID, Name: n.Name, Depth: n.Depth }));\n }\n\n /** Collects IDs of all descendants of a node */\n private collectDescendantIds(node: TaxTreeNode): Set<string> {\n const ids = new Set<string>();\n for (const child of node.Children) {\n ids.add(NormalizeUUID(child.ID));\n for (const id of this.collectDescendantIds(child)) {\n ids.add(id);\n }\n }\n return ids;\n }\n\n /** Executes the move operation */\n public async ExecuteMove(): Promise<void> {\n if (!this.moveTargetNode) return;\n const newParent = this.MoveNewParentID;\n this.ShowMoveDialog = false;\n\n await this.MoveTag(this.moveTargetNode, newParent);\n this.moveTargetNode = null;\n this.MoveNewParentID = null;\n this.cdr.detectChanges();\n }\n\n // ── Merge Into Dialog ──\n\n public OpenMergeIntoDialog(node: TaxTreeNode): void {\n this.MergeSourceTag = node;\n this.MergeTargetID = null;\n this.MergeTargetData = this.GetMergeTargetOptions().map(o => ({\n ID: o.ID,\n Label: `${' '.repeat(o.Depth)}${o.Name} (${o.ItemCount})`\n }));\n this.ShowMergeIntoDialog = true;\n this.cdr.detectChanges();\n }\n\n public OnMergeTargetSelected(value: unknown): void {\n this.MergeTargetID = value != null ? String(value) : null;\n }\n\n public CloseMergeIntoDialog(): void {\n this.ShowMergeIntoDialog = false;\n this.MergeSourceTag = null;\n this.MergeTargetID = null;\n this.cdr.detectChanges();\n }\n\n /** Returns flat list of tags eligible as merge targets (excludes the source tag) */\n public GetMergeTargetOptions(): { ID: string; Name: string; Depth: number; ItemCount: number }[] {\n if (!this.MergeSourceTag) return [];\n const sourceNormalized = NormalizeUUID(this.MergeSourceTag.ID);\n\n return this.TaxFlatNodes\n .filter(n => NormalizeUUID(n.ID) !== sourceNormalized)\n .map(n => ({ ID: n.ID, Name: n.Name, Depth: n.Depth, ItemCount: n.ItemCount }));\n }\n\n public async ExecuteMergeInto(): Promise<void> {\n if (!this.MergeSourceTag || !this.MergeTargetID) return;\n const targetNode = this.TaxFlatNodes.find(n => UUIDsEqual(n.ID, this.MergeTargetID!));\n const targetName = targetNode?.Name ?? 'Unknown';\n const sourceName = this.MergeSourceTag.Name;\n const sourceId = this.MergeSourceTag.ID;\n const targetId = this.MergeTargetID;\n\n this.ShowMergeIntoDialog = false;\n await this.MergeTags(sourceId, targetId, sourceName, targetName);\n this.MergeSourceTag = null;\n this.MergeTargetID = null;\n }\n\n // ── Treemap Drill-In ──\n\n /** Opens treemap drill-in panel for the given cell */\n public OpenTreemapDrillIn(cell: TaxTreemapCell): void {\n const node = this.TaxFlatNodes.find(n => UUIDsEqual(n.ID, cell.ID));\n if (node) {\n this.TreemapDrillInNode = node;\n this.ShowTreemapDrillIn = true;\n this.loadRecentItemsForTag(node);\n this.cdr.detectChanges();\n }\n }\n\n /** Closes treemap drill-in panel */\n public CloseTreemapDrillIn(): void {\n this.ShowTreemapDrillIn = false;\n this.TreemapDrillInNode = null;\n this.cdr.detectChanges();\n }\n\n /** Navigate from treemap drill-in to the tag in the tree view */\n public DrillInToTreeView(node: TaxTreeNode): void {\n this.CloseTreemapDrillIn();\n this.SwitchTaxSubTab('tree');\n this.SelectTaxNode(node);\n }\n\n public async RefreshTaxonomyData(): Promise<void> {\n this.tabDataLoaded.delete('taxonomy');\n await this.loadTaxonomyData();\n this.cdr.detectChanges();\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 = new RunView();\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 = new RunView();\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 = new Metadata();\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 = new Metadata();\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\n// ================================================================\n// Cron-to-Human-Readable Utility\n// ================================================================\n\n/**\n * Converts a 5-part or 6-part cron expression to a human-readable English string.\n *\n * Handles common patterns:\n * `0 * * * *` -> \"Every hour\"\n * `0 2 * * *` -> \"Daily at 2:00 AM\"\n * `0 2 * * 1` -> \"Weekly on Monday at 2:00 AM\"\n * `star/15 * * * *` -> \"Every 15 minutes\" (where star = asterisk)\n * `0 0 1 * *` -> \"Monthly on day 1 at 12:00 AM\"\n *\n * Falls back to returning the raw cron string for unrecognized patterns.\n *\n * @param cron A cron expression string (5 or 6 parts)\n * @returns A human-readable description or the raw cron if unrecognized\n */\nexport function CronToHumanReadable(cron: string): string {\n if (!cron) return 'No schedule';\n\n const parts = cron.trim().split(/\\s+/);\n const p = parseCronParts(parts);\n if (!p) return cron;\n\n return formatCronParts(p) ?? cron;\n}\n\n/** Internal cron field tuple */\ninterface CronFields {\n Minute: string;\n Hour: string;\n DayOfMonth: string;\n Month: string;\n DayOfWeek: string;\n}\n\n/**\n * Parses 5-part or 6-part cron expressions into normalized fields.\n * 6-part expressions have a leading seconds field that is discarded.\n */\nfunction parseCronParts(parts: string[]): CronFields | null {\n if (parts.length === 5) {\n return { Minute: parts[0], Hour: parts[1], DayOfMonth: parts[2], Month: parts[3], DayOfWeek: parts[4] };\n }\n if (parts.length === 6) {\n return { Minute: parts[1], Hour: parts[2], DayOfMonth: parts[3], Month: parts[4], DayOfWeek: parts[5] };\n }\n return null;\n}\n\n/**\n * Attempts to map parsed cron fields to a human-readable string.\n * Returns null when the pattern is not recognized.\n */\nfunction formatCronParts(p: CronFields): string | null {\n // Every N minutes: */N * * * *\n if (p.Minute.startsWith('*/') && p.Hour === '*' && p.DayOfMonth === '*' && p.Month === '*' && p.DayOfWeek === '*') {\n const interval = parseInt(p.Minute.slice(2), 10);\n if (interval === 1) return 'Every minute';\n return `Every ${interval} minutes`;\n }\n\n // Every hour at minute M: M * * * *\n if (!p.Minute.includes('*') && !p.Minute.includes('/') && p.Hour === '*' && p.DayOfMonth === '*' && p.Month === '*' && p.DayOfWeek === '*') {\n return 'Every hour';\n }\n\n // Every N hours: 0 */N * * *\n if (!p.Minute.includes('*') && !p.Minute.includes('/') && p.Hour.startsWith('*/') && p.DayOfMonth === '*') {\n const interval = parseInt(p.Hour.slice(2), 10);\n if (interval === 1) return 'Every hour';\n return `Every ${interval} hours`;\n }\n\n // Specific hour + minute with wildcard or specific day fields\n if (!p.Minute.includes('*') && !p.Minute.includes('/') &&\n !p.Hour.includes('*') && !p.Hour.includes('/') &&\n p.Month === '*') {\n\n const hour = parseInt(p.Hour, 10);\n const minute = parseInt(p.Minute, 10);\n const timeStr = formatTimeOfDay(hour, minute);\n\n // Weekly: specific day of week\n if (p.DayOfWeek !== '*' && p.DayOfMonth === '*') {\n const dayName = dayOfWeekToName(p.DayOfWeek);\n return `Weekly on ${dayName} at ${timeStr}`;\n }\n\n // Monthly: specific day of month\n if (p.DayOfMonth !== '*' && p.DayOfWeek === '*') {\n return `Monthly on day ${p.DayOfMonth} at ${timeStr}`;\n }\n\n // Daily\n if (p.DayOfMonth === '*' && p.DayOfWeek === '*') {\n return `Daily at ${timeStr}`;\n }\n }\n\n return null;\n}\n\n/** Formats hour and minute to 12-hour AM/PM time string */\nfunction formatTimeOfDay(hour: number, minute: number): string {\n const ampm = hour >= 12 ? 'PM' : 'AM';\n const h = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;\n const m = minute.toString().padStart(2, '0');\n return `${h}:${m} ${ampm}`;\n}\n\n/** Maps day-of-week cron values (0-7 or SUN-SAT) to English names */\nfunction dayOfWeekToName(dow: string): string {\n const names: Record<string, string> = {\n '0': 'Sunday', '1': 'Monday', '2': 'Tuesday',\n '3': 'Wednesday', '4': 'Thursday', '5': 'Friday',\n '6': 'Saturday', '7': 'Sunday',\n 'SUN': 'Sunday', 'MON': 'Monday', 'TUE': 'Tuesday',\n 'WED': 'Wednesday', 'THU': 'Thursday', 'FRI': 'Friday',\n 'SAT': 'Saturday',\n };\n return names[dow.toUpperCase()] ?? dow;\n}\n","<!-- Content Classification Dashboard -->\n<div class=\"at-dashboard\">\n\n <!-- ══════ LEFT NAV ══════ -->\n <div class=\"at-left-nav\">\n <div class=\"at-left-nav-header\">\n <h2><i class=\"fa-solid fa-tags\"></i> Classify</h2>\n </div>\n <div class=\"at-left-nav-items\">\n @for (item of NavItems; track item.Tab) {\n <div class=\"at-nav-item\" [class.active]=\"ActiveTab === item.Tab\" (click)=\"SwitchTab(item.Tab)\">\n <i [class]=\"item.Icon\"></i> {{ item.Label }}\n @if (item.BadgeText) {\n <span class=\"at-nav-badge\" [class.at-nav-badge-live]=\"item.BadgeClass === 'nav-badge-live'\">{{ item.BadgeText }}</span>\n }\n </div>\n }\n <div class=\"at-nav-divider\"></div>\n <div class=\"at-nav-item\" [class.active]=\"ActiveTab === 'history'\" (click)=\"SwitchTab('history')\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i> Run History\n </div>\n </div>\n <div class=\"at-left-nav-footer\">\n <button class=\"at-run-pipeline-btn\" (click)=\"RunPipeline()\" [disabled]=\"IsRunning\">\n @if (IsRunning) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Running...\n } @else {\n <i class=\"fa-solid fa-play\"></i> Run Pipeline\n }\n </button>\n </div>\n </div>\n\n <!-- ══════ MAIN AREA ══════ -->\n <div class=\"at-main-area\">\n\n @if (IsLoading) {\n <div class=\"at-loading-overlay\">\n <mj-loading text=\"Loading autotagging data...\"></mj-loading>\n </div>\n }\n\n @if (!IsLoading) {\n\n <!-- ════════════════════════════════════════════ -->\n <!-- TAB 1: PIPELINE MONITOR -->\n <!-- ════════════════════════════════════════════ -->\n @if (ActiveTab === 'pipeline') {\n <div class=\"at-page-header\">\n <div>\n <div class=\"at-page-title\">Pipeline Monitor</div>\n <div class=\"at-page-subtitle\">Real-time processing status and recent activity</div>\n </div>\n <div class=\"at-page-actions\">\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"LoadPipelineData()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n </div>\n </div>\n <div class=\"at-page-body\">\n <!-- KPIs -->\n <div class=\"at-kpi-strip\">\n @for (kpi of KPIMetrics; track kpi.Label) {\n <div class=\"at-kpi-card\">\n <div class=\"at-kpi-value\" [class.at-kpi-error-value]=\"kpi.Label === 'Errors' && kpi.Value > 0\">{{ kpi.Value | number }}</div>\n <div class=\"at-kpi-label\">{{ kpi.Label }}</div>\n @if (kpi.Trend) {\n <div class=\"at-kpi-trend\" [class.up]=\"kpi.TrendUp\">\n @if (kpi.TrendUp) { <i class=\"fa-solid fa-arrow-up\"></i> }\n {{ kpi.Trend }}\n </div>\n }\n </div>\n }\n </div>\n\n <div class=\"at-pipeline-layout\">\n <div class=\"at-pipeline-center\">\n <!-- Pipeline stages visualization (only during active run) -->\n @if (PipelineStages.length > 0 && (IsRunning || IsPaused)) {\n <div class=\"at-pipeline-stages\">\n @for (stage of PipelineStages; track stage.Name; let last = $last) {\n <div class=\"at-pipeline-stage\"\n [class.stage-idle]=\"stage.Status === 'idle'\"\n [class.stage-active]=\"stage.Status === 'active'\"\n [class.stage-complete]=\"stage.Status === 'complete'\">\n <div class=\"at-pipeline-stage-icon\">\n @if (stage.Status === 'active') {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else if (stage.Status === 'complete') {\n <i class=\"fa-solid fa-check\"></i>\n } @else {\n <i [class]=\"stage.Icon\"></i>\n }\n </div>\n <div class=\"at-pipeline-stage-name\">{{ stage.Name }}</div>\n </div>\n @if (!last) {\n <div class=\"at-stage-connector\"\n [class.connector-complete]=\"stage.Status === 'complete'\">\n </div>\n }\n }\n </div>\n }\n\n <!-- Progress bar (visible during run or paused) -->\n @if (IsRunning || IsPaused) {\n <div class=\"at-progress-section\">\n <div class=\"at-progress-header\">\n <span class=\"at-progress-stage-label\">{{ RunStage }}</span>\n <span class=\"at-progress-pct\">{{ RunProgress | number:'1.0-0' }}%</span>\n </div>\n <div class=\"at-progress-bar\"><div class=\"at-progress-fill\" [style.width.%]=\"RunProgress\" [class.at-progress-fill-paused]=\"IsPaused\"></div></div>\n @if (RunCurrentItem) {\n <div class=\"at-progress-current\">{{ RunCurrentItem }}</div>\n }\n <div class=\"at-pipeline-controls\">\n @if (IsRunning && !IsPaused) {\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"PausePipeline()\" [disabled]=\"!CurrentProcessRunID\">\n <i class=\"fa-solid fa-pause\"></i> Pause\n </button>\n }\n @if (IsPaused) {\n <button class=\"at-action-btn at-primary-btn\" (click)=\"ResumePipeline()\">\n <i class=\"fa-solid fa-play\"></i> Resume\n </button>\n }\n <button class=\"at-action-btn at-danger-btn\" (click)=\"CancelPipeline()\">\n <i class=\"fa-solid fa-stop\"></i> Cancel\n </button>\n </div>\n </div>\n }\n\n <!-- D2: Live Per-Source Progress (visible during run) -->\n @if (IsRunning && LiveRunDetailRows.length > 0) {\n <div class=\"at-card\" style=\"margin-bottom: 12px;\">\n <div class=\"at-card-header\">\n <span class=\"at-card-title\"><i class=\"fa-solid fa-list-check\"></i> Per-Source Progress</span>\n <button class=\"at-action-btn at-secondary-btn\" style=\"font-size: 11px; padding: 3px 8px;\" (click)=\"LoadLiveRunDetails()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n </button>\n </div>\n <div class=\"at-card-body\" style=\"max-height: 200px; overflow-y: auto;\">\n <table class=\"at-run-table\">\n <thead>\n <tr>\n <th>Source</th>\n <th>Status</th>\n <th>Items</th>\n <th>Tagged</th>\n <th>Vectorized</th>\n <th>Errors</th>\n </tr>\n </thead>\n <tbody>\n @for (row of LiveRunDetailRows; track row.SourceName) {\n <tr>\n <td class=\"at-run-source-name\">{{ row.SourceName }}</td>\n <td>\n <span class=\"at-run-status-badge\" [class]=\"row.StatusClass\">\n @if (row.StatusClass === 'running') {\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 0.55rem\"></i>\n }\n {{ row.Status }}\n </span>\n </td>\n <td>{{ row.ItemsProcessed }}</td>\n <td>{{ row.ItemsTagged }}</td>\n <td>{{ row.ItemsVectorized }}</td>\n <td [class.run-error-text]=\"row.ErrorCount > 0\">{{ row.ErrorCount }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n\n <!-- Recent Processing Feed -->\n <div class=\"at-card at-feed-card\">\n <div class=\"at-card-header\">\n <span class=\"at-card-title\"><i class=\"fa-solid fa-bolt\"></i> Recent Processing</span>\n <div class=\"at-feed-header-actions\">\n <button class=\"at-feed-sort-btn\" (click)=\"ToggleFeedSort()\"\n [title]=\"FeedSortOrder === 'newest' ? 'Showing newest first' : 'Showing oldest first'\">\n <i class=\"fa-solid\" [class.fa-arrow-down-short-wide]=\"FeedSortOrder === 'newest'\"\n [class.fa-arrow-up-short-wide]=\"FeedSortOrder === 'oldest'\"></i>\n {{ FeedSortOrder === 'newest' ? 'Newest' : 'Oldest' }}\n </button>\n <span class=\"at-feed-count\">{{ FilteredFeedItems.length }} items</span>\n </div>\n </div>\n <!-- Feed search bar -->\n <div class=\"at-feed-search-bar\">\n <i class=\"fa-solid fa-search at-feed-search-icon\"></i>\n <input type=\"text\"\n class=\"mj-input at-feed-search-input\"\n placeholder=\"Search items, sources, or tags...\"\n [(ngModel)]=\"FeedSearchQuery\"\n (input)=\"OnFeedSearchChange()\">\n @if (FeedSearchQuery) {\n <button class=\"at-feed-search-clear\" (click)=\"FeedSearchQuery = ''; OnFeedSearchChange()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n <div class=\"at-card-body at-feed-scroll-body\">\n @if (FilteredFeedItems.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n @if (FeedSearchQuery) {\n <p>No items match \"{{ FeedSearchQuery }}\"</p>\n } @else {\n <p>No processed items yet.</p>\n }\n </div>\n }\n @for (item of PaginatedFeedItems; track item.Name + item.SourceName + item.TimeAgo) {\n <div class=\"at-feed-item at-feed-item-clickable\" (click)=\"OpenFeedItemDetail(GetFeedItemOriginalIndex(item))\">\n <div class=\"at-feed-status-dot\" [class]=\"item.Status\"></div>\n <div class=\"at-feed-item-content\">\n <span class=\"at-feed-item-name\">{{ item.Name }}</span>\n <span class=\"at-feed-item-source-label\">{{ item.SourceName }}</span>\n </div>\n <div class=\"at-feed-item-tags\">\n @for (tag of item.Tags; track tag) {\n <span class=\"at-feed-tag\">{{ tag }}</span>\n }\n </div>\n <span class=\"at-feed-item-time\">{{ item.TimeAgo }}</span>\n </div>\n }\n </div>\n <!-- Feed pagination -->\n @if (FeedTotalPages > 1) {\n <div class=\"at-feed-pagination\">\n <button class=\"at-action-btn at-secondary-btn\" [disabled]=\"FeedPage === 0\" (click)=\"FeedPrevPage()\">\n <i class=\"fa-solid fa-chevron-left\"></i>\n </button>\n <span class=\"at-feed-pagination-label\">Page {{ FeedPage + 1 }} of {{ FeedTotalPages }}</span>\n <button class=\"at-action-btn at-secondary-btn\" [disabled]=\"FeedPage >= FeedTotalPages - 1\" (click)=\"FeedNextPage()\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </button>\n </div>\n }\n </div>\n </div>\n\n <!-- Right sidebar -->\n <div class=\"at-pipeline-right\">\n <!-- Sources Quick List -->\n <div class=\"at-card\">\n <div class=\"at-card-header\">\n <span class=\"at-card-title\"><i class=\"fa-solid fa-database\"></i> Sources</span>\n </div>\n <div class=\"at-card-body\">\n @for (source of SourceMinis; track source.ID) {\n <div class=\"at-source-mini\">\n <div class=\"at-source-mini-icon\"><i [class]=\"source.Icon\"></i></div>\n <div class=\"at-source-mini-info\">\n <div class=\"at-source-mini-name\">{{ source.Name }}</div>\n <div class=\"at-source-mini-meta\">{{ source.Meta }}</div>\n </div>\n <div class=\"at-source-mini-status\" [class]=\"source.StatusClass\"></div>\n </div>\n }\n </div>\n </div>\n <!-- Trending Tags -->\n <div class=\"at-card at-tag-cloud-card\">\n <div class=\"at-card-title\" style=\"margin-bottom: 10px;\"><i class=\"fa-solid fa-chart-bar\"></i> Trending Tags</div>\n <div class=\"at-tag-cloud\">\n @for (tag of TrendingTags; track tag.Tag) {\n <span class=\"at-tag-pill\" [class]=\"tag.SizeClass\"\n [style.opacity]=\"0.4 + tag.AvgWeight * 0.6\"\n [title]=\"'Weight: ' + tag.AvgWeight.toFixed(2)\">{{ tag.Tag }}</span>\n }\n </div>\n </div>\n\n <!-- Pipeline Settings Widget -->\n <div class=\"at-card at-config-card\">\n <div class=\"at-card-header\" (click)=\"TogglePipelineConfig()\" style=\"cursor:pointer\">\n <span class=\"at-card-title\"><i class=\"fa-solid fa-sliders\"></i> Pipeline Settings</span>\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!ShowPipelineConfig\" [class.fa-chevron-up]=\"ShowPipelineConfig\" style=\"font-size:0.7rem; color:var(--mj-text-muted)\"></i>\n </div>\n @if (ShowPipelineConfig) {\n <div class=\"at-card-body at-config-body\">\n <div class=\"at-config-row\">\n <label class=\"at-config-label\">Batch Size</label>\n <div class=\"at-config-control\">\n <input type=\"number\" class=\"at-config-input\" min=\"10\" max=\"1000\" step=\"10\"\n [(ngModel)]=\"PipelineConfig.Pipeline!.BatchSize\">\n </div>\n </div>\n <div class=\"at-config-row\">\n <label class=\"at-config-label\">Throttle (ms)</label>\n <div class=\"at-config-control\">\n <input type=\"range\" class=\"at-config-slider\" min=\"0\" max=\"5000\" step=\"100\"\n [(ngModel)]=\"PipelineConfig.Pipeline!.DelayBetweenBatchesMs\">\n <span class=\"at-config-value\">{{ PipelineConfig.Pipeline!.DelayBetweenBatchesMs }}ms</span>\n </div>\n </div>\n <div class=\"at-config-row\">\n <label class=\"at-config-label\">Error Tolerance</label>\n <div class=\"at-config-control\">\n <input type=\"range\" class=\"at-config-slider\" min=\"5\" max=\"50\" step=\"5\"\n [(ngModel)]=\"PipelineConfig.Pipeline!.ErrorThresholdPercent\">\n <span class=\"at-config-value\">{{ PipelineConfig.Pipeline!.ErrorThresholdPercent }}%</span>\n </div>\n </div>\n <div class=\"at-config-row\">\n <label class=\"at-config-label\">Auto-resume</label>\n <div class=\"at-config-control\">\n <label class=\"at-config-toggle\">\n <input type=\"checkbox\" [(ngModel)]=\"PipelineConfig.Pipeline!.ResumeFromLastBatch\">\n <span class=\"at-toggle-track\"><span class=\"at-toggle-thumb\"></span></span>\n </label>\n </div>\n </div>\n <div class=\"at-config-divider\"></div>\n <div class=\"at-config-section-label\">LLM Rate Limits</div>\n <div class=\"at-config-row\">\n <label class=\"at-config-label\">Requests/min</label>\n <div class=\"at-config-control\">\n <input type=\"number\" class=\"at-config-input\" min=\"1\" max=\"500\"\n [(ngModel)]=\"PipelineConfig.RateLimits!.LLM!.RequestsPerMinute\">\n </div>\n </div>\n <div class=\"at-config-row\">\n <label class=\"at-config-label\">Tokens/min</label>\n <div class=\"at-config-control\">\n <input type=\"number\" class=\"at-config-input\" min=\"1000\" max=\"5000000\" step=\"10000\"\n [(ngModel)]=\"PipelineConfig.RateLimits!.LLM!.TokensPerMinute\">\n <span class=\"at-config-value\">{{ FormatTokenCount(PipelineConfig.RateLimits!.LLM!.TokensPerMinute ?? 0) }}</span>\n </div>\n </div>\n <div class=\"at-config-section-label\">Embedding Rate Limits</div>\n <div class=\"at-config-row\">\n <label class=\"at-config-label\">Requests/min</label>\n <div class=\"at-config-control\">\n <input type=\"number\" class=\"at-config-input\" min=\"1\" max=\"1000\"\n [(ngModel)]=\"PipelineConfig.RateLimits!.Embedding!.RequestsPerMinute\">\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- ════════════════════════════════════════════ -->\n <!-- TAB 2: SOURCES -->\n <!-- ════════════════════════════════════════════ -->\n @if (ActiveTab === 'sources') {\n <div class=\"at-page-header\">\n <div>\n <div class=\"at-page-title\">Content Sources</div>\n <div class=\"at-page-subtitle\">Configure where content is ingested from</div>\n </div>\n <div class=\"at-page-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"OpenAddSourceForm()\">\n <i class=\"fa-solid fa-plus\"></i> Add Source\n </button>\n </div>\n </div>\n <div class=\"at-page-body\">\n <div class=\"at-sources-grid\">\n @for (card of SourceCards; track card.ID) {\n <div class=\"at-source-card-full at-source-card-clickable\" (click)=\"OpenSourceDetail(card)\">\n <div class=\"at-source-card-header\">\n <div class=\"at-source-card-icon\"><i [class]=\"card.Icon\"></i></div>\n <div>\n <div class=\"at-source-card-title\">{{ card.Name }}</div>\n <div class=\"at-source-card-type\">{{ card.SourceTypeName }}@if (card.RequiresFileType) { · {{ card.FileTypeName }}}</div>\n </div>\n <div class=\"at-source-card-status\" [class]=\"card.StatusClass\">\n <div class=\"at-source-mini-status\" [class]=\"card.StatusClass\"></div>\n {{ card.StatusLabel }}\n </div>\n </div>\n @if (card.URL) {\n <div class=\"at-source-card-url\">{{ card.URL }}</div>\n }\n <div class=\"at-source-card-stats\">\n <div class=\"at-source-stat\">\n <div class=\"at-source-stat-value\">{{ formatNumber(card.ItemCount) }}</div>\n <div class=\"at-source-stat-label\">Items</div>\n </div>\n <div class=\"at-source-stat\">\n <div class=\"at-source-stat-value\">{{ formatNumber(card.TagCount) }}</div>\n <div class=\"at-source-stat-label\">Tags</div>\n </div>\n <div class=\"at-source-stat\">\n <div class=\"at-source-stat-value\">{{ card.AvgTags }}</div>\n <div class=\"at-source-stat-label\">Avg Tags</div>\n </div>\n <div class=\"at-source-stat\">\n <div class=\"at-source-stat-value\">{{ card.LastRunAgo }}</div>\n <div class=\"at-source-stat-label\">Last Run</div>\n </div>\n </div>\n <!-- Schedule indicator -->\n @if (card.ScheduledActionID) {\n <div class=\"at-schedule-indicator\" (click)=\"RemoveSchedule(card); $event.stopPropagation()\" title=\"Click to remove schedule\">\n <i class=\"fa-regular fa-clock\"></i>\n <span>{{ GetScheduleLabel(card) }}</span>\n </div>\n }\n <div class=\"at-source-card-actions\">\n <button class=\"at-source-action-btn\" (click)=\"OpenEditSourceForm(card); $event.stopPropagation()\"><i class=\"fa-solid fa-pen\"></i> Edit</button>\n <button class=\"at-source-action-btn\" (click)=\"RunPipelineForSource(card.ID); $event.stopPropagation()\"><i class=\"fa-solid fa-play\"></i> Run</button>\n @if (!card.ScheduledActionID) {\n <button class=\"at-source-action-btn at-source-schedule-btn\" (click)=\"OpenScheduleDialog(card); $event.stopPropagation()\"><i class=\"fa-regular fa-clock\"></i> Schedule</button>\n }\n <button class=\"at-source-action-btn at-source-delete-btn\" (click)=\"DeleteSource(card); $event.stopPropagation()\"><i class=\"fa-solid fa-trash\"></i> Delete</button>\n </div>\n </div>\n }\n\n <!-- Add Source Card -->\n <div class=\"at-add-source-card\" (click)=\"OpenAddSourceForm()\">\n <i class=\"fa-solid fa-plus-circle\"></i>\n <span style=\"font-size: 0.85rem; font-weight: 600;\">Add Content Source</span>\n <span style=\"font-size: 0.72rem;\">Web, RSS, Email, Files, API</span>\n </div>\n </div>\n\n <!-- Content Item Duplicates Section -->\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\n <!-- ════════════════════════════════════════════ -->\n <!-- TAB 3: CONTENT TYPES -->\n <!-- ════════════════════════════════════════════ -->\n @if (ActiveTab === 'types') {\n <div class=\"at-page-header\">\n <div>\n <div class=\"at-page-title\">Content Types</div>\n <div class=\"at-page-subtitle\">Configure AI tagging rules per content category</div>\n </div>\n <div class=\"at-page-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"OpenAddTypeForm()\">\n <i class=\"fa-solid fa-plus\"></i> Add Type\n </button>\n </div>\n </div>\n <div class=\"at-page-body\">\n <div class=\"at-ct-grid\">\n @for (card of ContentTypeCards; track card.ID) {\n <div class=\"at-ct-card\">\n <div class=\"at-ct-card-header\">\n <span class=\"at-ct-card-name\">{{ card.Name }}</span>\n <span class=\"at-ct-card-model\">{{ card.AIModelName }}</span>\n </div>\n <div class=\"at-ct-field\">\n <span class=\"at-ct-field-label\">Description</span>\n <span class=\"at-ct-field-value\">{{ card.Description || '\\u2014' }}</span>\n </div>\n <div class=\"at-ct-field\">\n <span class=\"at-ct-field-label\">Sources Using</span>\n <span class=\"at-ct-field-value\">{{ card.SourcesUsing }}</span>\n </div>\n <div class=\"at-ct-field\">\n <span class=\"at-ct-field-label\">Items Tagged</span>\n <span class=\"at-ct-field-value\">{{ formatNumber(card.ItemsTagged) }}</span>\n </div>\n <div class=\"at-ct-tag-range\">\n <i class=\"fa-solid fa-tags\"></i>\n <span>{{ card.MinTags }}</span>\n <div class=\"at-ct-tag-range-bar\">\n <div class=\"at-ct-tag-range-fill\" [style.left.%]=\"card.RangeLeftPct\" [style.right.%]=\"card.RangeRightPct\"></div>\n </div>\n <span>{{ card.MaxTags }}</span>\n <span class=\"at-ct-range-suffix\">tags/item</span>\n </div>\n <div class=\"at-source-card-actions\" style=\"margin-top: 10px;\">\n <button class=\"at-source-action-btn\" (click)=\"OpenEditTypeForm(card)\"><i class=\"fa-solid fa-pen\"></i> Edit</button>\n </div>\n </div>\n }\n <!-- Add Content Type Card -->\n <div class=\"at-add-type-card\" (click)=\"OpenAddTypeForm()\">\n <i class=\"fa-solid fa-plus-circle\"></i>\n <span style=\"font-size: 0.85rem; font-weight: 600;\">Add Content Type</span>\n <span style=\"font-size: 0.72rem;\">Configure tagging rules</span>\n </div>\n </div>\n </div>\n }\n\n <!-- ════════════════════════════════════════════ -->\n <!-- TAB 4: TAG LIBRARY -->\n <!-- ════════════════════════════════════════════ -->\n @if (ActiveTab === 'tags') {\n <div class=\"at-page-header\">\n <div>\n <div class=\"at-page-title\">Tag Library</div>\n <div class=\"at-page-subtitle\">{{ TagRows.length }} unique tags across all content sources</div>\n </div>\n <div class=\"at-page-actions\">\n <input type=\"text\" class=\"at-search-input\" placeholder=\"Search tags...\"\n [(ngModel)]=\"TagSearchQuery\" (input)=\"FilterTags()\">\n </div>\n </div>\n <div class=\"at-page-body\">\n <div class=\"at-tag-lib-layout\">\n <div class=\"at-tag-lib-main\">\n <div class=\"at-card\">\n <div class=\"at-card-body\" style=\"max-height: 500px; overflow-y: auto;\">\n <table class=\"at-tag-table\">\n <thead>\n <tr>\n <th>Tag</th>\n <th>Count</th>\n <th>Avg Weight</th>\n <th>Distribution</th>\n <th>Top Source</th>\n <th>First Seen</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredTagRows; track row.Tag) {\n <tr class=\"at-tag-row-clickable\" (click)=\"DrillDownTag(row.Tag)\"\n [class.at-tag-row-selected]=\"SelectedDrillDownTag === row.Tag\">\n <td class=\"at-tag-name-cell\">{{ row.Tag }}</td>\n <td>{{ row.UsageCount }}</td>\n <td>\n <div class=\"at-weight-indicator\">\n <div class=\"at-weight-bar\">\n <div class=\"at-weight-bar-fill\" [style.width.%]=\"row.AvgWeight * 100\"\n [class.at-weight-high]=\"row.AvgWeight >= 0.7\"\n [class.at-weight-medium]=\"row.AvgWeight >= 0.4 && row.AvgWeight < 0.7\"\n [class.at-weight-low]=\"row.AvgWeight < 0.4\"></div>\n </div>\n <span class=\"at-weight-value\">{{ row.AvgWeight.toFixed(2) }}</span>\n </div>\n </td>\n <td>\n <div class=\"at-tag-bar\">\n <div class=\"at-tag-bar-fill\" [style.width.%]=\"row.BarWidthPct\"></div>\n </div>\n </td>\n <td>{{ row.TopSource }}</td>\n <td>{{ row.FirstSeen }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n <!-- Tag drill-down: content items matching selected tag -->\n @if (SelectedDrillDownTag) {\n <div class=\"at-card\" style=\"margin-top: 12px;\">\n <div class=\"at-card-header\">\n <span class=\"at-card-title\">\n <i class=\"fa-solid fa-tag\"></i>\n Content items tagged \"{{ SelectedDrillDownTag }}\"\n ({{ TagDrillDownItems.length }})\n </span>\n <button class=\"at-slide-close\" (click)=\"CloseDrillDownTag()\" style=\"background:none;border:none;cursor:pointer;color:var(--mj-text-muted)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-card-body\" style=\"max-height: 300px; overflow-y: auto;\">\n @if (TagDrillDownItems.length === 0) {\n <div class=\"at-empty-state\"><p>No content items found for this tag.</p></div>\n } @else {\n <table class=\"at-tag-table\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Source</th>\n <th>Weight</th>\n <th>Updated</th>\n </tr>\n </thead>\n <tbody>\n @for (di of TagDrillDownItems; track di.ID) {\n <tr class=\"at-tag-row-clickable\" (click)=\"OpenItemDetailByID(di.ID)\">\n <td>{{ di.Name }}</td>\n <td>{{ di.SourceName }}</td>\n <td>{{ FormatWeight(di.Weight) }}</td>\n <td>{{ di.UpdatedAt }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n </div>\n }\n </div>\n <div class=\"at-tag-lib-sidebar\">\n <div class=\"at-card at-tag-cloud-card\">\n <div class=\"at-card-title\" style=\"margin-bottom: 12px;\"><i class=\"fa-solid fa-cloud\"></i> Tag Cloud</div>\n @if (TagCloudWordItems.length > 0) {\n <mj-word-cloud\n [Items]=\"TagCloudWordItems\"\n [MaxFontSize]=\"40\"\n [MinFontSize]=\"12\"\n [MaxItems]=\"20\"\n Layout=\"spiral\"\n ColorMode=\"weight-gradient\"\n [Interactive]=\"true\"\n [Animate]=\"true\">\n </mj-word-cloud>\n } @else {\n <div class=\"at-tag-cloud-empty\">No tags yet</div>\n }\n </div>\n <div class=\"at-card\" style=\"padding: 16px; margin-top: 12px;\">\n <div class=\"at-card-title\" style=\"margin-bottom: 10px;\"><i class=\"fa-solid fa-chart-pie\"></i> By Source</div>\n <div class=\"at-tags-by-source\">\n @for (s of TagsBySource; track s.SourceName) {\n <div class=\"at-tag-source-row\">\n <span>{{ s.SourceName }}</span>\n <strong>{{ s.Count }}</strong>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- ════════════════════════════════════════════ -->\n <!-- TAB 6: TAXONOMY GOVERNANCE -->\n <!-- ════════════════════════════════════════════ -->\n @if (ActiveTab === 'taxonomy') {\n <div class=\"at-page-header\">\n <div>\n <div class=\"at-page-title\">Taxonomy Governance</div>\n <div class=\"at-page-subtitle\">Manage tag hierarchy, resolve duplicates, and monitor taxonomy health &mdash; <strong>{{ TaxHealth.Total }} total tags</strong></div>\n </div>\n <div class=\"at-page-actions\">\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"RefreshTaxonomyData()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n </div>\n </div>\n\n <!-- Sub-tab strip -->\n <div class=\"at-tax-tab-strip\">\n <div class=\"at-tax-tab\" [class.active]=\"TaxSubTab === 'tree'\" (click)=\"SwitchTaxSubTab('tree')\">\n <i class=\"fa-solid fa-sitemap\"></i> Tree View\n </div>\n <div class=\"at-tax-tab\" [class.active]=\"TaxSubTab === 'duplicates'\" (click)=\"SwitchTaxSubTab('duplicates')\">\n <i class=\"fa-solid fa-link\"></i> Duplicates\n @if (TaxDuplicates.length > 0) {\n <span class=\"at-tax-tab-badge at-tax-badge-warning\">{{ TaxDuplicates.length }}</span>\n }\n </div>\n <div class=\"at-tax-tab\" [class.active]=\"TaxSubTab === 'orphans'\" (click)=\"SwitchTaxSubTab('orphans')\">\n <i class=\"fa-solid fa-ban\"></i> Orphans\n @if (TaxOrphans.length > 0) {\n <span class=\"at-tax-tab-badge at-tax-badge-error\">{{ TaxOrphans.length }}</span>\n }\n </div>\n <div class=\"at-tax-tab\" [class.active]=\"TaxSubTab === 'treemap'\" (click)=\"SwitchTaxSubTab('treemap')\">\n <i class=\"fa-solid fa-chart-tree-map\"></i> Treemap\n </div>\n <div class=\"at-tax-tab\" [class.active]=\"TaxSubTab === 'audit'\" (click)=\"SwitchTaxSubTab('audit')\">\n <i class=\"fa-solid fa-scroll\"></i> Audit Log\n </div>\n </div>\n\n <div class=\"at-page-body\">\n\n <!-- ══ SUB-TAB 1: TREE VIEW ══ -->\n @if (TaxSubTab === 'tree') {\n <div class=\"at-tax-split-view\">\n <!-- Tree panel -->\n <div class=\"at-tax-tree-panel\" style=\"position: relative;\">\n <div class=\"at-tax-tree-toolbar\">\n <input type=\"text\" class=\"at-search-input\" style=\"flex: 1;\" placeholder=\"Search tags...\"\n [(ngModel)]=\"TaxTreeSearch\" (input)=\"FilterTaxTree()\">\n <button class=\"at-tax-toolbar-btn\" title=\"Add root tag\" (click)=\"OpenCreateRootTag()\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n <button class=\"at-tax-toolbar-btn\" [class.active]=\"TaxMultiSelectMode\"\n title=\"Toggle multi-select for drag reparenting\" (click)=\"ToggleMultiSelectMode()\">\n <i class=\"fa-solid fa-check-double\"></i>\n </button>\n </div>\n <div class=\"at-tax-tree-body\"\n (dragover)=\"$event.preventDefault()\"\n (drop)=\"OnDropToRoot($event)\">\n @if (TaxFilteredNodes.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-sitemap\"></i>\n <p>No tags found</p>\n </div>\n }\n @for (node of TaxFilteredNodes; track node.ID) {\n <div class=\"at-tax-tree-node\"\n [class.at-tax-node-selected]=\"node.IsSelected\"\n [class.at-tax-node-drag-over]=\"TaxDragOverNodeID === node.ID\"\n [class.at-tax-node-multi-selected]=\"IsNodeMultiSelected(node.ID)\"\n [style.padding-left.px]=\"16 + node.Depth * 20\"\n [attr.draggable]=\"true\"\n (dragstart)=\"OnTreeNodeDragStart($event, node)\"\n (dragover)=\"OnTreeNodeDragOver($event, node)\"\n (dragleave)=\"OnTreeNodeDragLeave()\"\n (drop)=\"OnTreeNodeDrop($event, node); $event.stopPropagation()\"\n (click)=\"SelectTaxNode(node)\">\n @if (TaxMultiSelectMode) {\n <input type=\"checkbox\" class=\"at-tax-tree-checkbox\"\n [checked]=\"IsNodeMultiSelected(node.ID)\"\n (click)=\"ToggleNodeSelection(node, $event)\">\n }\n <span class=\"at-tax-tree-arrow\"\n [class.at-tax-arrow-expanded]=\"node.IsExpanded && node.Children.length > 0\"\n [class.at-tax-arrow-collapsed]=\"!node.IsExpanded && node.Children.length > 0\"\n [class.at-tax-arrow-leaf]=\"node.Children.length === 0\"\n (click)=\"ToggleTaxNode(node); $event.stopPropagation()\"></span>\n <span class=\"at-tax-health-dot\" [class]=\"node.HealthColor\"></span>\n <span class=\"at-tax-tree-label\" [class.at-tax-tree-label-selected]=\"node.IsSelected\">{{ node.Name }}</span>\n <span class=\"at-tax-tree-count\">({{ node.ItemCount }})</span>\n <span class=\"at-tax-tree-add-child\" title=\"Add child tag\"\n (click)=\"OpenCreateChildTagFor(node); $event.stopPropagation()\">\n <i class=\"fa-solid fa-plus\"></i>\n </span>\n </div>\n }\n </div>\n @if (TaxTreeSaving) {\n <div class=\"at-tax-tree-saving-overlay\">\n <mj-loading text=\"Moving tags...\" size=\"small\"></mj-loading>\n </div>\n }\n </div>\n\n <!-- Details panel -->\n <div class=\"at-tax-details-panel\">\n @if (TaxSelectedNode) {\n <div class=\"at-tax-details-header\">\n <!-- Breadcrumb -->\n <div class=\"at-tax-breadcrumb\">\n @for (bc of GetTaxBreadcrumb(TaxSelectedNode); track bc.ID) {\n <span class=\"at-tax-bc-link\" (click)=\"NavigateToBreadcrumb(bc.ID)\">{{ bc.Name }}</span>\n <span class=\"at-tax-bc-sep\">&rsaquo;</span>\n }\n <span class=\"at-tax-bc-current\">{{ TaxSelectedNode.Name }}</span>\n </div>\n\n @if (!TaxIsEditing) {\n <div class=\"at-tax-details-title\">\n {{ TaxSelectedNode.DisplayName }}\n <span class=\"at-tax-edit-icon\" (click)=\"StartEditTag()\" title=\"Edit name\">\n <i class=\"fa-solid fa-pen\"></i>\n </span>\n </div>\n @if (TaxSelectedNode.Description) {\n <div class=\"at-tax-details-desc\">{{ TaxSelectedNode.Description }}</div>\n }\n } @else {\n <div class=\"at-tax-edit-form\">\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"TaxEditName\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Description</label>\n <textarea class=\"at-form-textarea\" rows=\"3\" [(ngModel)]=\"TaxEditDescription\"></textarea>\n </div>\n <div class=\"at-form-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveEditTag()\">Save</button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CancelEditTag()\">Cancel</button>\n </div>\n </div>\n }\n </div>\n\n <!-- Stats row -->\n <div class=\"at-tax-stats-row\">\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.ItemCount }}</div>\n <div class=\"at-tax-stat-label\">Items Tagged</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.AvgWeight.toFixed(2) }}</div>\n <div class=\"at-tax-stat-label\">Avg Weight</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.Children.length }}</div>\n <div class=\"at-tax-stat-label\">Children</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.Depth }}</div>\n <div class=\"at-tax-stat-label\">Depth</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value at-tax-stat-date\">{{ TaxSelectedNode.FirstSeen }}</div>\n <div class=\"at-tax-stat-label\">First Seen</div>\n </div>\n </div>\n\n <!-- Action toolbar -->\n @if (!TaxIsEditing) {\n <div class=\"at-tax-action-toolbar\">\n <button class=\"at-tax-action-btn\" (click)=\"OpenCreateChildTag()\"><i class=\"fa-solid fa-plus\"></i> Add Child</button>\n <button class=\"at-tax-action-btn\" (click)=\"StartEditTag()\"><i class=\"fa-solid fa-pen\"></i> Rename</button>\n <button class=\"at-tax-action-btn\" (click)=\"OpenMoveDialog(TaxSelectedNode)\"><i class=\"fa-solid fa-arrows-up-down\"></i> Move</button>\n <button class=\"at-tax-action-btn\" (click)=\"OpenMergeIntoDialog(TaxSelectedNode)\"><i class=\"fa-solid fa-compress\"></i> Merge Into...</button>\n <button class=\"at-tax-action-btn\" (click)=\"OpenSplitDialog(TaxSelectedNode)\"><i class=\"fa-solid fa-code-branch\"></i> Split</button>\n <button class=\"at-tax-action-btn at-tax-action-danger\" (click)=\"DeleteTag(TaxSelectedNode)\"><i class=\"fa-solid fa-trash\"></i> Delete</button>\n </div>\n }\n\n <!-- Child tags -->\n @if (TaxSelectedNode.Children.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Child Tags</div>\n <div class=\"at-tax-child-chips\">\n @for (child of TaxSelectedNode.Children; track child.ID) {\n <span class=\"at-tax-child-chip\" (click)=\"SelectTaxNode(child)\">\n {{ child.Name }}\n <span class=\"at-tax-chip-count\">{{ child.ItemCount }}</span>\n </span>\n }\n </div>\n </div>\n }\n\n <!-- Recently tagged items -->\n @if (TaxRecentItems.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Recently Tagged Items</div>\n <div class=\"at-tax-recent-list\">\n @for (item of TaxRecentItems; track $index) {\n <div class=\"at-tax-recent-item\">\n <div class=\"at-tax-recent-icon\"><i [class]=\"item.Icon\"></i></div>\n <div class=\"at-tax-recent-name\">{{ item.Name }}</div>\n <div class=\"at-tax-recent-weight\">{{ item.Weight.toFixed(2) }}</div>\n <div class=\"at-tax-recent-date\">{{ item.Date }}</div>\n </div>\n }\n </div>\n </div>\n }\n } @else {\n <div class=\"at-empty-state\" style=\"height: 100%;\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n <p>Select a tag from the tree to view details</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Health bar -->\n <div class=\"at-tax-health-bar\">\n <span class=\"at-tax-health-label\">Taxonomy Health</span>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-total\"></span>\n <span class=\"at-tax-health-value\">{{ TaxHealth.Total }}</span>\n <span class=\"at-tax-health-text\">Total</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-healthy\"></span>\n <span class=\"at-tax-health-value at-tax-val-success\">{{ TaxHealth.Healthy }}</span>\n <span class=\"at-tax-health-text\">Healthy</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-attention\"></span>\n <span class=\"at-tax-health-value at-tax-val-warning\">{{ TaxHealth.NeedAttention }}</span>\n <span class=\"at-tax-health-text\">Need Attention</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-orphaned\"></span>\n <span class=\"at-tax-health-value at-tax-val-error\">{{ TaxHealth.Orphaned }}</span>\n <span class=\"at-tax-health-text\">Orphaned</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-duplicates\"></span>\n <span class=\"at-tax-health-value at-tax-val-info\">{{ TaxHealth.Duplicates }}</span>\n <span class=\"at-tax-health-text\">Duplicate Candidates</span>\n </div>\n </div>\n }\n\n <!-- ══ SUB-TAB 2: DUPLICATES ══ -->\n @if (TaxSubTab === 'duplicates') {\n <div class=\"at-tax-dup-stats-bar\">\n <div class=\"at-tax-dup-stat\"><strong>{{ TaxDuplicates.length }}</strong> candidates found</div>\n <div class=\"at-tax-dup-stat at-tax-dup-high\"><strong>{{ TaxHighConfidenceDupeCount }}</strong> high confidence (&gt;85%)</div>\n <div class=\"at-tax-dup-stat at-tax-dup-moderate\"><strong>{{ TaxModerateDupeCount }}</strong> moderate (70-85%)</div>\n </div>\n\n @if (TaxDuplicates.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <p>No duplicate tags detected</p>\n </div>\n }\n\n <div class=\"at-tax-dup-list\">\n @for (pair of TaxDuplicates; track $index) {\n <div class=\"at-tax-dup-card\" [class.at-tax-dup-high]=\"pair.SeverityClass === 'high'\" [class.at-tax-dup-moderate]=\"pair.SeverityClass === 'moderate'\">\n @if (pair.IsExactDuplicate) {\n <!-- Exact-name duplicates: show single tag name with count -->\n <div class=\"at-tax-dup-tag\">{{ pair.TagA }}</div>\n <div class=\"at-tax-dup-similarity\">\n <span class=\"at-tax-sim-percent high\">\n <i class=\"fa-solid fa-clone\"></i>&nbsp;{{ pair.ExactDuplicateCount }} identical records\n </span>\n </div>\n <div class=\"at-tax-dup-actions\">\n <button class=\"at-tax-dup-btn at-tax-dup-btn-primary\" (click)=\"MergeTags(pair.TagAID, pair.TagBID, pair.TagA, pair.TagB)\" [disabled]=\"IsMerging\">@if (IsMerging) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Merging... } @else { Merge }</button>\n <button class=\"at-tax-dup-btn\" (click)=\"DismissDuplicate(pair)\">Dismiss</button>\n </div>\n } @else {\n <!-- Similar (non-exact) pairs: show both tags with similarity -->\n <div class=\"at-tax-dup-tag\">{{ pair.TagA }}</div>\n <div class=\"at-tax-dup-arrow\"><i class=\"fa-solid fa-arrows-left-right\"></i></div>\n <div class=\"at-tax-dup-similarity\">\n <div class=\"at-tax-sim-bar-bg\">\n <div class=\"at-tax-sim-bar-fill\" [class]=\"pair.SeverityClass\" [style.width.%]=\"pair.Similarity\"></div>\n </div>\n <span class=\"at-tax-sim-percent\" [class]=\"pair.SeverityClass\">{{ pair.Similarity }}%</span>\n </div>\n <div class=\"at-tax-dup-arrow\"><i class=\"fa-solid fa-arrows-left-right\"></i></div>\n <div class=\"at-tax-dup-tag\">{{ pair.TagB }}</div>\n <div class=\"at-tax-dup-actions\">\n <button class=\"at-tax-dup-btn at-tax-dup-btn-primary\" (click)=\"MergeTags(pair.TagAID, pair.TagBID, pair.TagA, pair.TagB)\" [disabled]=\"IsMerging\">@if (IsMerging) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Merging... } @else { Merge }</button>\n <button class=\"at-tax-dup-btn\" (click)=\"MakeChildTag(pair.TagAID, pair.TagBID)\">Make Child</button>\n <button class=\"at-tax-dup-btn\" (click)=\"DismissDuplicate(pair)\">Dismiss</button>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- ══ SUB-TAB 3: ORPHANS ══ -->\n @if (TaxSubTab === 'orphans') {\n <div class=\"at-tax-orphan-toolbar\">\n <span class=\"at-tax-orphan-count\">{{ TaxOrphans.length }} orphaned tags</span>\n <span class=\"at-tax-orphan-desc\">&mdash; no parent, no children, low usage</span>\n <div class=\"at-tax-orphan-bulk\">\n <button class=\"at-tax-bulk-btn\" (click)=\"ToggleAllOrphans()\">\n @if (TaxAllOrphansSelected) { <i class=\"fa-solid fa-square-check\"></i> } @else { <i class=\"fa-regular fa-square\"></i> }\n Select All\n </button>\n <button class=\"at-tax-bulk-btn at-tax-bulk-danger\" (click)=\"BulkDeleteOrphans()\">\n <i class=\"fa-solid fa-trash\"></i> Bulk Delete\n </button>\n <button class=\"at-tax-bulk-btn at-tax-bulk-danger\" (click)=\"DeleteAllOrphans()\">\n <i class=\"fa-solid fa-trash-can\"></i> Delete All ({{ TaxOrphans.length }})\n </button>\n </div>\n </div>\n\n @if (TaxOrphans.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <p>No orphaned tags</p>\n </div>\n }\n\n <div class=\"at-tax-orphan-grid\">\n @for (orphan of TaxOrphans; track orphan.ID) {\n <div class=\"at-tax-orphan-card\">\n <div class=\"at-tax-orphan-header\">\n <span class=\"at-tax-orphan-name\">{{ orphan.Name }}</span>\n <input type=\"checkbox\" class=\"at-tax-orphan-checkbox\" [checked]=\"orphan.IsSelected\"\n (change)=\"ToggleOrphanSelection(orphan)\" (click)=\"$event.stopPropagation()\">\n </div>\n <div class=\"at-tax-orphan-stats\">\n <span>Usage: <strong>{{ orphan.UsageCount }}</strong></span>\n <span>Avg Weight: <strong>{{ orphan.AvgWeight.toFixed(2) }}</strong></span>\n </div>\n <div class=\"at-tax-orphan-dates\">\n <span>First: {{ orphan.FirstSeen }}</span>\n <span>Last: {{ orphan.LastSeen }}</span>\n </div>\n <div class=\"at-tax-orphan-actions\">\n <button class=\"at-tax-orphan-btn at-tax-orphan-delete\" (click)=\"DeleteOrphan(orphan)\">Delete</button>\n <button class=\"at-tax-orphan-btn\">Ignore</button>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- ══ SUB-TAB 4: TREEMAP ══ -->\n @if (TaxSubTab === 'treemap') {\n <div class=\"at-tax-treemap-kpi-strip\">\n @for (kpi of TaxTreemapKPIs; track kpi.Label) {\n <div class=\"at-tax-treemap-kpi\">\n <div class=\"at-tax-treemap-kpi-value\">{{ kpi.Value }}</div>\n <div class=\"at-tax-treemap-kpi-label\">{{ kpi.Label }}</div>\n </div>\n }\n </div>\n\n @if (TaxTreemapCells.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-chart-tree-map\"></i>\n <p>No taxonomy data to visualize</p>\n </div>\n } @else {\n <div class=\"at-tax-treemap-container\">\n @for (cell of TaxTreemapCells; track $index) {\n <div class=\"at-tax-treemap-cell at-tax-treemap-cell-clickable\" [class]=\"cell.ColorClass\"\n [style.grid-row]=\"cell.RowSpan > 1 ? 'span ' + cell.RowSpan : ''\"\n (click)=\"OpenTreemapDrillIn(cell)\">\n <span class=\"at-tax-cell-name\">{{ cell.Name }}</span>\n <span class=\"at-tax-cell-count\">{{ cell.ItemCount }} items</span>\n </div>\n }\n </div>\n }\n\n <!-- Treemap Drill-In Panel -->\n @if (ShowTreemapDrillIn && TreemapDrillInNode) {\n <div class=\"at-tax-drillin-overlay\" (click)=\"CloseTreemapDrillIn()\">\n <div class=\"at-tax-drillin-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-tax-drillin-header\">\n <h3><i class=\"fa-solid fa-tag\"></i> {{ TreemapDrillInNode.Name }}</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseTreemapDrillIn()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-tax-drillin-body\">\n <div class=\"at-tax-stats-row\">\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TreemapDrillInNode.ItemCount }}</div>\n <div class=\"at-tax-stat-label\">Items Tagged</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TreemapDrillInNode.AvgWeight.toFixed(2) }}</div>\n <div class=\"at-tax-stat-label\">Avg Weight</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TreemapDrillInNode.Children.length }}</div>\n <div class=\"at-tax-stat-label\">Children</div>\n </div>\n </div>\n\n @if (TreemapDrillInNode.Children.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Child Tags</div>\n <div class=\"at-tax-child-chips\">\n @for (child of TreemapDrillInNode.Children; track child.ID) {\n <span class=\"at-tax-child-chip\">{{ child.Name }} <span class=\"at-tax-chip-count\">{{ child.ItemCount }}</span></span>\n }\n </div>\n </div>\n }\n\n @if (TaxRecentItems.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Recently Tagged Items</div>\n <div class=\"at-tax-recent-list\">\n @for (item of TaxRecentItems; track $index) {\n <div class=\"at-tax-recent-item\">\n <div class=\"at-tax-recent-icon\"><i [class]=\"item.Icon\"></i></div>\n <div class=\"at-tax-recent-name\">{{ item.Name }}</div>\n <div class=\"at-tax-recent-weight\">{{ item.Weight.toFixed(2) }}</div>\n <div class=\"at-tax-recent-date\">{{ item.Date }}</div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n <div class=\"at-tax-drillin-footer\">\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"DrillInToTreeView(TreemapDrillInNode)\">\n <i class=\"fa-solid fa-sitemap\"></i> View in Tree\n </button>\n </div>\n </div>\n </div>\n }\n }\n\n <!-- ══ SUB-TAB 5: AUDIT LOG ══ -->\n @if (TaxSubTab === 'audit') {\n <div class=\"at-tax-audit-filters\">\n <span class=\"at-tax-audit-filter-label\">Filter</span>\n <div class=\"at-tax-audit-checkbox-group\">\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('created')\" (change)=\"ToggleTaxAuditFilter('created')\"> Created\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('merged')\" (change)=\"ToggleTaxAuditFilter('merged')\"> Merged\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('moved')\" (change)=\"ToggleTaxAuditFilter('moved')\"> Moved\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('deleted')\" (change)=\"ToggleTaxAuditFilter('deleted')\"> Deleted\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('renamed')\" (change)=\"ToggleTaxAuditFilter('renamed')\"> Renamed\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('deprecated')\" (change)=\"ToggleTaxAuditFilter('deprecated')\"> Deprecated\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('split')\" (change)=\"ToggleTaxAuditFilter('split')\"> Split\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('reactivated')\" (change)=\"ToggleTaxAuditFilter('reactivated')\"> Reactivated\n </label>\n </div>\n </div>\n\n @if (GetFilteredAuditEvents().length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-scroll\"></i>\n <p>No audit events match the current filters</p>\n </div>\n }\n\n <div class=\"at-tax-audit-timeline\">\n @for (event of GetFilteredAuditEvents(); track $index) {\n <div class=\"at-tax-audit-event\">\n <div class=\"at-tax-audit-event-icon\" [class]=\"event.Type\">\n <i [class]=\"GetTaxAuditIcon(event.Type)\"></i>\n </div>\n <div class=\"at-tax-audit-event-body\">\n <div class=\"at-tax-audit-event-desc\">\n {{ event.Description }} <span class=\"at-tax-tag-ref\">{{ event.TagRef }}</span>\n </div>\n <div class=\"at-tax-audit-event-meta\">\n <span>{{ event.User }}</span>\n <span>{{ event.Timestamp }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- ════════════════════════════════════════════ -->\n <!-- TAB 7: RUN HISTORY -->\n <!-- ════════════════════════════════════════════ -->\n @if (ActiveTab === 'history') {\n <div class=\"at-page-header\">\n <div>\n <div class=\"at-page-title\">Run History</div>\n <div class=\"at-page-subtitle\">Processing run log across all content sources</div>\n </div>\n <div class=\"at-page-actions\">\n <select class=\"at-filter-select\" [(ngModel)]=\"HistorySourceFilter\" (change)=\"FilterRunHistory()\">\n <option value=\"\">All Sources</option>\n @for (s of HistorySourceOptions; track s) {\n <option [value]=\"s\">{{ s }}</option>\n }\n </select>\n <select class=\"at-filter-select\" [(ngModel)]=\"HistoryStatusFilter\" (change)=\"FilterRunHistory()\">\n <option value=\"\">All Status</option>\n <option value=\"complete\">Complete</option>\n <option value=\"failed\">Failed</option>\n <option value=\"running\">Running</option>\n </select>\n </div>\n </div>\n <div class=\"at-page-body\">\n <div class=\"at-card\">\n <div class=\"at-card-body\" style=\"max-height: 600px; overflow-y: auto;\">\n <table class=\"at-run-table\">\n <thead>\n <tr>\n <th>Status</th>\n <th>Source</th>\n <th>Started</th>\n <th>Duration</th>\n <th>Items</th>\n <th>Tags</th>\n <th>Errors</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredRunRows; track row.ID) {\n <tr class=\"at-run-row-clickable\"\n [class.at-run-row-selected]=\"SelectedRunID === row.ID\"\n (click)=\"OpenRunDetail(row.ID)\">\n <td>\n <span class=\"at-run-status-badge\" [class]=\"row.StatusClass\">\n @if (row.StatusClass === 'running') {\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 0.55rem\"></i>\n }\n {{ row.Status }}\n </span>\n </td>\n <td class=\"at-run-source-name\">{{ row.SourceName }}</td>\n <td>{{ row.StartedDisplay }}</td>\n <td class=\"at-run-duration\">{{ row.Duration }}</td>\n <td>{{ row.Items }}</td>\n <td>{{ row.Tags }}</td>\n <td [class]=\"row.ErrorClass\">{{ row.Errors }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n <!-- D3/D8: Run Detail Slide-In Panel -->\n @if (SelectedRunID) {\n <div class=\"at-card\" style=\"margin-top: 12px;\">\n <div class=\"at-card-header\">\n <span class=\"at-card-title\">\n <i class=\"fa-solid fa-magnifying-glass-chart\"></i>\n Run Detail: {{ SelectedRunID.slice(0, 14) }}...\n </span>\n <button class=\"at-action-btn at-secondary-btn\" style=\"font-size: 11px; padding: 3px 8px;\" (click)=\"CloseRunDetail()\">\n <i class=\"fa-solid fa-times\"></i> Close\n </button>\n </div>\n <div class=\"at-card-body\">\n @if (IsLoadingRunDetail) {\n <mj-loading text=\"Loading run details...\" size=\"small\"></mj-loading>\n } @else if (RunDetailRows.length > 0) {\n <table class=\"at-run-table\">\n <thead>\n <tr>\n <th>Source</th>\n <th>Source Type</th>\n <th>Status</th>\n <th>Items</th>\n <th>Tagged</th>\n <th>Vectorized</th>\n <th>Errors</th>\n <th>Tokens</th>\n <th>Cost</th>\n <th>Duration</th>\n </tr>\n </thead>\n <tbody>\n @for (detail of RunDetailRows; track detail.SourceName) {\n <tr>\n <td class=\"at-run-source-name\">{{ detail.SourceName }}</td>\n <td>{{ detail.SourceType }}</td>\n <td>\n <span class=\"at-run-status-badge\" [class]=\"detail.StatusClass\">{{ detail.Status }}</span>\n </td>\n <td>{{ detail.ItemsProcessed }}</td>\n <td>{{ detail.ItemsTagged }}</td>\n <td>{{ detail.ItemsVectorized }}</td>\n <td [class.run-error-text]=\"detail.ErrorCount > 0\">{{ detail.ErrorCount }}</td>\n <td>{{ FormatTokenCount(detail.TotalTokens) }}</td>\n <td>{{ detail.TotalCost > 0 ? '$' + detail.TotalCost.toFixed(4) : '$0.00' }}</td>\n <td class=\"at-run-duration\">{{ detail.Duration }}</td>\n </tr>\n }\n </tbody>\n </table>\n } @else {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <p>No per-source detail records found for this run.</p>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n <!-- ══════ SLIDE-IN FORM OVERLAY ══════ -->\n @if (FormMode !== 'none') {\n <div class=\"at-slide-overlay\" (click)=\"CloseForm()\"></div>\n <div class=\"at-slide-panel\">\n <div class=\"at-slide-header\">\n <h3>\n @if (FormMode === 'add-source') { Add Content Source }\n @else if (FormMode === 'edit-source') { Edit Content Source }\n @else if (FormMode === 'add-type') { Add Content Type }\n @else if (FormMode === 'edit-type') { Edit Content Type }\n </h3>\n <button class=\"at-slide-close\" aria-label=\"Close form\" (click)=\"CloseForm()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n <div class=\"at-slide-body\">\n\n <!-- Source form -->\n @if (FormMode === 'add-source' || FormMode === 'edit-source') {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceName\" placeholder=\"Source name\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Source Type</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceTypeID\">\n <option value=\"\">Select source type...</option>\n @for (opt of SourceTypeOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n <!-- Content Type + File Type: hidden for Entity source type -->\n @if (SelectedSourceTypeRequiresContentType) {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Content Type</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormContentTypeID\">\n <option value=\"\">Select content type...</option>\n @for (opt of ContentTypeOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">File Type</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormFileTypeID\">\n <option value=\"\">Select file type...</option>\n @for (opt of FileTypeOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Dynamic source-type-specific fields from ConfigurationObject.RequiredFields -->\n @for (field of SelectedSourceTypeFields; track field.Key) {\n @if (!field.DependsOnField || FormSourceSpecificConfig[field.DependsOnField]) {\n @if (!field.ShowOnlyIfMultiple || GetDependentOptions(field).length > 1) {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">{{ field.Label }} @if (field.Required) { <span class=\"at-required\">*</span> }</label>\n @switch (field.Type) {\n @case ('url') {\n <input type=\"url\" class=\"at-form-input\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n [placeholder]=\"field.Description || 'https://...'\">\n }\n @case ('path') {\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n [placeholder]=\"field.Description || '/path/to/...'\">\n }\n @case ('text') {\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n [placeholder]=\"field.Description || ''\" [value]=\"field.DefaultValue || ''\">\n }\n @case ('entity-picker') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n (ngModelChange)=\"OnSourceFieldChanged(field.Key)\">\n <option value=\"\">Select entity...</option>\n @for (opt of EntitiesWithDocuments; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n }\n @case ('entity-doc-picker') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\">\n @for (opt of GetDependentOptions(field); track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n }\n @case ('storage-provider-picker') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\">\n <option value=\"\">Select provider...</option>\n @for (opt of StorageProviderOptions; track opt) {\n <option [value]=\"opt\">{{ opt }}</option>\n }\n </select>\n }\n @case ('dropdown') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\">\n <option value=\"\">Select...</option>\n @for (opt of field.Options || []; track opt.Value) {\n <option [value]=\"opt.Value\">{{ opt.Label }}</option>\n }\n </select>\n }\n }\n @if (field.Description) {\n <span class=\"at-form-hint\">{{ field.Description }}</span>\n }\n </div>\n }\n }\n }\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Embedding Model Override</label>\n <mj-tree-dropdown\n [BranchConfig]=\"EmbeddingVendorBranch\"\n [LeafConfig]=\"EmbeddingModelsLeaf\"\n SelectionMode=\"single\"\n SelectableTypes=\"leaf\"\n Placeholder=\"Use system default\"\n [Clearable]=\"true\"\n [Value]=\"ToCompositeKey(FormSourceEmbeddingModelID)\"\n (ValueChange)=\"FormSourceEmbeddingModelID = FromCompositeKey($event)\">\n </mj-tree-dropdown>\n <span class=\"at-form-hint\">Overrides Content Type default</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Vector Index Override</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceVectorIndexID\">\n <option value=\"\">Use system default</option>\n @for (opt of VectorIndexOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n <span class=\"at-form-hint\">Overrides Content Type default</span>\n </div>\n <div class=\"at-form-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveSource()\" [disabled]=\"FormSaving\">\n @if (FormSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving... }\n @else { <i class=\"fa-solid fa-check\"></i> Save }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseForm()\">Cancel</button>\n </div>\n }\n\n <!-- Content Type form -->\n @if (FormMode === 'add-type' || FormMode === 'edit-type') {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormTypeName\" placeholder=\"Content type name\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Description</label>\n <textarea class=\"at-form-textarea\" [(ngModel)]=\"FormTypeDescription\" rows=\"3\" placeholder=\"Description...\"></textarea>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">AI Model (for tagging)</label>\n <mj-tree-dropdown\n [BranchConfig]=\"AIModelVendorBranch\"\n [LeafConfig]=\"AllModelsLeaf\"\n SelectionMode=\"single\"\n SelectableTypes=\"leaf\"\n Placeholder=\"Select AI model...\"\n [Clearable]=\"true\"\n [Value]=\"ToCompositeKey(FormTypeAIModelID)\"\n (ValueChange)=\"FormTypeAIModelID = FromCompositeKey($event)\">\n </mj-tree-dropdown>\n </div>\n <div class=\"at-form-row\">\n <div class=\"at-form-group\" style=\"flex: 1;\">\n <label class=\"at-form-label\">Min Tags</label>\n <input type=\"number\" class=\"at-form-input\" [(ngModel)]=\"FormTypeMinTags\" min=\"0\">\n </div>\n <div class=\"at-form-group\" style=\"flex: 1;\">\n <label class=\"at-form-label\">Max Tags</label>\n <input type=\"number\" class=\"at-form-input\" [(ngModel)]=\"FormTypeMaxTags\" min=\"1\">\n </div>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Embedding Model</label>\n <mj-tree-dropdown\n [BranchConfig]=\"EmbeddingVendorBranch\"\n [LeafConfig]=\"EmbeddingModelsLeaf\"\n SelectionMode=\"single\"\n SelectableTypes=\"leaf\"\n Placeholder=\"Use system default\"\n [Clearable]=\"true\"\n [Value]=\"ToCompositeKey(FormTypeEmbeddingModelID)\"\n (ValueChange)=\"FormTypeEmbeddingModelID = FromCompositeKey($event)\">\n </mj-tree-dropdown>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Vector Index</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormTypeVectorIndexID\">\n <option value=\"\">Use system default</option>\n @for (opt of VectorIndexOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n <div class=\"at-form-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveContentType()\" [disabled]=\"FormSaving\">\n @if (FormSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving... }\n @else { <i class=\"fa-solid fa-check\"></i> Save }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseForm()\">Cancel</button>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- ══════ ITEM DETAIL SLIDE-IN ══════ -->\n @if (ShowItemDetail && SelectedFeedItem) {\n <div class=\"at-slide-overlay\" (click)=\"CloseItemDetail()\"></div>\n <div class=\"at-slide-panel at-detail-panel\">\n <div class=\"at-slide-header\">\n <h3><i class=\"fa-solid fa-file-lines\"></i> Content Item</h3>\n <button class=\"at-slide-close\" aria-label=\"Close item detail\" (click)=\"CloseItemDetail()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n <div class=\"at-slide-body\">\n <!-- Header -->\n <div class=\"at-detail-item-header\">\n <h4 class=\"at-detail-item-name\">{{ SelectedFeedItem.Name }}</h4>\n <div class=\"at-detail-badges\">\n <span class=\"at-detail-badge at-detail-badge-source\">{{ SelectedFeedItem.SourceName }}</span>\n @if (SelectedFeedItem.RequiresContentType) {\n <span class=\"at-detail-badge at-detail-badge-type\">{{ SelectedFeedItem.ContentTypeName }}</span>\n @if (SelectedFeedItem.FileTypeName) {\n <span class=\"at-detail-badge at-detail-badge-file\"><i class=\"fa-solid fa-file\"></i> {{ SelectedFeedItem.FileTypeName }}</span>\n }\n }\n </div>\n </div>\n\n <!-- URL -->\n @if (SelectedFeedItem.URL) {\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">URL</div>\n <a [href]=\"SelectedFeedItem.URL\" target=\"_blank\" class=\"at-detail-link\">\n {{ SelectedFeedItem.URL }}\n <i class=\"fa-solid fa-external-link-alt\" style=\"font-size: 0.65rem; margin-left: 4px;\"></i>\n </a>\n </div>\n }\n\n <!-- Text Preview -->\n @if (SelectedFeedItem.TextContent) {\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Content Preview</div>\n <div class=\"at-detail-text-preview\">{{ SelectedFeedItem.TextContent }}</div>\n </div>\n }\n\n <!-- Tags (weighted) -->\n @if (SelectedFeedItem.Tags.length > 0) {\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Tags ({{ SelectedFeedItem.Tags.length }})</div>\n <div class=\"at-detail-tags\">\n @for (wt of SelectedFeedItem.Tags; track wt.Tag) {\n <span class=\"at-tag-pill at-tag-weighted\" [style.font-size]=\"TagFontSize(wt.Weight)\">\n {{ wt.Tag }}\n <span class=\"at-tag-weight\">{{ FormatWeight(wt.Weight) }}</span>\n </span>\n }\n </div>\n </div>\n }\n\n <!-- Metadata -->\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Metadata</div>\n <div class=\"at-detail-meta-grid\">\n @if (SelectedFeedItem.Checksum) {\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Checksum</span>\n <span class=\"at-detail-meta-value at-detail-meta-mono\">{{ SelectedFeedItem.Checksum }}</span>\n </div>\n }\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Created</span>\n <span class=\"at-detail-meta-value\">{{ SelectedFeedItem.CreatedAt }}</span>\n </div>\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Updated</span>\n <span class=\"at-detail-meta-value\">{{ SelectedFeedItem.UpdatedAt }}</span>\n </div>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"at-detail-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"OpenRecordFromItem(SelectedFeedItem)\">\n <i class=\"fa-solid fa-external-link-alt\"></i> Open Record\n </button>\n <button class=\"at-action-btn at-secondary-btn\" disabled>\n <i class=\"fa-solid fa-magnifying-glass\"></i> See Similar Items\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- ══════ SOURCE DETAIL SLIDE-IN ══════ -->\n @if (ShowSourceDetail) {\n <div class=\"at-slide-overlay\" (click)=\"CloseSourceDetail()\"></div>\n <div class=\"at-slide-panel at-detail-panel\">\n <div class=\"at-slide-header\">\n <h3><i class=\"fa-solid fa-database\"></i> Source Detail</h3>\n <button class=\"at-slide-close\" aria-label=\"Close source detail\" (click)=\"CloseSourceDetail()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n <div class=\"at-slide-body\">\n @if (SourceDetailLoading) {\n <div class=\"at-loading-overlay\">\n <mj-loading text=\"Loading source details...\"></mj-loading>\n </div>\n }\n @if (!SourceDetailLoading && SelectedSource) {\n <!-- Source Header -->\n <div class=\"at-detail-source-header\">\n <div class=\"at-source-card-icon\"><i [class]=\"SelectedSource.Icon\"></i></div>\n <div>\n <h4 class=\"at-detail-item-name\">{{ SelectedSource.Name }}</h4>\n <div class=\"at-detail-badges\">\n <span class=\"at-detail-badge at-detail-badge-type\">{{ SelectedSource.SourceTypeName }}</span>\n <span class=\"at-detail-badge\" [class]=\"'at-detail-badge-status-' + SelectedSource.StatusClass\">\n {{ SelectedSource.StatusLabel }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Configuration -->\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Configuration</div>\n <div class=\"at-detail-meta-grid\">\n @if (SelectedSource.URL) {\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">URL</span>\n <a [href]=\"SelectedSource.URL\" target=\"_blank\" class=\"at-detail-link at-detail-meta-value\">{{ SelectedSource.URL }}</a>\n </div>\n }\n @if (SelectedSource.RequiresFileType) {\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Content Type</span>\n <span class=\"at-detail-meta-value\">{{ SelectedSource.ContentTypeName }}</span>\n </div>\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">File Type</span>\n <span class=\"at-detail-meta-value\">{{ SelectedSource.FileTypeName }}</span>\n </div>\n }\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Embedding Model</span>\n <span class=\"at-detail-meta-value\">{{ SelectedSource.EmbeddingModelName }}</span>\n </div>\n <div class=\"at-detail-meta-row\">\n <span class=\"at-detail-meta-key\">Vector Index</span>\n <span class=\"at-detail-meta-value\">{{ SelectedSource.VectorIndexName }}</span>\n </div>\n </div>\n </div>\n\n <!-- Stats -->\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Statistics</div>\n <div class=\"at-detail-stats-strip\">\n <div class=\"at-detail-stat\">\n <div class=\"at-detail-stat-value\">{{ formatNumber(SelectedSource.ItemCount) }}</div>\n <div class=\"at-detail-stat-label\">Items</div>\n </div>\n <div class=\"at-detail-stat\">\n <div class=\"at-detail-stat-value\">{{ formatNumber(SelectedSource.TagCount) }}</div>\n <div class=\"at-detail-stat-label\">Tags</div>\n </div>\n <div class=\"at-detail-stat\">\n <div class=\"at-detail-stat-value\">{{ SelectedSource.AvgTags }}</div>\n <div class=\"at-detail-stat-label\">Avg Tags</div>\n </div>\n <div class=\"at-detail-stat\">\n <div class=\"at-detail-stat-value\">{{ SelectedSource.LastRunAgo }}</div>\n <div class=\"at-detail-stat-label\">Last Run</div>\n </div>\n <div class=\"at-detail-stat\">\n <div class=\"at-detail-stat-value\" [class.at-kpi-error-value]=\"SelectedSource.ErrorCount > 0\">{{ SelectedSource.ErrorCount }}</div>\n <div class=\"at-detail-stat-label\">Errors</div>\n </div>\n </div>\n </div>\n\n <!-- Content Library (D4 status badges, D7 pagination) -->\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-header-row\">\n <div class=\"at-detail-section-label\">Content Library ({{ FilteredSourceDetailTotal }} of {{ SelectedSource.ItemCount | number }})</div>\n <div class=\"at-detail-section-controls\">\n <select class=\"at-detail-filter-select\" [(ngModel)]=\"SourceDetailStatusFilter\" (ngModelChange)=\"OnSourceDetailStatusFilterChange()\">\n @for (opt of SourceDetailStatusOptions; track opt) {\n <option [value]=\"opt\">{{ opt }}</option>\n }\n </select>\n <button class=\"at-action-btn at-retry-btn\" (click)=\"RetryFailedItems()\" title=\"Re-queue failed items for processing\">\n <i class=\"fa-solid fa-rotate-right\"></i> Retry Failed\n </button>\n </div>\n </div>\n <div class=\"at-detail-content-list\">\n @if (FilteredSourceDetailItems.length === 0) {\n <div class=\"at-empty-state\" style=\"padding: 16px;\">\n <p>{{ SourceDetailStatusFilter === 'All' ? 'No content items yet.' : 'No items match this filter.' }}</p>\n </div>\n }\n @for (ci of FilteredSourceDetailItems; track ci.ID) {\n <div class=\"at-detail-content-item\" (click)=\"OpenContentItemDetail(ci)\">\n <div class=\"at-feed-status-dot\" [class]=\"ci.StatusDot\"></div>\n <span class=\"at-detail-content-item-name\">{{ ci.Name }}</span>\n <span class=\"at-status-badge\" [class]=\"GetStatusBadgeClass(ci.EmbeddingStatus)\">E:{{ ci.EmbeddingStatus }}</span>\n <span class=\"at-status-badge\" [class]=\"GetStatusBadgeClass(ci.TaggingStatus)\">T:{{ ci.TaggingStatus }}</span>\n <span class=\"at-detail-content-item-tags\">{{ ci.TagCount }} tags</span>\n <span class=\"at-detail-content-item-time\">{{ ci.UpdatedAt }}</span>\n </div>\n }\n </div>\n <!-- Pagination -->\n @if (SourceDetailTotalPages > 1) {\n <div class=\"at-detail-pagination\">\n <button class=\"at-page-btn\" [disabled]=\"SourceDetailPage === 0\" (click)=\"SourceDetailPrevPage()\">\n <i class=\"fa-solid fa-chevron-left\"></i> Prev\n </button>\n <span class=\"at-page-info\">Page {{ SourceDetailPage + 1 }} of {{ SourceDetailTotalPages }}</span>\n <button class=\"at-page-btn\" [disabled]=\"SourceDetailPage >= SourceDetailTotalPages - 1\" (click)=\"SourceDetailNextPage()\">\n Next <i class=\"fa-solid fa-chevron-right\"></i>\n </button>\n </div>\n }\n </div>\n\n <!-- Run History -->\n @if (SelectedSource.RunHistory.length > 0) {\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Recent Runs</div>\n <div class=\"at-detail-run-history\">\n @for (run of SelectedSource.RunHistory; track run.ID) {\n <div class=\"at-detail-run-row\">\n <span class=\"at-run-status-badge\" [class]=\"run.StatusClass\">{{ run.Status }}</span>\n <span class=\"at-detail-run-time\">{{ run.StartedDisplay }}</span>\n <span class=\"at-detail-run-duration\">{{ run.Duration }}</span>\n <span class=\"at-detail-run-items\">{{ run.Items }} items</span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Actions -->\n <div class=\"at-detail-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"OpenEditSourceFromDetail()\">\n <i class=\"fa-solid fa-pen\"></i> Edit\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"RunSourceFromDetail()\">\n <i class=\"fa-solid fa-play\"></i> Run Now\n </button>\n <button class=\"at-action-btn at-secondary-btn at-source-delete-btn\" (click)=\"DeleteSourceFromDetail()\">\n <i class=\"fa-solid fa-trash\"></i> Delete\n </button>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- ══════ SCHEDULE DIALOG ══════ -->\n @if (ShowScheduleDialog && SchedulingSourceCard) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseScheduleDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-regular fa-clock\"></i> Schedule Pipeline</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseScheduleDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <div class=\"at-schedule-field\">\n <label>Source</label>\n <div class=\"at-schedule-source-name\">\n <i [class]=\"SchedulingSourceCard.Icon\"></i>\n {{ SchedulingSourceCard.Name }}\n </div>\n </div>\n <div class=\"at-schedule-field\">\n <label>Action</label>\n <div class=\"at-schedule-action-name\">Autotag and Vectorize Content</div>\n </div>\n <div class=\"at-schedule-field\">\n <label for=\"schedule-cron\">Cron Expression</label>\n <input id=\"schedule-cron\"\n type=\"text\"\n class=\"mj-input at-schedule-cron-input\"\n [(ngModel)]=\"ScheduleCron\"\n placeholder=\"0 2 * * *\" />\n <div class=\"at-schedule-cron-preview\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{ GetCronPreview(ScheduleCron) }}\n </div>\n </div>\n <div class=\"at-schedule-field at-schedule-toggle-row\">\n <label for=\"schedule-enabled\">Enabled</label>\n <input id=\"schedule-enabled\"\n type=\"checkbox\"\n class=\"mj-checkbox\"\n [(ngModel)]=\"ScheduleEnabled\" />\n </div>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveSchedule()\" [disabled]=\"ScheduleSaving\">\n @if (ScheduleSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-check\"></i> Create Schedule\n }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseScheduleDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n <!-- ══════ CONFIRMATION DIALOG ══════ -->\n @if (ShowConfirmDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"ConfirmDialogCancel()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-triangle-exclamation\"></i> {{ ConfirmDialogTitle }}</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"ConfirmDialogCancel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <p class=\"at-confirm-message\">{{ ConfirmDialogMessage }}</p>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-danger-btn\" (click)=\"ConfirmDialogAccept()\">\n <i class=\"fa-solid fa-check\"></i> Confirm\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"ConfirmDialogCancel()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n <!-- ══════ SPLIT DIALOG ══════ -->\n @if (ShowSplitDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseSplitDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-code-branch\"></i> Split Tag</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseSplitDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <div class=\"at-schedule-field\">\n <label>New tag names (comma-separated)</label>\n <input type=\"text\" class=\"mj-input\" style=\"width: 100%;\"\n [(ngModel)]=\"SplitChildNames\"\n placeholder=\"Tag A, Tag B, Tag C\" />\n </div>\n <p class=\"at-confirm-message\">New tags will be created as siblings of the original tag under the same parent.</p>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"ExecuteSplit()\" [disabled]=\"!SplitChildNames.trim()\">\n <i class=\"fa-solid fa-code-branch\"></i> Create Tags\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseSplitDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n <!-- ══════ MOVE DIALOG ══════ -->\n @if (ShowCreateTagDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseCreateTagDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-plus\"></i> Create Tag</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseCreateTagDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <div class=\"at-tax-create-context\">{{ CreateTagParentLabel }}</div>\n <div class=\"at-schedule-field\">\n <label>Name</label>\n <input type=\"text\" class=\"mj-input\" style=\"width: 100%;\" [(ngModel)]=\"CreateTagName\"\n placeholder=\"Tag name\" (keydown.enter)=\"SaveNewTag()\">\n </div>\n <div class=\"at-schedule-field\">\n <label>Description (optional)</label>\n <textarea class=\"mj-textarea\" rows=\"3\" style=\"width: 100%;\" [(ngModel)]=\"CreateTagDescription\"\n placeholder=\"Brief description of this tag\"></textarea>\n </div>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveNewTag()\" [disabled]=\"!CreateTagName.trim()\">\n <i class=\"fa-solid fa-check\"></i> Create\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseCreateTagDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n @if (ShowMoveDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseMoveDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-arrows-up-down\"></i> Move Tag</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseMoveDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <div class=\"at-schedule-field\">\n <label>New parent tag</label>\n <select class=\"mj-input\" style=\"width: 100%;\" [(ngModel)]=\"MoveNewParentID\">\n <option [ngValue]=\"null\">(Root level &mdash; no parent)</option>\n @for (opt of GetMoveTargetOptions(); track opt.ID) {\n <option [ngValue]=\"opt.ID\">{{ '\\u00A0\\u00A0'.repeat(opt.Depth) }}{{ opt.Name }}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"ExecuteMove()\">\n <i class=\"fa-solid fa-check\"></i> Move\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseMoveDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n @if (ShowMergeIntoDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseMergeIntoDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-compress\"></i> Merge \"{{ MergeSourceTag?.Name }}\" Into...</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseMergeIntoDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <p style=\"font-size: 0.85rem; color: var(--mj-text-secondary); margin: 0 0 12px;\">\n All tagged items will be moved to the target tag, then \"{{ MergeSourceTag?.Name }}\" will be deleted.\n </p>\n <div class=\"at-schedule-field\">\n <label>Merge into</label>\n <mj-combobox\n [Data]=\"MergeTargetData\"\n TextField=\"Label\"\n ValueField=\"ID\"\n [Filterable]=\"true\"\n [ValuePrimitive]=\"true\"\n Placeholder=\"Search and select a tag...\"\n (ValueChange)=\"OnMergeTargetSelected($event)\">\n </mj-combobox>\n </div>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"ExecuteMergeInto()\" [disabled]=\"!MergeTargetID || IsMerging\">\n @if (IsMerging) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Merging... } @else { <i class=\"fa-solid fa-compress\"></i> Merge }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseMergeIntoDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n <!-- No Content Types Warning Dialog (z-index above slide-in panel) -->\n @if (ShowNoContentTypeWarning) {\n <div class=\"at-schedule-dialog-overlay\" style=\"z-index: 10001;\" (click)=\"ShowNoContentTypeWarning = false\">\n <div class=\"at-schedule-dialog\" style=\"max-width: 440px; z-index: 10002;\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <span><i class=\"fa-solid fa-triangle-exclamation\" style=\"color: var(--mj-status-warning); margin-right: 8px;\"></i> Content Type Required</span>\n <button class=\"at-close-btn\" aria-label=\"Close warning\" (click)=\"ShowNoContentTypeWarning = false\"><i class=\"fa-solid fa-xmark\"></i></button>\n </div>\n <div class=\"at-schedule-dialog-body\" style=\"text-align: center; padding: 24px;\">\n <p style=\"color: var(--mj-text-secondary); margin-bottom: 16px;\">\n No content types have been configured yet. At least one content type is required before you can create a content source.\n </p>\n <p style=\"color: var(--mj-text-muted); font-size: 13px;\">\n Go to the <strong>Content Types</strong> tab to create one.\n </p>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (mousedown)=\"ShowNoContentTypeWarning = false; CloseForm(); SwitchTab('types')\">\n <i class=\"fa-solid fa-arrow-right\"></i> Go to Content Types\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"ShowNoContentTypeWarning = false\">Close</button>\n </div>\n </div>\n </div>\n }\n</div>\n"]}