@memberjunction/ng-dashboards 5.22.0 → 5.23.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 (204) hide show
  1. package/README.md +51 -0
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +364 -362
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.js +2 -2
  6. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +275 -64
  7. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  8. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2645 -436
  9. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  10. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +240 -6
  11. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  12. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +2166 -256
  13. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  14. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  15. package/dist/AI/components/execution-monitoring.component.js +191 -197
  16. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  17. package/dist/AI/components/models/model-management.component.js +9 -8
  18. package/dist/AI/components/models/model-management.component.js.map +1 -1
  19. package/dist/AI/components/prompts/prompt-management.component.js +305 -299
  20. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  21. package/dist/AI/components/system/system-configuration.component.js +319 -313
  22. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  23. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +1 -2
  24. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  25. package/dist/AI/components/vectors/vector-management-resource.component.js +12 -27
  26. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  27. package/dist/APIKeys/api-applications-panel.component.js +10 -12
  28. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  29. package/dist/APIKeys/api-key-create-dialog.component.js +13 -19
  30. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  31. package/dist/APIKeys/api-key-edit-panel.component.js +12 -14
  32. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  33. package/dist/APIKeys/api-scopes-panel.component.js +61 -68
  34. package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
  35. package/dist/APIKeys/api-usage-panel.component.js +10 -11
  36. package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
  37. package/dist/Actions/components/actions-list-view.component.js +82 -96
  38. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  39. package/dist/Actions/components/actions-overview.component.js +130 -134
  40. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  41. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  42. package/dist/Actions/components/categories-list-view.component.js +40 -46
  43. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  44. package/dist/Actions/components/code-management.component.js +2 -2
  45. package/dist/Actions/components/code-management.component.js.map +1 -1
  46. package/dist/Actions/components/entity-integration.component.js +2 -2
  47. package/dist/Actions/components/entity-integration.component.js.map +1 -1
  48. package/dist/Actions/components/execution-monitoring.component.js +127 -132
  49. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  50. package/dist/Actions/components/executions-list-view.component.js +2 -2
  51. package/dist/Actions/components/executions-list-view.component.js.map +1 -1
  52. package/dist/Actions/components/explorer/action-card.component.js +11 -17
  53. package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
  54. package/dist/Actions/components/explorer/action-explorer.component.js +5 -11
  55. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  56. package/dist/Actions/components/explorer/action-list-item.component.js +8 -10
  57. package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -1
  58. package/dist/Actions/components/explorer/action-toolbar.component.js +112 -133
  59. package/dist/Actions/components/explorer/action-toolbar.component.js.map +1 -1
  60. package/dist/Actions/components/explorer/action-tree-panel.component.js +63 -83
  61. package/dist/Actions/components/explorer/action-tree-panel.component.js.map +1 -1
  62. package/dist/Actions/components/explorer/new-action-panel.component.js +17 -21
  63. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  64. package/dist/Actions/components/explorer/new-category-panel.component.js +17 -21
  65. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  66. package/dist/Actions/components/scheduled-actions.component.js +2 -2
  67. package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
  68. package/dist/Actions/components/security-permissions.component.js +2 -2
  69. package/dist/Actions/components/security-permissions.component.js.map +1 -1
  70. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +13 -5
  71. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  72. package/dist/ComponentStudio/component-studio-dashboard.component.js +168 -145
  73. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  74. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +4 -5
  75. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  76. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +197 -200
  77. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  78. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +5 -7
  79. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  80. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +142 -148
  81. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  82. package/dist/ComponentStudio/components/browser/component-browser.component.js +153 -166
  83. package/dist/ComponentStudio/components/browser/component-browser.component.js.map +1 -1
  84. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +15 -20
  85. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
  86. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +16 -21
  87. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
  88. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +18 -23
  89. package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
  90. package/dist/ComponentStudio/components/editors/spec-editor.component.js +25 -30
  91. package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
  92. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +10 -11
  93. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js.map +1 -1
  94. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts.map +1 -1
  95. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +24 -35
  96. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
  97. package/dist/ComponentStudio/components/text-import-dialog.component.js +15 -17
  98. package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
  99. package/dist/Credentials/components/credentials-categories-resource.component.js +7 -6
  100. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  101. package/dist/Credentials/components/credentials-list-resource.component.js +6 -5
  102. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  103. package/dist/Credentials/components/credentials-types-resource.component.js +7 -6
  104. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  105. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +9 -9
  106. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  107. package/dist/Home/home-dashboard.component.js +4 -4
  108. package/dist/Home/home-dashboard.component.js.map +1 -1
  109. package/dist/Integration/components/connections/connections.component.js +4 -4
  110. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  111. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +246 -259
  112. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  113. package/dist/Integration/components/widgets/integration-card.component.js +7 -9
  114. package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
  115. package/dist/Integration/integration.module.d.ts +6 -10
  116. package/dist/Integration/integration.module.d.ts.map +1 -1
  117. package/dist/Integration/integration.module.js +12 -20
  118. package/dist/Integration/integration.module.js.map +1 -1
  119. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +106 -0
  120. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -0
  121. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +607 -0
  122. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -0
  123. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +7 -2
  124. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
  125. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +59 -31
  126. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  127. package/dist/KnowledgeHub/index.d.ts +1 -0
  128. package/dist/KnowledgeHub/index.d.ts.map +1 -1
  129. package/dist/KnowledgeHub/index.js +1 -0
  130. package/dist/KnowledgeHub/index.js.map +1 -1
  131. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  132. package/dist/Lists/components/lists-browse-resource.component.js +9 -7
  133. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  134. package/dist/Lists/components/lists-my-lists-resource.component.js +5 -4
  135. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  136. package/dist/Lists/components/lists-operations-resource.component.js +10 -9
  137. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  138. package/dist/MCP/components/mcp-connection-dialog.component.js +141 -132
  139. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  140. package/dist/MCP/components/mcp-log-detail-panel.component.js +4 -4
  141. package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
  142. package/dist/MCP/components/mcp-server-dialog.component.js +141 -128
  143. package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
  144. package/dist/MCP/components/mcp-test-tool-dialog.component.js +210 -218
  145. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
  146. package/dist/MCP/mcp-dashboard.component.js +2 -2
  147. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  148. package/dist/MCP/mcp.module.d.ts +6 -9
  149. package/dist/MCP/mcp.module.d.ts.map +1 -1
  150. package/dist/MCP/mcp.module.js +20 -22
  151. package/dist/MCP/mcp.module.js.map +1 -1
  152. package/dist/Scheduling/components/scheduling-activity.component.js +5 -4
  153. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  154. package/dist/Scheduling/components/scheduling-jobs.component.js +6 -5
  155. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  156. package/dist/Scheduling/components/scheduling-overview.component.js +93 -92
  157. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  158. package/dist/Testing/testing-dashboard.component.js +9 -10
  159. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  160. package/dist/actions-dashboards.module.d.ts +8 -13
  161. package/dist/actions-dashboards.module.d.ts.map +1 -1
  162. package/dist/actions-dashboards.module.js +6 -27
  163. package/dist/actions-dashboards.module.js.map +1 -1
  164. package/dist/ai-dashboards.module.d.ts +16 -20
  165. package/dist/ai-dashboards.module.d.ts.map +1 -1
  166. package/dist/ai-dashboards.module.js +23 -44
  167. package/dist/ai-dashboards.module.js.map +1 -1
  168. package/dist/communication-dashboards.module.d.ts +4 -8
  169. package/dist/communication-dashboards.module.d.ts.map +1 -1
  170. package/dist/communication-dashboards.module.js +0 -19
  171. package/dist/communication-dashboards.module.js.map +1 -1
  172. package/dist/component-studio-dashboards.module.d.ts +7 -11
  173. package/dist/component-studio-dashboards.module.d.ts.map +1 -1
  174. package/dist/component-studio-dashboards.module.js +22 -34
  175. package/dist/component-studio-dashboards.module.js.map +1 -1
  176. package/dist/core-dashboards.module.d.ts +12 -18
  177. package/dist/core-dashboards.module.d.ts.map +1 -1
  178. package/dist/core-dashboards.module.js +15 -31
  179. package/dist/core-dashboards.module.js.map +1 -1
  180. package/dist/credentials-dashboards.module.d.ts +5 -8
  181. package/dist/credentials-dashboards.module.d.ts.map +1 -1
  182. package/dist/credentials-dashboards.module.js +3 -19
  183. package/dist/credentials-dashboards.module.js.map +1 -1
  184. package/dist/data-explorer-dashboards.module.d.ts +7 -13
  185. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  186. package/dist/data-explorer-dashboards.module.js +0 -27
  187. package/dist/data-explorer-dashboards.module.js.map +1 -1
  188. package/dist/lists-dashboards.module.d.ts +5 -8
  189. package/dist/lists-dashboards.module.d.ts.map +1 -1
  190. package/dist/lists-dashboards.module.js +3 -19
  191. package/dist/lists-dashboards.module.js.map +1 -1
  192. package/dist/public-api.d.ts +1 -0
  193. package/dist/public-api.d.ts.map +1 -1
  194. package/dist/public-api.js +1 -0
  195. package/dist/public-api.js.map +1 -1
  196. package/dist/scheduling-dashboards.module.d.ts +6 -10
  197. package/dist/scheduling-dashboards.module.d.ts.map +1 -1
  198. package/dist/scheduling-dashboards.module.js +3 -23
  199. package/dist/scheduling-dashboards.module.js.map +1 -1
  200. package/dist/testing-dashboards.module.d.ts +7 -13
  201. package/dist/testing-dashboards.module.d.ts.map +1 -1
  202. package/dist/testing-dashboards.module.js +0 -27
  203. package/dist/testing-dashboards.module.js.map +1 -1
  204. package/package.json +47 -55
@@ -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 Pipeline Monitor\n *\n * Operations dashboard for monitoring the content autotagging pipeline.\n * Displays KPI metrics, pipeline stage visualization, recent processing feed,\n * and source configuration status.\n */\n\nimport { Component, ChangeDetectorRef, OnDestroy, AfterViewInit, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RunView } from '@memberjunction/core';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\n\n/** Represents a single pipeline stage with its current status */\ninterface PipelineStage {\n Name: string;\n Icon: string;\n ActiveCount: number;\n Status: 'idle' | 'active' | 'error';\n}\n\n/** Summary of a recently processed content item */\ninterface ProcessedItem {\n Name: string;\n SourceName: string;\n ProcessingTimeMs: number;\n Status: 'Complete' | 'Error' | 'Processing';\n TagCount: number;\n ProcessedAt: Date;\n}\n\n/** Summary of a configured content source */\ninterface ContentSource {\n ID: string;\n Name: string;\n TypeName: string;\n TypeIcon: string;\n Status: 'Active' | 'Paused' | 'Error';\n LastRunAt: Date | null;\n ItemCount: number;\n}\n\n/** KPI metric card data */\ninterface KPIMetric {\n Label: string;\n Value: number;\n Icon: string;\n ColorClass: string;\n}\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})\nexport class AutotaggingPipelineResourceComponent extends BaseResourceComponent implements AfterViewInit, OnDestroy {\n private destroy$ = new Subject<void>();\n\n public IsLoading = false;\n public ErrorMessage = '';\n\n // KPI data\n public KPIMetrics: KPIMetric[] = [];\n\n // Pipeline stages\n public PipelineStages: PipelineStage[] = [];\n\n // Recent processing feed\n public ProcessedItems: ProcessedItem[] = [];\n\n // Source configuration\n public ContentSources: ContentSource[] = [];\n\n // Raw data holders for aggregation\n private contentItems: Record<string, unknown>[] = [];\n private contentRuns: Record<string, unknown>[] = [];\n private contentTags: Record<string, unknown>[] = [];\n private contentSourceTypes: Record<string, unknown>[] = [];\n private contentSourcesRaw: Record<string, unknown>[] = [];\n\n private cdr = inject(ChangeDetectorRef);\n\n async ngAfterViewInit(): Promise<void> {\n await this.LoadData();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Content Autotagging';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-tags';\n }\n\n /** Load all pipeline data from MJ entities */\n public async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.ErrorMessage = '';\n this.cdr.detectChanges();\n\n try {\n const rv = new RunView();\n const [sourcesResult, itemsResult, runsResult, tagsResult, typesResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Content Sources',\n OrderBy: 'Name',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Content Items',\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 200,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Content Process Runs',\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 100,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Content Item Tags',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Content Source Types',\n ResultType: 'simple'\n }\n ]);\n\n this.contentSourcesRaw = sourcesResult.Success ? sourcesResult.Results : [];\n this.contentItems = itemsResult.Success ? itemsResult.Results : [];\n this.contentRuns = runsResult.Success ? runsResult.Results : [];\n this.contentTags = tagsResult.Success ? tagsResult.Results : [];\n this.contentSourceTypes = typesResult.Success ? typesResult.Results : [];\n\n this.buildKPIMetrics();\n this.buildPipelineStages();\n this.buildProcessedItems();\n this.buildContentSources();\n } catch (error) {\n console.error('Error loading autotagging pipeline data:', error);\n this.ErrorMessage = 'Failed to load pipeline data. Please try again.';\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Refresh pipeline status data */\n public async RefreshData(): Promise<void> {\n await this.LoadData();\n }\n\n /** Format milliseconds into a human-readable duration */\n public FormatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n return `${(ms / 60000).toFixed(1)}m`;\n }\n\n /** Format a date as a relative time string */\n public FormatRelativeTime(date: Date | null): string {\n if (!date) return 'Never';\n const now = new Date();\n const diffMs = now.getTime() - new Date(date).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 /** Get CSS class for a processing status */\n public GetStatusClass(status: string): string {\n switch (status) {\n case 'Complete':\n case 'Active':\n return 'status-success';\n case 'Processing':\n return 'status-processing';\n case 'Error':\n return 'status-error';\n case 'Paused':\n return 'status-warning';\n default:\n return 'status-default';\n }\n }\n\n /** Get icon for a source type */\n public GetSourceTypeIcon(typeName: string): string {\n const iconMap: Record<string, string> = {\n 'Web': 'fa-solid fa-globe',\n 'API': 'fa-solid fa-plug',\n 'Database': 'fa-solid fa-database',\n 'File': 'fa-solid fa-file-alt',\n 'Email': 'fa-solid fa-envelope',\n 'RSS': 'fa-solid fa-rss',\n 'CMS': 'fa-solid fa-newspaper'\n };\n return iconMap[typeName] ?? 'fa-solid fa-folder';\n }\n\n // ---- Private Methods ----\n\n /** Build KPI metrics from loaded data */\n private buildKPIMetrics(): void {\n const activeSources = this.contentSourcesRaw.filter(\n (s: Record<string, unknown>) => s['Status'] === 'Active'\n ).length;\n\n const totalItems = this.contentItems.length;\n const totalTags = this.contentTags.length;\n const errorCount = this.contentRuns.filter(\n (r: Record<string, unknown>) => r['Status'] === 'Error'\n ).length;\n\n this.KPIMetrics = [\n {\n Label: 'Active Sources',\n Value: activeSources,\n Icon: 'fa-solid fa-satellite-dish',\n ColorClass: 'kpi-brand'\n },\n {\n Label: 'Items Processed',\n Value: totalItems,\n Icon: 'fa-solid fa-file-lines',\n ColorClass: 'kpi-info'\n },\n {\n Label: 'Tags Generated',\n Value: totalTags,\n Icon: 'fa-solid fa-tags',\n ColorClass: 'kpi-success'\n },\n {\n Label: 'Errors',\n Value: errorCount,\n Icon: 'fa-solid fa-circle-exclamation',\n ColorClass: errorCount > 0 ? 'kpi-error' : 'kpi-success'\n }\n ];\n }\n\n /** Build pipeline stage visualization data */\n private buildPipelineStages(): void {\n const runsByStage = this.groupRunsByStage();\n\n this.PipelineStages = [\n this.createStage('Ingest', 'fa-solid fa-download', runsByStage),\n this.createStage('Extract', 'fa-solid fa-file-export', runsByStage),\n this.createStage('Chunk', 'fa-solid fa-puzzle-piece', runsByStage),\n this.createStage('Tag', 'fa-solid fa-tag', runsByStage),\n this.createStage('Vectorize', 'fa-solid fa-vector-square', runsByStage)\n ];\n }\n\n /** Group content runs by their processing stage */\n private groupRunsByStage(): Map<string, Record<string, unknown>[]> {\n const groups = new Map<string, Record<string, unknown>[]>();\n for (const run of this.contentRuns) {\n const stage = (run['Stage'] as string) ?? 'Unknown';\n const existing = groups.get(stage) ?? [];\n existing.push(run);\n groups.set(stage, existing);\n }\n return groups;\n }\n\n /** Create a pipeline stage object from run data */\n private createStage(\n name: string,\n icon: string,\n runsByStage: Map<string, Record<string, unknown>[]>\n ): PipelineStage {\n const stageRuns = runsByStage.get(name) ?? [];\n const activeRuns = stageRuns.filter(\n (r: Record<string, unknown>) => r['Status'] === 'Processing' || r['Status'] === 'Running'\n );\n const errorRuns = stageRuns.filter(\n (r: Record<string, unknown>) => r['Status'] === 'Error'\n );\n\n let status: 'idle' | 'active' | 'error' = 'idle';\n if (errorRuns.length > 0) status = 'error';\n else if (activeRuns.length > 0) status = 'active';\n\n return { Name: name, Icon: icon, ActiveCount: activeRuns.length, Status: status };\n }\n\n /** Build the recent processing feed from content items and tags */\n private buildProcessedItems(): void {\n const tagCountByItem = this.countTagsByItem();\n\n this.ProcessedItems = this.contentItems.slice(0, 50).map((item: Record<string, unknown>) => {\n const itemId = item['ID'] as string;\n return {\n Name: (item['Name'] as string) ?? 'Unnamed Item',\n SourceName: (item['ContentSource'] as string) ?? (item['ContentSourceID'] as string) ?? 'Unknown',\n ProcessingTimeMs: (item['ProcessingTimeMs'] as number) ?? 0,\n Status: this.mapItemStatus(item['Status'] as string),\n TagCount: tagCountByItem.get(itemId) ?? 0,\n ProcessedAt: item['__mj_CreatedAt'] ? new Date(item['__mj_CreatedAt'] as string) : new Date()\n };\n });\n }\n\n /** Count tags per content item */\n private countTagsByItem(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const tag of this.contentTags) {\n const itemId = tag['ContentItemID'] as string;\n if (itemId) {\n counts.set(itemId, (counts.get(itemId) ?? 0) + 1);\n }\n }\n return counts;\n }\n\n /** Map raw status values to display status */\n private mapItemStatus(status: string | undefined): 'Complete' | 'Error' | 'Processing' {\n if (!status) return 'Processing';\n const normalized = status.toLowerCase();\n if (normalized === 'complete' || normalized === 'completed' || normalized === 'done') return 'Complete';\n if (normalized === 'error' || normalized === 'failed') return 'Error';\n return 'Processing';\n }\n\n /** Build content source summaries from raw data */\n private buildContentSources(): void {\n const typeMap = this.buildTypeMap();\n const itemCountBySource = this.countItemsBySource();\n\n this.ContentSources = this.contentSourcesRaw.map((source: Record<string, unknown>) => {\n const typeId = source['ContentSourceTypeID'] as string;\n const typeName = typeMap.get(typeId) ?? 'Unknown';\n\n return {\n ID: source['ID'] as string,\n Name: (source['Name'] as string) ?? 'Unnamed Source',\n TypeName: typeName,\n TypeIcon: this.GetSourceTypeIcon(typeName),\n Status: this.mapSourceStatus(source['Status'] as string),\n LastRunAt: source['LastRunAt'] ? new Date(source['LastRunAt'] as string) : null,\n ItemCount: itemCountBySource.get(source['ID'] as string) ?? 0\n };\n });\n }\n\n /** Build a map of source type IDs to names */\n private buildTypeMap(): Map<string, string> {\n const map = new Map<string, string>();\n for (const type of this.contentSourceTypes) {\n map.set(type['ID'] as string, (type['Name'] as string) ?? 'Unknown');\n }\n return map;\n }\n\n /** Count content items per source */\n private countItemsBySource(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const item of this.contentItems) {\n const sourceId = item['ContentSourceID'] as string;\n if (sourceId) {\n counts.set(sourceId, (counts.get(sourceId) ?? 0) + 1);\n }\n }\n return counts;\n }\n\n /** Map raw source status to display status */\n private mapSourceStatus(status: string | undefined): 'Active' | 'Paused' | 'Error' {\n if (!status) return 'Paused';\n const normalized = status.toLowerCase();\n if (normalized === 'active' || normalized === 'running') return 'Active';\n if (normalized === 'error' || normalized === 'failed') return 'Error';\n return 'Paused';\n }\n}\n\nexport function LoadAutotaggingPipelineResource(): void {\n // Prevents tree-shaking\n}\n","<!-- Content Autotagging Pipeline Monitor -->\n<div class=\"autotagging-container\">\n @if (IsLoading) {\n <div class=\"loading-overlay\">\n <mj-loading text=\"Loading pipeline data...\"></mj-loading>\n </div>\n }\n\n @if (ErrorMessage) {\n <div class=\"error-banner\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ ErrorMessage }}</span>\n <button class=\"refresh-btn\" (click)=\"RefreshData()\">\n <i class=\"fa-solid fa-rotate-right\"></i> Retry\n </button>\n </div>\n }\n\n @if (!IsLoading) {\n <!-- Header -->\n <div class=\"header-row\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-tags header-icon\"></i>\n <h2>Content Autotagging Pipeline</h2>\n </div>\n <button class=\"refresh-btn\" (click)=\"RefreshData()\">\n <i class=\"fa-solid fa-rotate-right\"></i> Refresh\n </button>\n </div>\n\n <!-- KPI Strip -->\n <div class=\"kpi-strip\">\n @for (metric of KPIMetrics; track metric.Label) {\n <div class=\"kpi-card\" [class]=\"metric.ColorClass\">\n <div class=\"kpi-icon\">\n <i [class]=\"metric.Icon\"></i>\n </div>\n <div class=\"kpi-content\">\n <span class=\"kpi-value\">{{ metric.Value | number }}</span>\n <span class=\"kpi-label\">{{ metric.Label }}</span>\n </div>\n </div>\n }\n </div>\n\n <!-- Pipeline Stages Visualization -->\n <div class=\"pipeline-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-diagram-project\"></i> Pipeline Stages\n </h3>\n <div class=\"pipeline-flow\">\n @for (stage of PipelineStages; track stage.Name; let last = $last) {\n <div class=\"pipeline-stage\" [class]=\"'stage-' + stage.Status\">\n <div class=\"stage-icon\">\n <i [class]=\"stage.Icon\"></i>\n </div>\n <span class=\"stage-name\">{{ stage.Name }}</span>\n <span class=\"stage-count\">\n @if (stage.ActiveCount > 0) {\n {{ stage.ActiveCount }} active\n } @else {\n Idle\n }\n </span>\n <div class=\"stage-indicator\"></div>\n </div>\n @if (!last) {\n <div class=\"stage-connector\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </div>\n }\n }\n </div>\n </div>\n\n <!-- Main content area: Feed + Sources sidebar -->\n <div class=\"main-content\">\n <!-- Recent Processing Feed -->\n <div class=\"feed-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i> Recent Processing\n </h3>\n <div class=\"feed-list\">\n @if (ProcessedItems.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No processed items yet.</p>\n </div>\n }\n @for (item of ProcessedItems; track $index) {\n <div class=\"feed-item\">\n <div class=\"feed-item-header\">\n <span class=\"feed-item-name\" [title]=\"item.Name\">{{ item.Name }}</span>\n <span class=\"feed-item-status\" [class]=\"GetStatusClass(item.Status)\">\n {{ item.Status }}\n </span>\n </div>\n <div class=\"feed-item-details\">\n <span class=\"feed-detail\">\n <i class=\"fa-solid fa-database\"></i> {{ item.SourceName }}\n </span>\n <span class=\"feed-detail\">\n <i class=\"fa-solid fa-stopwatch\"></i> {{ FormatDuration(item.ProcessingTimeMs) }}\n </span>\n <span class=\"feed-detail\">\n <i class=\"fa-solid fa-tags\"></i> {{ item.TagCount }} tags\n </span>\n <span class=\"feed-detail feed-time\">\n {{ FormatRelativeTime(item.ProcessedAt) }}\n </span>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Source Configuration Panel (right sidebar) -->\n <div class=\"sources-panel\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-gear\"></i> Content Sources\n </h3>\n <div class=\"sources-list\">\n @if (ContentSources.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-plug-circle-xmark\"></i>\n <p>No sources configured.</p>\n </div>\n }\n @for (source of ContentSources; track source.ID) {\n <div class=\"source-card\">\n <div class=\"source-header\">\n <div class=\"source-icon\">\n <i [class]=\"source.TypeIcon\"></i>\n </div>\n <div class=\"source-info\">\n <span class=\"source-name\">{{ source.Name }}</span>\n <span class=\"source-type\">{{ source.TypeName }}</span>\n </div>\n <span class=\"source-status\" [class]=\"GetStatusClass(source.Status)\">\n {{ source.Status }}\n </span>\n </div>\n <div class=\"source-meta\">\n <span class=\"source-meta-item\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ FormatRelativeTime(source.LastRunAt) }}\n </span>\n <span class=\"source-meta-item\">\n <i class=\"fa-solid fa-file-lines\"></i>\n {{ source.ItemCount | number }} items\n </span>\n </div>\n </div>\n }\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, RunView } from '@memberjunction/core';\nimport { TreeBranchConfig, TreeLeafConfig } from '@memberjunction/ng-trees';\nimport { ResourceData, KnowledgeHubMetadataEngine } from '@memberjunction/core-entities';\nimport { RegisterClass, UUIDsEqual } 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';\n\n// ── Tab type ──\n\ntype TabName = 'pipeline' | 'sources' | 'types' | 'tags' | '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}\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\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: string[];\n CreatedAt: string;\n UpdatedAt: string;\n ContentSourceID: string;\n StatusDot: 'complete' | 'processing' | 'error';\n TagCount: number;\n}\n\ninterface SourceDetailInfo {\n ID: string;\n Name: string;\n SourceTypeName: string;\n FileTypeName: string;\n ContentTypeName: string;\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 private destroy$ = new Subject<void>();\n private cdr = inject(ChangeDetectorRef);\n private navigationService = inject(NavigationService);\n\n // ── Global state ──\n public IsLoading = true;\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 run state\n public IsRunning = false;\n public RunProgress = 0;\n public RunStage = '';\n public RunCurrentItem = '';\n\n // ── Sources tab ──\n public SourceCards: SourceCard[] = [];\n\n // ── Content Types tab ──\n public ContentTypeCards: ContentTypeCard[] = [];\n\n // ── Tag Library tab ──\n public TagRows: TagRow[] = [];\n public TagCloud: TagCloudItem[] = [];\n public TagsBySource: TagBySource[] = [];\n public TagSearchQuery = '';\n public FilteredTagRows: TagRow[] = [];\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 // ── Slide-in form ──\n public FormMode: FormMode = 'none';\n public FormSaving = 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 // Embedding model + vector index form fields (Content Source overrides)\n public FormSourceEmbeddingModelID = '';\n public FormSourceVectorIndexID = '';\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 // 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 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 async ngAfterViewInit(): Promise<void> {\n await this.LoadPipelineData();\n this.tabDataLoaded.add('pipeline');\n this.IsLoading = false;\n this.cdr.detectChanges();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Content Autotagging';\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.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 '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', 'ContentSource', 'ContentSourceType', 'ContentType', 'ContentFileType', 'URL', 'TextContent', 'Checksum', '__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', 'Tag', '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 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.contentTagsRaw.length), BadgeClass: '' },\n ];\n }\n\n private buildKPIMetrics(): void {\n const sourceCount = this.contentSourcesRaw.length;\n const itemCount = this.contentItemsRaw.length;\n const tagCount = this.contentTagsRaw.length;\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.slice(0, 50).map(item => {\n const itemId = item['ID'] as string;\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(itemId) ?? 0)\n };\n });\n }\n\n private buildSourceMinis(): void {\n const itemCountBySource = this.countItemsBySource();\n this.SourceMinis = this.contentSourcesRaw.map(source => {\n const id = source['ID'] as string;\n const itemCount = 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 private buildTrendingTags(): void {\n const tagCounts = this.countAllTags();\n const avgWeights = this.computeAvgWeights();\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, 12);\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 // SOURCES TAB\n // ════════════════════════════════════════════\n\n private async loadSourcesData(): Promise<void> {\n await this.ensureBaseDataLoaded();\n this.buildSourceCards();\n }\n\n private buildSourceCards(): void {\n const itemCountBySource = this.countItemsBySource();\n const tagCountBySource = 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 = itemCountBySource.get(id) ?? 0;\n const tagCount = 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 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 };\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 const itemsByType = 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: 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\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 // ════════════════════════════════════════════\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 statusLower = status.toLowerCase();\n const isFailed = statusLower === 'error' || statusLower === 'failed';\n const isRunning = statusLower === 'running' || statusLower === 'processing';\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: isFailed ? status : '0',\n ErrorClass: isFailed ? '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 // 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.FormSourceEmbeddingModelID = card.EmbeddingModelID ?? '';\n this.FormSourceVectorIndexID = card.VectorIndexID ?? '';\n this.EditingSourceID = card.ID;\n this.FormMode = 'edit-source';\n this.cdr.detectChanges();\n }\n\n public async SaveSource(): 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 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.Set('Name', this.FormSourceName);\n entity.Set('ContentSourceTypeID', this.FormSourceTypeID);\n entity.Set('ContentTypeID', this.FormContentTypeID);\n entity.Set('ContentFileTypeID', this.FormFileTypeID);\n entity.Set('URL', this.FormSourceURL);\n entity.Set('EmbeddingModelID', this.FormSourceEmbeddingModelID || null);\n entity.Set('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 MJNotificationService.Instance.CreateSimpleNotification('Failed to save 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 } 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 // 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 public async RunPipeline(): 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.RunProgress = 0;\n this.RunStage = 'Starting...';\n this.RunCurrentItem = '';\n this.cdr.detectChanges();\n\n try {\n const aiClient = new GraphQLAIClient(provider);\n const result = await aiClient.RunAutotagPipeline();\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.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 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.RunStage = success ? 'Complete' : 'Error';\n this.RunProgress = success ? 100 : 0;\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 await this.LoadPipelineData();\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 = 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 = 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 ((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 = '';\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 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.FormSourceEmbeddingModelID = '';\n this.FormSourceVectorIndexID = '';\n this.EditingSourceID = '';\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 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.getAllTagsForItem(itemId);\n const tagCount = allTags.length;\n\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['TextContent'] 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 StatusDot: feed.Status,\n TagCount: tagCount\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 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 pkey.KeyValuePairs = [{ FieldName: 'ID', Value: item.ID }];\n this.navigationService.OpenEntityRecord('MJ: Content Items', pkey);\n }\n\n private getAllTagsForItem(itemId: string): string[] {\n const tags: string[] = [];\n for (const tag of this.contentTagsRaw) {\n if ((tag['ItemID'] as string) === itemId) {\n tags.push(tag['Tag'] as string);\n }\n }\n return tags;\n }\n\n // ════════════════════════════════════════════\n // DETAIL PANELS — Source Detail\n // ════════════════════════════════════════════\n\n public async OpenSourceDetail(card: SourceCard): Promise<void> {\n this.SourceDetailLoading = true;\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 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.getAllTagsForItem(itemId);\n const tagCount = tagsByItem.get(itemId) ?? allTags.length;\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['TextContent'] 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 StatusDot: tagCount > 0 ? 'complete' : 'processing',\n TagCount: tagCount\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 statusLower = status.toLowerCase();\n const isFailed = statusLower === 'error' || statusLower === 'failed';\n const isRunning = statusLower === 'running' || statusLower === 'processing';\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: isFailed ? status : '0',\n ErrorClass: isFailed ? '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\nexport function LoadAutotaggingPipelineResource(): void {\n // Prevents tree-shaking\n}\n","<!-- Content Autotagging 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> Autotagging</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 hidden for now — can re-enable with animation later -->\n\n <!-- Progress bar (visible during run) -->\n @if (IsRunning) {\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 }}%</span>\n </div>\n <div class=\"at-progress-bar\"><div class=\"at-progress-fill\" [style.width.%]=\"RunProgress\"></div></div>\n @if (RunCurrentItem) {\n <div class=\"at-progress-current\">{{ RunCurrentItem }}</div>\n }\n </div>\n }\n\n <!-- Recent Processing Feed -->\n <div class=\"at-card\" style=\"flex: 1;\">\n <div class=\"at-card-header\">\n <span class=\"at-card-title\"><i class=\"fa-solid fa-bolt\"></i> Recent Processing</span>\n </div>\n <div class=\"at-card-body\">\n @if (FeedItems.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No processed items yet.</p>\n </div>\n }\n @for (item of FeedItems; track $index) {\n <div class=\"at-feed-item at-feed-item-clickable\" (click)=\"OpenFeedItemDetail($index)\">\n <div class=\"at-feed-status-dot\" [class]=\"item.Status\"></div>\n <span class=\"at-feed-item-name\">{{ item.Name }}</span>\n <span class=\"at-feed-item-source\">{{ item.SourceName }}</span>\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 </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 </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 }} · {{ 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 <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)=\"RunPipeline(); $event.stopPropagation()\"><i class=\"fa-solid fa-play\"></i> Run</button>\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 </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>\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 </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 <div class=\"at-tag-cloud\">\n @for (tag of TagCloud; 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 <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 5: 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>\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 </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 <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 <div class=\"at-form-group\">\n <label class=\"at-form-label\">URL</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceURL\" placeholder=\"https://...\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Embedding Model Override</label>\n <mj-tree-dropdown\n [BranchConfig]=\"AIModelVendorBranch\"\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]=\"AIModelVendorBranch\"\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 <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 </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 -->\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 (tag of SelectedFeedItem.Tags; track tag) {\n <span class=\"at-tag-pill\">{{ tag }}</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 <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 <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 -->\n <div class=\"at-detail-section\">\n <div class=\"at-detail-section-label\">Content Library ({{ SelectedSource.ContentItems.length }})</div>\n <div class=\"at-detail-content-list\">\n @if (SelectedSource.ContentItems.length === 0) {\n <div class=\"at-empty-state\" style=\"padding: 16px;\">\n <p>No content items yet.</p>\n </div>\n }\n @for (ci of SelectedSource.ContentItems; 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-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 </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</div>\n"]}