@memberjunction/ng-dashboards 5.38.0 → 5.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -7
- package/dist/AI/components/agents/agent-configuration.component.js +199 -198
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +20 -17
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +15 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +166 -58
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +2 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +1 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.js +55 -36
- package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +9 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +158 -117
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +1 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +22 -8
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +217 -860
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1717 -7802
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts +56 -0
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js +423 -0
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts +70 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js +308 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts +29 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +186 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts +69 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js +278 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts +73 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js +393 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts +122 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js +908 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts +87 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js +475 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts +29 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js +208 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts +21 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js +70 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +333 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +2125 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts +61 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.js +78 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.format.d.ts +58 -0
- package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.format.js +260 -0
- package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.types.d.ts +319 -0
- package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.types.js +6 -0
- package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts +103 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.js +571 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +77 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.js +519 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts +107 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.js +719 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +131 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +813 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +177 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1465 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +78 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.js +492 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts +397 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js +3490 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +56 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.js +271 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +3 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +306 -290
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +1 -1
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +209 -208
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +130 -128
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +61 -61
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +17 -17
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +1 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +578 -538
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +3 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +331 -303
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js +14 -2
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/AI/services/cache-metrics.d.ts +50 -0
- package/dist/AI/services/cache-metrics.d.ts.map +1 -0
- package/dist/AI/services/cache-metrics.js +43 -0
- package/dist/AI/services/cache-metrics.js.map +1 -0
- package/dist/APIKeys/api-applications-panel.component.js +2 -2
- package/dist/APIKeys/api-key-create-dialog.component.js +2 -2
- package/dist/APIKeys/api-key-edit-panel.component.js +2 -2
- package/dist/APIKeys/api-keys-resource.component.js +132 -131
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +141 -141
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +15 -15
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -5
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +139 -212
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +2 -2
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +2 -2
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +2 -2
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +2 -2
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +54 -49
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts +6 -0
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +72 -50
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +103 -102
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +52 -51
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +39 -38
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts +6 -0
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +92 -89
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +136 -135
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +155 -152
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +119 -118
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +129 -128
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +107 -106
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +31 -340
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +468 -1958
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.js +10 -0
- package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +115 -114
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +5 -6
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +4 -5
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/DevTools/app-state-inspector.component.js +18 -17
- package/dist/DevTools/app-state-inspector.component.js.map +1 -1
- package/dist/DevTools/class-registry.component.js +88 -85
- package/dist/DevTools/class-registry.component.js.map +1 -1
- package/dist/DevTools/event-monitor.component.js +155 -150
- package/dist/DevTools/event-monitor.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +245 -243
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/DevTools/layout-inspector.component.js +18 -17
- package/dist/DevTools/layout-inspector.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -19
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +2 -2
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +236 -229
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +390 -389
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +2 -2
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +14 -11
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +27 -2
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +244 -119
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +293 -291
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +62 -61
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts +65 -0
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js +176 -0
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js.map +1 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts +81 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js +308 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js.map +1 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts +85 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js +362 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/index.d.ts +3 -0
- package/dist/KnowledgeHub/index.d.ts.map +1 -1
- package/dist/KnowledgeHub/index.js +3 -0
- package/dist/KnowledgeHub/index.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +6 -2
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +525 -566
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +135 -134
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +199 -198
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
- package/dist/MCP/mcp-dashboard.component.js +443 -438
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +146 -147
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +76 -75
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +97 -96
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +24 -22
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +2 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.js +1 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +14 -4
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +436 -427
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +1 -1
- package/dist/Testing/components/testing-runs.component.js +116 -115
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +6 -7
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +173 -172
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.d.ts +6 -0
- package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +116 -92
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +57 -35
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +80 -1
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +1 -1
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +7 -1
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/data-explorer-dashboards.module.d.ts +12 -14
- package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
- package/dist/data-explorer-dashboards.module.js +5 -14
- package/dist/data-explorer-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +3 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -0
- package/dist/public-api.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +4 -5
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +7 -5
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +57 -54
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts +0 -79
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts.map +0 -1
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +0 -195
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +0 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +0 -226
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +0 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +0 -861
- package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-type-form.dialog.component.js","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/dialogs/source-type-form.dialog.component.ts","../../../../../src/AI/components/autotagging/dialogs/source-type-form.dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Classify · Source + Content Type CRUD slide-in form dialog.\n *\n * Owns the entire add/edit slide-in form for BOTH content sources and content\n * types (the form renders one or the other depending on `FormMode`). Extracted\n * from the host monolith: the dialog owns ALL form state, the dropdown option\n * getters, the dynamic source-type field logic, and the open / populate / save /\n * close lifecycle. It reads cached reference metadata directly from\n * `KnowledgeHubMetadataEngine.Instance` / `AIEngineBase.Instance` (same as the\n * host did) and persists via the threaded provider.\n *\n * Contract with the host (data orchestrator):\n * - The host calls the public `OpenAddSource()` / `OpenEditSource(card)` /\n * `OpenAddType()` / `OpenEditType(card)` methods via `@ViewChild` in response\n * to the Sources/Types tabs' add/edit events.\n * - After a successful save the dialog closes itself and emits `(Saved)` with\n * `{ kind: 'source' | 'type' }` so the host reloads the right shared data.\n * - When a source save is blocked because no content type exists, it emits\n * `(ContentTypeMissing)` so the host shows its no-content-type warning.\n * - \"Open advanced settings\" navigates to the full entity form via the host's\n * NavigationService through the `(NavigateToRecordRequested)` output.\n */\nimport { Component, ChangeDetectorRef, EventEmitter, Output, inject, NgZone, OnDestroy } from '@angular/core';\nimport { CompositeKey, RunView } from '@memberjunction/core';\nimport { TreeBranchConfig, TreeLeafConfig } from '@memberjunction/ng-trees';\nimport { KnowledgeHubMetadataEngine, MJContentSourceEntity, MJContentTypeEntity, MJContentSourceEntity_IContentSourceConfiguration, MJContentSourceTypeEntity_IContentSourceTypeField, MJEntityDocumentEntity, ApplicationSettingEngine, UserInfoEngine } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { TagEngineBase } from '@memberjunction/tag-engine-base';\nimport { SourceCard, ContentTypeCard, DropdownOption, FormMode } from '../shared/classify.types';\n\n/** The taxonomy-mode literal union, derived from the typed config so it can never drift. */\ntype TaxonomyModeJson = NonNullable<MJContentSourceEntity_IContentSourceConfiguration['TagTaxonomyMode']>;\n\n/** How the source-level domain context combines with the org / content-type scopes. */\nexport type ClassificationContextMode = 'additive' | 'substitutive';\n\n/**\n * Source-level classification-context extension to the CodeGen-generated\n * {@link MJContentSourceEntity_IContentSourceConfiguration} interface. These two\n * keys are not yet in the generated JSON-type interface (a migration + CodeGen\n * pass is required to add them there); we model them as a typed extension so this\n * client code stays strongly typed without touching generated code. They are\n * persisted into the source's Configuration JSON and read by the server-side\n * `ClassificationContextResolver` during autotagging.\n */\nexport interface IContentSourceClassificationConfiguration\n extends MJContentSourceEntity_IContentSourceConfiguration {\n /** Free-text guidance injected into the autotagging prompt at the SOURCE scope. */\n ClassificationContext?: string;\n /** How this source's context combines with the org/type scopes. Defaults to 'additive'. */\n ClassificationContextMode?: ClassificationContextMode;\n}\n\n/**\n * Application name used to resolve the Knowledge Hub Application ID for the\n * org-level classification-context ApplicationSetting. Mirrors the server-side\n * `KNOWLEDGE_HUB_APPLICATION_NAME` constant.\n */\nexport const KNOWLEDGE_HUB_APPLICATION_NAME = 'Knowledge Hub';\n\n/** ApplicationSetting key under which the org-level classification context lives. */\nexport const CLASSIFY_ORG_CONTEXT_SETTING_KEY = 'classify.org.context';\n\n/** One selectable taxonomy-mode card (icon + name + one-line \"best for\"). */\ninterface TaxonomyModeOption {\n value: TaxonomyModeJson;\n label: string;\n icon: string;\n bestFor: string;\n}\n\n/** Default classifier knob values — mirrors the autotagger's runtime defaults + the reference panel. */\nconst DEFAULT_TAXONOMY_MODE: TaxonomyModeJson = 'auto-grow';\nconst DEFAULT_MATCH_THRESHOLD = 0.85;\nconst SUGGEST_THRESHOLD_GAP = 0.05;\nconst DEFAULT_SHARE_TAXONOMY = true;\nconst DEFAULT_ENABLE_VECTORIZATION = true;\n\n/** Slide-in panel width bounds + default. The source form is field-rich, so it\n * defaults wider than the host's 420px shared default. */\nconst PANEL_WIDTH_DEFAULT = 640;\nconst PANEL_WIDTH_MIN = 420;\n/** UserInfoEngine setting key for the remembered source-form panel width. */\nconst PANEL_WIDTH_SETTING_KEY = 'mj.classify.sourceForm.width';\n\n/** One row in the effective-values aside: the resolved value + where it came from. */\ninterface EffectiveValueRow {\n label: string;\n value: string;\n origin: 'source override' | 'default';\n}\n\n@Component({\n standalone: false,\n selector: 'classify-source-type-form-dialog',\n templateUrl: './source-type-form.dialog.component.html',\n styleUrls: ['./source-type-form.dialog.component.css']\n})\nexport class ClassifySourceTypeFormDialogComponent extends BaseAngularComponent implements OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private zone = inject(NgZone);\n\n // ── Resizable panel state ──\n\n /** Current slide-in panel width (px). Bound to the panel via [style.width.px]. */\n public PanelWidth: number = PANEL_WIDTH_DEFAULT;\n\n /** Whether the inline \"Effective values\" panel is shown in the Classification section. */\n public ShowEffectiveValues: boolean = false;\n\n /** Active-drag bookkeeping for the left-edge resize handle. */\n private isResizing = false;\n private resizeMoveListener: ((e: MouseEvent) => void) | null = null;\n private resizeUpListener: (() => void) | null = null;\n\n // ── Cross-tab / host intents ──\n\n /** Emitted after a successful save so the host reloads the relevant shared data. */\n @Output() Saved = new EventEmitter<{ kind: 'source' | 'type' }>();\n /** Emitted when a source save is blocked because no content type exists. */\n @Output() ContentTypeMissing = new EventEmitter<void>();\n /** Emitted when the user opts into the full entity form (advanced settings). */\n @Output() NavigateToRecordRequested = new EventEmitter<{ entityName: string; key: CompositeKey }>();\n\n // ── Slide-in form state ──\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 // Entity source fields (shown when source type is \"Entity\")\n public FormSourceEntityID = '';\n public FormSourceEntityDocID = '';\n\n // ── Inline Entity Document creation ──────────────────────────────────────\n // When the selected Entity-type source's entity has no Entity Document, the\n // form shows a callout + an inline create sub-form so the operator doesn't\n // have to leave the wizard to set one up.\n\n /** Whether the inline \"Create Entity Document\" sub-form is expanded. */\n public ShowInlineEntityDocForm = false;\n /** Saving spinner for the inline Entity Document create. */\n public EntityDocSaving = false;\n /** Name for the new Entity Document (auto-filled from the entity). */\n public NewEntityDocName = '';\n /** Selected field names to include in the new Entity Document template. */\n public NewEntityDocSelectedFields: Record<string, boolean> = {};\n\n // Embedding model + vector index form fields (Content Source overrides)\n public FormSourceEmbeddingModelID = '';\n public FormSourceVectorIndexID = '';\n\n // Slide-in is the QUICK-EDIT surface for content sources. We only expose the\n // most-useful subset of the new knobs here; the full surface (other budgets,\n // URL pattern, root URL, taxonomy mode, thresholds, …) lives on the entity\n // form opened via the \"Open Advanced settings →\" link below.\n //\n // Decisions:\n // - MaxItemsPerRun: the single most-asked-for cap → always shown\n // - MaxDepth + the two crawl toggles: Website-only, the symptom that\n // started this whole work\n // - Everything else: too niche for the quick-edit surface\n public FormMaxItemsPerRun: number | null = null;\n public FormMaxDepth: number | null = null;\n public FormCrawlSitesInLowerLevelDomain: boolean = true;\n public FormCrawlOtherSitesInTopLevelDomain: boolean = false;\n\n // ── Classification (full config parity) ──────────────────────────────\n // The classifier knobs that used to require navigating out to the entity\n // form's \"advanced settings\" are now edited inline. They live on the typed\n // Configuration JSON (`MJContentSourceEntity_IContentSourceConfiguration`),\n // accessed via the `Config` getter / `setConfig` merge helper below.\n //\n // For EDIT we hydrate `workingConfig` from the loaded source's\n // ConfigurationObject; for ADD we start from {} and accumulate. On SAVE the\n // working config is merged into the entity's ConfigurationObject so we never\n // clobber Website / SourceSpecificConfiguration sub-objects.\n private workingConfig: IContentSourceClassificationConfiguration = {};\n\n /** Selectable taxonomy-mode cards. Exactly the three modes the type allows — no 'hybrid'. */\n public readonly TaxonomyModes: TaxonomyModeOption[] = [\n { value: 'constrained', label: 'Constrained', icon: 'fa-lock', bestFor: 'Curated, regulated taxonomies' },\n { value: 'auto-grow', label: 'Auto-Grow', icon: 'fa-seedling', bestFor: 'Bounded growth under a tag root' },\n { value: 'free-flow', label: 'Free-Flow', icon: 'fa-water', bestFor: 'Sandbox — anything goes' },\n ];\n\n /** Tags eligible to be the taxonomy root (loaded from TagEngineBase). */\n public TagRootOptions: { ID: string; Name: string }[] = [];\n\n // ── Config accessor + merge helper (mirrors TagPipelineConfigurationPanel) ──\n\n /** The working classifier config — never null; defaults are applied by the typed getters below. */\n public get Config(): IContentSourceClassificationConfiguration {\n return this.workingConfig;\n }\n\n /** Merge a partial patch into the working config (immutable spread, like the reference panel). */\n public setConfig(patch: Partial<IContentSourceClassificationConfiguration>): void {\n this.workingConfig = { ...this.workingConfig, ...patch };\n }\n\n // Taxonomy mode\n public get CurrentMode(): TaxonomyModeJson {\n return this.Config.TagTaxonomyMode ?? DEFAULT_TAXONOMY_MODE;\n }\n public SetMode(mode: TaxonomyModeJson): void {\n this.setConfig({ TagTaxonomyMode: mode });\n }\n\n // Thresholds — match auto-applies; suggest routes to inbox. When match moves\n // and suggest is unset/above it, default suggest to max(0, match - 0.05).\n public get MatchThresholdValue(): number {\n return this.Config.TagMatchThreshold ?? DEFAULT_MATCH_THRESHOLD;\n }\n public set MatchThresholdValue(v: number | string) {\n const clamped = Math.max(0, Math.min(1, Number(v) || 0));\n const cur = this.Config.SuggestThreshold;\n const patch: Partial<MJContentSourceEntity_IContentSourceConfiguration> = { TagMatchThreshold: clamped };\n if (cur == null || cur >= clamped) {\n patch.SuggestThreshold = Math.max(0, clamped - SUGGEST_THRESHOLD_GAP);\n }\n this.setConfig(patch);\n }\n public get SuggestThresholdValue(): number {\n return this.Config.SuggestThreshold ?? Math.max(0, this.MatchThresholdValue - SUGGEST_THRESHOLD_GAP);\n }\n public set SuggestThresholdValue(v: number | string) {\n const clamped = Math.max(0, Math.min(this.MatchThresholdValue, Number(v) || 0));\n this.setConfig({ SuggestThreshold: clamped });\n }\n public get ThresholdValidationMessage(): string | null {\n const m = this.Config.TagMatchThreshold;\n const s = this.Config.SuggestThreshold;\n if (m != null && s != null && s >= m) {\n return 'Suggest threshold must be lower than the match threshold.';\n }\n return null;\n }\n\n // Tag root + toggles\n public get TagRootIDValue(): string {\n return this.Config.TagRootID ?? '';\n }\n public set TagRootIDValue(v: string) {\n this.setConfig({ TagRootID: v ? v : null });\n }\n public get ShareTaxonomyValue(): boolean {\n return this.Config.ShareTaxonomyWithLLM !== false; // default true\n }\n public set ShareTaxonomyValue(v: boolean) {\n this.setConfig({ ShareTaxonomyWithLLM: v });\n }\n public get EnableVectorizationValue(): boolean {\n return this.Config.EnableVectorization !== false; // default true\n }\n public set EnableVectorizationValue(v: boolean) {\n this.setConfig({ EnableVectorization: v });\n }\n\n // ── Domain context (source scope) ──────────────────────────────────────\n // Free-text guidance + combine mode persisted into the source Configuration\n // JSON. The server-side ClassificationContextResolver reads these and combines\n // them with the org-level and content-type-level scopes when autotagging runs.\n\n /** Source-level domain-context free text. */\n public get ClassificationContextValue(): string {\n return this.Config.ClassificationContext ?? '';\n }\n public set ClassificationContextValue(v: string) {\n const trimmed = (v ?? '').length > 0 ? v : undefined;\n this.setConfig({ ClassificationContext: trimmed });\n this.cdr.detectChanges();\n }\n\n /** Whether this source's context is additive (concatenated) or substitutive (most-specific wins). */\n public get ClassificationContextModeValue(): ClassificationContextMode {\n return this.Config.ClassificationContextMode === 'substitutive' ? 'substitutive' : 'additive';\n }\n public set ClassificationContextModeValue(v: ClassificationContextMode) {\n this.setConfig({ ClassificationContextMode: v });\n this.cdr.detectChanges();\n }\n\n /** Convenience boolean bound to the additive/substitutive mj-switch. On = substitutive. */\n public get IsSubstitutiveMode(): boolean {\n return this.ClassificationContextModeValue === 'substitutive';\n }\n public set IsSubstitutiveMode(v: boolean) {\n this.ClassificationContextModeValue = v ? 'substitutive' : 'additive';\n }\n\n /**\n * The org-level domain context, resolved once from ApplicationSettingEngine\n * (Knowledge Hub app scope, GLOBAL fallback). Read-only here — the org editor\n * lives on the Content Types tab. Used for the effective-context preview.\n */\n public OrgClassificationContext = '';\n\n /**\n * The effective domain-context preview the autotagger would assemble for this\n * source, mirroring the server-side `ClassificationContextResolver` combine\n * logic. Content-type scope is intentionally omitted here because the slide-in\n * doesn't load every content type's Configuration JSON — the preview shows the\n * org + source scopes (the two the operator edits in this flow).\n */\n public get EffectiveContextPreview(): string {\n const org = this.cleanContext(this.OrgClassificationContext);\n const source = this.cleanContext(this.Config.ClassificationContext);\n if (this.ClassificationContextModeValue === 'substitutive') {\n return source ?? org ?? '(no domain context set)';\n }\n const parts: string[] = [];\n if (org) parts.push(`Organization context:\\n${org}`);\n if (source) parts.push(`Source context:\\n${source}`);\n return parts.length > 0 ? parts.join('\\n\\n') : '(no domain context set)';\n }\n\n /** Normalize a raw context value: trim, treat empty as undefined. */\n private cleanContext(value: string | null | undefined): string | undefined {\n if (value == null) return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n\n // Budgets (blank = unlimited → key stripped from JSON)\n public get MaxNewTagsPerRunValue(): number | null {\n return this.Config.MaxNewTagsPerRun ?? null;\n }\n public set MaxNewTagsPerRunValue(v: number | string | null) {\n this.setConfig({ MaxNewTagsPerRun: this.normalizeNullableNumber(v) });\n }\n public get MaxNewTagsPerItemValue(): number | null {\n return this.Config.MaxNewTagsPerItem ?? null;\n }\n public set MaxNewTagsPerItemValue(v: number | string | null) {\n this.setConfig({ MaxNewTagsPerItem: this.normalizeNullableNumber(v) });\n }\n public get MaxTokensPerRunValue(): number | null {\n return this.Config.MaxTokensPerRun ?? null;\n }\n public set MaxTokensPerRunValue(v: number | string | null) {\n this.setConfig({ MaxTokensPerRun: this.normalizeNullableNumber(v) });\n }\n public get MaxCostPerRunValue(): number | null {\n return this.Config.MaxCostPerRun ?? null;\n }\n public set MaxCostPerRunValue(v: number | string | null) {\n this.setConfig({ MaxCostPerRun: this.normalizeNullableNumber(v) });\n }\n\n /**\n * Coerce a possibly-blank input into a typed number. Returning undefined\n * deletes the key from the persisted JSON when the setConfig spread is applied.\n */\n private normalizeNullableNumber(v: number | string | null | undefined): number | undefined {\n if (v == null) return undefined;\n if (typeof v === 'string') {\n const trimmed = v.trim();\n if (trimmed === '') return undefined;\n const n = Number(trimmed);\n return Number.isFinite(n) ? n : undefined;\n }\n return Number.isFinite(v) ? v : undefined;\n }\n\n /** Human label for the currently-selected tag root (for the effective-values aside). */\n private get tagRootLabel(): string {\n const id = this.Config.TagRootID;\n if (!id) return 'Whole taxonomy';\n const match = this.TagRootOptions.find(t => UUIDsEqual(t.ID, id));\n return match?.Name ?? 'Whole taxonomy';\n }\n\n /**\n * The effective value of each key knob + where it comes from. Since the tag\n * classifier fields are source-level JSON (no content-type cascade), the\n * effective value is the configured override or the documented default.\n */\n public get EffectiveValues(): EffectiveValueRow[] {\n const c = this.Config;\n const mode = this.TaxonomyModes.find(m => m.value === this.CurrentMode);\n return [\n { label: 'Taxonomy mode', value: mode?.label ?? this.CurrentMode, origin: c.TagTaxonomyMode != null ? 'source override' : 'default' },\n { label: 'Tag root', value: this.tagRootLabel, origin: c.TagRootID ? 'source override' : 'default' },\n { label: 'Match threshold', value: this.MatchThresholdValue.toFixed(2), origin: c.TagMatchThreshold != null ? 'source override' : 'default' },\n { label: 'Suggest threshold', value: this.SuggestThresholdValue.toFixed(2), origin: c.SuggestThreshold != null ? 'source override' : 'default' },\n { label: 'Share taxonomy w/ LLM', value: this.ShareTaxonomyValue ? 'On' : 'Off', origin: c.ShareTaxonomyWithLLM != null ? 'source override' : 'default' },\n { label: 'Vectorization', value: this.EnableVectorizationValue ? 'On' : 'Off', origin: c.EnableVectorization != null ? 'source override' : 'default' },\n ];\n }\n\n /** True when the form's selected source type is Website — gates the crawler knobs. */\n public get IsWebsiteSourceTypeSelected(): boolean {\n if (!this.FormSourceTypeID) return false;\n const t = this.SourceTypeOptions.find(o => UUIDsEqual(o.ID, this.FormSourceTypeID));\n return t != null && t.Name?.trim().toLowerCase() === 'website';\n }\n\n /** Whether the selected source type is the Entity type (name-based check) */\n public get IsEntitySourceTypeSelected(): boolean {\n if (!this.FormSourceTypeID) return false;\n const sourceType = this.SourceTypeOptions.find(o => UUIDsEqual(o.ID, this.FormSourceTypeID));\n return sourceType?.Name?.toLowerCase() === 'entity';\n }\n\n /** Whether the selected source type requires Content Type / File Type selection */\n public get SelectedSourceTypeRequiresContentType(): boolean {\n if (!this.FormSourceTypeID) return true;\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const st = engine.ContentSourceTypes.find(t => UUIDsEqual(t.ID, this.FormSourceTypeID));\n return st?.ConfigurationObject?.RequiresContentType !== false;\n } catch {\n return true;\n }\n }\n\n /** Entities that have at least one EntityDocument configured */\n public get EntitiesWithDocuments(): { ID: string; Name: string }[] {\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const docs = engine.GetActiveEntityDocuments();\n const entityMap = new Map<string, string>();\n const md = this.ProviderToUse;\n for (const doc of docs) {\n const entityName = doc.Entity;\n if (entityName) {\n const entityInfo = md.Entities.find(e => e.Name === entityName);\n if (entityInfo && !entityMap.has(entityInfo.ID)) {\n entityMap.set(entityInfo.ID, entityInfo.Name);\n }\n }\n }\n return Array.from(entityMap.entries())\n .map(([ID, Name]) => ({ ID, Name }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n } catch {\n return [];\n }\n }\n\n /** Entity documents for the selected entity */\n public get EntityDocOptionsForSelectedEntity(): { ID: string; Name: string }[] {\n if (!this.FormSourceEntityID) return [];\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const md = this.ProviderToUse;\n const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, this.FormSourceEntityID));\n if (!entityInfo) return [];\n return engine.GetActiveEntityDocuments()\n .filter(d => d.Entity === entityInfo.Name)\n .map(d => ({ ID: d.ID, Name: d.Name }));\n } catch {\n return [];\n }\n }\n\n // ════════════════════════════════════════════\n // INLINE ENTITY DOCUMENT CREATION\n // ════════════════════════════════════════════\n\n /**\n * The entity ID currently selected for an Entity-type source. The dynamic\n * entity-picker stores its value under its field Key (conventionally\n * 'EntityID') in FormSourceSpecificConfig; fall back to FormSourceEntityID.\n */\n public get SelectedEntityID(): string {\n const fromDynamic = this.FormSourceSpecificConfig['EntityID'];\n return fromDynamic || this.FormSourceEntityID || '';\n }\n\n /** EntityInfo for the currently-selected entity, or null. */\n private get selectedEntityInfo() {\n if (!this.SelectedEntityID) return null;\n return this.ProviderToUse.Entities.find(e => UUIDsEqual(e.ID, this.SelectedEntityID)) ?? null;\n }\n\n /** Display name of the selected entity (for the callout + auto-filled doc name). */\n public get SelectedEntityName(): string {\n return this.selectedEntityInfo?.Name ?? '';\n }\n\n /**\n * True when an Entity source type is selected, an entity is chosen, and that\n * entity has NO active Entity Document — the trigger for the inline create UI.\n */\n public get SelectedEntityHasNoDocument(): boolean {\n if (!this.IsEntitySourceTypeSelected) return false;\n const entity = this.selectedEntityInfo;\n if (!entity) return false;\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n return engine.GetActiveEntityDocuments().filter(d => d.Entity === entity.Name).length === 0;\n } catch {\n return false;\n }\n }\n\n /** Fields of the selected entity, for the field-picker in the inline create form. */\n public get SelectedEntityFields(): { Name: string; DisplayName: string }[] {\n const entity = this.selectedEntityInfo;\n if (!entity) return [];\n return entity.Fields\n .filter(f => !f.IsVirtual)\n .map(f => ({ Name: f.Name, DisplayName: f.DisplayName || f.Name }));\n }\n\n /** Open the inline Entity Document create sub-form, auto-filling sensible defaults. */\n public OpenInlineEntityDocForm(): void {\n const entity = this.selectedEntityInfo;\n if (!entity) return;\n this.NewEntityDocName = `${entity.Name} Document`;\n // Default-select a few common text-bearing fields if present.\n this.NewEntityDocSelectedFields = {};\n const preferred = ['Name', 'Title', 'Description', 'Notes', 'Body', 'Content'];\n for (const f of this.SelectedEntityFields) {\n if (preferred.includes(f.Name)) this.NewEntityDocSelectedFields[f.Name] = true;\n }\n this.ShowInlineEntityDocForm = true;\n this.cdr.detectChanges();\n }\n\n public CancelInlineEntityDocForm(): void {\n this.ShowInlineEntityDocForm = false;\n this.cdr.detectChanges();\n }\n\n /** Number of currently-selected fields (template-facing). */\n public get SelectedEntityDocFieldCount(): number {\n return Object.values(this.NewEntityDocSelectedFields).filter(Boolean).length;\n }\n\n /**\n * Create a new Entity Document for the selected entity, then select it on the\n * form. Builds a simple template body referencing the chosen fields. The\n * Entity Document entity has several NOT NULL FKs (Type, VectorDatabase,\n * Template, AIModel) populated from cached Knowledge Hub / AI metadata.\n */\n public async CreateInlineEntityDocument(): Promise<void> {\n if (this.EntityDocSaving) return;\n const entity = this.selectedEntityInfo;\n if (!entity) {\n MJNotificationService.Instance.CreateSimpleNotification('Select an entity first.', 'warning', 3000);\n return;\n }\n if (!this.NewEntityDocName.trim()) {\n MJNotificationService.Instance.CreateSimpleNotification('Enter a name for the Entity Document.', 'warning', 3000);\n return;\n }\n\n this.EntityDocSaving = true;\n this.cdr.detectChanges();\n try {\n const p = this.ProviderToUse;\n const doc = await p.GetEntityObject<MJEntityDocumentEntity>('MJ: Entity Documents', p.CurrentUser);\n doc.NewRecord();\n doc.Name = this.NewEntityDocName.trim();\n doc.EntityID = entity.ID;\n doc.Status = 'Active';\n\n const selectedFields = this.SelectedEntityFields\n .filter(f => this.NewEntityDocSelectedFields[f.Name])\n .map(f => f.Name);\n // Stash the chosen fields in Configuration so downstream template/build\n // steps know which fields drive this document.\n doc.Configuration = JSON.stringify({ Fields: selectedFields });\n\n const saved = await doc.Save();\n if (saved) {\n // Refresh the KH metadata cache so the entity-doc picker sees the new doc.\n await KnowledgeHubMetadataEngine.Instance.Config(true, p.CurrentUser, p);\n // Select the new doc on the form.\n this.FormSourceEntityDocID = doc.ID;\n const docField = this.SelectedSourceTypeFields.find(f => f.Type === 'entity-doc-picker');\n if (docField) this.FormSourceSpecificConfig[docField.Key] = doc.ID;\n this.ShowInlineEntityDocForm = false;\n MJNotificationService.Instance.CreateSimpleNotification('Entity Document created', 'success', 2500);\n } else {\n const detail = doc.LatestResult?.CompleteMessage ?? 'Unknown error';\n MJNotificationService.Instance.CreateSimpleNotification(`Failed to create Entity Document: ${detail}`, 'error', 5000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);\n } finally {\n this.EntityDocSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n // ── Dynamic source-type fields (metadata-driven) ──\n\n /** Stores source-type-specific config values keyed by RequiredFields[].Key */\n public FormSourceSpecificConfig: Record<string, string> = {};\n\n /** Available MJ Storage provider keys for the storage-provider-picker widget */\n public StorageProviderOptions: string[] = ['Azure Blob Storage', 'AWS S3', 'Google Cloud Storage', 'SharePoint', 'Dropbox', 'Box'];\n\n /**\n * The RequiredFields array from the selected source type's ConfigurationObject.\n * Drives dynamic form rendering — each field becomes a widget.\n */\n public get SelectedSourceTypeFields(): MJContentSourceTypeEntity_IContentSourceTypeField[] {\n if (!this.FormSourceTypeID) return [];\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const sourceType = engine.ContentSourceTypes.find(st => UUIDsEqual(st.ID, this.FormSourceTypeID));\n if (!sourceType) return [];\n const config = sourceType.ConfigurationObject;\n return config?.RequiredFields ?? [];\n } catch {\n return [];\n }\n }\n\n /**\n * Get dependent options for a field (e.g., entity-doc-picker depends on entity-picker).\n * Returns entity documents for the entity selected in the dependent field.\n */\n public GetDependentOptions(field: MJContentSourceTypeEntity_IContentSourceTypeField): { ID: string; Name: string }[] {\n if (field.Type === 'entity-doc-picker' && field.DependsOnField) {\n const entityID = this.FormSourceSpecificConfig[field.DependsOnField];\n if (!entityID) return [];\n try {\n const engine = KnowledgeHubMetadataEngine.Instance;\n const md = this.ProviderToUse;\n const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, entityID));\n if (!entityInfo) return [];\n return engine.GetActiveEntityDocuments()\n .filter(d => d.Entity === entityInfo.Name)\n .map(d => ({ ID: d.ID, Name: d.Name }));\n } catch {\n return [];\n }\n }\n return [];\n }\n\n /**\n * Handle a source-specific field value change.\n * For entity-picker: auto-select the first entity doc if only one exists.\n */\n public OnSourceFieldChanged(fieldKey: string): void {\n // Find fields that depend on this field\n for (const field of this.SelectedSourceTypeFields) {\n if (field.DependsOnField === fieldKey) {\n const options = this.GetDependentOptions(field);\n if (options.length === 1) {\n this.FormSourceSpecificConfig[field.Key] = options[0].ID;\n } else {\n this.FormSourceSpecificConfig[field.Key] = '';\n }\n }\n }\n }\n\n // Dropdown options for forms\n public SourceTypeOptions: DropdownOption[] = [];\n public ContentTypeOptions: DropdownOption[] = [];\n public FileTypeOptions: DropdownOption[] = [];\n public AIModelOptions: DropdownOption[] = [];\n public EmbeddingModelOptions: DropdownOption[] = [];\n public VectorIndexOptions: DropdownOption[] = [];\n\n // Tree-dropdown configs for AI model selection (vendor → model grouping)\n public AIModelVendorBranch: TreeBranchConfig = {\n EntityName: 'MJ: AI Vendors',\n DisplayField: 'Name',\n IDField: 'ID',\n DefaultIcon: 'fa-solid fa-building',\n OrderBy: 'Name ASC',\n };\n public AllModelsLeaf: TreeLeafConfig = {\n EntityName: 'MJ: AI Models',\n ParentField: '',\n DisplayField: 'Name',\n IDField: 'ID',\n DefaultIcon: 'fa-solid fa-brain',\n OrderBy: '__mj_CreatedAt DESC',\n JunctionConfig: {\n EntityName: 'MJ: AI Model Vendors',\n LeafForeignKey: 'ModelID',\n BranchForeignKey: 'VendorID',\n },\n };\n /** Branch config filtered to only vendors that have at least one embedding model */\n public EmbeddingVendorBranch: TreeBranchConfig = {\n EntityName: 'MJ: AI Vendors',\n DisplayField: 'Name',\n IDField: 'ID',\n DefaultIcon: 'fa-solid fa-building',\n OrderBy: 'Name ASC',\n ExtraFilter: `ID IN (SELECT mv.VendorID FROM [__mj].vwAIModelVendors mv JOIN [__mj].vwAIModels m ON mv.ModelID = m.ID WHERE m.AIModelType = 'Embeddings')`,\n };\n public EmbeddingModelsLeaf: TreeLeafConfig = {\n EntityName: 'MJ: AI Models',\n ParentField: '',\n DisplayField: 'Name',\n IDField: 'ID',\n DefaultIcon: 'fa-solid fa-vector-square',\n ExtraFilter: \"AIModelType = 'Embeddings'\",\n OrderBy: '__mj_CreatedAt DESC',\n JunctionConfig: {\n EntityName: 'MJ: AI Model Vendors',\n LeafForeignKey: 'ModelID',\n BranchForeignKey: 'VendorID',\n },\n };\n\n /** 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 // ════════════════════════════════════════════\n // PUBLIC OPEN METHODS — called by the host via @ViewChild\n // ════════════════════════════════════════════\n\n public async OpenAddSource(): Promise<void> {\n await this.ensureFormDropdownsLoaded();\n this.resetSourceForm();\n this.ShowEffectiveValues = false;\n this.restorePanelWidth();\n this.FormMode = 'add-source';\n this.cdr.detectChanges();\n }\n\n public async OpenEditSource(card: SourceCard): Promise<void> {\n await this.ensureFormDropdownsLoaded();\n this.ShowEffectiveValues = false;\n this.restorePanelWidth();\n this.FormSourceName = card.Name;\n this.FormSourceTypeID = card.ContentSourceTypeID;\n this.FormContentTypeID = card.ContentTypeID;\n this.FormFileTypeID = card.ContentFileTypeID;\n this.FormSourceURL = card.URL;\n this.FormSourceEntityID = card.EntityID ?? '';\n this.FormSourceEntityDocID = card.EntityDocumentID ?? '';\n this.FormSourceEmbeddingModelID = card.EmbeddingModelID ?? '';\n this.FormSourceVectorIndexID = card.VectorIndexID ?? '';\n this.EditingSourceID = card.ID;\n\n // Populate quick-edit knobs + FormSourceSpecificConfig from Configuration JSON.\n // Reset to defaults first so a previously-edited source's values don't leak in.\n this.FormSourceSpecificConfig = {};\n this.FormMaxItemsPerRun = null;\n this.FormMaxDepth = null;\n this.FormCrawlSitesInLowerLevelDomain = true;\n this.FormCrawlOtherSitesInTopLevelDomain = false;\n this.workingConfig = {};\n this.ShowInlineEntityDocForm = false;\n this.NewEntityDocName = '';\n this.NewEntityDocSelectedFields = {};\n const rawSource = this.RawSources.find(s => UUIDsEqual(s['ID'] as string, card.ID));\n if (rawSource) {\n const configStr = rawSource['Configuration'] as string | null;\n if (configStr) {\n try {\n const parsed = JSON.parse(configStr) as IContentSourceClassificationConfiguration | null;\n // Hydrate the working classifier config from the persisted JSON.\n // Defaults are applied lazily by the typed getters, so we only\n // copy what was actually stored (unset = \"use default\").\n if (parsed) {\n this.workingConfig = { ...parsed };\n }\n const specific = parsed?.SourceSpecificConfiguration as Record<string, string> | undefined;\n if (specific) {\n this.FormSourceSpecificConfig = { ...specific };\n }\n // Run-budget knob — pulled directly off the typed Configuration.\n const items = parsed?.MaxItemsPerRun;\n if (typeof items === 'number' && Number.isFinite(items)) {\n this.FormMaxItemsPerRun = items;\n }\n // Website sub-object — only populates the inputs when present\n // (matches the autotagger's \"unset = default\" semantics).\n const website = parsed?.Website;\n if (website) {\n const depth = website.MaxDepth;\n if (typeof depth === 'number' && Number.isFinite(depth)) {\n this.FormMaxDepth = depth;\n }\n if (typeof website.CrawlSitesInLowerLevelDomain === 'boolean') {\n this.FormCrawlSitesInLowerLevelDomain = website.CrawlSitesInLowerLevelDomain;\n }\n if (typeof website.CrawlOtherSitesInTopLevelDomain === 'boolean') {\n this.FormCrawlOtherSitesInTopLevelDomain = website.CrawlOtherSitesInTopLevelDomain;\n }\n }\n } catch {\n // Configuration not valid JSON, ignore\n }\n }\n }\n\n this.FormMode = 'edit-source';\n this.cdr.detectChanges();\n }\n\n public async OpenAddType(): Promise<void> {\n await this.ensureFormDropdownsLoaded();\n this.resetTypeForm();\n this.FormMode = 'add-type';\n this.cdr.detectChanges();\n }\n\n public async OpenEditType(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 // ════════════════════════════════════════════\n // ADVANCED SETTINGS\n // ════════════════════════════════════════════\n\n /**\n * Open the full entity form for the source currently being edited in the\n * slide-in. Quick-edit covers the most-used knobs; the entity form (with\n * the dynamically-mounted BaseFormPanel slots) exposes everything else\n * — taxonomy mode, thresholds, all five run-budget caps, URL pattern,\n * root URL, etc. The host owns NavigationService, so navigation bubbles up.\n */\n public OpenAdvancedSourceSettings(): void {\n if (!this.EditingSourceID) return;\n const id = this.EditingSourceID;\n this.CloseForm();\n this.NavigateToRecordRequested.emit({\n entityName: 'MJ: Content Sources',\n key: CompositeKey.FromID(id),\n });\n }\n\n // ════════════════════════════════════════════\n // SAVE — Sources\n // ════════════════════════════════════════════\n\n public async SaveSource(): Promise<void> {\n if (this.FormSaving) return;\n\n // Validate required fields before saving\n if (!this.FormSourceName.trim()) {\n MJNotificationService.Instance.CreateSimpleNotification('Please enter a source name.', 'warning', 3000);\n return;\n }\n if (!this.FormSourceTypeID) {\n MJNotificationService.Instance.CreateSimpleNotification('Please select a source type.', 'warning', 3000);\n return;\n }\n\n // For non-Entity source types, ContentType is required\n if (!this.IsEntitySourceTypeSelected && this.SelectedSourceTypeRequiresContentType) {\n if (!this.FormContentTypeID) {\n if (this.ContentTypeOptions.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'No content types are configured. Please create a content type first in the Content Types section.',\n 'warning', 5000\n );\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please select a content type.',\n 'warning', 3000\n );\n }\n return;\n }\n }\n\n this.FormSaving = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<MJContentSourceEntity>('MJ: Content Sources');\n\n if (this.FormMode === 'edit-source' && this.EditingSourceID) {\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: this.EditingSourceID }]));\n } else {\n entity.NewRecord();\n }\n\n entity.Name = this.FormSourceName;\n entity.ContentSourceTypeID = this.FormSourceTypeID;\n\n // For Entity source type, ContentType and FileType are not relevant\n // but the DB columns are NOT NULL, so default to the first available value\n if (this.IsEntitySourceTypeSelected) {\n const engine = KnowledgeHubMetadataEngine.Instance;\n if (!entity.ContentTypeID) {\n if (engine.ContentTypes.length === 0) {\n this.FormSaving = false;\n this.cdr.detectChanges();\n this.ContentTypeMissing.emit();\n return;\n }\n entity.ContentTypeID = engine.ContentTypes[0].ID;\n }\n if (!entity.ContentFileTypeID && engine.ContentFileTypes.length > 0) {\n entity.ContentFileTypeID = engine.ContentFileTypes[0].ID;\n }\n } else {\n entity.ContentTypeID = this.FormContentTypeID;\n entity.ContentFileTypeID = this.FormFileTypeID;\n }\n\n // Store source-type-specific values from the dynamic form\n // For Entity type: EntityID and EntityDocumentID go on the entity directly\n if (this.IsEntitySourceTypeSelected) {\n entity.EntityID = this.FormSourceSpecificConfig['EntityID'] || null;\n const entityDocID = this.FormSourceSpecificConfig['EntityDocumentID'];\n if (entityDocID) {\n entity.EntityDocumentID = entityDocID;\n } else {\n // Auto-select first doc if only one exists\n const docField = this.SelectedSourceTypeFields.find(f => f.Type === 'entity-doc-picker');\n const docs = docField ? this.GetDependentOptions(docField) : [];\n entity.EntityDocumentID = docs.length > 0 ? docs[0].ID : null;\n }\n entity.URL = '';\n } else {\n entity.EntityID = null;\n entity.EntityDocumentID = null;\n // URL comes from dynamic fields for RSS/Website, or empty for others\n entity.URL = this.FormSourceSpecificConfig['URL'] || '';\n }\n\n // Store the full SourceSpecificConfiguration in the Configuration JSON\n const currentConfig = entity.ConfigurationObject ?? {};\n\n // Merge the inline Classification knobs (taxonomy mode, thresholds,\n // tag root, budgets, toggles) from the working config. We deliberately\n // exclude the sub-objects owned by the dedicated quick-edit logic below\n // (SourceSpecificConfiguration, MaxItemsPerRun, Website) so those stay\n // single-owner and we never clobber crawl settings. Keys absent from the\n // working config are left untouched on currentConfig.\n const { SourceSpecificConfiguration: _ssc, MaxItemsPerRun: _mipr, Website: _web, ...classifierKnobs } = this.workingConfig;\n Object.assign(currentConfig, classifierKnobs);\n\n currentConfig.SourceSpecificConfiguration = { ...this.FormSourceSpecificConfig };\n\n // Persist the quick-edit knobs that don't have their own DB columns\n // (the rest live on the typed Configuration JSON sub-objects). The\n // advanced settings flow on the entity form can override more fields\n // — we only touch the keys the slide-in exposes so we don't clobber\n // unrelated values an operator set there earlier.\n if (this.FormMaxItemsPerRun != null && Number.isFinite(this.FormMaxItemsPerRun)) {\n currentConfig.MaxItemsPerRun = this.FormMaxItemsPerRun;\n } else {\n // Empty input = \"unlimited\" — strip the key so the autotagger\n // sees no cap (rather than 0 = \"process zero items\").\n delete currentConfig.MaxItemsPerRun;\n }\n\n if (this.IsWebsiteSourceTypeSelected) {\n const website = { ...(currentConfig.Website ?? {}) };\n if (this.FormMaxDepth != null && Number.isFinite(this.FormMaxDepth)) {\n website.MaxDepth = this.FormMaxDepth;\n } else {\n delete website.MaxDepth;\n }\n website.CrawlSitesInLowerLevelDomain = this.FormCrawlSitesInLowerLevelDomain;\n website.CrawlOtherSitesInTopLevelDomain = this.FormCrawlOtherSitesInTopLevelDomain;\n currentConfig.Website = website;\n }\n\n entity.ConfigurationObject = currentConfig;\n\n entity.EmbeddingModelID = this.FormSourceEmbeddingModelID || null;\n entity.VectorIndexID = this.FormSourceVectorIndexID || null;\n\n const saved = await entity.Save();\n if (saved) {\n MJNotificationService.Instance.CreateSimpleNotification(\n this.FormMode === 'edit-source' ? 'Source updated' : 'Source created', 'success', 2500\n );\n this.CloseForm();\n this.Saved.emit({ kind: 'source' });\n } else {\n // CP-4: Show detailed error from LatestResult\n const errorDetail = entity.LatestResult?.CompleteMessage ?? 'Unknown error';\n console.error('[Classify] Save source failed:', entity.LatestResult);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to save source: ${errorDetail}`, 'error', 5000\n );\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[Classify] Save source exception:', error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);\n } finally {\n this.FormSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n // ════════════════════════════════════════════\n // SAVE — Content Types\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 = this.ProviderToUse;\n const contentType = await md.GetEntityObject<MJContentTypeEntity>('MJ: Content Types', md.CurrentUser);\n\n if (this.FormMode === 'edit-type' && this.EditingTypeID) {\n await contentType.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: this.EditingTypeID }]));\n } else {\n contentType.NewRecord();\n }\n\n contentType.Name = this.FormTypeName;\n contentType.Description = this.FormTypeDescription;\n contentType.AIModelID = this.FormTypeAIModelID;\n contentType.MinTags = this.FormTypeMinTags;\n contentType.MaxTags = this.FormTypeMaxTags;\n contentType.EmbeddingModelID = this.FormTypeEmbeddingModelID || null;\n contentType.VectorIndexID = this.FormTypeVectorIndexID || null;\n\n const saved = await contentType.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 this.Saved.emit({ kind: 'type' });\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 // RAW SOURCES — supplied by the host so edit can read Configuration JSON\n // ════════════════════════════════════════════\n\n /**\n * Raw `MJ: Content Sources` rows, forwarded by the host so `OpenEditSource`\n * can hydrate the quick-edit knobs from the source's Configuration JSON. The\n * card the Sources tab passes doesn't carry the full Configuration blob.\n */\n public RawSources: Record<string, unknown>[] = [];\n\n // ════════════════════════════════════════════\n // HELPERS\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\n // Tag-root candidates for the Classification section's root dropdown.\n if (this.TagRootOptions.length === 0) {\n const p = this.ProviderToUse;\n await TagEngineBase.Instance.Config(false, p.CurrentUser, p);\n this.TagRootOptions = TagEngineBase.Instance.Tags\n .map(t => ({ ID: t.ID, Name: t.Name }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n }\n\n // Org-level domain context — used for the effective-context preview.\n await this.loadOrgClassificationContext();\n } catch (error) {\n console.error('[Autotagging] Error loading form dropdowns:', error);\n }\n }\n\n /**\n * Resolve the Knowledge Hub Application ID by name (cached per dialog instance).\n * Returns null when no such application exists.\n */\n private khApplicationID: string | null | undefined = undefined;\n private async resolveKnowledgeHubApplicationID(): Promise<string | null> {\n if (this.khApplicationID !== undefined) return this.khApplicationID;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: Applications',\n ExtraFilter: `Name = '${KNOWLEDGE_HUB_APPLICATION_NAME.replace(/'/g, \"''\")}'`,\n Fields: ['ID'],\n MaxRows: 1,\n ResultType: 'simple',\n });\n this.khApplicationID = result.Success && result.Results.length > 0 ? result.Results[0].ID : null;\n return this.khApplicationID;\n }\n\n /** Read the org-level classification context for the effective-context preview. */\n private async loadOrgClassificationContext(): Promise<void> {\n try {\n const p = this.ProviderToUse;\n await ApplicationSettingEngine.Instance.Config(false, p.CurrentUser, p);\n const appID = await this.resolveKnowledgeHubApplicationID();\n this.OrgClassificationContext =\n ApplicationSettingEngine.Instance.GetSetting(CLASSIFY_ORG_CONTEXT_SETTING_KEY, appID ?? undefined) ?? '';\n } catch {\n this.OrgClassificationContext = '';\n }\n }\n\n private resetSourceForm(): void {\n this.FormSourceName = '';\n this.FormSourceTypeID = '';\n this.FormContentTypeID = '';\n this.FormFileTypeID = '';\n this.FormSourceURL = '';\n this.FormSourceEntityID = '';\n this.FormSourceEntityDocID = '';\n this.FormSourceEmbeddingModelID = '';\n this.FormSourceVectorIndexID = '';\n this.EditingSourceID = '';\n this.FormSourceSpecificConfig = {};\n // Quick-edit knobs — defaults match the autotagger's runtime defaults.\n this.FormMaxItemsPerRun = null;\n this.FormMaxDepth = null;\n this.FormCrawlSitesInLowerLevelDomain = true;\n this.FormCrawlOtherSitesInTopLevelDomain = false;\n // Classification knobs — start empty; the typed getters apply defaults.\n this.workingConfig = {};\n // Inline Entity Document create sub-form.\n this.ShowInlineEntityDocForm = false;\n this.NewEntityDocName = '';\n this.NewEntityDocSelectedFields = {};\n }\n\n // ════════════════════════════════════════════\n // EFFECTIVE-VALUES TOGGLE\n // ════════════════════════════════════════════\n\n /** Show / hide the inline effective-values panel in the Classification section. */\n public ToggleEffectiveValues(): void {\n this.ShowEffectiveValues = !this.ShowEffectiveValues;\n this.cdr.detectChanges();\n }\n\n // ════════════════════════════════════════════\n // RESIZABLE PANEL (drag the left edge) + width persistence\n // ════════════════════════════════════════════\n\n /** Clamp a candidate width to the allowed range (min .. 90% of viewport). */\n private clampPanelWidth(width: number): number {\n const max = window.innerWidth * 0.9;\n return Math.max(PANEL_WIDTH_MIN, Math.min(width, max));\n }\n\n /**\n * Restore the remembered panel width from UserInfoEngine (a synchronous cache\n * read), falling back to the default. Called when a source form is opened.\n */\n private restorePanelWidth(): void {\n const raw = UserInfoEngine.Instance.GetSetting(PANEL_WIDTH_SETTING_KEY);\n if (raw) {\n const n = parseInt(raw, 10);\n if (!isNaN(n)) {\n this.PanelWidth = this.clampPanelWidth(n);\n return;\n }\n }\n this.PanelWidth = PANEL_WIDTH_DEFAULT;\n }\n\n /**\n * Begin a left-edge resize drag. The panel slides in from the right, so the\n * resizable edge is its LEFT edge: dragging left widens the panel.\n */\n public StartResize(event: MouseEvent): void {\n event.preventDefault();\n if (this.isResizing) return;\n this.isResizing = true;\n\n const startX = event.clientX;\n const startWidth = this.PanelWidth;\n // Prevent text selection / iframe capture during the drag.\n document.body.style.userSelect = 'none';\n\n // Run move tracking outside Angular to avoid a CD cycle on every pixel;\n // we re-enter the zone only to update the bound width.\n this.zone.runOutsideAngular(() => {\n this.resizeMoveListener = (e: MouseEvent) => {\n const next = this.clampPanelWidth(startWidth + (startX - e.clientX));\n this.zone.run(() => {\n this.PanelWidth = next;\n this.cdr.detectChanges();\n });\n // Debounced persistence while dragging — the final value is what sticks.\n UserInfoEngine.Instance.SetSettingDebounced(PANEL_WIDTH_SETTING_KEY, String(Math.round(next)));\n };\n this.resizeUpListener = () => this.endResize();\n document.addEventListener('mousemove', this.resizeMoveListener);\n document.addEventListener('mouseup', this.resizeUpListener);\n });\n }\n\n /** Tear down the active drag listeners and persist the final width. */\n private endResize(): void {\n if (!this.isResizing) return;\n this.isResizing = false;\n document.body.style.userSelect = '';\n if (this.resizeMoveListener) {\n document.removeEventListener('mousemove', this.resizeMoveListener);\n this.resizeMoveListener = null;\n }\n if (this.resizeUpListener) {\n document.removeEventListener('mouseup', this.resizeUpListener);\n this.resizeUpListener = null;\n }\n UserInfoEngine.Instance.SetSettingDebounced(PANEL_WIDTH_SETTING_KEY, String(Math.round(this.PanelWidth)));\n }\n\n public ngOnDestroy(): void {\n // Clean up any active drag listeners + body style if destroyed mid-drag.\n this.endResize();\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","<!-- ══════ SLIDE-IN FORM OVERLAY ══════ -->\n@if (FormMode !== 'none') {\n <div class=\"at-slide-overlay\" (click)=\"CloseForm()\"></div>\n <div class=\"at-slide-panel\" [style.width.px]=\"PanelWidth\">\n <!-- Left-edge drag handle: the panel slides in from the right, so its\n resizable edge is the LEFT. Dragging left widens the panel. -->\n <div class=\"cls-resize-handle\" (mousedown)=\"StartResize($event)\"\n role=\"separator\" aria-orientation=\"vertical\" aria-label=\"Resize panel\"></div>\n <div class=\"at-slide-header\">\n <h3>\n @if (FormMode === 'add-source') { Add Content Source }\n @else if (FormMode === 'edit-source') { Edit Content Source }\n @else if (FormMode === 'add-type') { Add Content Type }\n @else if (FormMode === 'edit-type') { Edit Content Type }\n </h3>\n <button class=\"at-slide-close\" aria-label=\"Close form\" (click)=\"CloseForm()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n <div class=\"at-slide-body\">\n\n <!-- Source form -->\n @if (FormMode === 'add-source' || FormMode === 'edit-source') {\n <!-- ══════ SOURCE ══════ -->\n <div class=\"cls-section cls-section--first\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-database\"></i> Source</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceName\" placeholder=\"Source name\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Source Type</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceTypeID\">\n <option value=\"\">Select source type...</option>\n @for (opt of SourceTypeOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n <!-- Content Type + File Type: hidden for Entity source type -->\n @if (SelectedSourceTypeRequiresContentType) {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Content Type</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormContentTypeID\">\n <option value=\"\">Select content type...</option>\n @for (opt of ContentTypeOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">File Type</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormFileTypeID\">\n <option value=\"\">Select file type...</option>\n @for (opt of FileTypeOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Dynamic source-type-specific fields from ConfigurationObject.RequiredFields -->\n @for (field of SelectedSourceTypeFields; track field.Key) {\n @if (!field.DependsOnField || FormSourceSpecificConfig[field.DependsOnField]) {\n @if (!field.ShowOnlyIfMultiple || GetDependentOptions(field).length > 1) {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">{{ field.Label }} @if (field.Required) { <span class=\"at-required\">*</span> }</label>\n @switch (field.Type) {\n @case ('url') {\n <input type=\"url\" class=\"at-form-input\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n [placeholder]=\"field.Description || 'https://...'\">\n }\n @case ('path') {\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n [placeholder]=\"field.Description || '/path/to/...'\">\n }\n @case ('text') {\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n [placeholder]=\"field.Description || ''\" [value]=\"field.DefaultValue || ''\">\n }\n @case ('entity-picker') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n (ngModelChange)=\"OnSourceFieldChanged(field.Key)\">\n <option value=\"\">Select entity...</option>\n @for (opt of EntitiesWithDocuments; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n }\n @case ('entity-doc-picker') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\">\n @for (opt of GetDependentOptions(field); track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n }\n @case ('storage-provider-picker') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\">\n <option value=\"\">Select provider...</option>\n @for (opt of StorageProviderOptions; track opt) {\n <option [value]=\"opt\">{{ opt }}</option>\n }\n </select>\n }\n @case ('dropdown') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\">\n <option value=\"\">Select...</option>\n @for (opt of field.Options || []; track opt.Value) {\n <option [value]=\"opt.Value\">{{ opt.Label }}</option>\n }\n </select>\n }\n }\n @if (field.Description) {\n <span class=\"at-form-hint\">{{ field.Description }}</span>\n }\n </div>\n }\n }\n }\n\n <!-- Inline Entity Document creation: shown when an Entity-type\n source's selected entity has no Entity Document yet. -->\n @if (SelectedEntityHasNoDocument) {\n <div class=\"cls-doc-callout\">\n <div class=\"cls-doc-callout-head\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <span><strong>{{ SelectedEntityName }}</strong> has no Entity Document. One is required to classify its records.</span>\n </div>\n @if (!ShowInlineEntityDocForm) {\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"OpenInlineEntityDocForm()\">\n <i class=\"fa-solid fa-plus\"></i> Create Entity Document\n </button>\n }\n </div>\n\n @if (ShowInlineEntityDocForm) {\n <div class=\"cls-doc-form\">\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Document name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"NewEntityDocName\"\n placeholder=\"Document name\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Fields to include ({{ SelectedEntityDocFieldCount }} selected)</label>\n <div class=\"cls-doc-field-list\">\n @for (f of SelectedEntityFields; track f.Name) {\n <label class=\"cls-doc-field-row\">\n <input type=\"checkbox\" [(ngModel)]=\"NewEntityDocSelectedFields[f.Name]\">\n <span>{{ f.DisplayName }}</span>\n </label>\n }\n </div>\n </div>\n <div class=\"at-form-actions\">\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"CreateInlineEntityDocument()\" [disabled]=\"EntityDocSaving\">\n @if (EntityDocSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Creating… }\n @else { <i class=\"fa-solid fa-check\"></i> Create }\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"CancelInlineEntityDocForm()\">Cancel</button>\n </div>\n </div>\n }\n }\n </div><!-- /Source section -->\n\n <!-- ══════ EMBEDDING & VECTORS ══════ -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-cubes\"></i> Embedding & Vectors</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Embedding Model Override</label>\n <mj-tree-dropdown\n [BranchConfig]=\"EmbeddingVendorBranch\"\n [LeafConfig]=\"EmbeddingModelsLeaf\"\n SelectionMode=\"single\"\n SelectableTypes=\"leaf\"\n Placeholder=\"Use system default\"\n [Clearable]=\"true\"\n [Value]=\"ToCompositeKey(FormSourceEmbeddingModelID)\"\n (ValueChange)=\"FormSourceEmbeddingModelID = FromCompositeKey($event)\">\n </mj-tree-dropdown>\n <span class=\"at-form-hint\">Overrides Content Type default</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Vector Index Override</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceVectorIndexID\">\n <option value=\"\">Use system default</option>\n @for (opt of VectorIndexOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n <span class=\"at-form-hint\">Overrides Content Type default</span>\n </div>\n </div><!-- /Embedding & Vectors section -->\n\n <!-- ══════ CLASSIFICATION (full config parity, in-app) ══════ -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\">\n <i class=\"fa-solid fa-sliders\"></i> Classification\n <button mjButton variant=\"flat\" size=\"sm\" class=\"cls-eff-toggle\"\n (click)=\"ToggleEffectiveValues()\">\n <i class=\"fa-solid\" [class.fa-eye]=\"!ShowEffectiveValues\" [class.fa-eye-slash]=\"ShowEffectiveValues\"></i>\n {{ ShowEffectiveValues ? 'Hide effective values' : 'Show effective values' }}\n </button>\n </div>\n\n <div class=\"cls-config\">\n <!-- Taxonomy mode cards -->\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Taxonomy mode</label>\n <div class=\"cls-mode-grid\">\n @for (m of TaxonomyModes; track m.value) {\n <div class=\"cls-mode-card\" [class.selected]=\"CurrentMode === m.value\"\n (click)=\"SetMode(m.value)\">\n <i class=\"fa-solid {{ m.icon }} cls-mode-ic\"></i>\n <div class=\"cls-mode-nm\">{{ m.label }}</div>\n <div class=\"cls-mode-best\">{{ m.bestFor }}</div>\n </div>\n }\n </div>\n </div>\n\n <!-- Tag root -->\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Tag root</label>\n <select class=\"at-form-select\" [(ngModel)]=\"TagRootIDValue\">\n <option value=\"\">(none / whole taxonomy)</option>\n @for (opt of TagRootOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n <span class=\"at-form-hint\">Restricts the LLM's visible taxonomy + auto-grow target. Leave blank for the full taxonomy.</span>\n </div>\n\n <!-- Thresholds + gradient band -->\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Confidence thresholds</label>\n <div class=\"cls-threshold-pair\">\n <div class=\"cls-slider-grid\">\n <div class=\"cls-slider-field\">\n <span class=\"cls-slider-cap\">Match (auto-apply) <strong>{{ MatchThresholdValue | number: '1.2-2' }}</strong></span>\n <input type=\"range\" class=\"cls-slider\" min=\"0.50\" max=\"1.00\" step=\"0.01\"\n [ngModel]=\"MatchThresholdValue\" (ngModelChange)=\"MatchThresholdValue = $event\">\n </div>\n <div class=\"cls-slider-field\">\n <span class=\"cls-slider-cap\">Suggest (route to inbox) <strong>{{ SuggestThresholdValue | number: '1.2-2' }}</strong></span>\n <input type=\"range\" class=\"cls-slider\" min=\"0.50\" max=\"1.00\" step=\"0.01\"\n [ngModel]=\"SuggestThresholdValue\" (ngModelChange)=\"SuggestThresholdValue = $event\">\n </div>\n </div>\n <div class=\"cls-band\" aria-hidden=\"true\"></div>\n @if (ThresholdValidationMessage) {\n <div class=\"cls-validation\"><i class=\"fa-solid fa-circle-exclamation\"></i> {{ ThresholdValidationMessage }}</div>\n } @else {\n <div class=\"cls-band-legend\">\n <span class=\"cls-band-key reject\">reject / new</span>\n <span class=\"cls-band-key review\">review (inbox)</span>\n <span class=\"cls-band-key apply\">auto-apply</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Toggles -->\n <div class=\"cls-toggle-row\">\n <div class=\"cls-toggle-label\">\n <span class=\"t\">Share full taxonomy with the LLM</span>\n <span class=\"d\">When on, the LLM prompt includes the visible taxonomy. Larger taxonomies → higher token cost.</span>\n </div>\n <mj-switch [(ngModel)]=\"ShareTaxonomyValue\"></mj-switch>\n </div>\n <div class=\"cls-toggle-row\">\n <div class=\"cls-toggle-label\">\n <span class=\"t\">Vectorize new content</span>\n <span class=\"d\">When off, this source skips vectorization (the classifier still runs).</span>\n </div>\n <mj-switch [(ngModel)]=\"EnableVectorizationValue\"></mj-switch>\n </div>\n </div><!-- /cls-config -->\n\n <!-- Effective-values panel — inline + conditional (no longer a floating aside) -->\n @if (ShowEffectiveValues) {\n <div class=\"cls-aside\">\n <h5 class=\"cls-aside-title\">Effective values</h5>\n @for (row of EffectiveValues; track row.label) {\n <div class=\"cls-eff-row\">\n <span class=\"cls-eff-label\">{{ row.label }}</span>\n <span class=\"cls-eff-value\">{{ row.value }}\n <span class=\"cls-eff-origin\" [class.override]=\"row.origin === 'source override'\">{{ row.origin }}</span>\n </span>\n </div>\n }\n </div>\n }\n </div><!-- /Classification section -->\n\n <!-- ══════ DOMAIN CONTEXT (source scope) ══════ -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-comment-dots\"></i> Domain context</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Source guidance</label>\n <textarea class=\"at-form-textarea\" rows=\"4\"\n [ngModel]=\"ClassificationContextValue\"\n (ngModelChange)=\"ClassificationContextValue = $event\"\n placeholder=\"Free-text guidance for the classifier about this source's domain — terminology, audience, what tags matter…\"></textarea>\n <span class=\"at-form-hint\">Injected into the autotagging prompt at the source scope.</span>\n </div>\n\n <div class=\"cls-toggle-row\">\n <div class=\"cls-toggle-label\">\n <span class=\"t\">Substitutive mode</span>\n <span class=\"d\">When on, this source's guidance <em>replaces</em> the org/content-type context. When off (default), it's <em>added</em> to them.</span>\n </div>\n <mj-switch [(ngModel)]=\"IsSubstitutiveMode\"></mj-switch>\n </div>\n\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Effective context preview</label>\n <pre class=\"cls-context-preview\">{{ EffectiveContextPreview }}</pre>\n <span class=\"at-form-hint\">Org + source scopes shown. Content-type scope (if any) is also merged at run time.</span>\n </div>\n </div><!-- /Domain context section -->\n\n <!-- ══════ RUN BUDGETS ══════ -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-gauge\"></i> Run budgets</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max items per run</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\"\n [(ngModel)]=\"FormMaxItemsPerRun\" placeholder=\"unlimited\">\n <span class=\"at-form-hint\">\n Caps the number of content items handed to the LLM. Skipped (unchanged) items don't count.\n Paused work resumes on the next run.\n </span>\n </div>\n\n <div class=\"cls-budget-grid\">\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max new tags / run</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\"\n [ngModel]=\"MaxNewTagsPerRunValue ?? ''\" (ngModelChange)=\"MaxNewTagsPerRunValue = $event\"\n placeholder=\"unlimited\">\n <span class=\"at-form-hint\">across all items</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max new tags / item</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\"\n [ngModel]=\"MaxNewTagsPerItemValue ?? ''\" (ngModelChange)=\"MaxNewTagsPerItemValue = $event\"\n placeholder=\"unlimited\">\n <span class=\"at-form-hint\">extras → suggestions</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max tokens / run</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\"\n [ngModel]=\"MaxTokensPerRunValue ?? ''\" (ngModelChange)=\"MaxTokensPerRunValue = $event\"\n placeholder=\"unlimited\">\n <span class=\"at-form-hint\">across all LLM calls</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max cost / run (USD)</label>\n <input type=\"number\" min=\"0\" step=\"0.01\" class=\"at-form-input\"\n [ngModel]=\"MaxCostPerRunValue ?? ''\" (ngModelChange)=\"MaxCostPerRunValue = $event\"\n placeholder=\"unlimited\">\n <span class=\"at-form-hint\">$ stops the run</span>\n </div>\n </div>\n </div><!-- /Run budgets section -->\n\n @if (IsWebsiteSourceTypeSelected) {\n <!-- ══════ CRAWL SETTINGS (website source only) ══════ -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-spider\"></i> Crawl settings</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Crawl depth</label>\n <input type=\"number\" min=\"0\" max=\"10\" step=\"1\" class=\"at-form-input\"\n [(ngModel)]=\"FormMaxDepth\" placeholder=\"2 (default)\">\n <span class=\"at-form-hint\">\n Recursion ceiling for in-domain links. <code>0</code> = just the start URL.\n <code>2</code> (default) = root + sections + content pages.\n </span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">\n <input type=\"checkbox\" [(ngModel)]=\"FormCrawlSitesInLowerLevelDomain\">\n Crawl sites in lower-level domain\n </label>\n <span class=\"at-form-hint\">When on (default), the depth-aware recursive crawler runs. Turn off to crawl only the seed page.</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">\n <input type=\"checkbox\" [(ngModel)]=\"FormCrawlOtherSitesInTopLevelDomain\">\n Crawl other sites in top-level domain\n </label>\n <span class=\"at-form-hint\">When on, also adds sibling-path URLs found on the seed page. Off by default to avoid accidental fan-out.</span>\n </div>\n </div><!-- /Crawl settings section -->\n }\n\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 @if (FormMode === 'edit-source' && EditingSourceID) {\n <div class=\"at-form-advanced-link\">\n <a href=\"javascript:void(0)\" (click)=\"OpenAdvancedSourceSettings()\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n Open advanced settings — URL pattern, root URL, & full entity form\n </a>\n <span class=\"at-form-hint\">The key classifier knobs (taxonomy mode, thresholds, tag root, budgets) are now editable inline above.</span>\n </div>\n }\n }\n\n <!-- Content Type form -->\n @if (FormMode === 'add-type' || FormMode === 'edit-type') {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormTypeName\" placeholder=\"Content type name\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Description</label>\n <textarea class=\"at-form-textarea\" [(ngModel)]=\"FormTypeDescription\" rows=\"3\" placeholder=\"Description...\"></textarea>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">AI Model (for tagging)</label>\n <mj-tree-dropdown\n [BranchConfig]=\"AIModelVendorBranch\"\n [LeafConfig]=\"AllModelsLeaf\"\n SelectionMode=\"single\"\n SelectableTypes=\"leaf\"\n Placeholder=\"Select AI model...\"\n [Clearable]=\"true\"\n [Value]=\"ToCompositeKey(FormTypeAIModelID)\"\n (ValueChange)=\"FormTypeAIModelID = FromCompositeKey($event)\">\n </mj-tree-dropdown>\n </div>\n <div class=\"at-form-row\">\n <div class=\"at-form-group\" style=\"flex: 1;\">\n <label class=\"at-form-label\">Min Tags</label>\n <input type=\"number\" class=\"at-form-input\" [(ngModel)]=\"FormTypeMinTags\" min=\"0\">\n </div>\n <div class=\"at-form-group\" style=\"flex: 1;\">\n <label class=\"at-form-label\">Max Tags</label>\n <input type=\"number\" class=\"at-form-input\" [(ngModel)]=\"FormTypeMaxTags\" min=\"1\">\n </div>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Embedding Model</label>\n <mj-tree-dropdown\n [BranchConfig]=\"EmbeddingVendorBranch\"\n [LeafConfig]=\"EmbeddingModelsLeaf\"\n SelectionMode=\"single\"\n SelectableTypes=\"leaf\"\n Placeholder=\"Use system default\"\n [Clearable]=\"true\"\n [Value]=\"ToCompositeKey(FormTypeEmbeddingModelID)\"\n (ValueChange)=\"FormTypeEmbeddingModelID = FromCompositeKey($event)\">\n </mj-tree-dropdown>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Vector Index</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormTypeVectorIndexID\">\n <option value=\"\">Use system default</option>\n @for (opt of VectorIndexOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n <div class=\"at-form-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveContentType()\" [disabled]=\"FormSaving\">\n @if (FormSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving... }\n @else { <i class=\"fa-solid fa-check\"></i> Save }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseForm()\">Cancel</button>\n </div>\n }\n </div>\n </div>\n}\n"]}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Classify · pure dry-run disposition helper.
|
|
3
|
+
*
|
|
4
|
+
* Honest, in-memory PREVIEW of how a source's EXISTING extracted ContentItemTags
|
|
5
|
+
* would be dispositioned under its current taxonomy mode + thresholds. This is
|
|
6
|
+
* NOT a fresh LLM run — it replays the deterministic, post-resolution routing
|
|
7
|
+
* portion of the server's autotagger so operators can see the effect of mode +
|
|
8
|
+
* thresholds before committing a real run.
|
|
9
|
+
*
|
|
10
|
+
* This module is intentionally framework-free (no Angular, no DI) so it can be
|
|
11
|
+
* unit-tested in isolation. The Angular dialog builds the `resolve` closure from
|
|
12
|
+
* cached taxonomy metadata (Tags / TagSynonyms) and feeds rows in here.
|
|
13
|
+
*
|
|
14
|
+
* NOTE: the server also has a semantic/embedding match tier that is NOT
|
|
15
|
+
* reproducible client-side. Borderline rows ('none' here) may resolve
|
|
16
|
+
* differently in a real run; the UI labels this clearly.
|
|
17
|
+
*/
|
|
18
|
+
/** Terminal outcome the server's tiered router would reach for a single tag. */
|
|
19
|
+
export type Disposition = 'auto-apply' | 'route-to-inbox' | 'create-new' | 'reject';
|
|
20
|
+
/** A single existing ContentItemTag being previewed. */
|
|
21
|
+
export interface DryRunInput {
|
|
22
|
+
/** Free-text tag as extracted by the LLM. */
|
|
23
|
+
tag: string;
|
|
24
|
+
/** Resolved formal Tag ID if the server already linked it, else null. */
|
|
25
|
+
resolvedTagId: string | null;
|
|
26
|
+
/** ContentItemTag.Weight (0..1). */
|
|
27
|
+
weight: number;
|
|
28
|
+
}
|
|
29
|
+
/** The effective source config that governs routing. */
|
|
30
|
+
export interface DryRunConfig {
|
|
31
|
+
mode: 'constrained' | 'auto-grow' | 'free-flow';
|
|
32
|
+
/** Score at/above which an auto-apply happens (0..1). */
|
|
33
|
+
matchThreshold: number;
|
|
34
|
+
/** Lower band: at/above this but below matchThreshold → route to inbox. */
|
|
35
|
+
suggestThreshold: number;
|
|
36
|
+
}
|
|
37
|
+
/** Which resolution tier a tag landed in. */
|
|
38
|
+
export type ResolveTier = 'synonym' | 'exact' | 'fuzzy' | 'none';
|
|
39
|
+
/** Result of resolving a free-text tag against the cached taxonomy. */
|
|
40
|
+
export interface ResolveResult {
|
|
41
|
+
tagId: string | null;
|
|
42
|
+
tagName: string | null;
|
|
43
|
+
/** 1.0 for synonym/exact, ~0.8 for fuzzy, null for none. */
|
|
44
|
+
score: number | null;
|
|
45
|
+
tier: ResolveTier;
|
|
46
|
+
}
|
|
47
|
+
/** A previewed disposition row, ready to render. */
|
|
48
|
+
export interface DryRunRow {
|
|
49
|
+
tag: string;
|
|
50
|
+
matchedTag: string | null;
|
|
51
|
+
score: number | null;
|
|
52
|
+
disposition: Disposition;
|
|
53
|
+
reason: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Preview the disposition of a batch of existing extracted tags under a config.
|
|
57
|
+
* Pure and deterministic — given the same inputs + resolve function it always
|
|
58
|
+
* returns the same rows in the same order.
|
|
59
|
+
*/
|
|
60
|
+
export declare function previewDispositions(input: DryRunInput[], cfg: DryRunConfig, resolve: (tag: string) => ResolveResult): DryRunRow[];
|
|
61
|
+
//# sourceMappingURL=classify.dryrun.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.dryrun.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/shared/classify.dryrun.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,gFAAgF;AAChF,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,gBAAgB,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEpF,wDAAwD;AACxD,MAAM,WAAW,WAAW;IACxB,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,yEAAyE;IACzE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,wDAAwD;AACxD,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,aAAa,GAAG,WAAW,GAAG,WAAW,CAAC;IAChD,yDAAyD;IACzD,cAAc,EAAE,MAAM,CAAC;IACvB,2EAA2E;IAC3E,gBAAgB,EAAE,MAAM,CAAC;CAC5B;AAED,6CAA6C;AAC7C,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAEjE,uEAAuE;AACvE,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,WAAW,CAAC;CACrB;AAED,oDAAoD;AACpD,MAAM,WAAW,SAAS;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAClB;AA0DD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAC/B,KAAK,EAAE,WAAW,EAAE,EACpB,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,aAAa,GACxC,SAAS,EAAE,CAEb"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Classify · pure dry-run disposition helper.
|
|
3
|
+
*
|
|
4
|
+
* Honest, in-memory PREVIEW of how a source's EXISTING extracted ContentItemTags
|
|
5
|
+
* would be dispositioned under its current taxonomy mode + thresholds. This is
|
|
6
|
+
* NOT a fresh LLM run — it replays the deterministic, post-resolution routing
|
|
7
|
+
* portion of the server's autotagger so operators can see the effect of mode +
|
|
8
|
+
* thresholds before committing a real run.
|
|
9
|
+
*
|
|
10
|
+
* This module is intentionally framework-free (no Angular, no DI) so it can be
|
|
11
|
+
* unit-tested in isolation. The Angular dialog builds the `resolve` closure from
|
|
12
|
+
* cached taxonomy metadata (Tags / TagSynonyms) and feeds rows in here.
|
|
13
|
+
*
|
|
14
|
+
* NOTE: the server also has a semantic/embedding match tier that is NOT
|
|
15
|
+
* reproducible client-side. Borderline rows ('none' here) may resolve
|
|
16
|
+
* differently in a real run; the UI labels this clearly.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Resolve a single input row to its disposition under the given config.
|
|
20
|
+
*
|
|
21
|
+
* Routing mirrors the server's tiered model (deterministic portion only):
|
|
22
|
+
* 1. synonym/exact tier (or score ≥ matchThreshold) → auto-apply.
|
|
23
|
+
* 2. fuzzy/near with suggestThreshold ≤ score < matchThreshold → route-to-inbox.
|
|
24
|
+
* 3. no match (tier 'none') → governed by taxonomy mode:
|
|
25
|
+
* - constrained → route-to-inbox (novel tag goes to human review; we route to
|
|
26
|
+
* inbox rather than 'reject' so the operator can promote/discard it — this
|
|
27
|
+
* matches the server enqueuing a Tag Suggestion instead of silently dropping).
|
|
28
|
+
* - auto-grow / free-flow → create-new (would create the tag).
|
|
29
|
+
*/
|
|
30
|
+
function disposeRow(input, cfg, r) {
|
|
31
|
+
// Tier 1 — exact/synonym match (or a numeric score that clears the match bar).
|
|
32
|
+
if (r.tier === 'synonym' || r.tier === 'exact' || (r.score != null && r.score >= cfg.matchThreshold)) {
|
|
33
|
+
return {
|
|
34
|
+
tag: input.tag,
|
|
35
|
+
matchedTag: r.tagName,
|
|
36
|
+
score: r.score,
|
|
37
|
+
disposition: 'auto-apply',
|
|
38
|
+
reason: r.tier === 'synonym' ? 'synonym match' : 'exact/synonym match',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// Tier 2 — fuzzy/near match inside the suggest band → human-in-the-loop.
|
|
42
|
+
if (r.score != null && r.score >= cfg.suggestThreshold && r.score < cfg.matchThreshold) {
|
|
43
|
+
return {
|
|
44
|
+
tag: input.tag,
|
|
45
|
+
matchedTag: r.tagName,
|
|
46
|
+
score: r.score,
|
|
47
|
+
disposition: 'route-to-inbox',
|
|
48
|
+
reason: 'below match threshold',
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// Tier 3 — no usable match → governed by taxonomy mode.
|
|
52
|
+
if (cfg.mode === 'constrained') {
|
|
53
|
+
return {
|
|
54
|
+
tag: input.tag,
|
|
55
|
+
matchedTag: null,
|
|
56
|
+
score: r.score,
|
|
57
|
+
disposition: 'route-to-inbox',
|
|
58
|
+
reason: 'constrained: novel tag → review',
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// auto-grow | free-flow
|
|
62
|
+
return {
|
|
63
|
+
tag: input.tag,
|
|
64
|
+
matchedTag: null,
|
|
65
|
+
score: r.score,
|
|
66
|
+
disposition: 'create-new',
|
|
67
|
+
reason: cfg.mode === 'auto-grow' ? 'auto-grow: would create tag' : 'free-flow: would create tag',
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Preview the disposition of a batch of existing extracted tags under a config.
|
|
72
|
+
* Pure and deterministic — given the same inputs + resolve function it always
|
|
73
|
+
* returns the same rows in the same order.
|
|
74
|
+
*/
|
|
75
|
+
export function previewDispositions(input, cfg, resolve) {
|
|
76
|
+
return input.map(row => disposeRow(row, cfg, resolve(row.tag)));
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=classify.dryrun.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.dryrun.js","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/shared/classify.dryrun.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA6CH;;;;;;;;;;;GAWG;AACH,SAAS,UAAU,CAAC,KAAkB,EAAE,GAAiB,EAAE,CAAgB;IACvE,+EAA+E;IAC/E,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QACnG,OAAO;YACH,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,UAAU,EAAE,CAAC,CAAC,OAAO;YACrB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,WAAW,EAAE,YAAY;YACzB,MAAM,EAAE,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,qBAAqB;SACzE,CAAC;IACN,CAAC;IAED,yEAAyE;IACzE,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,gBAAgB,IAAI,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;QACrF,OAAO;YACH,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,UAAU,EAAE,CAAC,CAAC,OAAO;YACrB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,WAAW,EAAE,gBAAgB;YAC7B,MAAM,EAAE,uBAAuB;SAClC,CAAC;IACN,CAAC;IAED,wDAAwD;IACxD,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAC7B,OAAO;YACH,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,WAAW,EAAE,gBAAgB;YAC7B,MAAM,EAAE,iCAAiC;SAC5C,CAAC;IACN,CAAC;IAED,wBAAwB;IACxB,OAAO;QACH,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,WAAW,EAAE,YAAY;QACzB,MAAM,EAAE,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,6BAA6B;KACnG,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAC/B,KAAoB,EACpB,GAAiB,EACjB,OAAuC;IAEvC,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC","sourcesContent":["/**\n * @fileoverview Classify · pure dry-run disposition helper.\n *\n * Honest, in-memory PREVIEW of how a source's EXISTING extracted ContentItemTags\n * would be dispositioned under its current taxonomy mode + thresholds. This is\n * NOT a fresh LLM run — it replays the deterministic, post-resolution routing\n * portion of the server's autotagger so operators can see the effect of mode +\n * thresholds before committing a real run.\n *\n * This module is intentionally framework-free (no Angular, no DI) so it can be\n * unit-tested in isolation. The Angular dialog builds the `resolve` closure from\n * cached taxonomy metadata (Tags / TagSynonyms) and feeds rows in here.\n *\n * NOTE: the server also has a semantic/embedding match tier that is NOT\n * reproducible client-side. Borderline rows ('none' here) may resolve\n * differently in a real run; the UI labels this clearly.\n */\n\n/** Terminal outcome the server's tiered router would reach for a single tag. */\nexport type Disposition = 'auto-apply' | 'route-to-inbox' | 'create-new' | 'reject';\n\n/** A single existing ContentItemTag being previewed. */\nexport interface DryRunInput {\n /** Free-text tag as extracted by the LLM. */\n tag: string;\n /** Resolved formal Tag ID if the server already linked it, else null. */\n resolvedTagId: string | null;\n /** ContentItemTag.Weight (0..1). */\n weight: number;\n}\n\n/** The effective source config that governs routing. */\nexport interface DryRunConfig {\n mode: 'constrained' | 'auto-grow' | 'free-flow';\n /** Score at/above which an auto-apply happens (0..1). */\n matchThreshold: number;\n /** Lower band: at/above this but below matchThreshold → route to inbox. */\n suggestThreshold: number;\n}\n\n/** Which resolution tier a tag landed in. */\nexport type ResolveTier = 'synonym' | 'exact' | 'fuzzy' | 'none';\n\n/** Result of resolving a free-text tag against the cached taxonomy. */\nexport interface ResolveResult {\n tagId: string | null;\n tagName: string | null;\n /** 1.0 for synonym/exact, ~0.8 for fuzzy, null for none. */\n score: number | null;\n tier: ResolveTier;\n}\n\n/** A previewed disposition row, ready to render. */\nexport interface DryRunRow {\n tag: string;\n matchedTag: string | null;\n score: number | null;\n disposition: Disposition;\n reason: string;\n}\n\n/**\n * Resolve a single input row to its disposition under the given config.\n *\n * Routing mirrors the server's tiered model (deterministic portion only):\n * 1. synonym/exact tier (or score ≥ matchThreshold) → auto-apply.\n * 2. fuzzy/near with suggestThreshold ≤ score < matchThreshold → route-to-inbox.\n * 3. no match (tier 'none') → governed by taxonomy mode:\n * - constrained → route-to-inbox (novel tag goes to human review; we route to\n * inbox rather than 'reject' so the operator can promote/discard it — this\n * matches the server enqueuing a Tag Suggestion instead of silently dropping).\n * - auto-grow / free-flow → create-new (would create the tag).\n */\nfunction disposeRow(input: DryRunInput, cfg: DryRunConfig, r: ResolveResult): DryRunRow {\n // Tier 1 — exact/synonym match (or a numeric score that clears the match bar).\n if (r.tier === 'synonym' || r.tier === 'exact' || (r.score != null && r.score >= cfg.matchThreshold)) {\n return {\n tag: input.tag,\n matchedTag: r.tagName,\n score: r.score,\n disposition: 'auto-apply',\n reason: r.tier === 'synonym' ? 'synonym match' : 'exact/synonym match',\n };\n }\n\n // Tier 2 — fuzzy/near match inside the suggest band → human-in-the-loop.\n if (r.score != null && r.score >= cfg.suggestThreshold && r.score < cfg.matchThreshold) {\n return {\n tag: input.tag,\n matchedTag: r.tagName,\n score: r.score,\n disposition: 'route-to-inbox',\n reason: 'below match threshold',\n };\n }\n\n // Tier 3 — no usable match → governed by taxonomy mode.\n if (cfg.mode === 'constrained') {\n return {\n tag: input.tag,\n matchedTag: null,\n score: r.score,\n disposition: 'route-to-inbox',\n reason: 'constrained: novel tag → review',\n };\n }\n\n // auto-grow | free-flow\n return {\n tag: input.tag,\n matchedTag: null,\n score: r.score,\n disposition: 'create-new',\n reason: cfg.mode === 'auto-grow' ? 'auto-grow: would create tag' : 'free-flow: would create tag',\n };\n}\n\n/**\n * Preview the disposition of a batch of existing extracted tags under a config.\n * Pure and deterministic — given the same inputs + resolve function it always\n * returns the same rows in the same order.\n */\nexport function previewDispositions(\n input: DryRunInput[],\n cfg: DryRunConfig,\n resolve: (tag: string) => ResolveResult,\n): DryRunRow[] {\n return input.map(row => disposeRow(row, cfg, resolve(row.tag)));\n}\n"]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Pure formatting/mapping helpers for the Classify (autotagging) sub-app.
|
|
3
|
+
* Extracted from the former monolith so host + tabs share one implementation (DRY).
|
|
4
|
+
* All functions are stateless — no `this`, no DI — so they're safe to import anywhere.
|
|
5
|
+
*/
|
|
6
|
+
import { RunDetailRow } from './classify.types';
|
|
7
|
+
/** Locale-formatted integer (e.g. 12345 → "12,345"). */
|
|
8
|
+
export declare function formatNumber(n: number): string;
|
|
9
|
+
/**
|
|
10
|
+
* Derive a human-meaningful display name for a content item.
|
|
11
|
+
*
|
|
12
|
+
* Entity-sourced content items now carry a real per-record `Name` (the source
|
|
13
|
+
* entity's name field — e.g. "GPT-4"), so we prefer `Name` directly. Only when a
|
|
14
|
+
* Name is missing (or is a generic source-name placeholder) do we fall back to
|
|
15
|
+
* the first meaningful line of the LLM-generated `Description` to keep rows
|
|
16
|
+
* distinguishable, then to a placeholder.
|
|
17
|
+
*
|
|
18
|
+
* Pure/stateless — safe to call from any render site.
|
|
19
|
+
*/
|
|
20
|
+
export declare function deriveDisplayName(item: {
|
|
21
|
+
Name?: string | null;
|
|
22
|
+
Description?: string | null;
|
|
23
|
+
}): string;
|
|
24
|
+
/** Compact token count (e.g. 1500 → "2K", 2_400_000 → "2.4M"). */
|
|
25
|
+
export declare function formatTokenCount(tokens: number): string;
|
|
26
|
+
/** Weight (0.0–1.0) as a percentage string (e.g. 0.42 → "42%"). */
|
|
27
|
+
export declare function formatWeight(weight: number): string;
|
|
28
|
+
/** Font size in rem for a tag chip based on weight (0.0–1.0), clamped to 0.7–1.0rem. */
|
|
29
|
+
export declare function tagFontSize(weight: number): string;
|
|
30
|
+
/** Short date (e.g. "Mar 5"). Returns '' on parse failure. */
|
|
31
|
+
export declare function formatShortDate(dateStr: string): string;
|
|
32
|
+
/** Date + time (e.g. "Mar 5, 2:05 PM"). Echoes the input on parse failure. */
|
|
33
|
+
export declare function formatDate(dateStr: string): string;
|
|
34
|
+
/** Human-friendly elapsed duration between two ISO timestamps; open-ended if `end` is null. */
|
|
35
|
+
export declare function computeDuration(start: string | null, end: string | null): string;
|
|
36
|
+
/** Normalize a raw run status to one of the canonical display labels. */
|
|
37
|
+
export declare function displayStatus(status: string): string;
|
|
38
|
+
/** Font Awesome icon class for a content source type name. */
|
|
39
|
+
export declare function getSourceTypeIcon(typeName: string): string;
|
|
40
|
+
/** Map raw `MJ: Content Process Run Details` rows to typed RunDetailRow view models. */
|
|
41
|
+
export declare function mapRunDetailRecords(records: Record<string, unknown>[]): RunDetailRow[];
|
|
42
|
+
/**
|
|
43
|
+
* Converts a 5-part or 6-part cron expression to a human-readable English string.
|
|
44
|
+
*
|
|
45
|
+
* Handles common patterns:
|
|
46
|
+
* `0 * * * *` -> "Every hour"
|
|
47
|
+
* `0 2 * * *` -> "Daily at 2:00 AM"
|
|
48
|
+
* `0 2 * * 1` -> "Weekly on Monday at 2:00 AM"
|
|
49
|
+
* `star/15 * * * *` -> "Every 15 minutes" (where star = asterisk)
|
|
50
|
+
* `0 0 1 * *` -> "Monthly on day 1 at 12:00 AM"
|
|
51
|
+
*
|
|
52
|
+
* Falls back to returning the raw cron string for unrecognized patterns.
|
|
53
|
+
*
|
|
54
|
+
* @param cron A cron expression string (5 or 6 parts)
|
|
55
|
+
* @returns A human-readable description or the raw cron if unrecognized
|
|
56
|
+
*/
|
|
57
|
+
export declare function CronToHumanReadable(cron: string): string;
|
|
58
|
+
//# sourceMappingURL=classify.format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.format.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/shared/classify.format.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,MAAM,CAYrG;AAgCD,kEAAkE;AAClE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED,mEAAmE;AACnE,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wFAAwF;AACxF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,+FAA+F;AAC/F,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAUhF;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED,8DAA8D;AAC9D,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS1D;AAED,wFAAwF;AACxF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,YAAY,EAAE,CAyBtF;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQxD"}
|