@memberjunction/ng-dashboards 5.34.1 → 5.36.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/dist/AI/components/agents/agent-configuration.component.d.ts +51 -0
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +399 -292
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +8 -2
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +87 -85
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +96 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +453 -122
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +5 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/analytics-filter-bar.component.js +184 -135
- package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +8 -2
- 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 +104 -103
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +8 -2
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +76 -74
- package/dist/AI/components/analytics/error-analysis/error-analysis.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 +67 -87
- 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 +12 -19
- 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 +96 -203
- 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.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +110 -126
- 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.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +61 -77
- 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 +28 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2084 -2079
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +6 -3
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +493 -490
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.d.ts +17 -0
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
- package/dist/AI/components/models/model-management.component.js +370 -425
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts +17 -0
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +317 -357
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts +11 -0
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +170 -175
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.d.ts +19 -0
- package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +403 -362
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +15 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +1423 -1438
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +8 -3
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +547 -521
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts +12 -8
- package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +329 -371
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +6 -0
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +202 -158
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +9 -3
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +191 -142
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +41 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +388 -94
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/index.d.ts +0 -1
- package/dist/Actions/components/explorer/index.d.ts.map +1 -1
- package/dist/Actions/components/explorer/index.js +0 -1
- package/dist/Actions/components/explorer/index.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +19 -79
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +19 -79
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +19 -79
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +19 -79
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/Admin/base-admin-container.component.d.ts +9 -7
- package/dist/Admin/base-admin-container.component.d.ts.map +1 -1
- package/dist/Admin/base-admin-container.component.js +26 -17
- package/dist/Admin/base-admin-container.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +92 -91
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -1
- package/dist/Archiving/components/archive-config-resource.component.js +24 -5
- package/dist/Archiving/components/archive-config-resource.component.js.map +1 -1
- package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -1
- package/dist/Archiving/components/archive-runs-resource.component.js +24 -5
- package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +80 -99
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +127 -106
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-new-message-resource.component.d.ts +93 -0
- package/dist/Communication/communication-new-message-resource.component.d.ts.map +1 -0
- package/dist/Communication/communication-new-message-resource.component.js +661 -0
- package/dist/Communication/communication-new-message-resource.component.js.map +1 -0
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +44 -45
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +60 -58
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +139 -162
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts +7 -0
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +310 -297
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +238 -266
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +7 -0
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +381 -399
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +222 -228
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +6 -0
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +290 -305
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +8 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +41 -21
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts +2 -0
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +148 -155
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +25 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/DevTools/app-state-inspector.component.d.ts +5 -0
- package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/app-state-inspector.component.js +46 -72
- package/dist/DevTools/app-state-inspector.component.js.map +1 -1
- package/dist/DevTools/class-registry.component.js +88 -100
- package/dist/DevTools/class-registry.component.js.map +1 -1
- package/dist/DevTools/event-monitor.component.js +158 -168
- package/dist/DevTools/event-monitor.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +257 -264
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/DevTools/layout-inspector.component.d.ts +5 -0
- package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/layout-inspector.component.js +46 -64
- package/dist/DevTools/layout-inspector.component.js.map +1 -1
- package/dist/DevTools/lazy-module-status.component.js +75 -84
- package/dist/DevTools/lazy-module-status.component.js.map +1 -1
- package/dist/DevTools/settings-explorer.component.js +76 -85
- package/dist/DevTools/settings-explorer.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +2 -0
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +24 -16
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +6 -0
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +521 -485
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts +8 -0
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +307 -318
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +654 -648
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +234 -233
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +182 -163
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts +2 -0
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +595 -606
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +230 -241
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/integration.module.d.ts +1 -1
- package/dist/Integration/integration.module.d.ts.map +1 -1
- package/dist/Integration/integration.module.js +28 -1
- package/dist/Integration/integration.module.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +5 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1138 -1147
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +54 -51
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +11 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +684 -697
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +12 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +191 -120
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +120 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +1239 -610
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +152 -160
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +302 -319
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts +133 -3
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +1460 -272
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts +29 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts.map +1 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.js +77 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.js.map +1 -0
- package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts +6 -0
- package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts.map +1 -1
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js +35 -7
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
- package/dist/Lists/index.d.ts +1 -0
- package/dist/Lists/index.d.ts.map +1 -1
- package/dist/Lists/index.js +1 -0
- package/dist/Lists/index.js.map +1 -1
- package/dist/Lists/services/list-set-operations.service.d.ts +93 -2
- package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
- package/dist/Lists/services/list-set-operations.service.js +236 -10
- package/dist/Lists/services/list-set-operations.service.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +20 -0
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +1248 -1338
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp.module.d.ts +1 -1
- package/dist/MCP/mcp.module.d.ts.map +1 -1
- package/dist/MCP/mcp.module.js +34 -1
- package/dist/MCP/mcp.module.js.map +1 -1
- package/dist/Permissions/audit-log-resource.component.js +76 -85
- package/dist/Permissions/audit-log-resource.component.js.map +1 -1
- package/dist/Permissions/resource-access-resource.component.js +64 -69
- package/dist/Permissions/resource-access-resource.component.js.map +1 -1
- package/dist/Permissions/user-access-resource.component.js +63 -74
- package/dist/Permissions/user-access-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts +9 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +250 -197
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts +9 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +203 -147
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts +3 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +224 -190
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts +19 -6
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +259 -103
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +13 -3
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +1009 -1264
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.js +7 -14
- package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics.component.d.ts +3 -1
- package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics.component.js +420 -393
- package/dist/Testing/components/testing-analytics.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +16 -19
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts +3 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.js +157 -122
- package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.js +7 -12
- package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +38 -6
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +679 -786
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts +4 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.js +9 -12
- package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-review.component.d.ts +3 -1
- package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review.component.js +310 -274
- package/dist/Testing/components/testing-review.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +16 -19
- package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.d.ts +3 -1
- package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +307 -273
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +2 -0
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +114 -99
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +185 -188
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +154 -184
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts +7 -0
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +350 -354
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +163 -169
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/actions-dashboards.module.d.ts +15 -16
- package/dist/actions-dashboards.module.d.ts.map +1 -1
- package/dist/actions-dashboards.module.js +34 -11
- package/dist/actions-dashboards.module.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +45 -48
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +51 -10
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/archiving-dashboards.module.d.ts +2 -1
- package/dist/archiving-dashboards.module.d.ts.map +1 -1
- package/dist/archiving-dashboards.module.js +12 -2
- package/dist/archiving-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +9 -6
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +37 -7
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +1 -1
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +46 -1
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/credentials-dashboards.module.d.ts +1 -1
- package/dist/credentials-dashboards.module.d.ts.map +1 -1
- package/dist/credentials-dashboards.module.js +28 -1
- package/dist/credentials-dashboards.module.js.map +1 -1
- package/dist/lists-dashboards.module.d.ts +10 -9
- package/dist/lists-dashboards.module.d.ts.map +1 -1
- package/dist/lists-dashboards.module.js +40 -2
- package/dist/lists-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +3 -2
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +4 -3
- package/dist/public-api.js.map +1 -1
- package/dist/scheduling-dashboards.module.d.ts +1 -1
- package/dist/scheduling-dashboards.module.d.ts.map +1 -1
- package/dist/scheduling-dashboards.module.js +31 -1
- package/dist/scheduling-dashboards.module.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +8 -7
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +42 -0
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +53 -52
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts +0 -56
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +0 -285
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +0 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +0 -49
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +0 -184
- package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +0 -1
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts +0 -33
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/system/system-config-filter-panel.component.js +0 -144
- package/dist/AI/components/system/system-config-filter-panel.component.js.map +0 -1
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts +0 -63
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +0 -1
- package/dist/Actions/components/explorer/action-toolbar.component.js +0 -463
- package/dist/Actions/components/explorer/action-toolbar.component.js.map +0 -1
|
@@ -23,118 +23,119 @@ import * as i0 from "@angular/core";
|
|
|
23
23
|
import * as i1 from "@angular/forms";
|
|
24
24
|
import * as i2 from "@memberjunction/ng-shared-generic";
|
|
25
25
|
import * as i3 from "@memberjunction/ng-search";
|
|
26
|
-
import * as i4 from "
|
|
27
|
-
import * as i5 from "
|
|
26
|
+
import * as i4 from "@memberjunction/ng-ui-components";
|
|
27
|
+
import * as i5 from "../scheduling/scheduling-resource.component";
|
|
28
|
+
import * as i6 from "@angular/common";
|
|
28
29
|
const _forTrack0 = ($index, $item) => $item.ID;
|
|
29
30
|
const _forTrack1 = ($index, $item) => $item.EntityName;
|
|
30
31
|
const _forTrack2 = ($index, $item) => $item.ScopeID;
|
|
31
32
|
const _forTrack3 = ($index, $item) => $item.Reranker;
|
|
32
33
|
const _forTrack4 = ($index, $item) => $item.Reason;
|
|
33
|
-
function
|
|
34
|
-
i0.ɵɵ
|
|
35
|
-
i0.ɵɵelement(1, "mj-loading", 2);
|
|
36
|
-
i0.ɵɵelementEnd();
|
|
34
|
+
function KnowledgeConfigResourceComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
35
|
+
i0.ɵɵelement(0, "mj-stat-badge", 2);
|
|
37
36
|
} }
|
|
38
|
-
function
|
|
37
|
+
function KnowledgeConfigResourceComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
39
38
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
40
|
-
i0.ɵɵelementStart(0, "button",
|
|
41
|
-
i0.ɵɵlistener("click", function
|
|
42
|
-
i0.ɵɵelement(1, "i");
|
|
43
|
-
i0.ɵɵ
|
|
44
|
-
i0.ɵɵ
|
|
45
|
-
i0.ɵɵ
|
|
39
|
+
i0.ɵɵelementStart(0, "button", 7);
|
|
40
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ResetConfiguration()); });
|
|
41
|
+
i0.ɵɵelement(1, "i", 8);
|
|
42
|
+
i0.ɵɵtext(2, " Reset ");
|
|
43
|
+
i0.ɵɵelementEnd();
|
|
44
|
+
i0.ɵɵelementStart(3, "button", 9);
|
|
45
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_5_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SaveConfiguration()); });
|
|
46
|
+
i0.ɵɵelement(4, "i", 10);
|
|
47
|
+
i0.ɵɵtext(5);
|
|
48
|
+
i0.ɵɵelementEnd();
|
|
46
49
|
} if (rf & 2) {
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
i0.ɵɵ
|
|
50
|
-
i0.ɵɵ
|
|
51
|
-
i0.ɵɵclassMap(section_r2.Icon);
|
|
50
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
51
|
+
i0.ɵɵproperty("disabled", ctx_r1.IsSaving);
|
|
52
|
+
i0.ɵɵadvance(3);
|
|
53
|
+
i0.ɵɵproperty("disabled", ctx_r1.IsSaving);
|
|
52
54
|
i0.ɵɵadvance(2);
|
|
53
|
-
i0.ɵɵ
|
|
55
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.IsSaving ? "Saving\u2026" : "Save", " ");
|
|
54
56
|
} }
|
|
55
|
-
function
|
|
56
|
-
|
|
57
|
-
i0.ɵɵ
|
|
58
|
-
i0.ɵɵtext(2, "Pipeline Settings");
|
|
59
|
-
i0.ɵɵelementEnd();
|
|
60
|
-
i0.ɵɵelementStart(3, "p", 13);
|
|
61
|
-
i0.ɵɵtext(4, "Configure how the Knowledge Pipeline processes incoming content.");
|
|
57
|
+
function KnowledgeConfigResourceComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
58
|
+
i0.ɵɵelementStart(0, "div", 5);
|
|
59
|
+
i0.ɵɵelement(1, "mj-loading", 11);
|
|
62
60
|
i0.ɵɵelementEnd();
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
} }
|
|
62
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
63
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
64
|
+
i0.ɵɵelementStart(0, "div", 14)(1, "div", 17)(2, "label", 18)(3, "div", 19)(4, "span", 20);
|
|
65
|
+
i0.ɵɵtext(5, "Auto-tag on Ingest");
|
|
65
66
|
i0.ɵɵelementEnd();
|
|
66
|
-
i0.ɵɵelementStart(
|
|
67
|
-
i0.ɵɵtext(
|
|
67
|
+
i0.ɵɵelementStart(6, "span", 21);
|
|
68
|
+
i0.ɵɵtext(7, "Automatically run autotagging when new content is ingested");
|
|
68
69
|
i0.ɵɵelementEnd()();
|
|
69
|
-
i0.ɵɵelementStart(
|
|
70
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
71
|
-
i0.ɵɵlistener("change", function
|
|
70
|
+
i0.ɵɵelementStart(8, "input", 22);
|
|
71
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.PipelineSettings.AutotagOnIngest, $event) || (ctx_r1.PipelineSettings.AutotagOnIngest = $event); return i0.ɵɵresetView($event); });
|
|
72
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_change_8_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
72
73
|
i0.ɵɵelementEnd()();
|
|
73
|
-
i0.ɵɵelementStart(
|
|
74
|
-
i0.ɵɵtext(
|
|
74
|
+
i0.ɵɵelementStart(9, "label", 18)(10, "div", 19)(11, "span", 20);
|
|
75
|
+
i0.ɵɵtext(12, "Vectorize on Ingest");
|
|
75
76
|
i0.ɵɵelementEnd();
|
|
76
|
-
i0.ɵɵelementStart(
|
|
77
|
-
i0.ɵɵtext(
|
|
77
|
+
i0.ɵɵelementStart(13, "span", 21);
|
|
78
|
+
i0.ɵɵtext(14, "Automatically create embeddings for new content");
|
|
78
79
|
i0.ɵɵelementEnd()();
|
|
79
|
-
i0.ɵɵelementStart(
|
|
80
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
81
|
-
i0.ɵɵlistener("change", function
|
|
80
|
+
i0.ɵɵelementStart(15, "input", 22);
|
|
81
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_ngModelChange_15_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.PipelineSettings.VectorizeOnIngest, $event) || (ctx_r1.PipelineSettings.VectorizeOnIngest = $event); return i0.ɵɵresetView($event); });
|
|
82
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_change_15_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
82
83
|
i0.ɵɵelementEnd()();
|
|
83
|
-
i0.ɵɵelementStart(
|
|
84
|
-
i0.ɵɵtext(
|
|
84
|
+
i0.ɵɵelementStart(16, "div", 23)(17, "div", 24)(18, "span", 20);
|
|
85
|
+
i0.ɵɵtext(19, "Default Batch Size");
|
|
85
86
|
i0.ɵɵelementEnd();
|
|
86
|
-
i0.ɵɵelementStart(
|
|
87
|
-
i0.ɵɵtext(
|
|
87
|
+
i0.ɵɵelementStart(20, "span", 21);
|
|
88
|
+
i0.ɵɵtext(21, "Number of items processed per batch");
|
|
88
89
|
i0.ɵɵelementEnd()();
|
|
89
|
-
i0.ɵɵelementStart(
|
|
90
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
91
|
-
i0.ɵɵlistener("input", function
|
|
90
|
+
i0.ɵɵelementStart(22, "input", 25);
|
|
91
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_ngModelChange_22_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.PipelineSettings.DefaultBatchSize, $event) || (ctx_r1.PipelineSettings.DefaultBatchSize = $event); return i0.ɵɵresetView($event); });
|
|
92
|
+
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_input_22_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
92
93
|
i0.ɵɵelementEnd()();
|
|
93
|
-
i0.ɵɵelementStart(
|
|
94
|
-
i0.ɵɵtext(
|
|
94
|
+
i0.ɵɵelementStart(23, "div", 23)(24, "div", 24)(25, "span", 20);
|
|
95
|
+
i0.ɵɵtext(26, "Max Concurrent Jobs");
|
|
95
96
|
i0.ɵɵelementEnd();
|
|
96
|
-
i0.ɵɵelementStart(
|
|
97
|
-
i0.ɵɵtext(
|
|
97
|
+
i0.ɵɵelementStart(27, "span", 21);
|
|
98
|
+
i0.ɵɵtext(28, "Maximum number of pipeline jobs running at once");
|
|
98
99
|
i0.ɵɵelementEnd()();
|
|
99
|
-
i0.ɵɵelementStart(
|
|
100
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
101
|
-
i0.ɵɵlistener("input", function
|
|
100
|
+
i0.ɵɵelementStart(29, "input", 26);
|
|
101
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_ngModelChange_29_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.PipelineSettings.MaxConcurrentJobs, $event) || (ctx_r1.PipelineSettings.MaxConcurrentJobs = $event); return i0.ɵɵresetView($event); });
|
|
102
|
+
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_input_29_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
102
103
|
i0.ɵɵelementEnd()()()();
|
|
103
104
|
} if (rf & 2) {
|
|
104
|
-
const
|
|
105
|
-
i0.ɵɵadvance(
|
|
106
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
105
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
106
|
+
i0.ɵɵadvance(8);
|
|
107
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.PipelineSettings.AutotagOnIngest);
|
|
107
108
|
i0.ɵɵadvance(7);
|
|
108
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
109
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.PipelineSettings.VectorizeOnIngest);
|
|
109
110
|
i0.ɵɵadvance(7);
|
|
110
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
111
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.PipelineSettings.DefaultBatchSize);
|
|
111
112
|
i0.ɵɵadvance(7);
|
|
112
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
113
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.PipelineSettings.MaxConcurrentJobs);
|
|
113
114
|
} }
|
|
114
|
-
function
|
|
115
|
-
i0.ɵɵelement(0, "i",
|
|
115
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
116
|
+
i0.ɵɵelement(0, "i", 36);
|
|
116
117
|
} }
|
|
117
|
-
function
|
|
118
|
-
i0.ɵɵelementStart(0, "span",
|
|
118
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
119
|
+
i0.ɵɵelementStart(0, "span", 37);
|
|
119
120
|
i0.ɵɵtext(1, "1");
|
|
120
121
|
i0.ɵɵelementEnd();
|
|
121
122
|
} }
|
|
122
|
-
function
|
|
123
|
-
i0.ɵɵelementStart(0, "span",
|
|
123
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
124
|
+
i0.ɵɵelementStart(0, "span", 40);
|
|
124
125
|
i0.ɵɵtext(1);
|
|
125
126
|
i0.ɵɵelementEnd();
|
|
126
127
|
} if (rf & 2) {
|
|
127
|
-
const
|
|
128
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
128
129
|
i0.ɵɵadvance();
|
|
129
|
-
i0.ɵɵtextInterpolate1("",
|
|
130
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.VectorDBProviders.length, " provider(s) registered");
|
|
130
131
|
} }
|
|
131
|
-
function
|
|
132
|
-
i0.ɵɵelementStart(0, "span",
|
|
132
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
133
|
+
i0.ɵɵelementStart(0, "span", 40);
|
|
133
134
|
i0.ɵɵtext(1, "No providers registered. Add a vector database provider (e.g., Pinecone, Weaviate) via the admin console.");
|
|
134
135
|
i0.ɵɵelementEnd();
|
|
135
136
|
} }
|
|
136
|
-
function
|
|
137
|
-
i0.ɵɵelementStart(0, "option",
|
|
137
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_For_20_Template(rf, ctx) { if (rf & 1) {
|
|
138
|
+
i0.ɵɵelementStart(0, "option", 56);
|
|
138
139
|
i0.ɵɵtext(1);
|
|
139
140
|
i0.ɵɵelementEnd();
|
|
140
141
|
} if (rf & 2) {
|
|
@@ -143,88 +144,88 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Condition
|
|
|
143
144
|
i0.ɵɵadvance();
|
|
144
145
|
i0.ɵɵtextInterpolate(cred_r7.Name);
|
|
145
146
|
} }
|
|
146
|
-
function
|
|
147
|
-
i0.ɵɵelement(0, "i",
|
|
147
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
148
|
+
i0.ɵɵelement(0, "i", 57);
|
|
148
149
|
} }
|
|
149
|
-
function
|
|
150
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
150
151
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
151
|
-
i0.ɵɵelementStart(0, "div",
|
|
152
|
-
i0.ɵɵelement(2, "i",
|
|
152
|
+
i0.ɵɵelementStart(0, "div", 44)(1, "div", 45);
|
|
153
|
+
i0.ɵɵelement(2, "i", 46);
|
|
153
154
|
i0.ɵɵelementEnd();
|
|
154
|
-
i0.ɵɵelementStart(3, "div",
|
|
155
|
+
i0.ɵɵelementStart(3, "div", 47)(4, "span", 48);
|
|
155
156
|
i0.ɵɵtext(5);
|
|
156
157
|
i0.ɵɵelementEnd();
|
|
157
|
-
i0.ɵɵelementStart(6, "span",
|
|
158
|
+
i0.ɵɵelementStart(6, "span", 49);
|
|
158
159
|
i0.ɵɵtext(7);
|
|
159
160
|
i0.ɵɵelementEnd()();
|
|
160
|
-
i0.ɵɵelementStart(8, "span",
|
|
161
|
-
i0.ɵɵelement(9, "i",
|
|
161
|
+
i0.ɵɵelementStart(8, "span", 50);
|
|
162
|
+
i0.ɵɵelement(9, "i", 36);
|
|
162
163
|
i0.ɵɵtext(10, " Active ");
|
|
163
164
|
i0.ɵɵelementEnd()();
|
|
164
|
-
i0.ɵɵelementStart(11, "div",
|
|
165
|
-
i0.ɵɵelement(13, "i",
|
|
165
|
+
i0.ɵɵelementStart(11, "div", 51)(12, "label", 52);
|
|
166
|
+
i0.ɵɵelement(13, "i", 53);
|
|
166
167
|
i0.ɵɵtext(14, " API Credential ");
|
|
167
168
|
i0.ɵɵelementEnd();
|
|
168
|
-
i0.ɵɵelementStart(15, "div",
|
|
169
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
170
|
-
i0.ɵɵlistener("change", function
|
|
171
|
-
i0.ɵɵelementStart(17, "option",
|
|
169
|
+
i0.ɵɵelementStart(15, "div", 54)(16, "select", 55);
|
|
170
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Template_select_ngModelChange_16_listener($event) { const provider_r6 = i0.ɵɵrestoreView(_r5).$implicit; i0.ɵɵtwoWayBindingSet(provider_r6.CredentialID, $event) || (provider_r6.CredentialID = $event); return i0.ɵɵresetView($event); });
|
|
171
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Template_select_change_16_listener() { const provider_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SaveProviderCredential(provider_r6)); });
|
|
172
|
+
i0.ɵɵelementStart(17, "option", 56);
|
|
172
173
|
i0.ɵɵtext(18, "None (use environment variable)");
|
|
173
174
|
i0.ɵɵelementEnd();
|
|
174
|
-
i0.ɵɵrepeaterCreate(19,
|
|
175
|
+
i0.ɵɵrepeaterCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_For_20_Template, 2, 2, "option", 56, _forTrack0);
|
|
175
176
|
i0.ɵɵelementEnd();
|
|
176
|
-
i0.ɵɵconditionalCreate(21,
|
|
177
|
+
i0.ɵɵconditionalCreate(21, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Conditional_21_Template, 1, 0, "i", 57);
|
|
177
178
|
i0.ɵɵelementEnd()();
|
|
178
179
|
} if (rf & 2) {
|
|
179
180
|
const provider_r6 = ctx.$implicit;
|
|
180
|
-
const
|
|
181
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
181
182
|
i0.ɵɵadvance(5);
|
|
182
183
|
i0.ɵɵtextInterpolate(provider_r6.Name);
|
|
183
184
|
i0.ɵɵadvance(2);
|
|
184
185
|
i0.ɵɵtextInterpolate(provider_r6.ClassKey);
|
|
185
186
|
i0.ɵɵadvance(9);
|
|
186
187
|
i0.ɵɵtwoWayProperty("ngModel", provider_r6.CredentialID);
|
|
187
|
-
i0.ɵɵproperty("disabled",
|
|
188
|
+
i0.ɵɵproperty("disabled", ctx_r1.IsSavingCredential);
|
|
188
189
|
i0.ɵɵadvance();
|
|
189
190
|
i0.ɵɵproperty("ngValue", null);
|
|
190
191
|
i0.ɵɵadvance(2);
|
|
191
|
-
i0.ɵɵrepeater(
|
|
192
|
+
i0.ɵɵrepeater(ctx_r1.AvailableCredentials);
|
|
192
193
|
i0.ɵɵadvance(2);
|
|
193
|
-
i0.ɵɵconditional(
|
|
194
|
+
i0.ɵɵconditional(ctx_r1.IsSavingCredential ? 21 : -1);
|
|
194
195
|
} }
|
|
195
|
-
function
|
|
196
|
-
i0.ɵɵelementStart(0, "div",
|
|
197
|
-
i0.ɵɵrepeaterCreate(1,
|
|
196
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
197
|
+
i0.ɵɵelementStart(0, "div", 41);
|
|
198
|
+
i0.ɵɵrepeaterCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Template, 22, 6, null, null, _forTrack0);
|
|
198
199
|
i0.ɵɵelementEnd();
|
|
199
200
|
} if (rf & 2) {
|
|
200
|
-
const
|
|
201
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
201
202
|
i0.ɵɵadvance();
|
|
202
|
-
i0.ɵɵrepeater(
|
|
203
|
+
i0.ɵɵrepeater(ctx_r1.VectorDBProviders);
|
|
203
204
|
} }
|
|
204
|
-
function
|
|
205
|
-
i0.ɵɵelement(0, "i",
|
|
205
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
206
|
+
i0.ɵɵelement(0, "i", 36);
|
|
206
207
|
} }
|
|
207
|
-
function
|
|
208
|
-
i0.ɵɵelementStart(0, "span",
|
|
208
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
209
|
+
i0.ɵɵelementStart(0, "span", 37);
|
|
209
210
|
i0.ɵɵtext(1, "2");
|
|
210
211
|
i0.ɵɵelementEnd();
|
|
211
212
|
} }
|
|
212
|
-
function
|
|
213
|
-
i0.ɵɵelementStart(0, "span",
|
|
213
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_28_Template(rf, ctx) { if (rf & 1) {
|
|
214
|
+
i0.ɵɵelementStart(0, "span", 40);
|
|
214
215
|
i0.ɵɵtext(1);
|
|
215
216
|
i0.ɵɵelementEnd();
|
|
216
217
|
} if (rf & 2) {
|
|
217
|
-
const
|
|
218
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
218
219
|
i0.ɵɵadvance();
|
|
219
|
-
i0.ɵɵtextInterpolate1("",
|
|
220
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.EmbeddingModels.length, " model(s) available");
|
|
220
221
|
} }
|
|
221
|
-
function
|
|
222
|
-
i0.ɵɵelementStart(0, "span",
|
|
222
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_29_Template(rf, ctx) { if (rf & 1) {
|
|
223
|
+
i0.ɵɵelementStart(0, "span", 40);
|
|
223
224
|
i0.ɵɵtext(1, "No embedding models found. Configure at least one in the AI app > Models tab.");
|
|
224
225
|
i0.ɵɵelementEnd();
|
|
225
226
|
} }
|
|
226
|
-
function
|
|
227
|
-
i0.ɵɵelementStart(0, "span",
|
|
227
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_30_For_3_Template(rf, ctx) { if (rf & 1) {
|
|
228
|
+
i0.ɵɵelementStart(0, "span", 59);
|
|
228
229
|
i0.ɵɵtext(1);
|
|
229
230
|
i0.ɵɵelementEnd();
|
|
230
231
|
} if (rf & 2) {
|
|
@@ -232,71 +233,71 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Condition
|
|
|
232
233
|
i0.ɵɵadvance();
|
|
233
234
|
i0.ɵɵtextInterpolate(model_r8.Name);
|
|
234
235
|
} }
|
|
235
|
-
function
|
|
236
|
-
i0.ɵɵelementStart(0, "div",
|
|
237
|
-
i0.ɵɵrepeaterCreate(2,
|
|
236
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_30_Template(rf, ctx) { if (rf & 1) {
|
|
237
|
+
i0.ɵɵelementStart(0, "div", 41)(1, "div", 58);
|
|
238
|
+
i0.ɵɵrepeaterCreate(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_30_For_3_Template, 2, 1, "span", 59, _forTrack0);
|
|
238
239
|
i0.ɵɵelementEnd()();
|
|
239
240
|
} if (rf & 2) {
|
|
240
|
-
const
|
|
241
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
241
242
|
i0.ɵɵadvance(2);
|
|
242
|
-
i0.ɵɵrepeater(
|
|
243
|
+
i0.ɵɵrepeater(ctx_r1.EmbeddingModels);
|
|
243
244
|
} }
|
|
244
|
-
function
|
|
245
|
-
i0.ɵɵelement(0, "i",
|
|
245
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_34_Template(rf, ctx) { if (rf & 1) {
|
|
246
|
+
i0.ɵɵelement(0, "i", 36);
|
|
246
247
|
} }
|
|
247
|
-
function
|
|
248
|
-
i0.ɵɵelementStart(0, "span",
|
|
248
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_35_Template(rf, ctx) { if (rf & 1) {
|
|
249
|
+
i0.ɵɵelementStart(0, "span", 37);
|
|
249
250
|
i0.ɵɵtext(1, "3");
|
|
250
251
|
i0.ɵɵelementEnd();
|
|
251
252
|
} }
|
|
252
|
-
function
|
|
253
|
-
i0.ɵɵelementStart(0, "span",
|
|
253
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_39_Template(rf, ctx) { if (rf & 1) {
|
|
254
|
+
i0.ɵɵelementStart(0, "span", 40);
|
|
254
255
|
i0.ɵɵtext(1);
|
|
255
256
|
i0.ɵɵelementEnd();
|
|
256
257
|
} if (rf & 2) {
|
|
257
|
-
const
|
|
258
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
258
259
|
i0.ɵɵadvance();
|
|
259
|
-
i0.ɵɵtextInterpolate1("",
|
|
260
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.VectorIndexes.length, " index(es) configured");
|
|
260
261
|
} }
|
|
261
|
-
function
|
|
262
|
-
i0.ɵɵelementStart(0, "span",
|
|
262
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_40_Template(rf, ctx) { if (rf & 1) {
|
|
263
|
+
i0.ɵɵelementStart(0, "span", 40);
|
|
263
264
|
i0.ɵɵtext(1, "No indexes yet \u2014 create one below.");
|
|
264
265
|
i0.ɵɵelementEnd();
|
|
265
266
|
} }
|
|
266
|
-
function
|
|
267
|
-
i0.ɵɵelementStart(0, "span",
|
|
267
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_41_Template(rf, ctx) { if (rf & 1) {
|
|
268
|
+
i0.ɵɵelementStart(0, "span", 40);
|
|
268
269
|
i0.ɵɵtext(1, "Complete steps 1 and 2 first.");
|
|
269
270
|
i0.ɵɵelementEnd();
|
|
270
271
|
} }
|
|
271
|
-
function
|
|
272
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_42_Template(rf, ctx) { if (rf & 1) {
|
|
272
273
|
const _r9 = i0.ɵɵgetCurrentView();
|
|
273
|
-
i0.ɵɵelementStart(0, "button",
|
|
274
|
-
i0.ɵɵlistener("click", function
|
|
275
|
-
i0.ɵɵelement(1, "i",
|
|
274
|
+
i0.ɵɵelementStart(0, "button", 60);
|
|
275
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_42_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenCreateIndexForm()); });
|
|
276
|
+
i0.ɵɵelement(1, "i", 61);
|
|
276
277
|
i0.ɵɵtext(2, " Create Index ");
|
|
277
278
|
i0.ɵɵelementEnd();
|
|
278
279
|
} }
|
|
279
|
-
function
|
|
280
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_43_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
280
281
|
const _r10 = i0.ɵɵgetCurrentView();
|
|
281
|
-
i0.ɵɵelementStart(0, "div",
|
|
282
|
-
i0.ɵɵelement(2, "i",
|
|
282
|
+
i0.ɵɵelementStart(0, "div", 62)(1, "div", 63);
|
|
283
|
+
i0.ɵɵelement(2, "i", 64);
|
|
283
284
|
i0.ɵɵelementEnd();
|
|
284
|
-
i0.ɵɵelementStart(3, "div",
|
|
285
|
+
i0.ɵɵelementStart(3, "div", 65)(4, "span", 66);
|
|
285
286
|
i0.ɵɵtext(5);
|
|
286
287
|
i0.ɵɵelementEnd();
|
|
287
|
-
i0.ɵɵelementStart(6, "span",
|
|
288
|
-
i0.ɵɵelement(7, "i",
|
|
288
|
+
i0.ɵɵelementStart(6, "span", 67);
|
|
289
|
+
i0.ɵɵelement(7, "i", 46);
|
|
289
290
|
i0.ɵɵtext(8);
|
|
290
|
-
i0.ɵɵelement(9, "i",
|
|
291
|
+
i0.ɵɵelement(9, "i", 68);
|
|
291
292
|
i0.ɵɵtext(10);
|
|
292
293
|
i0.ɵɵelementEnd()();
|
|
293
|
-
i0.ɵɵelementStart(11, "div",
|
|
294
|
-
i0.ɵɵelement(13, "i",
|
|
294
|
+
i0.ɵɵelementStart(11, "div", 69)(12, "span", 50);
|
|
295
|
+
i0.ɵɵelement(13, "i", 36);
|
|
295
296
|
i0.ɵɵtext(14, " Active ");
|
|
296
297
|
i0.ɵɵelementEnd();
|
|
297
|
-
i0.ɵɵelementStart(15, "button",
|
|
298
|
-
i0.ɵɵlistener("click", function
|
|
299
|
-
i0.ɵɵelement(16, "i",
|
|
298
|
+
i0.ɵɵelementStart(15, "button", 70);
|
|
299
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_43_For_2_Template_button_click_15_listener() { const idx_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.DeleteIndex(idx_r11.ID)); });
|
|
300
|
+
i0.ɵɵelement(16, "i", 71);
|
|
300
301
|
i0.ɵɵelementEnd()()();
|
|
301
302
|
} if (rf & 2) {
|
|
302
303
|
const idx_r11 = ctx.$implicit;
|
|
@@ -307,17 +308,17 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Condition
|
|
|
307
308
|
i0.ɵɵadvance(2);
|
|
308
309
|
i0.ɵɵtextInterpolate1(" ", idx_r11.EmbeddingModel, " ");
|
|
309
310
|
} }
|
|
310
|
-
function
|
|
311
|
-
i0.ɵɵelementStart(0, "div",
|
|
312
|
-
i0.ɵɵrepeaterCreate(1,
|
|
311
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_43_Template(rf, ctx) { if (rf & 1) {
|
|
312
|
+
i0.ɵɵelementStart(0, "div", 41);
|
|
313
|
+
i0.ɵɵrepeaterCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_43_For_2_Template, 17, 3, "div", 62, _forTrack0);
|
|
313
314
|
i0.ɵɵelementEnd();
|
|
314
315
|
} if (rf & 2) {
|
|
315
|
-
const
|
|
316
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
316
317
|
i0.ɵɵadvance();
|
|
317
|
-
i0.ɵɵrepeater(
|
|
318
|
+
i0.ɵɵrepeater(ctx_r1.VectorIndexes);
|
|
318
319
|
} }
|
|
319
|
-
function
|
|
320
|
-
i0.ɵɵelementStart(0, "option",
|
|
320
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_For_14_Template(rf, ctx) { if (rf & 1) {
|
|
321
|
+
i0.ɵɵelementStart(0, "option", 79);
|
|
321
322
|
i0.ɵɵtext(1);
|
|
322
323
|
i0.ɵɵelementEnd();
|
|
323
324
|
} if (rf & 2) {
|
|
@@ -326,8 +327,8 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Condition
|
|
|
326
327
|
i0.ɵɵadvance();
|
|
327
328
|
i0.ɵɵtextInterpolate(db_r13.Name);
|
|
328
329
|
} }
|
|
329
|
-
function
|
|
330
|
-
i0.ɵɵelementStart(0, "option",
|
|
330
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_For_20_Template(rf, ctx) { if (rf & 1) {
|
|
331
|
+
i0.ɵɵelementStart(0, "option", 79);
|
|
331
332
|
i0.ɵɵtext(1);
|
|
332
333
|
i0.ɵɵelementEnd();
|
|
333
334
|
} if (rf & 2) {
|
|
@@ -336,166 +337,160 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Condition
|
|
|
336
337
|
i0.ɵɵadvance();
|
|
337
338
|
i0.ɵɵtextInterpolate(model_r14.Name);
|
|
338
339
|
} }
|
|
339
|
-
function
|
|
340
|
-
i0.ɵɵelement(0, "i",
|
|
340
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
341
|
+
i0.ɵɵelement(0, "i", 83);
|
|
341
342
|
i0.ɵɵtext(1, " Creating... ");
|
|
342
343
|
} }
|
|
343
|
-
function
|
|
344
|
-
i0.ɵɵelement(0, "i",
|
|
344
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
345
|
+
i0.ɵɵelement(0, "i", 61);
|
|
345
346
|
i0.ɵɵtext(1, " Create Index ");
|
|
346
347
|
} }
|
|
347
|
-
function
|
|
348
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template(rf, ctx) { if (rf & 1) {
|
|
348
349
|
const _r12 = i0.ɵɵgetCurrentView();
|
|
349
|
-
i0.ɵɵelementStart(0, "div",
|
|
350
|
-
i0.ɵɵelement(2, "i",
|
|
350
|
+
i0.ɵɵelementStart(0, "div", 43)(1, "h4", 72);
|
|
351
|
+
i0.ɵɵelement(2, "i", 73);
|
|
351
352
|
i0.ɵɵtext(3, " Create New Vector Index ");
|
|
352
353
|
i0.ɵɵelementEnd();
|
|
353
|
-
i0.ɵɵelementStart(4, "div",
|
|
354
|
+
i0.ɵɵelementStart(4, "div", 74)(5, "div", 75)(6, "label", 76);
|
|
354
355
|
i0.ɵɵtext(7, "Index Name");
|
|
355
356
|
i0.ɵɵelementEnd();
|
|
356
|
-
i0.ɵɵelementStart(8, "input",
|
|
357
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
357
|
+
i0.ɵɵelementStart(8, "input", 77);
|
|
358
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.NewIndexName, $event) || (ctx_r1.NewIndexName = $event); return i0.ɵɵresetView($event); });
|
|
358
359
|
i0.ɵɵelementEnd()();
|
|
359
|
-
i0.ɵɵelementStart(9, "div",
|
|
360
|
+
i0.ɵɵelementStart(9, "div", 75)(10, "label", 76);
|
|
360
361
|
i0.ɵɵtext(11, "Vector Database");
|
|
361
362
|
i0.ɵɵelementEnd();
|
|
362
|
-
i0.ɵɵelementStart(12, "select",
|
|
363
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
364
|
-
i0.ɵɵrepeaterCreate(13,
|
|
363
|
+
i0.ɵɵelementStart(12, "select", 78);
|
|
364
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template_select_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.NewIndexVectorDBID, $event) || (ctx_r1.NewIndexVectorDBID = $event); return i0.ɵɵresetView($event); });
|
|
365
|
+
i0.ɵɵrepeaterCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_For_14_Template, 2, 2, "option", 79, _forTrack0);
|
|
365
366
|
i0.ɵɵelementEnd()();
|
|
366
|
-
i0.ɵɵelementStart(15, "div",
|
|
367
|
+
i0.ɵɵelementStart(15, "div", 75)(16, "label", 76);
|
|
367
368
|
i0.ɵɵtext(17, "Embedding Model");
|
|
368
369
|
i0.ɵɵelementEnd();
|
|
369
|
-
i0.ɵɵelementStart(18, "select",
|
|
370
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
371
|
-
i0.ɵɵrepeaterCreate(19,
|
|
370
|
+
i0.ɵɵelementStart(18, "select", 78);
|
|
371
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template_select_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.NewIndexEmbeddingModelID, $event) || (ctx_r1.NewIndexEmbeddingModelID = $event); return i0.ɵɵresetView($event); });
|
|
372
|
+
i0.ɵɵrepeaterCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_For_20_Template, 2, 2, "option", 79, _forTrack0);
|
|
372
373
|
i0.ɵɵelementEnd()()();
|
|
373
|
-
i0.ɵɵelementStart(21, "div",
|
|
374
|
-
i0.ɵɵlistener("click", function
|
|
375
|
-
i0.ɵɵconditionalCreate(23,
|
|
374
|
+
i0.ɵɵelementStart(21, "div", 80)(22, "button", 81);
|
|
375
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template_button_click_22_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CreateIndex()); });
|
|
376
|
+
i0.ɵɵconditionalCreate(23, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Conditional_23_Template, 2, 0)(24, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Conditional_24_Template, 2, 0);
|
|
376
377
|
i0.ɵɵelementEnd();
|
|
377
|
-
i0.ɵɵelementStart(25, "button",
|
|
378
|
-
i0.ɵɵlistener("click", function
|
|
378
|
+
i0.ɵɵelementStart(25, "button", 82);
|
|
379
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template_button_click_25_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CancelCreateIndex()); });
|
|
379
380
|
i0.ɵɵtext(26, " Cancel ");
|
|
380
381
|
i0.ɵɵelementEnd()()();
|
|
381
382
|
} if (rf & 2) {
|
|
382
|
-
const
|
|
383
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
383
384
|
i0.ɵɵadvance(8);
|
|
384
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
385
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.NewIndexName);
|
|
385
386
|
i0.ɵɵadvance(4);
|
|
386
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
387
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.NewIndexVectorDBID);
|
|
387
388
|
i0.ɵɵadvance();
|
|
388
|
-
i0.ɵɵrepeater(
|
|
389
|
+
i0.ɵɵrepeater(ctx_r1.VectorDBProviders);
|
|
389
390
|
i0.ɵɵadvance(5);
|
|
390
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
391
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.NewIndexEmbeddingModelID);
|
|
391
392
|
i0.ɵɵadvance();
|
|
392
|
-
i0.ɵɵrepeater(
|
|
393
|
+
i0.ɵɵrepeater(ctx_r1.EmbeddingModels);
|
|
393
394
|
i0.ɵɵadvance(3);
|
|
394
|
-
i0.ɵɵproperty("disabled",
|
|
395
|
+
i0.ɵɵproperty("disabled", ctx_r1.IsCreatingIndex);
|
|
395
396
|
i0.ɵɵadvance();
|
|
396
|
-
i0.ɵɵconditional(
|
|
397
|
+
i0.ɵɵconditional(ctx_r1.IsCreatingIndex ? 23 : 24);
|
|
397
398
|
i0.ɵɵadvance(2);
|
|
398
|
-
i0.ɵɵproperty("disabled",
|
|
399
|
+
i0.ɵɵproperty("disabled", ctx_r1.IsCreatingIndex);
|
|
399
400
|
} }
|
|
400
|
-
function
|
|
401
|
-
i0.ɵɵelementStart(0, "div",
|
|
402
|
-
i0.ɵɵtext(
|
|
401
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
402
|
+
i0.ɵɵelementStart(0, "div", 14)(1, "div", 27)(2, "div", 28)(3, "span", 29);
|
|
403
|
+
i0.ɵɵtext(4, "Setup Progress");
|
|
403
404
|
i0.ɵɵelementEnd();
|
|
404
|
-
i0.ɵɵelementStart(
|
|
405
|
-
i0.ɵɵtext(
|
|
406
|
-
i0.ɵɵelementEnd();
|
|
407
|
-
i0.ɵɵelementStart(5, "div", 24)(6, "div", 25)(7, "span", 26);
|
|
408
|
-
i0.ɵɵtext(8, "Setup Progress");
|
|
409
|
-
i0.ɵɵelementEnd();
|
|
410
|
-
i0.ɵɵelementStart(9, "span", 27);
|
|
411
|
-
i0.ɵɵtext(10);
|
|
405
|
+
i0.ɵɵelementStart(5, "span", 30);
|
|
406
|
+
i0.ɵɵtext(6);
|
|
412
407
|
i0.ɵɵelementEnd()();
|
|
413
|
-
i0.ɵɵelementStart(
|
|
414
|
-
i0.ɵɵelement(
|
|
408
|
+
i0.ɵɵelementStart(7, "div", 31);
|
|
409
|
+
i0.ɵɵelement(8, "div", 32);
|
|
415
410
|
i0.ɵɵelementEnd()();
|
|
416
|
-
i0.ɵɵelementStart(
|
|
417
|
-
i0.ɵɵconditionalCreate(
|
|
411
|
+
i0.ɵɵelementStart(9, "div", 33)(10, "div", 34)(11, "div", 35);
|
|
412
|
+
i0.ɵɵconditionalCreate(12, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_12_Template, 1, 0, "i", 36)(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_13_Template, 2, 0, "span", 37);
|
|
418
413
|
i0.ɵɵelementEnd();
|
|
419
|
-
i0.ɵɵelementStart(
|
|
420
|
-
i0.ɵɵtext(
|
|
414
|
+
i0.ɵɵelementStart(14, "div", 38)(15, "span", 39);
|
|
415
|
+
i0.ɵɵtext(16, "Vector Database Providers");
|
|
421
416
|
i0.ɵɵelementEnd();
|
|
422
|
-
i0.ɵɵconditionalCreate(
|
|
417
|
+
i0.ɵɵconditionalCreate(17, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_17_Template, 2, 1, "span", 40)(18, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_18_Template, 2, 0, "span", 40);
|
|
423
418
|
i0.ɵɵelementEnd()();
|
|
424
|
-
i0.ɵɵconditionalCreate(
|
|
419
|
+
i0.ɵɵconditionalCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_Template, 3, 0, "div", 41);
|
|
425
420
|
i0.ɵɵelementEnd();
|
|
426
|
-
i0.ɵɵelementStart(
|
|
427
|
-
i0.ɵɵconditionalCreate(
|
|
421
|
+
i0.ɵɵelementStart(20, "div", 33)(21, "div", 34)(22, "div", 35);
|
|
422
|
+
i0.ɵɵconditionalCreate(23, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_23_Template, 1, 0, "i", 36)(24, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_24_Template, 2, 0, "span", 37);
|
|
428
423
|
i0.ɵɵelementEnd();
|
|
429
|
-
i0.ɵɵelementStart(
|
|
430
|
-
i0.ɵɵtext(
|
|
424
|
+
i0.ɵɵelementStart(25, "div", 38)(26, "span", 39);
|
|
425
|
+
i0.ɵɵtext(27, "Embedding Models");
|
|
431
426
|
i0.ɵɵelementEnd();
|
|
432
|
-
i0.ɵɵconditionalCreate(
|
|
427
|
+
i0.ɵɵconditionalCreate(28, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_28_Template, 2, 1, "span", 40)(29, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_29_Template, 2, 0, "span", 40);
|
|
433
428
|
i0.ɵɵelementEnd()();
|
|
434
|
-
i0.ɵɵconditionalCreate(
|
|
429
|
+
i0.ɵɵconditionalCreate(30, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_30_Template, 4, 0, "div", 41);
|
|
435
430
|
i0.ɵɵelementEnd();
|
|
436
|
-
i0.ɵɵelementStart(
|
|
437
|
-
i0.ɵɵconditionalCreate(
|
|
431
|
+
i0.ɵɵelementStart(31, "div", 33)(32, "div", 34)(33, "div", 35);
|
|
432
|
+
i0.ɵɵconditionalCreate(34, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_34_Template, 1, 0, "i", 36)(35, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_35_Template, 2, 0, "span", 37);
|
|
438
433
|
i0.ɵɵelementEnd();
|
|
439
|
-
i0.ɵɵelementStart(
|
|
440
|
-
i0.ɵɵtext(
|
|
434
|
+
i0.ɵɵelementStart(36, "div", 38)(37, "span", 39);
|
|
435
|
+
i0.ɵɵtext(38, "Vector Indexes");
|
|
441
436
|
i0.ɵɵelementEnd();
|
|
442
|
-
i0.ɵɵconditionalCreate(
|
|
437
|
+
i0.ɵɵconditionalCreate(39, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_39_Template, 2, 1, "span", 40)(40, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_40_Template, 2, 0, "span", 40)(41, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_41_Template, 2, 0, "span", 40);
|
|
443
438
|
i0.ɵɵelementEnd();
|
|
444
|
-
i0.ɵɵconditionalCreate(
|
|
439
|
+
i0.ɵɵconditionalCreate(42, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_42_Template, 3, 0, "button", 42);
|
|
445
440
|
i0.ɵɵelementEnd();
|
|
446
|
-
i0.ɵɵconditionalCreate(
|
|
447
|
-
i0.ɵɵconditionalCreate(
|
|
441
|
+
i0.ɵɵconditionalCreate(43, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_43_Template, 3, 0, "div", 41);
|
|
442
|
+
i0.ɵɵconditionalCreate(44, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template, 27, 6, "div", 43);
|
|
448
443
|
i0.ɵɵelementEnd()();
|
|
449
444
|
} if (rf & 2) {
|
|
450
|
-
const
|
|
451
|
-
i0.ɵɵadvance(
|
|
452
|
-
i0.ɵɵtextInterpolate1("",
|
|
445
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
446
|
+
i0.ɵɵadvance(6);
|
|
447
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.SetupStepsCompleted, " of 3 complete");
|
|
453
448
|
i0.ɵɵadvance(2);
|
|
454
|
-
i0.ɵɵstyleProp("width",
|
|
449
|
+
i0.ɵɵstyleProp("width", ctx_r1.SetupStepsCompleted / 3 * 100, "%");
|
|
455
450
|
i0.ɵɵadvance();
|
|
456
|
-
i0.ɵɵclassProp("setup-step-complete",
|
|
451
|
+
i0.ɵɵclassProp("setup-step-complete", ctx_r1.HasVectorDBProvider)("setup-step-pending", !ctx_r1.HasVectorDBProvider);
|
|
457
452
|
i0.ɵɵadvance(3);
|
|
458
|
-
i0.ɵɵconditional(
|
|
453
|
+
i0.ɵɵconditional(ctx_r1.HasVectorDBProvider ? 12 : 13);
|
|
459
454
|
i0.ɵɵadvance(5);
|
|
460
|
-
i0.ɵɵconditional(
|
|
455
|
+
i0.ɵɵconditional(ctx_r1.HasVectorDBProvider ? 17 : 18);
|
|
461
456
|
i0.ɵɵadvance(2);
|
|
462
|
-
i0.ɵɵconditional(
|
|
457
|
+
i0.ɵɵconditional(ctx_r1.HasVectorDBProvider ? 19 : -1);
|
|
463
458
|
i0.ɵɵadvance();
|
|
464
|
-
i0.ɵɵclassProp("setup-step-complete",
|
|
459
|
+
i0.ɵɵclassProp("setup-step-complete", ctx_r1.HasEmbeddingModel)("setup-step-pending", !ctx_r1.HasEmbeddingModel);
|
|
465
460
|
i0.ɵɵadvance(3);
|
|
466
|
-
i0.ɵɵconditional(
|
|
461
|
+
i0.ɵɵconditional(ctx_r1.HasEmbeddingModel ? 23 : 24);
|
|
467
462
|
i0.ɵɵadvance(5);
|
|
468
|
-
i0.ɵɵconditional(
|
|
463
|
+
i0.ɵɵconditional(ctx_r1.HasEmbeddingModel ? 28 : 29);
|
|
469
464
|
i0.ɵɵadvance(2);
|
|
470
|
-
i0.ɵɵconditional(
|
|
465
|
+
i0.ɵɵconditional(ctx_r1.HasEmbeddingModel ? 30 : -1);
|
|
471
466
|
i0.ɵɵadvance();
|
|
472
|
-
i0.ɵɵclassProp("setup-step-complete",
|
|
467
|
+
i0.ɵɵclassProp("setup-step-complete", ctx_r1.HasVectorIndex)("setup-step-pending", !ctx_r1.HasVectorIndex);
|
|
473
468
|
i0.ɵɵadvance(3);
|
|
474
|
-
i0.ɵɵconditional(
|
|
469
|
+
i0.ɵɵconditional(ctx_r1.HasVectorIndex ? 34 : 35);
|
|
475
470
|
i0.ɵɵadvance(5);
|
|
476
|
-
i0.ɵɵconditional(
|
|
471
|
+
i0.ɵɵconditional(ctx_r1.HasVectorIndex ? 39 : ctx_r1.HasVectorDBProvider && ctx_r1.HasEmbeddingModel ? 40 : 41);
|
|
477
472
|
i0.ɵɵadvance(3);
|
|
478
|
-
i0.ɵɵconditional(
|
|
473
|
+
i0.ɵɵconditional(ctx_r1.HasVectorDBProvider && ctx_r1.HasEmbeddingModel && !ctx_r1.ShowCreateIndexForm ? 42 : -1);
|
|
479
474
|
i0.ɵɵadvance();
|
|
480
|
-
i0.ɵɵconditional(
|
|
475
|
+
i0.ɵɵconditional(ctx_r1.HasVectorIndex ? 43 : -1);
|
|
481
476
|
i0.ɵɵadvance();
|
|
482
|
-
i0.ɵɵconditional(
|
|
477
|
+
i0.ɵɵconditional(ctx_r1.ShowCreateIndexForm ? 44 : -1);
|
|
483
478
|
} }
|
|
484
|
-
function
|
|
485
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
479
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
480
|
+
i0.ɵɵelement(0, "mj-loading", 84);
|
|
486
481
|
} }
|
|
487
|
-
function
|
|
488
|
-
i0.ɵɵelementStart(0, "div",
|
|
489
|
-
i0.ɵɵelement(1, "i",
|
|
490
|
-
i0.ɵɵelementStart(2, "h3",
|
|
482
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
483
|
+
i0.ɵɵelementStart(0, "div", 85);
|
|
484
|
+
i0.ɵɵelement(1, "i", 86);
|
|
485
|
+
i0.ɵɵelementStart(2, "h3", 87);
|
|
491
486
|
i0.ɵɵtext(3, "No Searchable Entities Found");
|
|
492
487
|
i0.ɵɵelementEnd();
|
|
493
|
-
i0.ɵɵelementStart(4, "p",
|
|
488
|
+
i0.ɵɵelementStart(4, "p", 88);
|
|
494
489
|
i0.ɵɵtext(5, "No entities with text fields were discovered. Ensure your database schema includes entities with varchar/nvarchar columns.");
|
|
495
490
|
i0.ɵɵelementEnd()();
|
|
496
491
|
} }
|
|
497
|
-
function
|
|
498
|
-
i0.ɵɵelementStart(0, "span",
|
|
492
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
493
|
+
i0.ɵɵelementStart(0, "span", 100);
|
|
499
494
|
i0.ɵɵtext(1);
|
|
500
495
|
i0.ɵɵelementEnd();
|
|
501
496
|
} if (rf & 2) {
|
|
@@ -503,9 +498,9 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Condition
|
|
|
503
498
|
i0.ɵɵadvance();
|
|
504
499
|
i0.ɵɵtextInterpolate(field_r18);
|
|
505
500
|
} }
|
|
506
|
-
function
|
|
507
|
-
i0.ɵɵelementStart(0, "span",
|
|
508
|
-
i0.ɵɵelement(1, "i",
|
|
501
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
502
|
+
i0.ɵɵelementStart(0, "span", 104);
|
|
503
|
+
i0.ɵɵelement(1, "i", 105);
|
|
509
504
|
i0.ɵɵtext(2);
|
|
510
505
|
i0.ɵɵelementEnd();
|
|
511
506
|
} if (rf & 2) {
|
|
@@ -513,23 +508,23 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Condition
|
|
|
513
508
|
i0.ɵɵadvance(2);
|
|
514
509
|
i0.ɵɵtextInterpolate1(" ", entity_r17.SnippetField, " ");
|
|
515
510
|
} }
|
|
516
|
-
function
|
|
511
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Template(rf, ctx) { if (rf & 1) {
|
|
517
512
|
const _r16 = i0.ɵɵgetCurrentView();
|
|
518
|
-
i0.ɵɵelementStart(0, "div",
|
|
519
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
520
|
-
i0.ɵɵlistener("change", function
|
|
513
|
+
i0.ɵɵelementStart(0, "div", 95)(1, "div", 96)(2, "input", 22);
|
|
514
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Template_input_ngModelChange_2_listener($event) { const entity_r17 = i0.ɵɵrestoreView(_r16).$implicit; i0.ɵɵtwoWayBindingSet(entity_r17.Enabled, $event) || (entity_r17.Enabled = $event); return i0.ɵɵresetView($event); });
|
|
515
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Template_input_change_2_listener() { const entity_r17 = i0.ɵɵrestoreView(_r16).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnFTSEntityToggled(entity_r17)); });
|
|
521
516
|
i0.ɵɵelementEnd()();
|
|
522
|
-
i0.ɵɵelementStart(3, "div",
|
|
517
|
+
i0.ɵɵelementStart(3, "div", 97)(4, "span", 98);
|
|
523
518
|
i0.ɵɵtext(5);
|
|
524
519
|
i0.ɵɵelementEnd();
|
|
525
|
-
i0.ɵɵelementStart(6, "div",
|
|
526
|
-
i0.ɵɵrepeaterCreate(7,
|
|
520
|
+
i0.ɵɵelementStart(6, "div", 99);
|
|
521
|
+
i0.ɵɵrepeaterCreate(7, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_For_8_Template, 2, 1, "span", 100, i0.ɵɵrepeaterTrackByIdentity);
|
|
527
522
|
i0.ɵɵelementEnd()();
|
|
528
|
-
i0.ɵɵelementStart(9, "div",
|
|
529
|
-
i0.ɵɵelement(11, "i",
|
|
523
|
+
i0.ɵɵelementStart(9, "div", 101)(10, "span", 102);
|
|
524
|
+
i0.ɵɵelement(11, "i", 103);
|
|
530
525
|
i0.ɵɵtext(12);
|
|
531
526
|
i0.ɵɵelementEnd();
|
|
532
|
-
i0.ɵɵconditionalCreate(13,
|
|
527
|
+
i0.ɵɵconditionalCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Conditional_13_Template, 3, 1, "span", 104);
|
|
533
528
|
i0.ɵɵelementEnd()();
|
|
534
529
|
} if (rf & 2) {
|
|
535
530
|
const entity_r17 = ctx.$implicit;
|
|
@@ -545,42 +540,37 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Condition
|
|
|
545
540
|
i0.ɵɵadvance();
|
|
546
541
|
i0.ɵɵconditional(entity_r17.SnippetField !== entity_r17.TitleField ? 13 : -1);
|
|
547
542
|
} }
|
|
548
|
-
function
|
|
543
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
549
544
|
const _r15 = i0.ɵɵgetCurrentView();
|
|
550
|
-
i0.ɵɵelementStart(0, "div",
|
|
545
|
+
i0.ɵɵelementStart(0, "div", 89)(1, "div", 90)(2, "span", 91);
|
|
551
546
|
i0.ɵɵtext(3);
|
|
552
547
|
i0.ɵɵelementEnd();
|
|
553
|
-
i0.ɵɵelementStart(4, "input",
|
|
554
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
548
|
+
i0.ɵɵelementStart(4, "input", 92);
|
|
549
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.FTSFilterText, $event) || (ctx_r1.FTSFilterText = $event); return i0.ɵɵresetView($event); });
|
|
555
550
|
i0.ɵɵelementEnd()()();
|
|
556
|
-
i0.ɵɵelementStart(5, "div",
|
|
557
|
-
i0.ɵɵrepeaterCreate(6,
|
|
551
|
+
i0.ɵɵelementStart(5, "div", 93);
|
|
552
|
+
i0.ɵɵrepeaterCreate(6, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Template, 14, 6, "div", 94, _forTrack1);
|
|
558
553
|
i0.ɵɵelementEnd();
|
|
559
554
|
} if (rf & 2) {
|
|
560
|
-
const
|
|
555
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
561
556
|
i0.ɵɵadvance(3);
|
|
562
|
-
i0.ɵɵtextInterpolate2("",
|
|
557
|
+
i0.ɵɵtextInterpolate2("", ctx_r1.EnabledFTSCount, " of ", ctx_r1.FTSEntities.length, " entities enabled for search");
|
|
563
558
|
i0.ɵɵadvance();
|
|
564
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
559
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.FTSFilterText);
|
|
565
560
|
i0.ɵɵadvance(2);
|
|
566
|
-
i0.ɵɵrepeater(
|
|
561
|
+
i0.ɵɵrepeater(ctx_r1.FilteredFTSEntities);
|
|
567
562
|
} }
|
|
568
|
-
function
|
|
569
|
-
i0.ɵɵelementStart(0, "div",
|
|
570
|
-
i0.ɵɵ
|
|
571
|
-
i0.ɵɵelementEnd();
|
|
572
|
-
i0.ɵɵelementStart(3, "p", 13);
|
|
573
|
-
i0.ɵɵtext(4, "Configure which entities are included in full-text search. Entities with text fields (Name, Description, etc.) are automatically discovered.");
|
|
574
|
-
i0.ɵɵelementEnd();
|
|
575
|
-
i0.ɵɵconditionalCreate(5, KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Conditional_5_Template, 1, 0, "mj-loading", 81)(6, KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Conditional_6_Template, 6, 0, "div", 82)(7, KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Conditional_7_Template, 8, 3);
|
|
563
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
564
|
+
i0.ɵɵelementStart(0, "div", 14);
|
|
565
|
+
i0.ɵɵconditionalCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_1_Template, 1, 0, "mj-loading", 84)(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_2_Template, 6, 0, "div", 85)(3, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_Template, 8, 3);
|
|
576
566
|
i0.ɵɵelementEnd();
|
|
577
567
|
} if (rf & 2) {
|
|
578
|
-
const
|
|
579
|
-
i0.ɵɵadvance(
|
|
580
|
-
i0.ɵɵconditional(
|
|
568
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
569
|
+
i0.ɵɵadvance();
|
|
570
|
+
i0.ɵɵconditional(ctx_r1.IsLoadingFTSEntities ? 1 : ctx_r1.FTSEntities.length === 0 ? 2 : 3);
|
|
581
571
|
} }
|
|
582
|
-
function
|
|
583
|
-
i0.ɵɵelementStart(0, "span",
|
|
572
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_1_For_17_Template(rf, ctx) { if (rf & 1) {
|
|
573
|
+
i0.ɵɵelementStart(0, "span", 59);
|
|
584
574
|
i0.ɵɵtext(1);
|
|
585
575
|
i0.ɵɵelementEnd();
|
|
586
576
|
} if (rf & 2) {
|
|
@@ -588,136 +578,125 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_12_Condition
|
|
|
588
578
|
i0.ɵɵadvance();
|
|
589
579
|
i0.ɵɵtextInterpolate(model_r19.Name);
|
|
590
580
|
} }
|
|
591
|
-
function
|
|
592
|
-
i0.ɵɵelementStart(0, "div",
|
|
581
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
582
|
+
i0.ɵɵelementStart(0, "div", 17)(1, "div", 23)(2, "div", 24)(3, "span", 20);
|
|
593
583
|
i0.ɵɵtext(4, "Active Model");
|
|
594
584
|
i0.ɵɵelementEnd();
|
|
595
|
-
i0.ɵɵelementStart(5, "span",
|
|
585
|
+
i0.ɵɵelementStart(5, "span", 21);
|
|
596
586
|
i0.ɵɵtext(6, "Currently selected embedding model");
|
|
597
587
|
i0.ɵɵelementEnd()();
|
|
598
|
-
i0.ɵɵelementStart(7, "span",
|
|
588
|
+
i0.ɵɵelementStart(7, "span", 106);
|
|
599
589
|
i0.ɵɵtext(8);
|
|
600
590
|
i0.ɵɵelementEnd()();
|
|
601
|
-
i0.ɵɵelementStart(9, "div",
|
|
591
|
+
i0.ɵɵelementStart(9, "div", 23)(10, "div", 24)(11, "span", 20);
|
|
602
592
|
i0.ɵɵtext(12, "Available Models");
|
|
603
593
|
i0.ɵɵelementEnd();
|
|
604
|
-
i0.ɵɵelementStart(13, "span",
|
|
594
|
+
i0.ɵɵelementStart(13, "span", 21);
|
|
605
595
|
i0.ɵɵtext(14);
|
|
606
596
|
i0.ɵɵelementEnd()();
|
|
607
|
-
i0.ɵɵelementStart(15, "div",
|
|
608
|
-
i0.ɵɵrepeaterCreate(16,
|
|
597
|
+
i0.ɵɵelementStart(15, "div", 58);
|
|
598
|
+
i0.ɵɵrepeaterCreate(16, KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_1_For_17_Template, 2, 1, "span", 59, _forTrack0);
|
|
609
599
|
i0.ɵɵelementEnd()()();
|
|
610
|
-
i0.ɵɵelementStart(18, "p",
|
|
611
|
-
i0.ɵɵelement(19, "i",
|
|
600
|
+
i0.ɵɵelementStart(18, "p", 107);
|
|
601
|
+
i0.ɵɵelement(19, "i", 108);
|
|
612
602
|
i0.ɵɵtext(20, " Manage embedding models in the AI Dashboard > Models tab. ");
|
|
613
603
|
i0.ɵɵelementEnd();
|
|
614
604
|
} if (rf & 2) {
|
|
615
|
-
const
|
|
605
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
616
606
|
i0.ɵɵadvance(8);
|
|
617
|
-
i0.ɵɵtextInterpolate(
|
|
607
|
+
i0.ɵɵtextInterpolate(ctx_r1.EmbeddingModelName);
|
|
618
608
|
i0.ɵɵadvance(6);
|
|
619
|
-
i0.ɵɵtextInterpolate1("",
|
|
609
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.EmbeddingModels.length, " embedding model(s) configured");
|
|
620
610
|
i0.ɵɵadvance(2);
|
|
621
|
-
i0.ɵɵrepeater(
|
|
611
|
+
i0.ɵɵrepeater(ctx_r1.EmbeddingModels);
|
|
622
612
|
} }
|
|
623
|
-
function
|
|
624
|
-
i0.ɵɵelementStart(0, "div",
|
|
625
|
-
i0.ɵɵelement(1, "i",
|
|
626
|
-
i0.ɵɵelementStart(2, "h3",
|
|
613
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
614
|
+
i0.ɵɵelementStart(0, "div", 85);
|
|
615
|
+
i0.ɵɵelement(1, "i", 109);
|
|
616
|
+
i0.ɵɵelementStart(2, "h3", 87);
|
|
627
617
|
i0.ɵɵtext(3, "No Embedding Models Found");
|
|
628
618
|
i0.ɵɵelementEnd();
|
|
629
|
-
i0.ɵɵelementStart(4, "p",
|
|
619
|
+
i0.ɵɵelementStart(4, "p", 88);
|
|
630
620
|
i0.ɵɵtext(5, " Embedding models are required to convert text into vectors for semantic search and duplicate detection. Configure at least one embedding model (e.g., text-embedding-3-small) in the AI Dashboard > Models tab. ");
|
|
631
621
|
i0.ɵɵelementEnd()();
|
|
632
622
|
} }
|
|
633
|
-
function
|
|
634
|
-
i0.ɵɵelementStart(0, "div",
|
|
635
|
-
i0.ɵɵ
|
|
636
|
-
i0.ɵɵelementEnd();
|
|
637
|
-
i0.ɵɵelementStart(3, "p", 13);
|
|
638
|
-
i0.ɵɵtext(4, "AI models used for generating vector embeddings from text.");
|
|
639
|
-
i0.ɵɵelementEnd();
|
|
640
|
-
i0.ɵɵconditionalCreate(5, KnowledgeConfigResourceComponent_Conditional_1_Conditional_12_Conditional_5_Template, 21, 2)(6, KnowledgeConfigResourceComponent_Conditional_1_Conditional_12_Conditional_6_Template, 6, 0, "div", 82);
|
|
623
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
624
|
+
i0.ɵɵelementStart(0, "div", 14);
|
|
625
|
+
i0.ɵɵconditionalCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_1_Template, 21, 2)(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_2_Template, 6, 0, "div", 85);
|
|
641
626
|
i0.ɵɵelementEnd();
|
|
642
627
|
} if (rf & 2) {
|
|
643
|
-
const
|
|
644
|
-
i0.ɵɵadvance(
|
|
645
|
-
i0.ɵɵconditional(
|
|
628
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
629
|
+
i0.ɵɵadvance();
|
|
630
|
+
i0.ɵɵconditional(ctx_r1.HasEmbeddingModel ? 1 : 2);
|
|
646
631
|
} }
|
|
647
|
-
function
|
|
632
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
648
633
|
const _r20 = i0.ɵɵgetCurrentView();
|
|
649
|
-
i0.ɵɵelementStart(0, "div",
|
|
650
|
-
i0.ɵɵtext(
|
|
651
|
-
i0.ɵɵelementEnd();
|
|
652
|
-
i0.ɵɵelementStart(3, "p", 13);
|
|
653
|
-
i0.ɵɵtext(4, "Set the scoring thresholds used by search, duplicate detection, and autotagging.");
|
|
634
|
+
i0.ɵɵelementStart(0, "div", 14)(1, "div", 17)(2, "div", 23)(3, "div", 24)(4, "span", 20);
|
|
635
|
+
i0.ɵɵtext(5, "Duplicate Absolute Match");
|
|
654
636
|
i0.ɵɵelementEnd();
|
|
655
|
-
i0.ɵɵelementStart(
|
|
656
|
-
i0.ɵɵtext(
|
|
657
|
-
i0.ɵɵelementEnd();
|
|
658
|
-
i0.ɵɵelementStart(10, "span", 18);
|
|
659
|
-
i0.ɵɵtext(11);
|
|
637
|
+
i0.ɵɵelementStart(6, "span", 21);
|
|
638
|
+
i0.ɵɵtext(7);
|
|
660
639
|
i0.ɵɵelementEnd()();
|
|
661
|
-
i0.ɵɵelementStart(
|
|
662
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
663
|
-
i0.ɵɵlistener("input", function
|
|
640
|
+
i0.ɵɵelementStart(8, "input", 110);
|
|
641
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ThresholdSettings.DuplicateAbsolute, $event) || (ctx_r1.ThresholdSettings.DuplicateAbsolute = $event); return i0.ɵɵresetView($event); });
|
|
642
|
+
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_input_8_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
664
643
|
i0.ɵɵelementEnd()();
|
|
665
|
-
i0.ɵɵelementStart(
|
|
666
|
-
i0.ɵɵtext(
|
|
644
|
+
i0.ɵɵelementStart(9, "div", 23)(10, "div", 24)(11, "span", 20);
|
|
645
|
+
i0.ɵɵtext(12, "Duplicate Potential Match");
|
|
667
646
|
i0.ɵɵelementEnd();
|
|
668
|
-
i0.ɵɵelementStart(
|
|
669
|
-
i0.ɵɵtext(
|
|
647
|
+
i0.ɵɵelementStart(13, "span", 21);
|
|
648
|
+
i0.ɵɵtext(14);
|
|
670
649
|
i0.ɵɵelementEnd()();
|
|
671
|
-
i0.ɵɵelementStart(
|
|
672
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
673
|
-
i0.ɵɵlistener("input", function
|
|
650
|
+
i0.ɵɵelementStart(15, "input", 111);
|
|
651
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_ngModelChange_15_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ThresholdSettings.DuplicatePotential, $event) || (ctx_r1.ThresholdSettings.DuplicatePotential = $event); return i0.ɵɵresetView($event); });
|
|
652
|
+
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_input_15_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
674
653
|
i0.ɵɵelementEnd()();
|
|
675
|
-
i0.ɵɵelementStart(
|
|
676
|
-
i0.ɵɵtext(
|
|
654
|
+
i0.ɵɵelementStart(16, "div", 23)(17, "div", 24)(18, "span", 20);
|
|
655
|
+
i0.ɵɵtext(19, "Search Relevance");
|
|
677
656
|
i0.ɵɵelementEnd();
|
|
678
|
-
i0.ɵɵelementStart(
|
|
679
|
-
i0.ɵɵtext(
|
|
657
|
+
i0.ɵɵelementStart(20, "span", 21);
|
|
658
|
+
i0.ɵɵtext(21);
|
|
680
659
|
i0.ɵɵelementEnd()();
|
|
681
|
-
i0.ɵɵelementStart(
|
|
682
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
683
|
-
i0.ɵɵlistener("input", function
|
|
660
|
+
i0.ɵɵelementStart(22, "input", 112);
|
|
661
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_ngModelChange_22_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ThresholdSettings.SearchRelevance, $event) || (ctx_r1.ThresholdSettings.SearchRelevance = $event); return i0.ɵɵresetView($event); });
|
|
662
|
+
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_input_22_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
684
663
|
i0.ɵɵelementEnd()();
|
|
685
|
-
i0.ɵɵelementStart(
|
|
686
|
-
i0.ɵɵtext(
|
|
664
|
+
i0.ɵɵelementStart(23, "div", 23)(24, "div", 24)(25, "span", 20);
|
|
665
|
+
i0.ɵɵtext(26, "Autotag Confidence");
|
|
687
666
|
i0.ɵɵelementEnd();
|
|
688
|
-
i0.ɵɵelementStart(
|
|
689
|
-
i0.ɵɵtext(
|
|
667
|
+
i0.ɵɵelementStart(27, "span", 21);
|
|
668
|
+
i0.ɵɵtext(28);
|
|
690
669
|
i0.ɵɵelementEnd()();
|
|
691
|
-
i0.ɵɵelementStart(
|
|
692
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
693
|
-
i0.ɵɵlistener("input", function
|
|
670
|
+
i0.ɵɵelementStart(29, "input", 111);
|
|
671
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_ngModelChange_29_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ThresholdSettings.AutotagConfidence, $event) || (ctx_r1.ThresholdSettings.AutotagConfidence = $event); return i0.ɵɵresetView($event); });
|
|
672
|
+
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_input_29_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
|
|
694
673
|
i0.ɵɵelementEnd()()()();
|
|
695
674
|
} if (rf & 2) {
|
|
696
|
-
const
|
|
697
|
-
i0.ɵɵadvance(
|
|
698
|
-
i0.ɵɵtextInterpolate1("Score above which duplicates are auto-confirmed (",
|
|
675
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
676
|
+
i0.ɵɵadvance(7);
|
|
677
|
+
i0.ɵɵtextInterpolate1("Score above which duplicates are auto-confirmed (", ctx_r1.FormatThreshold(ctx_r1.ThresholdSettings.DuplicateAbsolute), ")");
|
|
699
678
|
i0.ɵɵadvance();
|
|
700
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
679
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ThresholdSettings.DuplicateAbsolute);
|
|
701
680
|
i0.ɵɵadvance(6);
|
|
702
|
-
i0.ɵɵtextInterpolate1("Score above which duplicates are flagged for review (",
|
|
681
|
+
i0.ɵɵtextInterpolate1("Score above which duplicates are flagged for review (", ctx_r1.FormatThreshold(ctx_r1.ThresholdSettings.DuplicatePotential), ")");
|
|
703
682
|
i0.ɵɵadvance();
|
|
704
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
683
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ThresholdSettings.DuplicatePotential);
|
|
705
684
|
i0.ɵɵadvance(6);
|
|
706
|
-
i0.ɵɵtextInterpolate1("Minimum score for search results (",
|
|
685
|
+
i0.ɵɵtextInterpolate1("Minimum score for search results (", ctx_r1.FormatThreshold(ctx_r1.ThresholdSettings.SearchRelevance), ")");
|
|
707
686
|
i0.ɵɵadvance();
|
|
708
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
687
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ThresholdSettings.SearchRelevance);
|
|
709
688
|
i0.ɵɵadvance(6);
|
|
710
|
-
i0.ɵɵtextInterpolate1("Minimum confidence for accepting auto-generated tags (",
|
|
689
|
+
i0.ɵɵtextInterpolate1("Minimum confidence for accepting auto-generated tags (", ctx_r1.FormatThreshold(ctx_r1.ThresholdSettings.AutotagConfidence), ")");
|
|
711
690
|
i0.ɵɵadvance();
|
|
712
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
691
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ThresholdSettings.AutotagConfidence);
|
|
713
692
|
} }
|
|
714
|
-
function
|
|
715
|
-
i0.ɵɵelementStart(0, "div",
|
|
693
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
694
|
+
i0.ɵɵelementStart(0, "div", 117);
|
|
716
695
|
i0.ɵɵtext(1, "Loading\u2026");
|
|
717
696
|
i0.ɵɵelementEnd();
|
|
718
697
|
} }
|
|
719
|
-
function
|
|
720
|
-
i0.ɵɵelementStart(0, "div",
|
|
698
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
699
|
+
i0.ɵɵelementStart(0, "div", 118);
|
|
721
700
|
i0.ɵɵtext(1, " No scopes defined yet. Click ");
|
|
722
701
|
i0.ɵɵelementStart(2, "strong");
|
|
723
702
|
i0.ɵɵtext(3, "New");
|
|
@@ -725,30 +704,30 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_14_Condition
|
|
|
725
704
|
i0.ɵɵtext(4, " to create one. ");
|
|
726
705
|
i0.ɵɵelementEnd();
|
|
727
706
|
} }
|
|
728
|
-
function
|
|
729
|
-
i0.ɵɵelementStart(0, "span",
|
|
707
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
708
|
+
i0.ɵɵelementStart(0, "span", 125);
|
|
730
709
|
i0.ɵɵtext(1, "Global");
|
|
731
710
|
i0.ɵɵelementEnd();
|
|
732
711
|
} }
|
|
733
|
-
function
|
|
734
|
-
i0.ɵɵelementStart(0, "span",
|
|
712
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
713
|
+
i0.ɵɵelementStart(0, "span", 125);
|
|
735
714
|
i0.ɵɵtext(1, "Default");
|
|
736
715
|
i0.ɵɵelementEnd();
|
|
737
716
|
} }
|
|
738
|
-
function
|
|
717
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
739
718
|
const _r22 = i0.ɵɵgetCurrentView();
|
|
740
|
-
i0.ɵɵelementStart(0, "button",
|
|
741
|
-
i0.ɵɵlistener("click", function
|
|
742
|
-
i0.ɵɵelement(1, "i",
|
|
743
|
-
i0.ɵɵelementStart(2, "span",
|
|
719
|
+
i0.ɵɵelementStart(0, "button", 122);
|
|
720
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Template_button_click_0_listener() { const s_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SelectScope(s_r23.ID)); });
|
|
721
|
+
i0.ɵɵelement(1, "i", 123);
|
|
722
|
+
i0.ɵɵelementStart(2, "span", 124);
|
|
744
723
|
i0.ɵɵtext(3);
|
|
745
724
|
i0.ɵɵelementEnd();
|
|
746
|
-
i0.ɵɵconditionalCreate(4,
|
|
725
|
+
i0.ɵɵconditionalCreate(4, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Conditional_4_Template, 2, 0, "span", 125)(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Conditional_5_Template, 2, 0, "span", 125);
|
|
747
726
|
i0.ɵɵelementEnd();
|
|
748
727
|
} if (rf & 2) {
|
|
749
728
|
const s_r23 = ctx.$implicit;
|
|
750
|
-
const
|
|
751
|
-
i0.ɵɵclassProp("active",
|
|
729
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
730
|
+
i0.ɵɵclassProp("active", ctx_r1.ActiveScopeID === s_r23.ID);
|
|
752
731
|
i0.ɵɵadvance();
|
|
753
732
|
i0.ɵɵclassMap(s_r23.Icon || "fa-solid fa-filter");
|
|
754
733
|
i0.ɵɵadvance(2);
|
|
@@ -756,143 +735,143 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_14_Condition
|
|
|
756
735
|
i0.ɵɵadvance();
|
|
757
736
|
i0.ɵɵconditional(s_r23.IsGlobal ? 4 : s_r23.IsDefault ? 5 : -1);
|
|
758
737
|
} }
|
|
759
|
-
function
|
|
760
|
-
i0.ɵɵrepeaterCreate(0,
|
|
738
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
739
|
+
i0.ɵɵrepeaterCreate(0, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Template, 6, 6, "button", 121, _forTrack0);
|
|
761
740
|
} if (rf & 2) {
|
|
762
|
-
const
|
|
763
|
-
i0.ɵɵrepeater(
|
|
741
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
742
|
+
i0.ɵɵrepeater(ctx_r1.SearchScopes);
|
|
764
743
|
} }
|
|
765
|
-
function
|
|
744
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
766
745
|
const _r25 = i0.ɵɵgetCurrentView();
|
|
767
|
-
i0.ɵɵelementStart(0, "button",
|
|
768
|
-
i0.ɵɵlistener("click", function
|
|
769
|
-
i0.ɵɵelement(1, "i",
|
|
746
|
+
i0.ɵɵelementStart(0, "button", 138);
|
|
747
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_14_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OpenActiveScopeFullForm()); });
|
|
748
|
+
i0.ɵɵelement(1, "i", 139);
|
|
770
749
|
i0.ɵɵtext(2, " Open Full Form ");
|
|
771
750
|
i0.ɵɵelementEnd();
|
|
772
751
|
} }
|
|
773
|
-
function
|
|
752
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
774
753
|
const _r26 = i0.ɵɵgetCurrentView();
|
|
775
|
-
i0.ɵɵelementStart(0, "button",
|
|
776
|
-
i0.ɵɵlistener("click", function
|
|
777
|
-
i0.ɵɵelement(1, "i",
|
|
754
|
+
i0.ɵɵelementStart(0, "button", 140);
|
|
755
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_18_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.DeleteActiveScope()); });
|
|
756
|
+
i0.ɵɵelement(1, "i", 141);
|
|
778
757
|
i0.ɵɵelementEnd();
|
|
779
758
|
} }
|
|
780
|
-
function
|
|
759
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
781
760
|
const _r27 = i0.ɵɵgetCurrentView();
|
|
782
|
-
i0.ɵɵelementStart(0, "div",
|
|
761
|
+
i0.ɵɵelementStart(0, "div", 133)(1, "label")(2, "span");
|
|
783
762
|
i0.ɵɵtext(3, "Name");
|
|
784
763
|
i0.ɵɵelementEnd();
|
|
785
|
-
i0.ɵɵelementStart(4, "input",
|
|
786
|
-
i0.ɵɵlistener("change", function
|
|
764
|
+
i0.ɵɵelementStart(4, "input", 142);
|
|
765
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_input_change_4_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.Name = $event.target.value); });
|
|
787
766
|
i0.ɵɵelementEnd()();
|
|
788
767
|
i0.ɵɵelementStart(5, "label")(6, "span");
|
|
789
768
|
i0.ɵɵtext(7, "Icon (Font Awesome class)");
|
|
790
769
|
i0.ɵɵelementEnd();
|
|
791
|
-
i0.ɵɵelementStart(8, "input",
|
|
792
|
-
i0.ɵɵlistener("change", function
|
|
770
|
+
i0.ɵɵelementStart(8, "input", 142);
|
|
771
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_input_change_8_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.Icon = $event.target.value); });
|
|
793
772
|
i0.ɵɵelementEnd()();
|
|
794
|
-
i0.ɵɵelementStart(9, "label",
|
|
773
|
+
i0.ɵɵelementStart(9, "label", 143)(10, "span");
|
|
795
774
|
i0.ɵɵtext(11, "Description");
|
|
796
775
|
i0.ɵɵelementEnd();
|
|
797
|
-
i0.ɵɵelementStart(12, "textarea",
|
|
798
|
-
i0.ɵɵlistener("change", function
|
|
776
|
+
i0.ɵɵelementStart(12, "textarea", 144);
|
|
777
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_textarea_change_12_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.Description = $event.target.value); });
|
|
799
778
|
i0.ɵɵelementEnd()();
|
|
800
779
|
i0.ɵɵelementStart(13, "label")(14, "span");
|
|
801
780
|
i0.ɵɵtext(15, "Status");
|
|
802
781
|
i0.ɵɵelementEnd();
|
|
803
|
-
i0.ɵɵelementStart(16, "select",
|
|
804
|
-
i0.ɵɵlistener("change", function
|
|
805
|
-
i0.ɵɵelementStart(17, "option",
|
|
782
|
+
i0.ɵɵelementStart(16, "select", 145);
|
|
783
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_select_change_16_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.Status = $event.target.value); });
|
|
784
|
+
i0.ɵɵelementStart(17, "option", 146);
|
|
806
785
|
i0.ɵɵtext(18, "Active");
|
|
807
786
|
i0.ɵɵelementEnd();
|
|
808
|
-
i0.ɵɵelementStart(19, "option",
|
|
787
|
+
i0.ɵɵelementStart(19, "option", 147);
|
|
809
788
|
i0.ɵɵtext(20, "Inactive");
|
|
810
789
|
i0.ɵɵelementEnd()()();
|
|
811
790
|
i0.ɵɵelementStart(21, "label")(22, "span");
|
|
812
791
|
i0.ɵɵtext(23, "Start at");
|
|
813
792
|
i0.ɵɵelementEnd();
|
|
814
|
-
i0.ɵɵelementStart(24, "input",
|
|
815
|
-
i0.ɵɵlistener("change", function
|
|
793
|
+
i0.ɵɵelementStart(24, "input", 148);
|
|
794
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_input_change_24_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SetScopeDate(ctx_r1.ActiveScope, "StartAt", $event.target.value)); });
|
|
816
795
|
i0.ɵɵelementEnd()();
|
|
817
796
|
i0.ɵɵelementStart(25, "label")(26, "span");
|
|
818
797
|
i0.ɵɵtext(27, "End at");
|
|
819
798
|
i0.ɵɵelementEnd();
|
|
820
|
-
i0.ɵɵelementStart(28, "input",
|
|
821
|
-
i0.ɵɵlistener("change", function
|
|
799
|
+
i0.ɵɵelementStart(28, "input", 148);
|
|
800
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_input_change_28_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SetScopeDate(ctx_r1.ActiveScope, "EndAt", $event.target.value)); });
|
|
822
801
|
i0.ɵɵelementEnd()();
|
|
823
|
-
i0.ɵɵelementStart(29, "label",
|
|
824
|
-
i0.ɵɵlistener("change", function
|
|
802
|
+
i0.ɵɵelementStart(29, "label", 149)(30, "input", 150);
|
|
803
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_input_change_30_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.IsDefault = $event.target.checked); });
|
|
825
804
|
i0.ɵɵelementEnd();
|
|
826
805
|
i0.ɵɵelementStart(31, "span");
|
|
827
806
|
i0.ɵɵtext(32, "Default scope \u2014 picked when users/agents don't specify one");
|
|
828
807
|
i0.ɵɵelementEnd()();
|
|
829
|
-
i0.ɵɵelementStart(33, "label",
|
|
830
|
-
i0.ɵɵelement(34, "input",
|
|
808
|
+
i0.ɵɵelementStart(33, "label", 149);
|
|
809
|
+
i0.ɵɵelement(34, "input", 151);
|
|
831
810
|
i0.ɵɵelementStart(35, "span");
|
|
832
811
|
i0.ɵɵtext(36, "Global \u2014 reserved for the built-in Global scope (read-only)");
|
|
833
812
|
i0.ɵɵelementEnd()();
|
|
834
|
-
i0.ɵɵelementStart(37, "label",
|
|
813
|
+
i0.ɵɵelementStart(37, "label", 143)(38, "span");
|
|
835
814
|
i0.ɵɵtext(39, "Scope Config (JSON)");
|
|
836
815
|
i0.ɵɵelementEnd();
|
|
837
|
-
i0.ɵɵelementStart(40, "textarea",
|
|
838
|
-
i0.ɵɵlistener("change", function
|
|
816
|
+
i0.ɵɵelementStart(40, "textarea", 152);
|
|
817
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_textarea_change_40_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.ScopeConfig = $event.target.value); });
|
|
839
818
|
i0.ɵɵelementEnd()();
|
|
840
|
-
i0.ɵɵelementStart(41, "label",
|
|
819
|
+
i0.ɵɵelementStart(41, "label", 143)(42, "span");
|
|
841
820
|
i0.ɵɵtext(43, "Search Context Config (JSON)");
|
|
842
821
|
i0.ɵɵelementEnd();
|
|
843
|
-
i0.ɵɵelementStart(44, "textarea",
|
|
844
|
-
i0.ɵɵlistener("change", function
|
|
822
|
+
i0.ɵɵelementStart(44, "textarea", 152);
|
|
823
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_textarea_change_44_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.SearchContextConfig = $event.target.value); });
|
|
845
824
|
i0.ɵɵelementEnd()()();
|
|
846
825
|
} if (rf & 2) {
|
|
847
|
-
const
|
|
826
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
848
827
|
i0.ɵɵadvance(4);
|
|
849
|
-
i0.ɵɵproperty("value",
|
|
828
|
+
i0.ɵɵproperty("value", ctx_r1.ActiveScope.Name);
|
|
850
829
|
i0.ɵɵadvance(4);
|
|
851
|
-
i0.ɵɵproperty("value",
|
|
830
|
+
i0.ɵɵproperty("value", ctx_r1.ActiveScope.Icon || "");
|
|
852
831
|
i0.ɵɵadvance(4);
|
|
853
|
-
i0.ɵɵproperty("value",
|
|
832
|
+
i0.ɵɵproperty("value", ctx_r1.ActiveScope.Description || "");
|
|
854
833
|
i0.ɵɵadvance(4);
|
|
855
|
-
i0.ɵɵproperty("value",
|
|
834
|
+
i0.ɵɵproperty("value", ctx_r1.ActiveScope.Status);
|
|
856
835
|
i0.ɵɵadvance(8);
|
|
857
|
-
i0.ɵɵproperty("value",
|
|
836
|
+
i0.ɵɵproperty("value", ctx_r1.FormatScopeDate(ctx_r1.ActiveScope.StartAt));
|
|
858
837
|
i0.ɵɵadvance(4);
|
|
859
|
-
i0.ɵɵproperty("value",
|
|
838
|
+
i0.ɵɵproperty("value", ctx_r1.FormatScopeDate(ctx_r1.ActiveScope.EndAt));
|
|
860
839
|
i0.ɵɵadvance(2);
|
|
861
|
-
i0.ɵɵproperty("checked",
|
|
840
|
+
i0.ɵɵproperty("checked", ctx_r1.ActiveScope.IsDefault)("disabled", ctx_r1.ActiveScope.IsGlobal);
|
|
862
841
|
i0.ɵɵadvance(4);
|
|
863
|
-
i0.ɵɵproperty("checked",
|
|
842
|
+
i0.ɵɵproperty("checked", ctx_r1.ActiveScope.IsGlobal);
|
|
864
843
|
i0.ɵɵadvance(6);
|
|
865
|
-
i0.ɵɵproperty("value",
|
|
844
|
+
i0.ɵɵproperty("value", ctx_r1.ActiveScope.ScopeConfig || "");
|
|
866
845
|
i0.ɵɵadvance(4);
|
|
867
|
-
i0.ɵɵproperty("value",
|
|
846
|
+
i0.ɵɵproperty("value", ctx_r1.ActiveScope.SearchContextConfig || "");
|
|
868
847
|
} }
|
|
869
|
-
function
|
|
870
|
-
i0.ɵɵelement(0, "mj-search-scope-child-grid",
|
|
848
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
849
|
+
i0.ɵɵelement(0, "mj-search-scope-child-grid", 134);
|
|
871
850
|
} if (rf & 2) {
|
|
872
|
-
const
|
|
873
|
-
i0.ɵɵproperty("ParentID",
|
|
851
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
852
|
+
i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopeProviderColumns);
|
|
874
853
|
} }
|
|
875
|
-
function
|
|
876
|
-
i0.ɵɵelement(0, "mj-search-scope-child-grid",
|
|
854
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
855
|
+
i0.ɵɵelement(0, "mj-search-scope-child-grid", 135);
|
|
877
856
|
} if (rf & 2) {
|
|
878
|
-
const
|
|
879
|
-
i0.ɵɵproperty("ParentID",
|
|
857
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
858
|
+
i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopeExternalIndexColumns);
|
|
880
859
|
} }
|
|
881
|
-
function
|
|
882
|
-
i0.ɵɵelement(0, "mj-search-scope-child-grid",
|
|
860
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
861
|
+
i0.ɵɵelement(0, "mj-search-scope-child-grid", 136);
|
|
883
862
|
} if (rf & 2) {
|
|
884
|
-
const
|
|
885
|
-
i0.ɵɵproperty("ParentID",
|
|
863
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
864
|
+
i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopeEntityColumns);
|
|
886
865
|
} }
|
|
887
|
-
function
|
|
888
|
-
i0.ɵɵelement(0, "mj-search-scope-child-grid",
|
|
866
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
867
|
+
i0.ɵɵelement(0, "mj-search-scope-child-grid", 137);
|
|
889
868
|
} if (rf & 2) {
|
|
890
|
-
const
|
|
891
|
-
i0.ɵɵproperty("ParentID",
|
|
869
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
870
|
+
i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopeStorageColumns);
|
|
892
871
|
} }
|
|
893
|
-
function
|
|
894
|
-
i0.ɵɵelementStart(0, "div",
|
|
895
|
-
i0.ɵɵelement(2, "i",
|
|
872
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
873
|
+
i0.ɵɵelementStart(0, "div", 153)(1, "p", 154);
|
|
874
|
+
i0.ɵɵelement(2, "i", 155);
|
|
896
875
|
i0.ɵɵelementStart(3, "strong");
|
|
897
876
|
i0.ɵɵtext(4, "Per-user / per-role grants on this scope.");
|
|
898
877
|
i0.ɵɵelementEnd();
|
|
@@ -926,86 +905,86 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_14_Condition
|
|
|
926
905
|
i0.ɵɵelementEnd();
|
|
927
906
|
i0.ɵɵtext(26, " via the resolver \u2014 see the spec for the full resolution order. ");
|
|
928
907
|
i0.ɵɵelementEnd()();
|
|
929
|
-
i0.ɵɵelement(27, "mj-search-scope-child-grid",
|
|
908
|
+
i0.ɵɵelement(27, "mj-search-scope-child-grid", 156);
|
|
930
909
|
} if (rf & 2) {
|
|
931
|
-
const
|
|
910
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
932
911
|
i0.ɵɵadvance(27);
|
|
933
|
-
i0.ɵɵproperty("ParentID",
|
|
912
|
+
i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopePermissionColumns);
|
|
934
913
|
} }
|
|
935
|
-
function
|
|
914
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
936
915
|
const _r24 = i0.ɵɵgetCurrentView();
|
|
937
|
-
i0.ɵɵelementStart(0, "div",
|
|
938
|
-
i0.ɵɵlistener("click", function
|
|
916
|
+
i0.ɵɵelementStart(0, "div", 126)(1, "button", 127);
|
|
917
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("definition")); });
|
|
939
918
|
i0.ɵɵtext(2, "Definition");
|
|
940
919
|
i0.ɵɵelementEnd();
|
|
941
|
-
i0.ɵɵelementStart(3, "button",
|
|
942
|
-
i0.ɵɵlistener("click", function
|
|
920
|
+
i0.ɵɵelementStart(3, "button", 127);
|
|
921
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("providers")); });
|
|
943
922
|
i0.ɵɵtext(4, "Providers");
|
|
944
923
|
i0.ɵɵelementEnd();
|
|
945
|
-
i0.ɵɵelementStart(5, "button",
|
|
946
|
-
i0.ɵɵlistener("click", function
|
|
924
|
+
i0.ɵɵelementStart(5, "button", 127);
|
|
925
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("indexes")); });
|
|
947
926
|
i0.ɵɵtext(6, "External Indexes");
|
|
948
927
|
i0.ɵɵelementEnd();
|
|
949
|
-
i0.ɵɵelementStart(7, "button",
|
|
950
|
-
i0.ɵɵlistener("click", function
|
|
928
|
+
i0.ɵɵelementStart(7, "button", 127);
|
|
929
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("entities")); });
|
|
951
930
|
i0.ɵɵtext(8, "Entities");
|
|
952
931
|
i0.ɵɵelementEnd();
|
|
953
|
-
i0.ɵɵelementStart(9, "button",
|
|
954
|
-
i0.ɵɵlistener("click", function
|
|
932
|
+
i0.ɵɵelementStart(9, "button", 127);
|
|
933
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("storage")); });
|
|
955
934
|
i0.ɵɵtext(10, "Storage");
|
|
956
935
|
i0.ɵɵelementEnd();
|
|
957
|
-
i0.ɵɵelementStart(11, "button",
|
|
958
|
-
i0.ɵɵlistener("click", function
|
|
936
|
+
i0.ɵɵelementStart(11, "button", 127);
|
|
937
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("permissions")); });
|
|
959
938
|
i0.ɵɵtext(12, "Permissions");
|
|
960
939
|
i0.ɵɵelementEnd();
|
|
961
|
-
i0.ɵɵelement(13, "div",
|
|
962
|
-
i0.ɵɵconditionalCreate(14,
|
|
963
|
-
i0.ɵɵelementStart(15, "button",
|
|
964
|
-
i0.ɵɵlistener("click", function
|
|
965
|
-
i0.ɵɵelement(16, "i",
|
|
940
|
+
i0.ɵɵelement(13, "div", 128);
|
|
941
|
+
i0.ɵɵconditionalCreate(14, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_14_Template, 3, 0, "button", 129);
|
|
942
|
+
i0.ɵɵelementStart(15, "button", 130);
|
|
943
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SaveActiveScope()); });
|
|
944
|
+
i0.ɵɵelement(16, "i", 131);
|
|
966
945
|
i0.ɵɵtext(17, " Save ");
|
|
967
946
|
i0.ɵɵelementEnd();
|
|
968
|
-
i0.ɵɵconditionalCreate(18,
|
|
947
|
+
i0.ɵɵconditionalCreate(18, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_18_Template, 2, 0, "button", 132);
|
|
969
948
|
i0.ɵɵelementEnd();
|
|
970
|
-
i0.ɵɵconditionalCreate(19,
|
|
971
|
-
i0.ɵɵconditionalCreate(20,
|
|
972
|
-
i0.ɵɵconditionalCreate(21,
|
|
973
|
-
i0.ɵɵconditionalCreate(22,
|
|
974
|
-
i0.ɵɵconditionalCreate(23,
|
|
975
|
-
i0.ɵɵconditionalCreate(24,
|
|
949
|
+
i0.ɵɵconditionalCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template, 45, 11, "div", 133);
|
|
950
|
+
i0.ɵɵconditionalCreate(20, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_20_Template, 1, 2, "mj-search-scope-child-grid", 134);
|
|
951
|
+
i0.ɵɵconditionalCreate(21, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_21_Template, 1, 2, "mj-search-scope-child-grid", 135);
|
|
952
|
+
i0.ɵɵconditionalCreate(22, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_22_Template, 1, 2, "mj-search-scope-child-grid", 136);
|
|
953
|
+
i0.ɵɵconditionalCreate(23, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_23_Template, 1, 2, "mj-search-scope-child-grid", 137);
|
|
954
|
+
i0.ɵɵconditionalCreate(24, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_24_Template, 28, 2);
|
|
976
955
|
} if (rf & 2) {
|
|
977
|
-
const
|
|
956
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
978
957
|
i0.ɵɵadvance();
|
|
979
|
-
i0.ɵɵclassProp("active",
|
|
958
|
+
i0.ɵɵclassProp("active", ctx_r1.ActiveScopeTab === "definition");
|
|
980
959
|
i0.ɵɵadvance(2);
|
|
981
|
-
i0.ɵɵclassProp("active",
|
|
960
|
+
i0.ɵɵclassProp("active", ctx_r1.ActiveScopeTab === "providers");
|
|
982
961
|
i0.ɵɵadvance(2);
|
|
983
|
-
i0.ɵɵclassProp("active",
|
|
962
|
+
i0.ɵɵclassProp("active", ctx_r1.ActiveScopeTab === "indexes");
|
|
984
963
|
i0.ɵɵadvance(2);
|
|
985
|
-
i0.ɵɵclassProp("active",
|
|
964
|
+
i0.ɵɵclassProp("active", ctx_r1.ActiveScopeTab === "entities");
|
|
986
965
|
i0.ɵɵadvance(2);
|
|
987
|
-
i0.ɵɵclassProp("active",
|
|
966
|
+
i0.ɵɵclassProp("active", ctx_r1.ActiveScopeTab === "storage");
|
|
988
967
|
i0.ɵɵadvance(2);
|
|
989
|
-
i0.ɵɵclassProp("active",
|
|
968
|
+
i0.ɵɵclassProp("active", ctx_r1.ActiveScopeTab === "permissions");
|
|
990
969
|
i0.ɵɵadvance(3);
|
|
991
|
-
i0.ɵɵconditional(
|
|
970
|
+
i0.ɵɵconditional(ctx_r1.ActiveScope.ID ? 14 : -1);
|
|
992
971
|
i0.ɵɵadvance(4);
|
|
993
|
-
i0.ɵɵconditional(!
|
|
972
|
+
i0.ɵɵconditional(!ctx_r1.ActiveScope.IsGlobal ? 18 : -1);
|
|
994
973
|
i0.ɵɵadvance();
|
|
995
|
-
i0.ɵɵconditional(
|
|
974
|
+
i0.ɵɵconditional(ctx_r1.ActiveScopeTab === "definition" ? 19 : -1);
|
|
996
975
|
i0.ɵɵadvance();
|
|
997
|
-
i0.ɵɵconditional(
|
|
976
|
+
i0.ɵɵconditional(ctx_r1.ActiveScopeTab === "providers" ? 20 : -1);
|
|
998
977
|
i0.ɵɵadvance();
|
|
999
|
-
i0.ɵɵconditional(
|
|
978
|
+
i0.ɵɵconditional(ctx_r1.ActiveScopeTab === "indexes" ? 21 : -1);
|
|
1000
979
|
i0.ɵɵadvance();
|
|
1001
|
-
i0.ɵɵconditional(
|
|
980
|
+
i0.ɵɵconditional(ctx_r1.ActiveScopeTab === "entities" ? 22 : -1);
|
|
1002
981
|
i0.ɵɵadvance();
|
|
1003
|
-
i0.ɵɵconditional(
|
|
982
|
+
i0.ɵɵconditional(ctx_r1.ActiveScopeTab === "storage" ? 23 : -1);
|
|
1004
983
|
i0.ɵɵadvance();
|
|
1005
|
-
i0.ɵɵconditional(
|
|
984
|
+
i0.ɵɵconditional(ctx_r1.ActiveScopeTab === "permissions" ? 24 : -1);
|
|
1006
985
|
} }
|
|
1007
|
-
function
|
|
1008
|
-
i0.ɵɵelementStart(0, "div",
|
|
986
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
987
|
+
i0.ɵɵelementStart(0, "div", 120);
|
|
1009
988
|
i0.ɵɵtext(1, " Select a scope on the left, or click ");
|
|
1010
989
|
i0.ɵɵelementStart(2, "strong");
|
|
1011
990
|
i0.ɵɵtext(3, "New");
|
|
@@ -1013,54 +992,47 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_14_Condition
|
|
|
1013
992
|
i0.ɵɵtext(4, " to create one. ");
|
|
1014
993
|
i0.ɵɵelementEnd();
|
|
1015
994
|
} }
|
|
1016
|
-
function
|
|
995
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
1017
996
|
const _r21 = i0.ɵɵgetCurrentView();
|
|
1018
|
-
i0.ɵɵelementStart(0, "div",
|
|
1019
|
-
i0.ɵɵ
|
|
1020
|
-
i0.ɵɵtext(3, " Search Scopes");
|
|
1021
|
-
i0.ɵɵelementEnd();
|
|
1022
|
-
i0.ɵɵelementStart(4, "p", 13);
|
|
1023
|
-
i0.ɵɵtext(5, " Define reusable search scopes that filter which providers, entities, external indexes, and storage accounts participate in a scoped search. Scopes can be assigned to AI agents for pre-execution RAG or agent-invoked search. ");
|
|
1024
|
-
i0.ɵɵelementEnd();
|
|
1025
|
-
i0.ɵɵelementStart(6, "div", 111)(7, "aside", 112)(8, "div", 113)(9, "span");
|
|
1026
|
-
i0.ɵɵtext(10);
|
|
997
|
+
i0.ɵɵelementStart(0, "div", 14)(1, "div", 113)(2, "aside", 114)(3, "div", 115)(4, "span");
|
|
998
|
+
i0.ɵɵtext(5);
|
|
1027
999
|
i0.ɵɵelementEnd();
|
|
1028
|
-
i0.ɵɵelementStart(
|
|
1029
|
-
i0.ɵɵlistener("click", function
|
|
1030
|
-
i0.ɵɵelement(
|
|
1031
|
-
i0.ɵɵtext(
|
|
1000
|
+
i0.ɵɵelementStart(6, "button", 116);
|
|
1001
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CreateNewScope()); });
|
|
1002
|
+
i0.ɵɵelement(7, "i", 61);
|
|
1003
|
+
i0.ɵɵtext(8, " New ");
|
|
1032
1004
|
i0.ɵɵelementEnd()();
|
|
1033
|
-
i0.ɵɵconditionalCreate(
|
|
1005
|
+
i0.ɵɵconditionalCreate(9, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_9_Template, 2, 0, "div", 117)(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_10_Template, 5, 0, "div", 118)(11, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_Template, 2, 0);
|
|
1034
1006
|
i0.ɵɵelementEnd();
|
|
1035
|
-
i0.ɵɵelementStart(
|
|
1036
|
-
i0.ɵɵconditionalCreate(
|
|
1007
|
+
i0.ɵɵelementStart(12, "section", 119);
|
|
1008
|
+
i0.ɵɵconditionalCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template, 25, 20)(14, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_14_Template, 5, 0, "div", 120);
|
|
1037
1009
|
i0.ɵɵelementEnd()()();
|
|
1038
1010
|
} if (rf & 2) {
|
|
1039
|
-
const
|
|
1040
|
-
i0.ɵɵadvance(
|
|
1041
|
-
i0.ɵɵtextInterpolate1("Scopes (",
|
|
1011
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
1012
|
+
i0.ɵɵadvance(5);
|
|
1013
|
+
i0.ɵɵtextInterpolate1("Scopes (", ctx_r1.SearchScopes.length, ")");
|
|
1042
1014
|
i0.ɵɵadvance(4);
|
|
1043
|
-
i0.ɵɵconditional(
|
|
1015
|
+
i0.ɵɵconditional(ctx_r1.IsLoadingScopes ? 9 : ctx_r1.SearchScopes.length === 0 ? 10 : 11);
|
|
1044
1016
|
i0.ɵɵadvance(4);
|
|
1045
|
-
i0.ɵɵconditional(
|
|
1017
|
+
i0.ɵɵconditional(ctx_r1.ActiveScope ? 13 : 14);
|
|
1046
1018
|
} }
|
|
1047
|
-
function
|
|
1048
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
1019
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
1020
|
+
i0.ɵɵelement(0, "mj-loading", 157);
|
|
1049
1021
|
} }
|
|
1050
|
-
function
|
|
1022
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
1051
1023
|
const _r28 = i0.ɵɵgetCurrentView();
|
|
1052
|
-
i0.ɵɵelementStart(0, "button",
|
|
1053
|
-
i0.ɵɵlistener("click", function
|
|
1054
|
-
i0.ɵɵelement(1, "i",
|
|
1024
|
+
i0.ɵɵelementStart(0, "button", 159);
|
|
1025
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.LoadSearchAnalytics()); });
|
|
1026
|
+
i0.ɵɵelement(1, "i", 160);
|
|
1055
1027
|
i0.ɵɵtext(2, " Load analytics ");
|
|
1056
1028
|
i0.ɵɵelementEnd();
|
|
1057
1029
|
} }
|
|
1058
|
-
function
|
|
1059
|
-
i0.ɵɵelementStart(0, "p",
|
|
1030
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_37_Template(rf, ctx) { if (rf & 1) {
|
|
1031
|
+
i0.ɵɵelementStart(0, "p", 167);
|
|
1060
1032
|
i0.ɵɵtext(1, "No runs in the window.");
|
|
1061
1033
|
i0.ɵɵelementEnd();
|
|
1062
1034
|
} }
|
|
1063
|
-
function
|
|
1035
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_38_For_11_Template(rf, ctx) { if (rf & 1) {
|
|
1064
1036
|
i0.ɵɵelementStart(0, "tr")(1, "td");
|
|
1065
1037
|
i0.ɵɵtext(2);
|
|
1066
1038
|
i0.ɵɵelementEnd();
|
|
@@ -1080,8 +1052,8 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_15_Condition
|
|
|
1080
1052
|
i0.ɵɵadvance(3);
|
|
1081
1053
|
i0.ɵɵtextInterpolate1("", s_r30.AvgLatencyMs, "ms");
|
|
1082
1054
|
} }
|
|
1083
|
-
function
|
|
1084
|
-
i0.ɵɵelementStart(0, "table",
|
|
1055
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_38_Template(rf, ctx) { if (rf & 1) {
|
|
1056
|
+
i0.ɵɵelementStart(0, "table", 168)(1, "thead")(2, "tr")(3, "th");
|
|
1085
1057
|
i0.ɵɵtext(4, "Scope");
|
|
1086
1058
|
i0.ɵɵelementEnd();
|
|
1087
1059
|
i0.ɵɵelementStart(5, "th");
|
|
@@ -1091,19 +1063,19 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_15_Condition
|
|
|
1091
1063
|
i0.ɵɵtext(8, "Avg latency");
|
|
1092
1064
|
i0.ɵɵelementEnd()()();
|
|
1093
1065
|
i0.ɵɵelementStart(9, "tbody");
|
|
1094
|
-
i0.ɵɵrepeaterCreate(10,
|
|
1066
|
+
i0.ɵɵrepeaterCreate(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_38_For_11_Template, 8, 5, "tr", null, _forTrack2);
|
|
1095
1067
|
i0.ɵɵelementEnd()();
|
|
1096
1068
|
} if (rf & 2) {
|
|
1097
|
-
const
|
|
1069
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
1098
1070
|
i0.ɵɵadvance(10);
|
|
1099
|
-
i0.ɵɵrepeater(
|
|
1071
|
+
i0.ɵɵrepeater(ctx_r1.AnalyticsTopScopes);
|
|
1100
1072
|
} }
|
|
1101
|
-
function
|
|
1102
|
-
i0.ɵɵelementStart(0, "p",
|
|
1073
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_41_Template(rf, ctx) { if (rf & 1) {
|
|
1074
|
+
i0.ɵɵelementStart(0, "p", 167);
|
|
1103
1075
|
i0.ɵɵtext(1, "No rerank invocations in the window.");
|
|
1104
1076
|
i0.ɵɵelementEnd();
|
|
1105
1077
|
} }
|
|
1106
|
-
function
|
|
1078
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_42_For_11_Template(rf, ctx) { if (rf & 1) {
|
|
1107
1079
|
i0.ɵɵelementStart(0, "tr")(1, "td");
|
|
1108
1080
|
i0.ɵɵtext(2);
|
|
1109
1081
|
i0.ɵɵelementEnd();
|
|
@@ -1124,8 +1096,8 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_15_Condition
|
|
|
1124
1096
|
i0.ɵɵadvance(3);
|
|
1125
1097
|
i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(8, 5, r_r31.TotalCents, "1.0-2"), "\u00A2");
|
|
1126
1098
|
} }
|
|
1127
|
-
function
|
|
1128
|
-
i0.ɵɵelementStart(0, "table",
|
|
1099
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_42_Template(rf, ctx) { if (rf & 1) {
|
|
1100
|
+
i0.ɵɵelementStart(0, "table", 168)(1, "thead")(2, "tr")(3, "th");
|
|
1129
1101
|
i0.ɵɵtext(4, "Reranker");
|
|
1130
1102
|
i0.ɵɵelementEnd();
|
|
1131
1103
|
i0.ɵɵelementStart(5, "th");
|
|
@@ -1135,19 +1107,19 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_15_Condition
|
|
|
1135
1107
|
i0.ɵɵtext(8, "Total cents");
|
|
1136
1108
|
i0.ɵɵelementEnd()()();
|
|
1137
1109
|
i0.ɵɵelementStart(9, "tbody");
|
|
1138
|
-
i0.ɵɵrepeaterCreate(10,
|
|
1110
|
+
i0.ɵɵrepeaterCreate(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_42_For_11_Template, 9, 8, "tr", null, _forTrack3);
|
|
1139
1111
|
i0.ɵɵelementEnd()();
|
|
1140
1112
|
} if (rf & 2) {
|
|
1141
|
-
const
|
|
1113
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
1142
1114
|
i0.ɵɵadvance(10);
|
|
1143
|
-
i0.ɵɵrepeater(
|
|
1115
|
+
i0.ɵɵrepeater(ctx_r1.AnalyticsRerankerSpend);
|
|
1144
1116
|
} }
|
|
1145
|
-
function
|
|
1146
|
-
i0.ɵɵelementStart(0, "p",
|
|
1117
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_45_Template(rf, ctx) { if (rf & 1) {
|
|
1118
|
+
i0.ɵɵelementStart(0, "p", 167);
|
|
1147
1119
|
i0.ɵɵtext(1, "No failures in the window.");
|
|
1148
1120
|
i0.ɵɵelementEnd();
|
|
1149
1121
|
} }
|
|
1150
|
-
function
|
|
1122
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_46_For_9_Template(rf, ctx) { if (rf & 1) {
|
|
1151
1123
|
i0.ɵɵelementStart(0, "tr")(1, "td");
|
|
1152
1124
|
i0.ɵɵtext(2);
|
|
1153
1125
|
i0.ɵɵelementEnd();
|
|
@@ -1162,133 +1134,123 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_15_Condition
|
|
|
1162
1134
|
i0.ɵɵadvance(2);
|
|
1163
1135
|
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 2, f_r32.Count));
|
|
1164
1136
|
} }
|
|
1165
|
-
function
|
|
1166
|
-
i0.ɵɵelementStart(0, "table",
|
|
1137
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_46_Template(rf, ctx) { if (rf & 1) {
|
|
1138
|
+
i0.ɵɵelementStart(0, "table", 168)(1, "thead")(2, "tr")(3, "th");
|
|
1167
1139
|
i0.ɵɵtext(4, "Reason");
|
|
1168
1140
|
i0.ɵɵelementEnd();
|
|
1169
1141
|
i0.ɵɵelementStart(5, "th");
|
|
1170
1142
|
i0.ɵɵtext(6, "Count");
|
|
1171
1143
|
i0.ɵɵelementEnd()()();
|
|
1172
1144
|
i0.ɵɵelementStart(7, "tbody");
|
|
1173
|
-
i0.ɵɵrepeaterCreate(8,
|
|
1145
|
+
i0.ɵɵrepeaterCreate(8, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_46_For_9_Template, 6, 4, "tr", null, _forTrack4);
|
|
1174
1146
|
i0.ɵɵelementEnd()();
|
|
1175
1147
|
} if (rf & 2) {
|
|
1176
|
-
const
|
|
1148
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
1177
1149
|
i0.ɵɵadvance(8);
|
|
1178
|
-
i0.ɵɵrepeater(
|
|
1150
|
+
i0.ɵɵrepeater(ctx_r1.AnalyticsTopFailures);
|
|
1179
1151
|
} }
|
|
1180
|
-
function
|
|
1152
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
1181
1153
|
const _r29 = i0.ɵɵgetCurrentView();
|
|
1182
|
-
i0.ɵɵelementStart(0, "div",
|
|
1154
|
+
i0.ɵɵelementStart(0, "div", 161)(1, "div", 162)(2, "span", 163);
|
|
1183
1155
|
i0.ɵɵtext(3, "Total runs");
|
|
1184
1156
|
i0.ɵɵelementEnd();
|
|
1185
|
-
i0.ɵɵelementStart(4, "span",
|
|
1157
|
+
i0.ɵɵelementStart(4, "span", 164);
|
|
1186
1158
|
i0.ɵɵtext(5);
|
|
1187
1159
|
i0.ɵɵpipe(6, "number");
|
|
1188
1160
|
i0.ɵɵelementEnd()();
|
|
1189
|
-
i0.ɵɵelementStart(7, "div",
|
|
1161
|
+
i0.ɵɵelementStart(7, "div", 162)(8, "span", 163);
|
|
1190
1162
|
i0.ɵɵtext(9, "Success rate");
|
|
1191
1163
|
i0.ɵɵelementEnd();
|
|
1192
|
-
i0.ɵɵelementStart(10, "span",
|
|
1164
|
+
i0.ɵɵelementStart(10, "span", 164);
|
|
1193
1165
|
i0.ɵɵtext(11);
|
|
1194
1166
|
i0.ɵɵelementEnd()();
|
|
1195
|
-
i0.ɵɵelementStart(12, "div",
|
|
1167
|
+
i0.ɵɵelementStart(12, "div", 162)(13, "span", 163);
|
|
1196
1168
|
i0.ɵɵtext(14, "Hit rate");
|
|
1197
1169
|
i0.ɵɵelementEnd();
|
|
1198
|
-
i0.ɵɵelementStart(15, "span",
|
|
1170
|
+
i0.ɵɵelementStart(15, "span", 164);
|
|
1199
1171
|
i0.ɵɵtext(16);
|
|
1200
1172
|
i0.ɵɵelementEnd();
|
|
1201
|
-
i0.ɵɵelementStart(17, "span",
|
|
1173
|
+
i0.ɵɵelementStart(17, "span", 165);
|
|
1202
1174
|
i0.ɵɵtext(18, "% of successful runs that returned \u22651 result");
|
|
1203
1175
|
i0.ɵɵelementEnd()();
|
|
1204
|
-
i0.ɵɵelementStart(19, "div",
|
|
1176
|
+
i0.ɵɵelementStart(19, "div", 162)(20, "span", 163);
|
|
1205
1177
|
i0.ɵɵtext(21, "Avg latency");
|
|
1206
1178
|
i0.ɵɵelementEnd();
|
|
1207
|
-
i0.ɵɵelementStart(22, "span",
|
|
1179
|
+
i0.ɵɵelementStart(22, "span", 164);
|
|
1208
1180
|
i0.ɵɵtext(23);
|
|
1209
1181
|
i0.ɵɵelementEnd()();
|
|
1210
|
-
i0.ɵɵelementStart(24, "div",
|
|
1182
|
+
i0.ɵɵelementStart(24, "div", 162)(25, "span", 163);
|
|
1211
1183
|
i0.ɵɵtext(26, "P95 latency");
|
|
1212
1184
|
i0.ɵɵelementEnd();
|
|
1213
|
-
i0.ɵɵelementStart(27, "span",
|
|
1185
|
+
i0.ɵɵelementStart(27, "span", 164);
|
|
1214
1186
|
i0.ɵɵtext(28);
|
|
1215
1187
|
i0.ɵɵelementEnd()();
|
|
1216
|
-
i0.ɵɵelementStart(29, "div",
|
|
1188
|
+
i0.ɵɵelementStart(29, "div", 162)(30, "span", 163);
|
|
1217
1189
|
i0.ɵɵtext(31, "Reranker spend");
|
|
1218
1190
|
i0.ɵɵelementEnd();
|
|
1219
|
-
i0.ɵɵelementStart(32, "span",
|
|
1191
|
+
i0.ɵɵelementStart(32, "span", 164);
|
|
1220
1192
|
i0.ɵɵtext(33);
|
|
1221
1193
|
i0.ɵɵpipe(34, "number");
|
|
1222
1194
|
i0.ɵɵelementEnd()()();
|
|
1223
|
-
i0.ɵɵelementStart(35, "h3",
|
|
1195
|
+
i0.ɵɵelementStart(35, "h3", 166);
|
|
1224
1196
|
i0.ɵɵtext(36, "Top scopes by volume");
|
|
1225
1197
|
i0.ɵɵelementEnd();
|
|
1226
|
-
i0.ɵɵconditionalCreate(37,
|
|
1227
|
-
i0.ɵɵelementStart(39, "h3",
|
|
1198
|
+
i0.ɵɵconditionalCreate(37, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_37_Template, 2, 0, "p", 167)(38, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_38_Template, 12, 0, "table", 168);
|
|
1199
|
+
i0.ɵɵelementStart(39, "h3", 166);
|
|
1228
1200
|
i0.ɵɵtext(40, "Reranker spend by driver");
|
|
1229
1201
|
i0.ɵɵelementEnd();
|
|
1230
|
-
i0.ɵɵconditionalCreate(41,
|
|
1231
|
-
i0.ɵɵelementStart(43, "h3",
|
|
1202
|
+
i0.ɵɵconditionalCreate(41, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_41_Template, 2, 0, "p", 167)(42, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_42_Template, 12, 0, "table", 168);
|
|
1203
|
+
i0.ɵɵelementStart(43, "h3", 166);
|
|
1232
1204
|
i0.ɵɵtext(44, "Top failure reasons");
|
|
1233
1205
|
i0.ɵɵelementEnd();
|
|
1234
|
-
i0.ɵɵconditionalCreate(45,
|
|
1235
|
-
i0.ɵɵelementStart(47, "button",
|
|
1236
|
-
i0.ɵɵlistener("click", function
|
|
1237
|
-
i0.ɵɵelement(48, "i",
|
|
1206
|
+
i0.ɵɵconditionalCreate(45, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_45_Template, 2, 0, "p", 167)(46, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_46_Template, 10, 0, "table", 168);
|
|
1207
|
+
i0.ɵɵelementStart(47, "button", 169);
|
|
1208
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Template_button_click_47_listener() { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.LoadSearchAnalytics()); });
|
|
1209
|
+
i0.ɵɵelement(48, "i", 160);
|
|
1238
1210
|
i0.ɵɵtext(49, " Refresh ");
|
|
1239
1211
|
i0.ɵɵelementEnd();
|
|
1240
1212
|
} if (rf & 2) {
|
|
1241
|
-
const
|
|
1213
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
1242
1214
|
i0.ɵɵadvance(5);
|
|
1243
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(6, 9,
|
|
1215
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(6, 9, ctx_r1.AnalyticsTotalRuns));
|
|
1244
1216
|
i0.ɵɵadvance(6);
|
|
1245
|
-
i0.ɵɵtextInterpolate1("",
|
|
1217
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.AnalyticsSuccessRate, "%");
|
|
1246
1218
|
i0.ɵɵadvance(5);
|
|
1247
|
-
i0.ɵɵtextInterpolate1("",
|
|
1219
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.AnalyticsHitRate, "%");
|
|
1248
1220
|
i0.ɵɵadvance(7);
|
|
1249
|
-
i0.ɵɵtextInterpolate1("",
|
|
1221
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.AnalyticsAvgLatencyMs, "ms");
|
|
1250
1222
|
i0.ɵɵadvance(5);
|
|
1251
|
-
i0.ɵɵtextInterpolate1("",
|
|
1223
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.AnalyticsP95LatencyMs, "ms");
|
|
1252
1224
|
i0.ɵɵadvance(5);
|
|
1253
|
-
i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(34, 11,
|
|
1225
|
+
i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(34, 11, ctx_r1.AnalyticsTotalRerankerCostCents, "1.0-2"), "\u00A2");
|
|
1254
1226
|
i0.ɵɵadvance(4);
|
|
1255
|
-
i0.ɵɵconditional(
|
|
1227
|
+
i0.ɵɵconditional(ctx_r1.AnalyticsTopScopes.length === 0 ? 37 : 38);
|
|
1256
1228
|
i0.ɵɵadvance(4);
|
|
1257
|
-
i0.ɵɵconditional(
|
|
1229
|
+
i0.ɵɵconditional(ctx_r1.AnalyticsRerankerSpend.length === 0 ? 41 : 42);
|
|
1258
1230
|
i0.ɵɵadvance(4);
|
|
1259
|
-
i0.ɵɵconditional(
|
|
1231
|
+
i0.ɵɵconditional(ctx_r1.AnalyticsTopFailures.length === 0 ? 45 : 46);
|
|
1260
1232
|
} }
|
|
1261
|
-
function
|
|
1262
|
-
i0.ɵɵelementStart(0, "div",
|
|
1263
|
-
i0.ɵɵ
|
|
1264
|
-
i0.ɵɵtext(3, " Search Analytics");
|
|
1265
|
-
i0.ɵɵelementEnd();
|
|
1266
|
-
i0.ɵɵelementStart(4, "p", 13);
|
|
1267
|
-
i0.ɵɵtext(5, "Aggregated metrics over the last 5,000 search invocations from ");
|
|
1268
|
-
i0.ɵɵelementStart(6, "code");
|
|
1269
|
-
i0.ɵɵtext(7, "MJ: Search Execution Logs");
|
|
1270
|
-
i0.ɵɵelementEnd();
|
|
1271
|
-
i0.ɵɵtext(8, ". Use this to spot slow scopes, high-failure queries, or runaway reranker spend.");
|
|
1272
|
-
i0.ɵɵelementEnd();
|
|
1273
|
-
i0.ɵɵconditionalCreate(9, KnowledgeConfigResourceComponent_Conditional_1_Conditional_15_Conditional_9_Template, 1, 0, "mj-loading", 156)(10, KnowledgeConfigResourceComponent_Conditional_1_Conditional_15_Conditional_10_Template, 3, 0, "button", 157)(11, KnowledgeConfigResourceComponent_Conditional_1_Conditional_15_Conditional_11_Template, 50, 14);
|
|
1233
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
1234
|
+
i0.ɵɵelementStart(0, "div", 15);
|
|
1235
|
+
i0.ɵɵconditionalCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_1_Template, 1, 0, "mj-loading", 157)(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_2_Template, 3, 0, "button", 158)(3, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Template, 50, 14);
|
|
1274
1236
|
i0.ɵɵelementEnd();
|
|
1275
1237
|
} if (rf & 2) {
|
|
1276
|
-
const
|
|
1277
|
-
i0.ɵɵadvance(
|
|
1278
|
-
i0.ɵɵconditional(
|
|
1238
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
1239
|
+
i0.ɵɵadvance();
|
|
1240
|
+
i0.ɵɵconditional(ctx_r1.AnalyticsLoading ? 1 : !ctx_r1.AnalyticsLoaded ? 2 : 3);
|
|
1279
1241
|
} }
|
|
1280
|
-
function
|
|
1242
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
1281
1243
|
i0.ɵɵelementStart(0, "div", 170);
|
|
1282
|
-
i0.ɵɵelement(1, "i",
|
|
1244
|
+
i0.ɵɵelement(1, "i", 83);
|
|
1283
1245
|
i0.ɵɵtext(2, " Loading permission rows... ");
|
|
1284
1246
|
i0.ɵɵelementEnd();
|
|
1285
1247
|
} }
|
|
1286
|
-
function
|
|
1248
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
1287
1249
|
i0.ɵɵelementStart(0, "div", 181);
|
|
1288
1250
|
i0.ɵɵtext(1, " No permission rows match your filters. ");
|
|
1289
1251
|
i0.ɵɵelementEnd();
|
|
1290
1252
|
} }
|
|
1291
|
-
function
|
|
1253
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
1292
1254
|
i0.ɵɵtext(0);
|
|
1293
1255
|
i0.ɵɵelementStart(1, "span", 184);
|
|
1294
1256
|
i0.ɵɵtext(2);
|
|
@@ -1299,32 +1261,32 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_16_Condition
|
|
|
1299
1261
|
i0.ɵɵadvance(2);
|
|
1300
1262
|
i0.ɵɵtextInterpolate1("(", row_r34.UserEmail, ")");
|
|
1301
1263
|
} }
|
|
1302
|
-
function
|
|
1264
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
1303
1265
|
i0.ɵɵtext(0);
|
|
1304
1266
|
} if (rf & 2) {
|
|
1305
1267
|
const row_r34 = i0.ɵɵnextContext().$implicit;
|
|
1306
1268
|
i0.ɵɵtextInterpolate1(" ", row_r34.RoleName, " ");
|
|
1307
1269
|
} }
|
|
1308
|
-
function
|
|
1270
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
1309
1271
|
i0.ɵɵelementStart(0, "span", 183);
|
|
1310
1272
|
i0.ɵɵtext(1, "User");
|
|
1311
1273
|
i0.ɵɵelementEnd();
|
|
1312
1274
|
} }
|
|
1313
|
-
function
|
|
1275
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
1314
1276
|
i0.ɵɵelementStart(0, "span", 183);
|
|
1315
1277
|
i0.ɵɵtext(1, "Role");
|
|
1316
1278
|
i0.ɵɵelementEnd();
|
|
1317
1279
|
} }
|
|
1318
|
-
function
|
|
1280
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Template(rf, ctx) { if (rf & 1) {
|
|
1319
1281
|
i0.ɵɵelementStart(0, "tr")(1, "td");
|
|
1320
1282
|
i0.ɵɵtext(2);
|
|
1321
1283
|
i0.ɵɵelementEnd();
|
|
1322
1284
|
i0.ɵɵelementStart(3, "td");
|
|
1323
|
-
i0.ɵɵconditionalCreate(4,
|
|
1285
|
+
i0.ɵɵconditionalCreate(4, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_4_Template, 3, 2)(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_5_Template, 1, 1);
|
|
1324
1286
|
i0.ɵɵelementEnd();
|
|
1325
1287
|
i0.ɵɵelementStart(6, "td");
|
|
1326
|
-
i0.ɵɵconditionalCreate(7,
|
|
1327
|
-
i0.ɵɵconditionalCreate(8,
|
|
1288
|
+
i0.ɵɵconditionalCreate(7, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_7_Template, 2, 0, "span", 183);
|
|
1289
|
+
i0.ɵɵconditionalCreate(8, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_8_Template, 2, 0, "span", 183);
|
|
1328
1290
|
i0.ɵɵelementEnd();
|
|
1329
1291
|
i0.ɵɵelementStart(9, "td")(10, "span");
|
|
1330
1292
|
i0.ɵɵpipe(11, "lowercase");
|
|
@@ -1345,7 +1307,7 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_16_Condition
|
|
|
1345
1307
|
i0.ɵɵadvance(2);
|
|
1346
1308
|
i0.ɵɵtextInterpolate(row_r34.PermissionLevel);
|
|
1347
1309
|
} }
|
|
1348
|
-
function
|
|
1310
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
1349
1311
|
i0.ɵɵelementStart(0, "table", 182)(1, "thead")(2, "tr")(3, "th");
|
|
1350
1312
|
i0.ɵɵtext(4, "Scope");
|
|
1351
1313
|
i0.ɵɵelementEnd();
|
|
@@ -1359,23 +1321,23 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_16_Condition
|
|
|
1359
1321
|
i0.ɵɵtext(10, "Permission Level");
|
|
1360
1322
|
i0.ɵɵelementEnd()()();
|
|
1361
1323
|
i0.ɵɵelementStart(11, "tbody");
|
|
1362
|
-
i0.ɵɵrepeaterCreate(12,
|
|
1324
|
+
i0.ɵɵrepeaterCreate(12, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Template, 13, 10, "tr", null, _forTrack0);
|
|
1363
1325
|
i0.ɵɵelementEnd()();
|
|
1364
1326
|
} if (rf & 2) {
|
|
1365
|
-
const
|
|
1327
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
1366
1328
|
i0.ɵɵadvance(12);
|
|
1367
|
-
i0.ɵɵrepeater(
|
|
1329
|
+
i0.ɵɵrepeater(ctx_r1.FilteredPermissionsRows);
|
|
1368
1330
|
} }
|
|
1369
|
-
function
|
|
1331
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
1370
1332
|
const _r33 = i0.ɵɵgetCurrentView();
|
|
1371
1333
|
i0.ɵɵelementStart(0, "div", 171)(1, "input", 172);
|
|
1372
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
1334
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Template_input_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r33); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.PermissionsFilterScope, $event) || (ctx_r1.PermissionsFilterScope = $event); return i0.ɵɵresetView($event); });
|
|
1373
1335
|
i0.ɵɵelementEnd();
|
|
1374
1336
|
i0.ɵɵelementStart(2, "input", 173);
|
|
1375
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
1337
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Template_input_ngModelChange_2_listener($event) { i0.ɵɵrestoreView(_r33); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.PermissionsFilterPrincipal, $event) || (ctx_r1.PermissionsFilterPrincipal = $event); return i0.ɵɵresetView($event); });
|
|
1376
1338
|
i0.ɵɵelementEnd();
|
|
1377
1339
|
i0.ɵɵelementStart(3, "select", 174);
|
|
1378
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
1340
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Template_select_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r33); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.PermissionsFilterLevel, $event) || (ctx_r1.PermissionsFilterLevel = $event); return i0.ɵɵresetView($event); });
|
|
1379
1341
|
i0.ɵɵelementStart(4, "option", 175);
|
|
1380
1342
|
i0.ɵɵtext(5, "All levels");
|
|
1381
1343
|
i0.ɵɵelementEnd();
|
|
@@ -1391,136 +1353,123 @@ function KnowledgeConfigResourceComponent_Conditional_1_Conditional_16_Condition
|
|
|
1391
1353
|
i0.ɵɵelementStart(12, "option", 179);
|
|
1392
1354
|
i0.ɵɵtext(13, "Manage");
|
|
1393
1355
|
i0.ɵɵelementEnd()();
|
|
1394
|
-
i0.ɵɵelementStart(14, "button",
|
|
1395
|
-
i0.ɵɵlistener("click", function
|
|
1396
|
-
i0.ɵɵelement(15, "i",
|
|
1356
|
+
i0.ɵɵelementStart(14, "button", 159);
|
|
1357
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r33); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.RefreshPermissionsAudit()); });
|
|
1358
|
+
i0.ɵɵelement(15, "i", 160);
|
|
1397
1359
|
i0.ɵɵtext(16, " Refresh ");
|
|
1398
1360
|
i0.ɵɵelementEnd()();
|
|
1399
1361
|
i0.ɵɵelementStart(17, "div", 180);
|
|
1400
1362
|
i0.ɵɵtext(18);
|
|
1401
1363
|
i0.ɵɵelementEnd();
|
|
1402
|
-
i0.ɵɵconditionalCreate(19,
|
|
1364
|
+
i0.ɵɵconditionalCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_19_Template, 2, 0, "div", 181)(20, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_Template, 14, 0, "table", 182);
|
|
1403
1365
|
} if (rf & 2) {
|
|
1404
|
-
const
|
|
1366
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
1405
1367
|
i0.ɵɵadvance();
|
|
1406
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
1368
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.PermissionsFilterScope);
|
|
1407
1369
|
i0.ɵɵadvance();
|
|
1408
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
1370
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.PermissionsFilterPrincipal);
|
|
1409
1371
|
i0.ɵɵadvance();
|
|
1410
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
1372
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.PermissionsFilterLevel);
|
|
1411
1373
|
i0.ɵɵadvance(15);
|
|
1412
|
-
i0.ɵɵtextInterpolate2(" Showing ",
|
|
1374
|
+
i0.ɵɵtextInterpolate2(" Showing ", ctx_r1.FilteredPermissionsRows.length, " of ", ctx_r1.PermissionsRows.length, " rows ");
|
|
1413
1375
|
i0.ɵɵadvance();
|
|
1414
|
-
i0.ɵɵconditional(
|
|
1376
|
+
i0.ɵɵconditional(ctx_r1.FilteredPermissionsRows.length === 0 ? 19 : 20);
|
|
1415
1377
|
} }
|
|
1416
|
-
function
|
|
1417
|
-
i0.ɵɵelementStart(0, "div",
|
|
1418
|
-
i0.ɵɵ
|
|
1419
|
-
i0.ɵɵ
|
|
1420
|
-
i0.ɵɵelementEnd();
|
|
1421
|
-
i0.ɵɵelementStart(4, "p", 13);
|
|
1422
|
-
i0.ɵɵtext(5, " Cross-scope view of every ");
|
|
1423
|
-
i0.ɵɵelementStart(6, "code");
|
|
1424
|
-
i0.ɵɵtext(7, "SearchScopePermission");
|
|
1425
|
-
i0.ɵɵelementEnd();
|
|
1426
|
-
i0.ɵɵtext(8, " row. Filter by scope, by user/role, or by permission level to answer \"who has access to what\". Read-only \u2014 to add or edit a grant, open the SearchScope's full form and use its Permissions panel. ");
|
|
1427
|
-
i0.ɵɵelementEnd();
|
|
1428
|
-
i0.ɵɵconditionalCreate(9, KnowledgeConfigResourceComponent_Conditional_1_Conditional_16_Conditional_9_Template, 3, 0, "div", 170);
|
|
1429
|
-
i0.ɵɵconditionalCreate(10, KnowledgeConfigResourceComponent_Conditional_1_Conditional_16_Conditional_10_Template, 21, 6);
|
|
1378
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
1379
|
+
i0.ɵɵelementStart(0, "div", 15);
|
|
1380
|
+
i0.ɵɵconditionalCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_1_Template, 3, 0, "div", 170);
|
|
1381
|
+
i0.ɵɵconditionalCreate(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Template, 21, 6);
|
|
1430
1382
|
i0.ɵɵelementEnd();
|
|
1431
1383
|
} if (rf & 2) {
|
|
1432
|
-
const
|
|
1433
|
-
i0.ɵɵadvance(
|
|
1434
|
-
i0.ɵɵconditional(
|
|
1384
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
1385
|
+
i0.ɵɵadvance();
|
|
1386
|
+
i0.ɵɵconditional(ctx_r1.PermissionsLoading ? 1 : -1);
|
|
1435
1387
|
i0.ɵɵadvance();
|
|
1436
|
-
i0.ɵɵconditional(
|
|
1388
|
+
i0.ɵɵconditional(ctx_r1.PermissionsLoaded && !ctx_r1.PermissionsLoading ? 2 : -1);
|
|
1437
1389
|
} }
|
|
1438
|
-
function
|
|
1439
|
-
i0.ɵɵelementStart(0, "div",
|
|
1440
|
-
i0.ɵɵelement(2, "
|
|
1441
|
-
i0.ɵɵtext(3, " Scheduling");
|
|
1442
|
-
i0.ɵɵelementEnd();
|
|
1443
|
-
i0.ɵɵelementStart(4, "p", 13);
|
|
1444
|
-
i0.ɵɵtext(5, "Manage automated pipeline schedules for content classification and vector sync. Create schedules here or manage all schedules in the dedicated Scheduling app.");
|
|
1445
|
-
i0.ɵɵelementEnd();
|
|
1446
|
-
i0.ɵɵelementStart(6, "div", 186);
|
|
1447
|
-
i0.ɵɵelement(7, "app-scheduling-resource");
|
|
1390
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
1391
|
+
i0.ɵɵelementStart(0, "div", 15)(1, "div", 185);
|
|
1392
|
+
i0.ɵɵelement(2, "app-scheduling-resource", 186);
|
|
1448
1393
|
i0.ɵɵelementEnd()();
|
|
1394
|
+
} if (rf & 2) {
|
|
1395
|
+
i0.ɵɵadvance(2);
|
|
1396
|
+
i0.ɵɵproperty("HideToolbar", true);
|
|
1449
1397
|
} }
|
|
1450
|
-
function
|
|
1451
|
-
i0.ɵɵelement(0, "i",
|
|
1398
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
1399
|
+
i0.ɵɵelement(0, "i", 83);
|
|
1452
1400
|
i0.ɵɵtext(1, " Saving... ");
|
|
1453
1401
|
} }
|
|
1454
|
-
function
|
|
1455
|
-
i0.ɵɵelement(0, "i",
|
|
1402
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
1403
|
+
i0.ɵɵelement(0, "i", 131);
|
|
1456
1404
|
i0.ɵɵtext(1, " Save Changes ");
|
|
1457
1405
|
} }
|
|
1458
|
-
function
|
|
1406
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
1459
1407
|
const _r35 = i0.ɵɵgetCurrentView();
|
|
1460
|
-
i0.ɵɵelementStart(0, "div",
|
|
1408
|
+
i0.ɵɵelementStart(0, "div", 16)(1, "span", 187);
|
|
1461
1409
|
i0.ɵɵtext(2, "You have unsaved changes");
|
|
1462
1410
|
i0.ɵɵelementEnd();
|
|
1463
1411
|
i0.ɵɵelementStart(3, "button", 188);
|
|
1464
|
-
i0.ɵɵlistener("click", function
|
|
1465
|
-
i0.ɵɵconditionalCreate(4,
|
|
1412
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r35); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SaveConfiguration()); });
|
|
1413
|
+
i0.ɵɵconditionalCreate(4, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_4_Template, 2, 0)(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_5_Template, 2, 0);
|
|
1466
1414
|
i0.ɵɵelementEnd();
|
|
1467
1415
|
i0.ɵɵelementStart(6, "button", 189);
|
|
1468
|
-
i0.ɵɵlistener("click", function
|
|
1416
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r35); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ResetConfiguration()); });
|
|
1469
1417
|
i0.ɵɵtext(7, " Reset ");
|
|
1470
1418
|
i0.ɵɵelementEnd()();
|
|
1471
1419
|
} if (rf & 2) {
|
|
1472
|
-
const
|
|
1420
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
1473
1421
|
i0.ɵɵadvance(3);
|
|
1474
|
-
i0.ɵɵproperty("disabled",
|
|
1422
|
+
i0.ɵɵproperty("disabled", ctx_r1.IsSaving);
|
|
1475
1423
|
i0.ɵɵadvance();
|
|
1476
|
-
i0.ɵɵconditional(
|
|
1424
|
+
i0.ɵɵconditional(ctx_r1.IsSaving ? 4 : 5);
|
|
1477
1425
|
i0.ɵɵadvance(2);
|
|
1478
|
-
i0.ɵɵproperty("disabled",
|
|
1479
|
-
} }
|
|
1480
|
-
function
|
|
1481
|
-
|
|
1482
|
-
i0.ɵɵ
|
|
1483
|
-
i0.ɵɵ
|
|
1484
|
-
i0.ɵɵ
|
|
1485
|
-
i0.ɵɵ
|
|
1486
|
-
i0.ɵɵ
|
|
1487
|
-
i0.ɵɵ
|
|
1488
|
-
i0.ɵɵ
|
|
1489
|
-
i0.ɵɵconditionalCreate(
|
|
1490
|
-
i0.ɵɵconditionalCreate(
|
|
1491
|
-
i0.ɵɵconditionalCreate(
|
|
1492
|
-
i0.ɵɵconditionalCreate(
|
|
1493
|
-
i0.ɵɵconditionalCreate(
|
|
1494
|
-
i0.ɵɵconditionalCreate(
|
|
1495
|
-
i0.ɵɵconditionalCreate(
|
|
1496
|
-
i0.ɵɵconditionalCreate(
|
|
1497
|
-
i0.ɵɵconditionalCreate(
|
|
1498
|
-
i0.ɵɵ
|
|
1499
|
-
i0.ɵɵelementEnd()();
|
|
1426
|
+
i0.ɵɵproperty("disabled", ctx_r1.IsSaving);
|
|
1427
|
+
} }
|
|
1428
|
+
function KnowledgeConfigResourceComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
1429
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
1430
|
+
i0.ɵɵelementStart(0, "div", 6)(1, "mj-left-nav", 12);
|
|
1431
|
+
i0.ɵɵlistener("ItemClicked", function KnowledgeConfigResourceComponent_Conditional_8_Template_mj_left_nav_ItemClicked_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onNavItemClicked($event)); });
|
|
1432
|
+
i0.ɵɵelementEnd();
|
|
1433
|
+
i0.ɵɵelementStart(2, "mj-left-nav-content");
|
|
1434
|
+
i0.ɵɵelement(3, "mj-page-header-interior", 13);
|
|
1435
|
+
i0.ɵɵelementStart(4, "mj-page-body-interior");
|
|
1436
|
+
i0.ɵɵconditionalCreate(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template, 30, 4, "div", 14);
|
|
1437
|
+
i0.ɵɵconditionalCreate(6, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Template, 45, 26, "div", 14);
|
|
1438
|
+
i0.ɵɵconditionalCreate(7, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Template, 4, 1, "div", 14);
|
|
1439
|
+
i0.ɵɵconditionalCreate(8, KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Template, 3, 1, "div", 14);
|
|
1440
|
+
i0.ɵɵconditionalCreate(9, KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template, 30, 8, "div", 14);
|
|
1441
|
+
i0.ɵɵconditionalCreate(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Template, 15, 3, "div", 14);
|
|
1442
|
+
i0.ɵɵconditionalCreate(11, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Template, 4, 1, "div", 15);
|
|
1443
|
+
i0.ɵɵconditionalCreate(12, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Template, 3, 2, "div", 15);
|
|
1444
|
+
i0.ɵɵconditionalCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template, 3, 1, "div", 15);
|
|
1445
|
+
i0.ɵɵconditionalCreate(14, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template, 8, 3, "div", 16);
|
|
1446
|
+
i0.ɵɵelementEnd()()();
|
|
1500
1447
|
} if (rf & 2) {
|
|
1501
|
-
const
|
|
1502
|
-
i0.ɵɵadvance(
|
|
1503
|
-
i0.ɵɵ
|
|
1504
|
-
i0.ɵɵadvance(
|
|
1505
|
-
i0.ɵɵ
|
|
1448
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
1449
|
+
i0.ɵɵadvance();
|
|
1450
|
+
i0.ɵɵproperty("Sections", ctx_r1.navSections)("ActiveId", ctx_r1.ActiveSection);
|
|
1451
|
+
i0.ɵɵadvance(2);
|
|
1452
|
+
i0.ɵɵproperty("Title", (ctx_r1.currentSection == null ? null : ctx_r1.currentSection.Label) || "")("Subtitle", (ctx_r1.currentSection == null ? null : ctx_r1.currentSection.Description) || "");
|
|
1453
|
+
i0.ɵɵadvance(2);
|
|
1454
|
+
i0.ɵɵconditional(ctx_r1.ActiveSection === "pipeline" ? 5 : -1);
|
|
1506
1455
|
i0.ɵɵadvance();
|
|
1507
|
-
i0.ɵɵconditional(
|
|
1456
|
+
i0.ɵɵconditional(ctx_r1.ActiveSection === "vectordb" ? 6 : -1);
|
|
1508
1457
|
i0.ɵɵadvance();
|
|
1509
|
-
i0.ɵɵconditional(
|
|
1458
|
+
i0.ɵɵconditional(ctx_r1.ActiveSection === "fulltext" ? 7 : -1);
|
|
1510
1459
|
i0.ɵɵadvance();
|
|
1511
|
-
i0.ɵɵconditional(
|
|
1460
|
+
i0.ɵɵconditional(ctx_r1.ActiveSection === "embedding" ? 8 : -1);
|
|
1512
1461
|
i0.ɵɵadvance();
|
|
1513
|
-
i0.ɵɵconditional(
|
|
1462
|
+
i0.ɵɵconditional(ctx_r1.ActiveSection === "thresholds" ? 9 : -1);
|
|
1514
1463
|
i0.ɵɵadvance();
|
|
1515
|
-
i0.ɵɵconditional(
|
|
1464
|
+
i0.ɵɵconditional(ctx_r1.ActiveSection === "search-scopes" ? 10 : -1);
|
|
1516
1465
|
i0.ɵɵadvance();
|
|
1517
|
-
i0.ɵɵconditional(
|
|
1466
|
+
i0.ɵɵconditional(ctx_r1.ActiveSection === "search-analytics" ? 11 : -1);
|
|
1518
1467
|
i0.ɵɵadvance();
|
|
1519
|
-
i0.ɵɵconditional(
|
|
1468
|
+
i0.ɵɵconditional(ctx_r1.ActiveSection === "search-permissions" ? 12 : -1);
|
|
1520
1469
|
i0.ɵɵadvance();
|
|
1521
|
-
i0.ɵɵconditional(
|
|
1470
|
+
i0.ɵɵconditional(ctx_r1.ActiveSection === "scheduling" ? 13 : -1);
|
|
1522
1471
|
i0.ɵɵadvance();
|
|
1523
|
-
i0.ɵɵconditional(
|
|
1472
|
+
i0.ɵɵconditional(ctx_r1.HasUnsavedChanges ? 14 : -1);
|
|
1524
1473
|
} }
|
|
1525
1474
|
let KnowledgeConfigResourceComponent = class KnowledgeConfigResourceComponent extends BaseResourceComponent {
|
|
1526
1475
|
cdr = inject(ChangeDetectorRef);
|
|
@@ -1682,6 +1631,29 @@ let KnowledgeConfigResourceComponent = class KnowledgeConfigResourceComponent ex
|
|
|
1682
1631
|
// ================================================================
|
|
1683
1632
|
// Public Methods
|
|
1684
1633
|
// ================================================================
|
|
1634
|
+
/** Wraps `Sections` for `<mj-left-nav>`. Single unlabeled section. */
|
|
1635
|
+
get navSections() {
|
|
1636
|
+
return [{
|
|
1637
|
+
items: this.Sections.map(s => ({
|
|
1638
|
+
id: s.ID,
|
|
1639
|
+
label: s.Label,
|
|
1640
|
+
icon: s.Icon,
|
|
1641
|
+
description: s.Description
|
|
1642
|
+
}))
|
|
1643
|
+
}];
|
|
1644
|
+
}
|
|
1645
|
+
/**
|
|
1646
|
+
* Active section metadata — drives the `<mj-page-header-interior>` Title +
|
|
1647
|
+
* Subtitle for the current section. Reusing the existing Sections array
|
|
1648
|
+
* (already used to drive the left rail) keeps section identity DRY.
|
|
1649
|
+
*/
|
|
1650
|
+
get currentSection() {
|
|
1651
|
+
return this.Sections.find(s => UUIDsEqual(s.ID, this.ActiveSection));
|
|
1652
|
+
}
|
|
1653
|
+
/** Adapter for `<mj-left-nav>`'s `(ItemClicked)` output. */
|
|
1654
|
+
onNavItemClicked(item) {
|
|
1655
|
+
this.SelectSection(item.id);
|
|
1656
|
+
}
|
|
1685
1657
|
SelectSection(sectionId) {
|
|
1686
1658
|
this.ActiveSection = sectionId;
|
|
1687
1659
|
if (sectionId === 'search-scopes' && this.SearchScopes.length === 0) {
|
|
@@ -2372,11 +2344,26 @@ let KnowledgeConfigResourceComponent = class KnowledgeConfigResourceComponent ex
|
|
|
2372
2344
|
}));
|
|
2373
2345
|
}
|
|
2374
2346
|
static ɵfac = /*@__PURE__*/ (() => { let ɵKnowledgeConfigResourceComponent_BaseFactory; return function KnowledgeConfigResourceComponent_Factory(__ngFactoryType__) { return (ɵKnowledgeConfigResourceComponent_BaseFactory || (ɵKnowledgeConfigResourceComponent_BaseFactory = i0.ɵɵgetInheritedFactory(KnowledgeConfigResourceComponent)))(__ngFactoryType__ || KnowledgeConfigResourceComponent); }; })();
|
|
2375
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KnowledgeConfigResourceComponent, selectors: [["app-knowledge-config-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
2376
|
-
i0.ɵɵ
|
|
2347
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KnowledgeConfigResourceComponent, selectors: [["app-knowledge-config-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 9, vars: 5, consts: [["Title", "Knowledge Hub Configuration", "Icon", "fa-solid fa-cogs", "Subtitle", "Pipeline, vector store, search, and automation settings"], ["meta", ""], ["Icon", "fa-solid fa-circle-exclamation", "Label", "Unsaved changes", "Variant", "warning"], ["actions", ""], [3, "Flex", "Padding"], [1, "config-loading"], [1, "config-layout"], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Discard unsaved changes", 3, "click", "disabled"], [1, "fa-solid", "fa-arrow-rotate-left"], ["mjButton", "", "variant", "primary", "size", "sm", "title", "Save all settings", 3, "click", "disabled"], [1, "fa-solid", "fa-floppy-disk"], ["text", "Loading configuration...", "size", "medium"], [3, "ItemClicked", "Sections", "ActiveId"], [3, "Title", "Subtitle"], [1, "config-section"], [1, "config-section-content"], [1, "config-save-bar"], [1, "config-group"], [1, "config-toggle-row"], [1, "config-toggle-info"], [1, "config-label"], [1, "config-hint"], ["type", "checkbox", 1, "config-checkbox", 3, "ngModelChange", "change", "ngModel"], [1, "config-field-row"], [1, "config-field-info"], ["type", "number", "min", "10", "max", "1000", 1, "config-input", "config-input-number", 3, "ngModelChange", "input", "ngModel"], ["type", "number", "min", "1", "max", "10", 1, "config-input", "config-input-number", 3, "ngModelChange", "input", "ngModel"], [1, "setup-progress"], [1, "setup-progress-header"], [1, "setup-progress-label"], [1, "setup-progress-count"], [1, "setup-progress-bar"], [1, "setup-progress-fill"], [1, "setup-step"], [1, "setup-step-header"], [1, "setup-step-indicator"], [1, "fa-solid", "fa-circle-check"], [1, "setup-step-number"], [1, "setup-step-info"], [1, "setup-step-title"], [1, "setup-step-status"], [1, "setup-step-detail"], [1, "setup-step-action"], [1, "create-index-form"], [1, "provider-card"], [1, "provider-icon"], [1, "fa-solid", "fa-database"], [1, "provider-info"], [1, "provider-name"], [1, "provider-class"], [1, "config-status-badge", "config-status-active"], [1, "provider-credential-row"], [1, "provider-credential-label"], [1, "fa-solid", "fa-key"], [1, "provider-credential-picker"], [1, "provider-credential-select", 3, "ngModelChange", "change", "ngModel", "disabled"], [3, "ngValue"], [1, "fa-solid", "fa-spinner", "fa-spin", "provider-credential-spinner"], [1, "config-tag-list"], [1, "config-tag"], [1, "setup-step-action", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "index-card"], [1, "index-icon"], [1, "fa-solid", "fa-cubes"], [1, "index-info"], [1, "index-name"], [1, "index-meta"], [1, "fa-solid", "fa-microchip"], [1, "index-actions"], ["title", "Delete index", 1, "index-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "create-index-title"], [1, "fa-solid", "fa-plus-circle"], [1, "create-index-fields"], [1, "create-index-field"], [1, "create-index-label"], ["type", "text", "placeholder", "e.g., mj-knowledge-index", 1, "config-input", 3, "ngModelChange", "ngModel"], [1, "config-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "create-index-actions"], [1, "create-index-submit", 3, "click", "disabled"], [1, "create-index-cancel", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], ["text", "Discovering searchable entities...", "size", "medium"], [1, "config-empty-state"], [1, "fa-solid", "fa-text-width", "config-empty-icon"], [1, "config-empty-title"], [1, "config-empty-text"], [1, "fts-entity-controls"], [1, "fts-summary"], [1, "fts-summary-count"], ["type", "text", "placeholder", "Filter entities...", 1, "config-input", "fts-filter-input", 3, "ngModelChange", "ngModel"], [1, "fts-entity-list"], [1, "fts-entity-card", 3, "fts-entity-enabled"], [1, "fts-entity-card"], [1, "fts-entity-toggle"], [1, "fts-entity-info"], [1, "fts-entity-name"], [1, "fts-entity-fields"], [1, "fts-field-tag"], [1, "fts-entity-meta"], ["title", "Title field", 1, "fts-entity-title-field"], [1, "fa-solid", "fa-heading"], ["title", "Snippet field", 1, "fts-entity-snippet-field"], [1, "fa-solid", "fa-align-left"], [1, "config-value-display"], [1, "config-section-note"], [1, "fa-solid", "fa-info-circle"], [1, "fa-solid", "fa-microchip", "config-empty-icon"], ["type", "range", "min", "0.5", "max", "1", "step", "0.01", 1, "config-slider", 3, "ngModelChange", "input", "ngModel"], ["type", "range", "min", "0.3", "max", "1", "step", "0.01", 1, "config-slider", 3, "ngModelChange", "input", "ngModel"], ["type", "range", "min", "0", "max", "1", "step", "0.01", 1, "config-slider", 3, "ngModelChange", "input", "ngModel"], [1, "scope-manager"], [1, "scope-manager-list"], [1, "scope-manager-list-header"], ["type", "button", 1, "scope-manager-new-btn", 3, "click"], [1, "scope-manager-loading"], [1, "scope-manager-empty"], [1, "scope-manager-detail"], [1, "scope-manager-empty-detail"], ["type", "button", 1, "scope-manager-list-item", 3, "active"], ["type", "button", 1, "scope-manager-list-item", 3, "click"], ["aria-hidden", "true"], [1, "scope-manager-list-name"], [1, "scope-manager-badge"], [1, "scope-manager-tabs"], ["type", "button", 1, "scope-manager-tab", 3, "click"], [1, "scope-manager-tab-spacer"], ["type", "button", "title", "Open the full custom form for this scope (Live Preview, Fusion Weights, Reranker, Test Queries, Execution Logs)", 1, "scope-manager-open-btn"], ["type", "button", 1, "scope-manager-save-btn", 3, "click"], [1, "fa-solid", "fa-save"], ["type", "button", "title", "Delete scope", 1, "scope-manager-delete-btn"], [1, "scope-definition-grid"], ["ChildEntityName", "MJ: Search Scope Providers", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Add provider", "EmptyMessage", "No providers assigned. Without any providers, this scope searches nothing.", 3, "ParentID", "Columns"], ["ChildEntityName", "MJ: Search Scope External Indexes", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Add external index", "EmptyMessage", "No external indexes configured for this scope.", 3, "ParentID", "Columns"], ["ChildEntityName", "MJ: Search Scope Entities", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Add entity", "EmptyMessage", "No entities configured. Scoped entity search will return no rows.", 3, "ParentID", "Columns"], ["ChildEntityName", "MJ: Search Scope Storage Accounts", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Add storage folder", "EmptyMessage", "No storage accounts linked to this scope.", 3, "ParentID", "Columns"], ["type", "button", "title", "Open the full custom form for this scope (Live Preview, Fusion Weights, Reranker, Test Queries, Execution Logs)", 1, "scope-manager-open-btn", 3, "click"], [1, "fa-solid", "fa-up-right-from-square"], ["type", "button", "title", "Delete scope", 1, "scope-manager-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash"], ["type", "text", 1, "mj-input", 3, "change", "value"], [1, "scope-definition-full"], ["rows", "2", 1, "mj-textarea", 3, "change", "value"], [1, "mj-input", 3, "change", "value"], ["value", "Active"], ["value", "Inactive"], ["type", "datetime-local", 1, "mj-input", 3, "change", "value"], [1, "scope-definition-toggle"], ["type", "checkbox", 3, "change", "checked", "disabled"], ["type", "checkbox", "disabled", "", 3, "checked"], ["rows", "4", "spellcheck", "false", 1, "mj-textarea", "scope-code-block", 3, "change", "value"], [1, "scope-permissions-help", 2, "margin-bottom", "12px", "padding", "8px 12px", "background", "var(--mj-bg-surface-card)", "border-left", "3px solid var(--mj-brand-primary)", "border-radius", "4px"], [2, "margin", "0", "font-size", "0.95em"], [1, "fa-solid", "fa-shield-halved", 2, "color", "var(--mj-brand-primary)"], ["ChildEntityName", "MJ: Search Scope Permissions", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Grant access", "EmptyMessage", "No explicit grants. Access falls back to agent SearchScopeAccess only.", 3, "ParentID", "Columns"], ["text", "Loading analytics\u2026", "size", "medium"], ["type", "button", 1, "mj-input"], ["type", "button", 1, "mj-input", 3, "click"], [1, "fa-solid", "fa-arrows-rotate"], [1, "search-analytics-kpi-grid"], [1, "search-analytics-kpi"], [1, "search-analytics-kpi-label"], [1, "search-analytics-kpi-value"], [1, "search-analytics-kpi-hint"], [1, "search-analytics-h3"], [1, "search-analytics-empty"], [1, "search-analytics-table"], ["type", "button", 1, "mj-input", "search-analytics-refresh", 3, "click"], [1, "search-permissions-loading"], [1, "search-permissions-filters"], ["type", "text", "placeholder", "Filter by scope name...", 1, "mj-input", 3, "ngModelChange", "ngModel"], ["type", "text", "placeholder", "Filter by user/role (name or email)...", 1, "mj-input", 3, "ngModelChange", "ngModel"], [1, "mj-input", 3, "ngModelChange", "ngModel"], ["value", ""], ["value", "None"], ["value", "Read"], ["value", "Search"], ["value", "Manage"], [1, "search-permissions-summary"], [1, "search-permissions-empty"], [1, "search-permissions-table"], [1, "search-permissions-tag"], [1, "search-permissions-secondary"], [2, "margin-top", "16px"], [3, "HideToolbar"], [1, "config-save-text"], [1, "config-save-btn", 3, "click", "disabled"], [1, "config-reset-btn", 3, "click", "disabled"]], template: function KnowledgeConfigResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
2348
|
+
i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 0)(2, "div", 1);
|
|
2349
|
+
i0.ɵɵconditionalCreate(3, KnowledgeConfigResourceComponent_Conditional_3_Template, 1, 0, "mj-stat-badge", 2);
|
|
2350
|
+
i0.ɵɵelementEnd();
|
|
2351
|
+
i0.ɵɵelementStart(4, "div", 3);
|
|
2352
|
+
i0.ɵɵconditionalCreate(5, KnowledgeConfigResourceComponent_Conditional_5_Template, 6, 3);
|
|
2353
|
+
i0.ɵɵelementEnd()();
|
|
2354
|
+
i0.ɵɵelementStart(6, "mj-page-body", 4);
|
|
2355
|
+
i0.ɵɵconditionalCreate(7, KnowledgeConfigResourceComponent_Conditional_7_Template, 2, 0, "div", 5)(8, KnowledgeConfigResourceComponent_Conditional_8_Template, 15, 14, "div", 6);
|
|
2356
|
+
i0.ɵɵelementEnd()();
|
|
2377
2357
|
} if (rf & 2) {
|
|
2378
|
-
i0.ɵɵ
|
|
2379
|
-
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.RangeValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.MaxValidator, i1.NgModel, i2.LoadingComponent, i3.SearchScopeChildGridComponent, i4.SchedulingResourceComponent, i5.LowerCasePipe, i5.DecimalPipe], styles: ["\n\n\n.config-loading[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 400px;\n}\n\n.config-layout[_ngcontent-%COMP%] {\n display: flex;\n height: 100%;\n min-height: 500px;\n}\n\n\n\n.config-nav[_ngcontent-%COMP%] {\n width: 240px;\n border-right: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n padding: 0.5rem 0;\n}\n\n.config-nav-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n margin-bottom: 0.5rem;\n}\n\n.config-nav-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.6rem;\n padding: 0.55rem 1rem;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n cursor: pointer;\n text-align: left;\n transition: all 0.15s ease;\n width: 100%;\n}\n\n.config-nav-item[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.config-nav-item-active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n\n\n.config-content[_ngcontent-%COMP%] {\n flex: 1;\n padding: 1.5rem 2rem;\n overflow-y: auto;\n position: relative;\n}\n\n.config-section[_ngcontent-%COMP%] {\n max-width: 700px;\n}\n\n.config-section-title[_ngcontent-%COMP%] {\n font-size: 1.3rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 0.5rem;\n}\n\n.config-section-desc[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 0.9rem;\n margin-bottom: 1.5rem;\n line-height: 1.5;\n}\n\n\n\n.config-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.config-toggle-row[_ngcontent-%COMP%], \n.config-field-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n border-radius: 8px;\n transition: background 0.1s ease;\n gap: 1rem;\n}\n\n.config-toggle-row[_ngcontent-%COMP%]:hover, \n.config-field-row[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.config-toggle-info[_ngcontent-%COMP%], \n.config-field-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.15rem;\n flex: 1;\n}\n\n.config-label[_ngcontent-%COMP%] {\n font-weight: 500;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n}\n\n.config-hint[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.config-checkbox[_ngcontent-%COMP%] {\n width: 1.1rem;\n height: 1.1rem;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n}\n\n.config-input[_ngcontent-%COMP%] {\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n font-family: inherit;\n}\n\n.config-input-number[_ngcontent-%COMP%] {\n width: 80px;\n text-align: center;\n}\n\n.config-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.config-slider[_ngcontent-%COMP%] {\n width: 200px;\n accent-color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.config-value-display[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n padding: 0.3rem 0.6rem;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-family: monospace;\n}\n\n\n\n.config-placeholder[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 1.5rem;\n text-align: center;\n gap: 1rem;\n color: var(--mj-text-muted);\n}\n\n.config-placeholder-icon[_ngcontent-%COMP%] {\n font-size: 2.5rem;\n}\n\n\n\n\n.setup-progress[_ngcontent-%COMP%] {\n margin-bottom: 1.5rem;\n padding: 1rem 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n}\n\n.setup-progress-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.5rem;\n}\n\n.setup-progress-label[_ngcontent-%COMP%] {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.setup-progress-count[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.setup-progress-bar[_ngcontent-%COMP%] {\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.setup-progress-fill[_ngcontent-%COMP%] {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n transition: width 0.4s ease;\n}\n\n\n\n\n.setup-step[_ngcontent-%COMP%] {\n padding: 1rem 1.25rem;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n margin-bottom: 0.75rem;\n transition: border-color 0.2s;\n}\n\n.setup-step-complete[_ngcontent-%COMP%] {\n border-color: var(--mj-status-success-border);\n background: color-mix(in srgb, var(--mj-status-success) 3%, var(--mj-bg-surface));\n}\n\n.setup-step-pending[_ngcontent-%COMP%] {\n border-color: var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.setup-step-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 0.85rem;\n}\n\n.setup-step-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex-shrink: 0;\n margin-top: 1px;\n}\n\n.setup-step-complete[_ngcontent-%COMP%] .setup-step-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n color: var(--mj-status-success);\n}\n\n.setup-step-number[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n font-weight: 700;\n}\n\n.setup-step-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n flex: 1;\n}\n\n.setup-step-title[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.setup-step-status[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.setup-step-complete[_ngcontent-%COMP%] .setup-step-status[_ngcontent-%COMP%] {\n color: var(--mj-status-success-text);\n}\n\n\n\n\n.config-group-title[_ngcontent-%COMP%] {\n margin: 0 0 0.75rem 0;\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n\n\n\n.config-status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 0.75rem;\n font-weight: 600;\n}\n\n.config-status-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n\n\n\n.setup-step-detail[_ngcontent-%COMP%] {\n margin-top: 0.75rem;\n padding-left: 2.85rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.setup-step-action[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s;\n flex-shrink: 0;\n}\n\n.setup-step-action[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n\n\n\n.provider-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n}\n\n.provider-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.provider-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.provider-name[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.provider-class[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n font-family: monospace;\n}\n\n\n\n\n.provider-credential-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 1rem 0.75rem;\n margin-top: -0.25rem;\n}\n\n.provider-credential-label[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.provider-credential-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.provider-credential-picker[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex: 1;\n min-width: 0;\n}\n\n.provider-credential-select[_ngcontent-%COMP%] {\n flex: 1;\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.8rem;\n}\n\n.provider-credential-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.provider-credential-spinner[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n}\n\n\n\n\n.index-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n transition: border-color 0.15s;\n}\n\n.index-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-default);\n}\n\n.index-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.index-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.index-name[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.index-meta[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 3px;\n}\n\n.index-meta[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.65rem;\n}\n\n.index-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex-shrink: 0;\n}\n\n.index-delete-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.index-delete-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error);\n}\n\n\n\n\n.create-index-form[_ngcontent-%COMP%] {\n margin-top: 0.75rem;\n padding: 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 2px solid var(--mj-brand-primary);\n border-radius: 10px;\n margin-left: 2.85rem;\n}\n\n.create-index-title[_ngcontent-%COMP%] {\n margin: 0 0 1rem 0;\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.create-index-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.create-index-fields[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.85rem;\n}\n\n.create-index-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.create-index-label[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.config-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n}\n\n.config-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.create-index-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n margin-top: 1rem;\n}\n\n.create-index-submit[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 18px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s;\n}\n\n.create-index-submit[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.create-index-submit[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.create-index-cancel[_ngcontent-%COMP%] {\n padding: 8px 18px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.create-index-cancel[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n.config-empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 2rem;\n text-align: center;\n gap: 0.75rem;\n border: 2px dashed var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface-sunken);\n}\n\n.config-empty-icon[_ngcontent-%COMP%] {\n font-size: 2.5rem;\n color: var(--mj-text-disabled);\n}\n\n.config-empty-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.config-empty-text[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.85rem;\n color: var(--mj-text-muted);\n max-width: 480px;\n line-height: 1.5;\n}\n\n\n\n.config-tag-list[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.config-tag[_ngcontent-%COMP%] {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 500;\n}\n\n\n\n.config-section-note[_ngcontent-%COMP%] {\n margin-top: 1rem;\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.config-section-note[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-info);\n}\n\n\n\n.config-save-bar[_ngcontent-%COMP%] {\n position: sticky;\n bottom: 0;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n margin-top: 2rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n}\n\n.config-save-text[_ngcontent-%COMP%] {\n flex: 1;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n}\n\n.config-save-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.5rem 1rem;\n border-radius: 6px;\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.85rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.config-save-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.config-save-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.config-reset-btn[_ngcontent-%COMP%] {\n padding: 0.5rem 0.75rem;\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n cursor: pointer;\n}\n\n.config-reset-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n@media (max-width: 768px) {\n .config-layout[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .config-nav[_ngcontent-%COMP%] {\n width: 100%;\n flex-direction: row;\n overflow-x: auto;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 0;\n }\n\n .config-nav-header[_ngcontent-%COMP%] {\n display: none;\n }\n\n .config-nav-item[_ngcontent-%COMP%] {\n white-space: nowrap;\n padding: 0.6rem 1rem;\n }\n\n .config-nav-item-active[_ngcontent-%COMP%] {\n border-left: none;\n border-bottom: 3px solid var(--mj-brand-primary);\n }\n\n .config-content[_ngcontent-%COMP%] {\n padding: 1rem;\n }\n}\n\n\n\n.fts-entity-controls[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.fts-summary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n}\n\n.fts-summary-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.fts-filter-input[_ngcontent-%COMP%] {\n max-width: 240px;\n}\n\n.fts-entity-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.fts-entity-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: border-color 0.15s, background 0.15s;\n}\n\n.fts-entity-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.fts-entity-card.fts-entity-enabled[_ngcontent-%COMP%] {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-brand-primary) 3%, var(--mj-bg-surface));\n}\n\n.fts-entity-toggle[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.fts-entity-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.fts-entity-name[_ngcontent-%COMP%] {\n display: block;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.fts-entity-fields[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.fts-field-tag[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 1px 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n}\n\n.fts-entity-meta[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 2px;\n flex-shrink: 0;\n}\n\n.fts-entity-title-field[_ngcontent-%COMP%], \n.fts-entity-snippet-field[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.fts-entity-title-field[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.fts-entity-snippet-field[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 4px;\n font-size: 10px;\n}\n\n\n\n\n.scope-manager[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 260px 1fr;\n gap: 16px;\n min-height: 420px;\n}\n\n.scope-manager-list[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.scope-manager-list-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 4px 6px 8px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.scope-manager-new-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-link);\n padding: 3px 8px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.7rem;\n font-weight: 500;\n text-transform: none;\n letter-spacing: normal;\n}\n\n.scope-manager-new-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-brand-primary);\n}\n\n.scope-manager-loading[_ngcontent-%COMP%], \n.scope-manager-empty[_ngcontent-%COMP%], \n.scope-manager-empty-detail[_ngcontent-%COMP%] {\n padding: 16px;\n color: var(--mj-text-muted);\n text-align: center;\n font-size: 0.85rem;\n}\n\n.scope-manager-empty-detail[_ngcontent-%COMP%] {\n padding: 40px 24px;\n background: var(--mj-bg-surface-card);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n}\n\n.scope-manager-list-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 6px;\n text-align: left;\n transition: background 120ms ease;\n}\n\n.scope-manager-list-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.scope-manager-list-item.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n.scope-manager-list-name[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.scope-manager-badge[_ngcontent-%COMP%] {\n font-size: 0.625rem;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.scope-manager-detail[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-width: 0;\n}\n\n.scope-manager-tabs[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 8px;\n flex-wrap: wrap;\n}\n\n.scope-manager-tab[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 6px 12px;\n color: var(--mj-text-secondary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 4px;\n transition: background 120ms ease, color 120ms ease;\n}\n\n.scope-manager-tab[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.scope-manager-tab.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom: 2px solid var(--mj-brand-primary);\n border-radius: 0;\n font-weight: 500;\n}\n\n.scope-manager-tab-spacer[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.scope-manager-save-btn[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 6px 14px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-save-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.scope-manager-delete-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-status-error-text);\n padding: 6px 10px;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.scope-manager-delete-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error-border);\n}\n\n.scope-manager-open-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-primary);\n padding: 6px 12px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-open-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.scope-definition-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px 16px;\n}\n\n.scope-definition-grid[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n}\n\n.scope-definition-grid[_ngcontent-%COMP%] label[_ngcontent-%COMP%] > span[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.scope-definition-full[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.scope-definition-toggle[_ngcontent-%COMP%] {\n flex-direction: row;\n align-items: center;\n gap: 8px;\n}\n\n.scope-definition-toggle[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n accent-color: var(--mj-brand-primary);\n}\n\n.scope-code-block[_ngcontent-%COMP%] {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n padding: 8px;\n}\n\n\n\n\n\n.search-analytics-kpi-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 12px;\n margin: 16px 0;\n}\n\n.search-analytics-kpi[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 14px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n}\n\n.search-analytics-kpi-label[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.search-analytics-kpi-value[_ngcontent-%COMP%] {\n font-size: 1.6rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-kpi-hint[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.72rem;\n}\n\n.search-analytics-h3[_ngcontent-%COMP%] {\n margin: 22px 0 8px;\n font-size: 1rem;\n color: var(--mj-text-primary);\n}\n\n.search-analytics-empty[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.85rem;\n margin: 4px 0 14px;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.86rem;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 6px 10px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 6px 10px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.search-analytics-refresh[_ngcontent-%COMP%] {\n margin-top: 16px;\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.9rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.82rem;\n}\n\n.search-analytics-refresh[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n\n.search-permissions-loading[_ngcontent-%COMP%] {\n padding: 1.2rem;\n color: var(--mj-text-secondary);\n font-style: italic;\n}\n\n.search-permissions-filters[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr 180px 130px;\n gap: 0.5rem;\n margin-bottom: 0.8rem;\n}\n\n.search-permissions-filters[_ngcontent-%COMP%] .mj-input[_ngcontent-%COMP%] {\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n font-size: 0.85rem;\n}\n\n.search-permissions-summary[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n margin-bottom: 0.6rem;\n}\n\n.search-permissions-empty[_ngcontent-%COMP%] {\n padding: 1.2rem;\n color: var(--mj-text-muted);\n text-align: center;\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n}\n\n.search-permissions-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.85rem;\n}\n\n.search-permissions-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n.search-permissions-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 0.5rem 0.7rem;\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n}\n\n.search-permissions-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n}\n\n.search-permissions-secondary[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n}\n\n.search-permissions-tag[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 0.1rem 0.5rem;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border-radius: 3px;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.search-permissions-level[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 0.15rem 0.55rem;\n border-radius: 3px;\n font-size: 0.78rem;\n font-weight: 500;\n}\n\n.search-permissions-level-none[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n}\n\n.search-permissions-level-read[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 12%, var(--mj-bg-surface));\n color: var(--mj-status-info-text);\n}\n\n.search-permissions-level-search[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n.search-permissions-level-manage[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}"] });
|
|
2358
|
+
i0.ɵɵadvance(3);
|
|
2359
|
+
i0.ɵɵconditional(ctx.HasUnsavedChanges ? 3 : -1);
|
|
2360
|
+
i0.ɵɵadvance(2);
|
|
2361
|
+
i0.ɵɵconditional(ctx.HasUnsavedChanges ? 5 : -1);
|
|
2362
|
+
i0.ɵɵadvance();
|
|
2363
|
+
i0.ɵɵproperty("Flex", true)("Padding", false);
|
|
2364
|
+
i0.ɵɵadvance();
|
|
2365
|
+
i0.ɵɵconditional(ctx.IsLoading ? 7 : 8);
|
|
2366
|
+
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.RangeValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.MaxValidator, i1.NgModel, i2.LoadingComponent, i3.SearchScopeChildGridComponent, i4.MJButtonDirective, i4.MJPageHeaderComponent, i4.MJPageLayoutComponent, i4.MJPageBodyComponent, i4.MJPageHeaderInteriorComponent, i4.MJPageBodyInteriorComponent, i4.MJLeftNavComponent, i4.MJLeftNavContentComponent, i4.MJStatBadgeComponent, i5.SchedulingResourceComponent, i6.LowerCasePipe, i6.DecimalPipe], styles: ["\n\n\n\n.config-loading[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 400px;\n}\n\n\n\n\n\n\n\n.config-layout[_ngcontent-%COMP%] {\n display: flex;\n height: 100%;\n min-height: 500px;\n}\n\n\n\n\n\n\n\n.config-section[_ngcontent-%COMP%] {\n max-width: 700px;\n}\n\n\n\n.config-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.config-toggle-row[_ngcontent-%COMP%], \n.config-field-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n border-radius: 8px;\n transition: background 0.1s ease;\n gap: 1rem;\n}\n\n.config-toggle-row[_ngcontent-%COMP%]:hover, \n.config-field-row[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.config-toggle-info[_ngcontent-%COMP%], \n.config-field-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.15rem;\n flex: 1;\n}\n\n.config-label[_ngcontent-%COMP%] {\n font-weight: 500;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n}\n\n.config-hint[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.config-checkbox[_ngcontent-%COMP%] {\n width: 1.1rem;\n height: 1.1rem;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n}\n\n.config-input[_ngcontent-%COMP%] {\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n font-family: inherit;\n}\n\n.config-input-number[_ngcontent-%COMP%] {\n width: 80px;\n text-align: center;\n}\n\n.config-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.config-slider[_ngcontent-%COMP%] {\n width: 200px;\n accent-color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.config-value-display[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n padding: 0.3rem 0.6rem;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-family: monospace;\n}\n\n\n\n.config-placeholder[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 1.5rem;\n text-align: center;\n gap: 1rem;\n color: var(--mj-text-muted);\n}\n\n.config-placeholder-icon[_ngcontent-%COMP%] {\n font-size: 2.5rem;\n}\n\n\n\n\n.setup-progress[_ngcontent-%COMP%] {\n margin-bottom: 1.5rem;\n padding: 1rem 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n}\n\n.setup-progress-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.5rem;\n}\n\n.setup-progress-label[_ngcontent-%COMP%] {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.setup-progress-count[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.setup-progress-bar[_ngcontent-%COMP%] {\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.setup-progress-fill[_ngcontent-%COMP%] {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n transition: width 0.4s ease;\n}\n\n\n\n\n.setup-step[_ngcontent-%COMP%] {\n padding: 1rem 1.25rem;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n margin-bottom: 0.75rem;\n transition: border-color 0.2s;\n}\n\n.setup-step-complete[_ngcontent-%COMP%] {\n border-color: var(--mj-status-success-border);\n background: color-mix(in srgb, var(--mj-status-success) 3%, var(--mj-bg-surface));\n}\n\n.setup-step-pending[_ngcontent-%COMP%] {\n border-color: var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.setup-step-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 0.85rem;\n}\n\n.setup-step-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex-shrink: 0;\n margin-top: 1px;\n}\n\n.setup-step-complete[_ngcontent-%COMP%] .setup-step-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n color: var(--mj-status-success);\n}\n\n.setup-step-number[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n font-weight: 700;\n}\n\n.setup-step-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n flex: 1;\n}\n\n.setup-step-title[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.setup-step-status[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.setup-step-complete[_ngcontent-%COMP%] .setup-step-status[_ngcontent-%COMP%] {\n color: var(--mj-status-success-text);\n}\n\n\n\n\n.config-group-title[_ngcontent-%COMP%] {\n margin: 0 0 0.75rem 0;\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n\n\n\n.config-status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 0.75rem;\n font-weight: 600;\n}\n\n.config-status-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n\n\n\n.setup-step-detail[_ngcontent-%COMP%] {\n margin-top: 0.75rem;\n padding-left: 2.85rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.setup-step-action[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s;\n flex-shrink: 0;\n}\n\n.setup-step-action[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n\n\n\n.provider-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n}\n\n.provider-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.provider-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.provider-name[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.provider-class[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n font-family: monospace;\n}\n\n\n\n\n.provider-credential-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 1rem 0.75rem;\n margin-top: -0.25rem;\n}\n\n.provider-credential-label[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.provider-credential-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.provider-credential-picker[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex: 1;\n min-width: 0;\n}\n\n.provider-credential-select[_ngcontent-%COMP%] {\n flex: 1;\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.8rem;\n}\n\n.provider-credential-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.provider-credential-spinner[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n}\n\n\n\n\n.index-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n transition: border-color 0.15s;\n}\n\n.index-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-default);\n}\n\n.index-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.index-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.index-name[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.index-meta[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 3px;\n}\n\n.index-meta[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.65rem;\n}\n\n.index-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex-shrink: 0;\n}\n\n.index-delete-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.index-delete-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error);\n}\n\n\n\n\n.create-index-form[_ngcontent-%COMP%] {\n margin-top: 0.75rem;\n padding: 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 2px solid var(--mj-brand-primary);\n border-radius: 10px;\n margin-left: 2.85rem;\n}\n\n.create-index-title[_ngcontent-%COMP%] {\n margin: 0 0 1rem 0;\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.create-index-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.create-index-fields[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.85rem;\n}\n\n.create-index-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.create-index-label[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.config-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n}\n\n.config-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.create-index-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n margin-top: 1rem;\n}\n\n.create-index-submit[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 18px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s;\n}\n\n.create-index-submit[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.create-index-submit[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.create-index-cancel[_ngcontent-%COMP%] {\n padding: 8px 18px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.create-index-cancel[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n.config-empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 2rem;\n text-align: center;\n gap: 0.75rem;\n border: 2px dashed var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface-sunken);\n}\n\n.config-empty-icon[_ngcontent-%COMP%] {\n font-size: 2.5rem;\n color: var(--mj-text-disabled);\n}\n\n.config-empty-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.config-empty-text[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.85rem;\n color: var(--mj-text-muted);\n max-width: 480px;\n line-height: 1.5;\n}\n\n\n\n.config-tag-list[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.config-tag[_ngcontent-%COMP%] {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 500;\n}\n\n\n\n.config-section-note[_ngcontent-%COMP%] {\n margin-top: 1rem;\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.config-section-note[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-info);\n}\n\n\n\n.config-save-bar[_ngcontent-%COMP%] {\n position: sticky;\n bottom: 0;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n margin-top: 2rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n}\n\n.config-save-text[_ngcontent-%COMP%] {\n flex: 1;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n}\n\n.config-save-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.5rem 1rem;\n border-radius: 6px;\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.85rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.config-save-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.config-save-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.config-reset-btn[_ngcontent-%COMP%] {\n padding: 0.5rem 0.75rem;\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n cursor: pointer;\n}\n\n.config-reset-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n@media (max-width: 768px) {\n .config-layout[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .config-nav[_ngcontent-%COMP%] {\n width: 100%;\n flex-direction: row;\n overflow-x: auto;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 0;\n }\n\n .config-nav-header[_ngcontent-%COMP%] {\n display: none;\n }\n\n .config-nav-item[_ngcontent-%COMP%] {\n white-space: nowrap;\n padding: 0.6rem 1rem;\n }\n\n .config-nav-item-active[_ngcontent-%COMP%] {\n border-left: none;\n border-bottom: 3px solid var(--mj-brand-primary);\n }\n\n .config-content[_ngcontent-%COMP%] {\n padding: 1rem;\n }\n}\n\n\n\n.fts-entity-controls[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.fts-summary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n}\n\n.fts-summary-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.fts-filter-input[_ngcontent-%COMP%] {\n max-width: 240px;\n}\n\n.fts-entity-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.fts-entity-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: border-color 0.15s, background 0.15s;\n}\n\n.fts-entity-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.fts-entity-card.fts-entity-enabled[_ngcontent-%COMP%] {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-brand-primary) 3%, var(--mj-bg-surface));\n}\n\n.fts-entity-toggle[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.fts-entity-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.fts-entity-name[_ngcontent-%COMP%] {\n display: block;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.fts-entity-fields[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.fts-field-tag[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 1px 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n}\n\n.fts-entity-meta[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 2px;\n flex-shrink: 0;\n}\n\n.fts-entity-title-field[_ngcontent-%COMP%], \n.fts-entity-snippet-field[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.fts-entity-title-field[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.fts-entity-snippet-field[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 4px;\n font-size: 10px;\n}\n\n\n\n\n.scope-manager[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 260px 1fr;\n gap: 16px;\n min-height: 420px;\n}\n\n.scope-manager-list[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.scope-manager-list-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 4px 6px 8px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.scope-manager-new-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-link);\n padding: 3px 8px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.7rem;\n font-weight: 500;\n text-transform: none;\n letter-spacing: normal;\n}\n\n.scope-manager-new-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-brand-primary);\n}\n\n.scope-manager-loading[_ngcontent-%COMP%], \n.scope-manager-empty[_ngcontent-%COMP%], \n.scope-manager-empty-detail[_ngcontent-%COMP%] {\n padding: 16px;\n color: var(--mj-text-muted);\n text-align: center;\n font-size: 0.85rem;\n}\n\n.scope-manager-empty-detail[_ngcontent-%COMP%] {\n padding: 40px 24px;\n background: var(--mj-bg-surface-card);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n}\n\n.scope-manager-list-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 6px;\n text-align: left;\n transition: background 120ms ease;\n}\n\n.scope-manager-list-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.scope-manager-list-item.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n.scope-manager-list-name[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.scope-manager-badge[_ngcontent-%COMP%] {\n font-size: 0.625rem;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.scope-manager-detail[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-width: 0;\n}\n\n.scope-manager-tabs[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 8px;\n flex-wrap: wrap;\n}\n\n.scope-manager-tab[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 6px 12px;\n color: var(--mj-text-secondary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 4px;\n transition: background 120ms ease, color 120ms ease;\n}\n\n.scope-manager-tab[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.scope-manager-tab.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom: 2px solid var(--mj-brand-primary);\n border-radius: 0;\n font-weight: 500;\n}\n\n.scope-manager-tab-spacer[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.scope-manager-save-btn[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 6px 14px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-save-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.scope-manager-delete-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-status-error-text);\n padding: 6px 10px;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.scope-manager-delete-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error-border);\n}\n\n.scope-manager-open-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-primary);\n padding: 6px 12px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-open-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.scope-definition-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px 16px;\n}\n\n.scope-definition-grid[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n}\n\n.scope-definition-grid[_ngcontent-%COMP%] label[_ngcontent-%COMP%] > span[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.scope-definition-full[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.scope-definition-toggle[_ngcontent-%COMP%] {\n flex-direction: row;\n align-items: center;\n gap: 8px;\n}\n\n.scope-definition-toggle[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n accent-color: var(--mj-brand-primary);\n}\n\n.scope-code-block[_ngcontent-%COMP%] {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n padding: 8px;\n}\n\n\n\n\n\n.search-analytics-kpi-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 12px;\n margin: 16px 0;\n}\n\n.search-analytics-kpi[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 14px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n}\n\n.search-analytics-kpi-label[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.search-analytics-kpi-value[_ngcontent-%COMP%] {\n font-size: 1.6rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-kpi-hint[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.72rem;\n}\n\n.search-analytics-h3[_ngcontent-%COMP%] {\n margin: 22px 0 8px;\n font-size: 1rem;\n color: var(--mj-text-primary);\n}\n\n.search-analytics-empty[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.85rem;\n margin: 4px 0 14px;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.86rem;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 6px 10px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 6px 10px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.search-analytics-refresh[_ngcontent-%COMP%] {\n margin-top: 16px;\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.9rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.82rem;\n}\n\n.search-analytics-refresh[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n\n.search-permissions-loading[_ngcontent-%COMP%] {\n padding: 1.2rem;\n color: var(--mj-text-secondary);\n font-style: italic;\n}\n\n.search-permissions-filters[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr 180px 130px;\n gap: 0.5rem;\n margin-bottom: 0.8rem;\n}\n\n.search-permissions-filters[_ngcontent-%COMP%] .mj-input[_ngcontent-%COMP%] {\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n font-size: 0.85rem;\n}\n\n.search-permissions-summary[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n margin-bottom: 0.6rem;\n}\n\n.search-permissions-empty[_ngcontent-%COMP%] {\n padding: 1.2rem;\n color: var(--mj-text-muted);\n text-align: center;\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n}\n\n.search-permissions-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.85rem;\n}\n\n.search-permissions-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n.search-permissions-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 0.5rem 0.7rem;\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n}\n\n.search-permissions-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n}\n\n.search-permissions-secondary[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n}\n\n.search-permissions-tag[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 0.1rem 0.5rem;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border-radius: 3px;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.search-permissions-level[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 0.15rem 0.55rem;\n border-radius: 3px;\n font-size: 0.78rem;\n font-weight: 500;\n}\n\n.search-permissions-level-none[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n}\n\n.search-permissions-level-read[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 12%, var(--mj-bg-surface));\n color: var(--mj-status-info-text);\n}\n\n.search-permissions-level-search[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n.search-permissions-level-manage[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}"] });
|
|
2380
2367
|
};
|
|
2381
2368
|
KnowledgeConfigResourceComponent = __decorate([
|
|
2382
2369
|
RegisterClass(BaseResourceComponent, 'KnowledgeConfigResource')
|
|
@@ -2384,9 +2371,9 @@ KnowledgeConfigResourceComponent = __decorate([
|
|
|
2384
2371
|
export { KnowledgeConfigResourceComponent };
|
|
2385
2372
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(KnowledgeConfigResourceComponent, [{
|
|
2386
2373
|
type: Component,
|
|
2387
|
-
args: [{ standalone: false, selector: 'app-knowledge-config-resource', template: "@if (IsLoading) {\n <div class=\"config-loading\">\n <mj-loading text=\"Loading configuration...\" size=\"medium\"></mj-loading>\n </div>\n} @else {\n <div class=\"config-layout\">\n <!-- Left Navigation -->\n <nav class=\"config-nav\">\n <div class=\"config-nav-header\">\n <i class=\"fa-solid fa-cogs\"></i>\n <span>Configuration</span>\n </div>\n @for (section of Sections; track section.ID) {\n <button\n class=\"config-nav-item\"\n [class.config-nav-item-active]=\"ActiveSection === section.ID\"\n (click)=\"SelectSection(section.ID)\"\n >\n <i [class]=\"section.Icon\"></i>\n <span>{{ section.Label }}</span>\n </button>\n }\n </nav>\n\n <!-- Content Area -->\n <div class=\"config-content\">\n <!-- Pipeline Settings -->\n @if (ActiveSection === 'pipeline') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Pipeline Settings</h2>\n <p class=\"config-section-desc\">Configure how the Knowledge Pipeline processes incoming content.</p>\n\n <div class=\"config-group\">\n <label class=\"config-toggle-row\">\n <div class=\"config-toggle-info\">\n <span class=\"config-label\">Auto-tag on Ingest</span>\n <span class=\"config-hint\">Automatically run autotagging when new content is ingested</span>\n </div>\n <input type=\"checkbox\" [(ngModel)]=\"PipelineSettings.AutotagOnIngest\" (change)=\"OnSettingChanged()\" class=\"config-checkbox\" />\n </label>\n\n <label class=\"config-toggle-row\">\n <div class=\"config-toggle-info\">\n <span class=\"config-label\">Vectorize on Ingest</span>\n <span class=\"config-hint\">Automatically create embeddings for new content</span>\n </div>\n <input type=\"checkbox\" [(ngModel)]=\"PipelineSettings.VectorizeOnIngest\" (change)=\"OnSettingChanged()\" class=\"config-checkbox\" />\n </label>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Default Batch Size</span>\n <span class=\"config-hint\">Number of items processed per batch</span>\n </div>\n <input type=\"number\" [(ngModel)]=\"PipelineSettings.DefaultBatchSize\" (input)=\"OnSettingChanged()\" class=\"config-input config-input-number\" min=\"10\" max=\"1000\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Max Concurrent Jobs</span>\n <span class=\"config-hint\">Maximum number of pipeline jobs running at once</span>\n </div>\n <input type=\"number\" [(ngModel)]=\"PipelineSettings.MaxConcurrentJobs\" (input)=\"OnSettingChanged()\" class=\"config-input config-input-number\" min=\"1\" max=\"10\" />\n </div>\n </div>\n </div>\n }\n\n <!-- Vector Database Settings -->\n @if (ActiveSection === 'vectordb') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Vector Database</h2>\n <p class=\"config-section-desc\">Manage the shared vector index and database connection.</p>\n\n <!-- Setup Progress -->\n <div class=\"setup-progress\">\n <div class=\"setup-progress-header\">\n <span class=\"setup-progress-label\">Setup Progress</span>\n <span class=\"setup-progress-count\">{{ SetupStepsCompleted }} of 3 complete</span>\n </div>\n <div class=\"setup-progress-bar\">\n <div class=\"setup-progress-fill\" [style.width.%]=\"(SetupStepsCompleted / 3) * 100\"></div>\n </div>\n </div>\n\n <!-- Step 1: Providers -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasVectorDBProvider\" [class.setup-step-pending]=\"!HasVectorDBProvider\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasVectorDBProvider) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">1</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Vector Database Providers</span>\n @if (HasVectorDBProvider) {\n <span class=\"setup-step-status\">{{ VectorDBProviders.length }} provider(s) registered</span>\n } @else {\n <span class=\"setup-step-status\">No providers registered. Add a vector database provider (e.g., Pinecone, Weaviate) via the admin console.</span>\n }\n </div>\n </div>\n @if (HasVectorDBProvider) {\n <div class=\"setup-step-detail\">\n @for (provider of VectorDBProviders; track provider.ID) {\n <div class=\"provider-card\">\n <div class=\"provider-icon\">\n <i class=\"fa-solid fa-database\"></i>\n </div>\n <div class=\"provider-info\">\n <span class=\"provider-name\">{{ provider.Name }}</span>\n <span class=\"provider-class\">{{ provider.ClassKey }}</span>\n </div>\n <span class=\"config-status-badge config-status-active\">\n <i class=\"fa-solid fa-circle-check\"></i> Active\n </span>\n </div>\n <div class=\"provider-credential-row\">\n <label class=\"provider-credential-label\">\n <i class=\"fa-solid fa-key\"></i> API Credential\n </label>\n <div class=\"provider-credential-picker\">\n <select class=\"provider-credential-select\"\n [(ngModel)]=\"provider.CredentialID\"\n (change)=\"SaveProviderCredential(provider)\"\n [disabled]=\"IsSavingCredential\">\n <option [ngValue]=\"null\">None (use environment variable)</option>\n @for (cred of AvailableCredentials; track cred.ID) {\n <option [ngValue]=\"cred.ID\">{{ cred.Name }}</option>\n }\n </select>\n @if (IsSavingCredential) {\n <i class=\"fa-solid fa-spinner fa-spin provider-credential-spinner\"></i>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Step 2: Embedding Model -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasEmbeddingModel\" [class.setup-step-pending]=\"!HasEmbeddingModel\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasEmbeddingModel) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">2</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Embedding Models</span>\n @if (HasEmbeddingModel) {\n <span class=\"setup-step-status\">{{ EmbeddingModels.length }} model(s) available</span>\n } @else {\n <span class=\"setup-step-status\">No embedding models found. Configure at least one in the AI app > Models tab.</span>\n }\n </div>\n </div>\n @if (HasEmbeddingModel) {\n <div class=\"setup-step-detail\">\n <div class=\"config-tag-list\">\n @for (model of EmbeddingModels; track model.ID) {\n <span class=\"config-tag\">{{ model.Name }}</span>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Step 3: Vector Indexes -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasVectorIndex\" [class.setup-step-pending]=\"!HasVectorIndex\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasVectorIndex) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">3</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Vector Indexes</span>\n @if (HasVectorIndex) {\n <span class=\"setup-step-status\">{{ VectorIndexes.length }} index(es) configured</span>\n } @else if (HasVectorDBProvider && HasEmbeddingModel) {\n <span class=\"setup-step-status\">No indexes yet \u2014 create one below.</span>\n } @else {\n <span class=\"setup-step-status\">Complete steps 1 and 2 first.</span>\n }\n </div>\n @if (HasVectorDBProvider && HasEmbeddingModel && !ShowCreateIndexForm) {\n <button class=\"setup-step-action\" (click)=\"OpenCreateIndexForm()\">\n <i class=\"fa-solid fa-plus\"></i> Create Index\n </button>\n }\n </div>\n\n <!-- Existing Indexes -->\n @if (HasVectorIndex) {\n <div class=\"setup-step-detail\">\n @for (idx of VectorIndexes; track idx.ID) {\n <div class=\"index-card\">\n <div class=\"index-icon\">\n <i class=\"fa-solid fa-cubes\"></i>\n </div>\n <div class=\"index-info\">\n <span class=\"index-name\">{{ idx.Name }}</span>\n <span class=\"index-meta\">\n <i class=\"fa-solid fa-database\"></i> {{ idx.VectorDatabase }}\n \u00B7 \n <i class=\"fa-solid fa-microchip\"></i> {{ idx.EmbeddingModel }}\n </span>\n </div>\n <div class=\"index-actions\">\n <span class=\"config-status-badge config-status-active\">\n <i class=\"fa-solid fa-circle-check\"></i> Active\n </span>\n <button class=\"index-delete-btn\" (click)=\"DeleteIndex(idx.ID)\" title=\"Delete index\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Create Index Form -->\n @if (ShowCreateIndexForm) {\n <div class=\"create-index-form\">\n <h4 class=\"create-index-title\">\n <i class=\"fa-solid fa-plus-circle\"></i> Create New Vector Index\n </h4>\n <div class=\"create-index-fields\">\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Index Name</label>\n <input type=\"text\"\n class=\"config-input\"\n [(ngModel)]=\"NewIndexName\"\n placeholder=\"e.g., mj-knowledge-index\" />\n </div>\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Vector Database</label>\n <select class=\"config-select\" [(ngModel)]=\"NewIndexVectorDBID\">\n @for (db of VectorDBProviders; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Embedding Model</label>\n <select class=\"config-select\" [(ngModel)]=\"NewIndexEmbeddingModelID\">\n @for (model of EmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"create-index-actions\">\n <button class=\"create-index-submit\" (click)=\"CreateIndex()\" [disabled]=\"IsCreatingIndex\">\n @if (IsCreatingIndex) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Creating...\n } @else {\n <i class=\"fa-solid fa-plus\"></i> Create Index\n }\n </button>\n <button class=\"create-index-cancel\" (click)=\"CancelCreateIndex()\" [disabled]=\"IsCreatingIndex\">\n Cancel\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Full-Text Indexes -->\n @if (ActiveSection === 'fulltext') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Full-Text Search Entities</h2>\n <p class=\"config-section-desc\">Configure which entities are included in full-text search. Entities with text fields (Name, Description, etc.) are automatically discovered.</p>\n\n @if (IsLoadingFTSEntities) {\n <mj-loading text=\"Discovering searchable entities...\" size=\"medium\"></mj-loading>\n } @else if (FTSEntities.length === 0) {\n <div class=\"config-empty-state\">\n <i class=\"fa-solid fa-text-width config-empty-icon\"></i>\n <h3 class=\"config-empty-title\">No Searchable Entities Found</h3>\n <p class=\"config-empty-text\">No entities with text fields were discovered. Ensure your database schema includes entities with varchar/nvarchar columns.</p>\n </div>\n } @else {\n <div class=\"fts-entity-controls\">\n <div class=\"fts-summary\">\n <span class=\"fts-summary-count\">{{ EnabledFTSCount }} of {{ FTSEntities.length }} entities enabled for search</span>\n <input type=\"text\" class=\"config-input fts-filter-input\" placeholder=\"Filter entities...\" [(ngModel)]=\"FTSFilterText\" />\n </div>\n </div>\n\n <div class=\"fts-entity-list\">\n @for (entity of FilteredFTSEntities; track entity.EntityName) {\n <div class=\"fts-entity-card\" [class.fts-entity-enabled]=\"entity.Enabled\">\n <div class=\"fts-entity-toggle\">\n <input type=\"checkbox\" [(ngModel)]=\"entity.Enabled\" (change)=\"OnFTSEntityToggled(entity)\" class=\"config-checkbox\" />\n </div>\n <div class=\"fts-entity-info\">\n <span class=\"fts-entity-name\">{{ entity.EntityName }}</span>\n <div class=\"fts-entity-fields\">\n @for (field of entity.IndexedFields; track field) {\n <span class=\"fts-field-tag\">{{ field }}</span>\n }\n </div>\n </div>\n <div class=\"fts-entity-meta\">\n <span class=\"fts-entity-title-field\" title=\"Title field\">\n <i class=\"fa-solid fa-heading\"></i> {{ entity.TitleField }}\n </span>\n @if (entity.SnippetField !== entity.TitleField) {\n <span class=\"fts-entity-snippet-field\" title=\"Snippet field\">\n <i class=\"fa-solid fa-align-left\"></i> {{ entity.SnippetField }}\n </span>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Embedding Models -->\n @if (ActiveSection === 'embedding') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Embedding Models</h2>\n <p class=\"config-section-desc\">AI models used for generating vector embeddings from text.</p>\n\n @if (HasEmbeddingModel) {\n <div class=\"config-group\">\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Active Model</span>\n <span class=\"config-hint\">Currently selected embedding model</span>\n </div>\n <span class=\"config-value-display\">{{ EmbeddingModelName }}</span>\n </div>\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Available Models</span>\n <span class=\"config-hint\">{{ EmbeddingModels.length }} embedding model(s) configured</span>\n </div>\n <div class=\"config-tag-list\">\n @for (model of EmbeddingModels; track model.ID) {\n <span class=\"config-tag\">{{ model.Name }}</span>\n }\n </div>\n </div>\n </div>\n <p class=\"config-section-note\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Manage embedding models in the AI Dashboard > Models tab.\n </p>\n } @else {\n <div class=\"config-empty-state\">\n <i class=\"fa-solid fa-microchip config-empty-icon\"></i>\n <h3 class=\"config-empty-title\">No Embedding Models Found</h3>\n <p class=\"config-empty-text\">\n Embedding models are required to convert text into vectors for semantic search and duplicate detection.\n Configure at least one embedding model (e.g., text-embedding-3-small) in the AI Dashboard > Models tab.\n </p>\n </div>\n }\n </div>\n }\n\n <!-- Thresholds -->\n @if (ActiveSection === 'thresholds') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Scoring Thresholds</h2>\n <p class=\"config-section-desc\">Set the scoring thresholds used by search, duplicate detection, and autotagging.</p>\n\n <div class=\"config-group\">\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Duplicate Absolute Match</span>\n <span class=\"config-hint\">Score above which duplicates are auto-confirmed ({{ FormatThreshold(ThresholdSettings.DuplicateAbsolute) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.DuplicateAbsolute\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.5\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Duplicate Potential Match</span>\n <span class=\"config-hint\">Score above which duplicates are flagged for review ({{ FormatThreshold(ThresholdSettings.DuplicatePotential) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.DuplicatePotential\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.3\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Search Relevance</span>\n <span class=\"config-hint\">Minimum score for search results ({{ FormatThreshold(ThresholdSettings.SearchRelevance) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.SearchRelevance\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Autotag Confidence</span>\n <span class=\"config-hint\">Minimum confidence for accepting auto-generated tags ({{ FormatThreshold(ThresholdSettings.AutotagConfidence) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.AutotagConfidence\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.3\" max=\"1\" step=\"0.01\" />\n </div>\n </div>\n </div>\n }\n\n <!-- Search Scopes Section -->\n @if (ActiveSection === 'search-scopes') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-compass-drafting\"></i> Search Scopes</h2>\n <p class=\"config-section-desc\">\n Define reusable search scopes that filter which providers, entities, external indexes, and storage accounts participate in a scoped search.\n Scopes can be assigned to AI agents for pre-execution RAG or agent-invoked search.\n </p>\n\n <div class=\"scope-manager\">\n <!-- Scope list -->\n <aside class=\"scope-manager-list\">\n <div class=\"scope-manager-list-header\">\n <span>Scopes ({{ SearchScopes.length }})</span>\n <button type=\"button\" class=\"scope-manager-new-btn\" (click)=\"CreateNewScope()\">\n <i class=\"fa-solid fa-plus\"></i> New\n </button>\n </div>\n @if (IsLoadingScopes) {\n <div class=\"scope-manager-loading\">Loading…</div>\n } @else if (SearchScopes.length === 0) {\n <div class=\"scope-manager-empty\">\n No scopes defined yet. Click <strong>New</strong> to create one.\n </div>\n } @else {\n @for (s of SearchScopes; track s.ID) {\n <button\n type=\"button\"\n class=\"scope-manager-list-item\"\n [class.active]=\"ActiveScopeID === s.ID\"\n (click)=\"SelectScope(s.ID)\">\n <i [class]=\"s.Icon || 'fa-solid fa-filter'\" aria-hidden=\"true\"></i>\n <span class=\"scope-manager-list-name\">{{ s.Name }}</span>\n @if (s.IsGlobal) {\n <span class=\"scope-manager-badge\">Global</span>\n } @else if (s.IsDefault) {\n <span class=\"scope-manager-badge\">Default</span>\n }\n </button>\n }\n }\n </aside>\n\n <!-- Scope detail -->\n <section class=\"scope-manager-detail\">\n @if (ActiveScope) {\n <!-- Tab strip -->\n <div class=\"scope-manager-tabs\">\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'definition'\" (click)=\"SelectScopeTab('definition')\">Definition</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'providers'\" (click)=\"SelectScopeTab('providers')\">Providers</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'indexes'\" (click)=\"SelectScopeTab('indexes')\">External Indexes</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'entities'\" (click)=\"SelectScopeTab('entities')\">Entities</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'storage'\" (click)=\"SelectScopeTab('storage')\">Storage</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'permissions'\" (click)=\"SelectScopeTab('permissions')\">Permissions</button>\n <div class=\"scope-manager-tab-spacer\"></div>\n @if (ActiveScope.ID) {\n <button type=\"button\" class=\"scope-manager-open-btn\"\n (click)=\"OpenActiveScopeFullForm()\"\n title=\"Open the full custom form for this scope (Live Preview, Fusion Weights, Reranker, Test Queries, Execution Logs)\">\n <i class=\"fa-solid fa-up-right-from-square\"></i> Open Full Form\n </button>\n }\n <button type=\"button\" class=\"scope-manager-save-btn\" (click)=\"SaveActiveScope()\">\n <i class=\"fa-solid fa-save\"></i> Save\n </button>\n @if (!ActiveScope.IsGlobal) {\n <button type=\"button\" class=\"scope-manager-delete-btn\" (click)=\"DeleteActiveScope()\" title=\"Delete scope\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n\n <!-- Definition tab -->\n @if (ActiveScopeTab === 'definition') {\n <div class=\"scope-definition-grid\">\n <label>\n <span>Name</span>\n <input type=\"text\" class=\"mj-input\" [value]=\"ActiveScope.Name\" (change)=\"ActiveScope.Name = $any($event.target).value\">\n </label>\n <label>\n <span>Icon (Font Awesome class)</span>\n <input type=\"text\" class=\"mj-input\" [value]=\"ActiveScope.Icon || ''\" (change)=\"ActiveScope.Icon = $any($event.target).value\">\n </label>\n <label class=\"scope-definition-full\">\n <span>Description</span>\n <textarea rows=\"2\" class=\"mj-textarea\" [value]=\"ActiveScope.Description || ''\" (change)=\"ActiveScope.Description = $any($event.target).value\"></textarea>\n </label>\n <label>\n <span>Status</span>\n <select class=\"mj-input\" [value]=\"ActiveScope.Status\" (change)=\"ActiveScope.Status = $any($event.target).value\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </label>\n <label>\n <span>Start at</span>\n <input type=\"datetime-local\" class=\"mj-input\" [value]=\"FormatScopeDate(ActiveScope.StartAt)\" (change)=\"SetScopeDate(ActiveScope, 'StartAt', $any($event.target).value)\">\n </label>\n <label>\n <span>End at</span>\n <input type=\"datetime-local\" class=\"mj-input\" [value]=\"FormatScopeDate(ActiveScope.EndAt)\" (change)=\"SetScopeDate(ActiveScope, 'EndAt', $any($event.target).value)\">\n </label>\n <label class=\"scope-definition-toggle\">\n <input type=\"checkbox\" [checked]=\"ActiveScope.IsDefault\" (change)=\"ActiveScope.IsDefault = $any($event.target).checked\" [disabled]=\"ActiveScope.IsGlobal\">\n <span>Default scope \u2014 picked when users/agents don't specify one</span>\n </label>\n <label class=\"scope-definition-toggle\">\n <input type=\"checkbox\" [checked]=\"ActiveScope.IsGlobal\" disabled>\n <span>Global \u2014 reserved for the built-in Global scope (read-only)</span>\n </label>\n <label class=\"scope-definition-full\">\n <span>Scope Config (JSON)</span>\n <textarea rows=\"4\" class=\"mj-textarea scope-code-block\" spellcheck=\"false\" [value]=\"ActiveScope.ScopeConfig || ''\" (change)=\"ActiveScope.ScopeConfig = $any($event.target).value\"></textarea>\n </label>\n <label class=\"scope-definition-full\">\n <span>Search Context Config (JSON)</span>\n <textarea rows=\"4\" class=\"mj-textarea scope-code-block\" spellcheck=\"false\" [value]=\"ActiveScope.SearchContextConfig || ''\" (change)=\"ActiveScope.SearchContextConfig = $any($event.target).value\"></textarea>\n </label>\n </div>\n }\n\n @if (ActiveScopeTab === 'providers') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Providers\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeProviderColumns\"\n AddButtonLabel=\"+ Add provider\"\n EmptyMessage=\"No providers assigned. Without any providers, this scope searches nothing.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'indexes') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope External Indexes\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeExternalIndexColumns\"\n AddButtonLabel=\"+ Add external index\"\n EmptyMessage=\"No external indexes configured for this scope.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'entities') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Entities\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeEntityColumns\"\n AddButtonLabel=\"+ Add entity\"\n EmptyMessage=\"No entities configured. Scoped entity search will return no rows.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'storage') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Storage Accounts\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeStorageColumns\"\n AddButtonLabel=\"+ Add storage folder\"\n EmptyMessage=\"No storage accounts linked to this scope.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'permissions') {\n <div class=\"scope-permissions-help\" style=\"margin-bottom: 12px; padding: 8px 12px; background: var(--mj-bg-surface-card); border-left: 3px solid var(--mj-brand-primary); border-radius: 4px;\">\n <p style=\"margin: 0; font-size: 0.95em;\">\n <i class=\"fa-solid fa-shield-halved\" style=\"color: var(--mj-brand-primary);\"></i>\n <strong>Per-user / per-role grants on this scope.</strong>\n Each row binds <em>either</em> a User <em>or</em> a Role (not both). Levels:\n <code>None</code> = explicit deny that overrides role grants,\n <code>Read</code> = view scope metadata,\n <code>Search</code> = invoke ScopedSearchAction,\n <code>Manage</code> = full edit including authoring permissions.\n Combined with <code>AIAgent.SearchScopeAccess</code> via the resolver \u2014 see the spec for the full resolution order.\n </p>\n </div>\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Permissions\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopePermissionColumns\"\n AddButtonLabel=\"+ Grant access\"\n EmptyMessage=\"No explicit grants. Access falls back to agent SearchScopeAccess only.\">\n </mj-search-scope-child-grid>\n }\n } @else {\n <div class=\"scope-manager-empty-detail\">\n Select a scope on the left, or click <strong>New</strong> to create one.\n </div>\n }\n </section>\n </div>\n </div>\n }\n\n <!-- Search Analytics Section (P3.3) \u2014 driven by SearchExecutionLog -->\n @if (ActiveSection === 'search-analytics') {\n <div class=\"config-section-content\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-chart-line\"></i> Search Analytics</h2>\n <p class=\"config-section-desc\">Aggregated metrics over the last 5,000 search invocations from <code>MJ: Search Execution Logs</code>. Use this to spot slow scopes, high-failure queries, or runaway reranker spend.</p>\n\n @if (AnalyticsLoading) {\n <mj-loading text=\"Loading analytics\u2026\" size=\"medium\"></mj-loading>\n } @else if (!AnalyticsLoaded) {\n <button class=\"mj-input\" type=\"button\" (click)=\"LoadSearchAnalytics()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Load analytics\n </button>\n } @else {\n <div class=\"search-analytics-kpi-grid\">\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Total runs</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsTotalRuns | number }}</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Success rate</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsSuccessRate }}%</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Hit rate</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsHitRate }}%</span>\n <span class=\"search-analytics-kpi-hint\">% of successful runs that returned \u22651 result</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Avg latency</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsAvgLatencyMs }}ms</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">P95 latency</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsP95LatencyMs }}ms</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Reranker spend</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsTotalRerankerCostCents | number:'1.0-2' }}\u00A2</span>\n </div>\n </div>\n\n <h3 class=\"search-analytics-h3\">Top scopes by volume</h3>\n @if (AnalyticsTopScopes.length === 0) {\n <p class=\"search-analytics-empty\">No runs in the window.</p>\n } @else {\n <table class=\"search-analytics-table\">\n <thead>\n <tr><th>Scope</th><th>Runs</th><th>Avg latency</th></tr>\n </thead>\n <tbody>\n @for (s of AnalyticsTopScopes; track s.ScopeID) {\n <tr>\n <td>{{ s.Name }}</td>\n <td>{{ s.Count | number }}</td>\n <td>{{ s.AvgLatencyMs }}ms</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <h3 class=\"search-analytics-h3\">Reranker spend by driver</h3>\n @if (AnalyticsRerankerSpend.length === 0) {\n <p class=\"search-analytics-empty\">No rerank invocations in the window.</p>\n } @else {\n <table class=\"search-analytics-table\">\n <thead>\n <tr><th>Reranker</th><th>Calls</th><th>Total cents</th></tr>\n </thead>\n <tbody>\n @for (r of AnalyticsRerankerSpend; track r.Reranker) {\n <tr>\n <td>{{ r.Reranker }}</td>\n <td>{{ r.Count | number }}</td>\n <td>{{ r.TotalCents | number:'1.0-2' }}\u00A2</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <h3 class=\"search-analytics-h3\">Top failure reasons</h3>\n @if (AnalyticsTopFailures.length === 0) {\n <p class=\"search-analytics-empty\">No failures in the window.</p>\n } @else {\n <table class=\"search-analytics-table\">\n <thead>\n <tr><th>Reason</th><th>Count</th></tr>\n </thead>\n <tbody>\n @for (f of AnalyticsTopFailures; track f.Reason) {\n <tr>\n <td>{{ f.Reason }}</td>\n <td>{{ f.Count | number }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <button class=\"mj-input search-analytics-refresh\" type=\"button\" (click)=\"LoadSearchAnalytics()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n }\n </div>\n }\n\n <!-- Permissions Audit Section (P2A.7) -->\n @if (ActiveSection === 'search-permissions') {\n <div class=\"config-section-content\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-shield-halved\"></i> Permissions</h2>\n <p class=\"config-section-desc\">\n Cross-scope view of every <code>SearchScopePermission</code> row. Filter by scope, by user/role, or by permission level to answer \"who has access to what\". Read-only \u2014 to add or edit a grant, open the SearchScope's full form and use its Permissions panel.\n </p>\n\n @if (PermissionsLoading) {\n <div class=\"search-permissions-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading permission rows...\n </div>\n }\n\n @if (PermissionsLoaded && !PermissionsLoading) {\n <div class=\"search-permissions-filters\">\n <input class=\"mj-input\" type=\"text\" placeholder=\"Filter by scope name...\" [(ngModel)]=\"PermissionsFilterScope\" />\n <input class=\"mj-input\" type=\"text\" placeholder=\"Filter by user/role (name or email)...\" [(ngModel)]=\"PermissionsFilterPrincipal\" />\n <select class=\"mj-input\" [(ngModel)]=\"PermissionsFilterLevel\">\n <option value=\"\">All levels</option>\n <option value=\"None\">None</option>\n <option value=\"Read\">Read</option>\n <option value=\"Search\">Search</option>\n <option value=\"Manage\">Manage</option>\n </select>\n <button class=\"mj-input\" type=\"button\" (click)=\"RefreshPermissionsAudit()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n </div>\n\n <div class=\"search-permissions-summary\">\n Showing {{ FilteredPermissionsRows.length }} of {{ PermissionsRows.length }} rows\n </div>\n\n @if (FilteredPermissionsRows.length === 0) {\n <div class=\"search-permissions-empty\">\n No permission rows match your filters.\n </div>\n } @else {\n <table class=\"search-permissions-table\">\n <thead>\n <tr>\n <th>Scope</th>\n <th>Principal</th>\n <th>Type</th>\n <th>Permission Level</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredPermissionsRows; track row.ID) {\n <tr>\n <td>{{ row.SearchScopeName }}</td>\n <td>\n @if (row.UserID) {\n {{ row.UserName }} <span class=\"search-permissions-secondary\">({{ row.UserEmail }})</span>\n } @else {\n {{ row.RoleName }}\n }\n </td>\n <td>\n @if (row.UserID) { <span class=\"search-permissions-tag\">User</span> }\n @if (row.RoleID) { <span class=\"search-permissions-tag\">Role</span> }\n </td>\n <td>\n <span class=\"search-permissions-level search-permissions-level-{{ row.PermissionLevel | lowercase }}\">{{ row.PermissionLevel }}</span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n }\n </div>\n }\n\n <!-- Scheduling Section -->\n @if (ActiveSection === 'scheduling') {\n <div class=\"config-section-content\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-clock\"></i> Scheduling</h2>\n <p class=\"config-section-desc\">Manage automated pipeline schedules for content classification and vector sync. Create schedules here or manage all schedules in the dedicated Scheduling app.</p>\n <div style=\"margin-top: 16px;\">\n <app-scheduling-resource></app-scheduling-resource>\n </div>\n </div>\n }\n\n <!-- Save Bar -->\n @if (HasUnsavedChanges) {\n <div class=\"config-save-bar\">\n <span class=\"config-save-text\">You have unsaved changes</span>\n <button class=\"config-save-btn\" (click)=\"SaveConfiguration()\" [disabled]=\"IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-save\"></i> Save Changes\n }\n </button>\n <button class=\"config-reset-btn\" (click)=\"ResetConfiguration()\" [disabled]=\"IsSaving\">\n Reset\n </button>\n </div>\n }\n </div>\n </div>\n}\n", styles: ["/* Knowledge Configuration - Settings Page with Left Nav */\n\n.config-loading {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 400px;\n}\n\n.config-layout {\n display: flex;\n height: 100%;\n min-height: 500px;\n}\n\n/* Left Navigation */\n.config-nav {\n width: 240px;\n border-right: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n padding: 0.5rem 0;\n}\n\n.config-nav-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n margin-bottom: 0.5rem;\n}\n\n.config-nav-item {\n display: flex;\n align-items: center;\n gap: 0.6rem;\n padding: 0.55rem 1rem;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n cursor: pointer;\n text-align: left;\n transition: all 0.15s ease;\n width: 100%;\n}\n\n.config-nav-item:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.config-nav-item-active {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n/* Content Area */\n.config-content {\n flex: 1;\n padding: 1.5rem 2rem;\n overflow-y: auto;\n position: relative;\n}\n\n.config-section {\n max-width: 700px;\n}\n\n.config-section-title {\n font-size: 1.3rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 0.5rem;\n}\n\n.config-section-desc {\n color: var(--mj-text-secondary);\n font-size: 0.9rem;\n margin-bottom: 1.5rem;\n line-height: 1.5;\n}\n\n/* Config Groups */\n.config-group {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.config-toggle-row,\n.config-field-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n border-radius: 8px;\n transition: background 0.1s ease;\n gap: 1rem;\n}\n\n.config-toggle-row:hover,\n.config-field-row:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.config-toggle-info,\n.config-field-info {\n display: flex;\n flex-direction: column;\n gap: 0.15rem;\n flex: 1;\n}\n\n.config-label {\n font-weight: 500;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n}\n\n.config-hint {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.config-checkbox {\n width: 1.1rem;\n height: 1.1rem;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n}\n\n.config-input {\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n font-family: inherit;\n}\n\n.config-input-number {\n width: 80px;\n text-align: center;\n}\n\n.config-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.config-slider {\n width: 200px;\n accent-color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.config-value-display {\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n padding: 0.3rem 0.6rem;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-family: monospace;\n}\n\n/* Placeholder */\n.config-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 1.5rem;\n text-align: center;\n gap: 1rem;\n color: var(--mj-text-muted);\n}\n\n.config-placeholder-icon {\n font-size: 2.5rem;\n}\n\n/* ---- Setup Progress Bar ---- */\n\n.setup-progress {\n margin-bottom: 1.5rem;\n padding: 1rem 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n}\n\n.setup-progress-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.5rem;\n}\n\n.setup-progress-label {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.setup-progress-count {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.setup-progress-bar {\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.setup-progress-fill {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n transition: width 0.4s ease;\n}\n\n/* ---- Setup Steps ---- */\n\n.setup-step {\n padding: 1rem 1.25rem;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n margin-bottom: 0.75rem;\n transition: border-color 0.2s;\n}\n\n.setup-step-complete {\n border-color: var(--mj-status-success-border);\n background: color-mix(in srgb, var(--mj-status-success) 3%, var(--mj-bg-surface));\n}\n\n.setup-step-pending {\n border-color: var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.setup-step-header {\n display: flex;\n align-items: flex-start;\n gap: 0.85rem;\n}\n\n.setup-step-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex-shrink: 0;\n margin-top: 1px;\n}\n\n.setup-step-complete .setup-step-indicator i {\n font-size: 1.25rem;\n color: var(--mj-status-success);\n}\n\n.setup-step-number {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n font-weight: 700;\n}\n\n.setup-step-info {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n flex: 1;\n}\n\n.setup-step-title {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.setup-step-status {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.setup-step-complete .setup-step-status {\n color: var(--mj-status-success-text);\n}\n\n/* ---- Config Group Title ---- */\n\n.config-group-title {\n margin: 0 0 0.75rem 0;\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n/* ---- Status Badge ---- */\n\n.config-status-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 0.75rem;\n font-weight: 600;\n}\n\n.config-status-active {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n/* ---- Step Detail Area ---- */\n\n.setup-step-detail {\n margin-top: 0.75rem;\n padding-left: 2.85rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.setup-step-action {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s;\n flex-shrink: 0;\n}\n\n.setup-step-action:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n/* ---- Provider Cards ---- */\n\n.provider-card {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n}\n\n.provider-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.provider-info {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.provider-name {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.provider-class {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n font-family: monospace;\n}\n\n/* ---- Provider Credential Row ---- */\n\n.provider-credential-row {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 1rem 0.75rem;\n margin-top: -0.25rem;\n}\n\n.provider-credential-label {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.provider-credential-label i {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.provider-credential-picker {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex: 1;\n min-width: 0;\n}\n\n.provider-credential-select {\n flex: 1;\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.8rem;\n}\n\n.provider-credential-select:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.provider-credential-spinner {\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n}\n\n/* ---- Index Cards ---- */\n\n.index-card {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n transition: border-color 0.15s;\n}\n\n.index-card:hover {\n border-color: var(--mj-border-default);\n}\n\n.index-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.index-info {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.index-name {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.index-meta {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 3px;\n}\n\n.index-meta i {\n font-size: 0.65rem;\n}\n\n.index-actions {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex-shrink: 0;\n}\n\n.index-delete-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.index-delete-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error);\n}\n\n/* ---- Create Index Form ---- */\n\n.create-index-form {\n margin-top: 0.75rem;\n padding: 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 2px solid var(--mj-brand-primary);\n border-radius: 10px;\n margin-left: 2.85rem;\n}\n\n.create-index-title {\n margin: 0 0 1rem 0;\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.create-index-title i {\n color: var(--mj-brand-primary);\n}\n\n.create-index-fields {\n display: flex;\n flex-direction: column;\n gap: 0.85rem;\n}\n\n.create-index-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.create-index-label {\n font-size: 0.78rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.config-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n}\n\n.config-select:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.create-index-actions {\n display: flex;\n gap: 8px;\n margin-top: 1rem;\n}\n\n.create-index-submit {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 18px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s;\n}\n\n.create-index-submit:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.create-index-submit:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.create-index-cancel {\n padding: 8px 18px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.create-index-cancel:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* Empty State for unconfigured sections */\n.config-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 2rem;\n text-align: center;\n gap: 0.75rem;\n border: 2px dashed var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface-sunken);\n}\n\n.config-empty-icon {\n font-size: 2.5rem;\n color: var(--mj-text-disabled);\n}\n\n.config-empty-title {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.config-empty-text {\n margin: 0;\n font-size: 0.85rem;\n color: var(--mj-text-muted);\n max-width: 480px;\n line-height: 1.5;\n}\n\n/* Tag list for showing multiple models */\n.config-tag-list {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.config-tag {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 500;\n}\n\n/* Section note */\n.config-section-note {\n margin-top: 1rem;\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.config-section-note i {\n color: var(--mj-status-info);\n}\n\n/* Save Bar */\n.config-save-bar {\n position: sticky;\n bottom: 0;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n margin-top: 2rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n}\n\n.config-save-text {\n flex: 1;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n}\n\n.config-save-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.5rem 1rem;\n border-radius: 6px;\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.85rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.config-save-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.config-save-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.config-reset-btn {\n padding: 0.5rem 0.75rem;\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n cursor: pointer;\n}\n\n.config-reset-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n}\n\n/* Mobile responsive */\n@media (max-width: 768px) {\n .config-layout {\n flex-direction: column;\n }\n\n .config-nav {\n width: 100%;\n flex-direction: row;\n overflow-x: auto;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 0;\n }\n\n .config-nav-header {\n display: none;\n }\n\n .config-nav-item {\n white-space: nowrap;\n padding: 0.6rem 1rem;\n }\n\n .config-nav-item-active {\n border-left: none;\n border-bottom: 3px solid var(--mj-brand-primary);\n }\n\n .config-content {\n padding: 1rem;\n }\n}\n\n/* Full-Text Search Entity Management */\n.fts-entity-controls {\n margin-bottom: 16px;\n}\n\n.fts-summary {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n}\n\n.fts-summary-count {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.fts-filter-input {\n max-width: 240px;\n}\n\n.fts-entity-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.fts-entity-card {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: border-color 0.15s, background 0.15s;\n}\n\n.fts-entity-card:hover {\n border-color: var(--mj-border-strong);\n}\n\n.fts-entity-card.fts-entity-enabled {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-brand-primary) 3%, var(--mj-bg-surface));\n}\n\n.fts-entity-toggle {\n flex-shrink: 0;\n}\n\n.fts-entity-info {\n flex: 1;\n min-width: 0;\n}\n\n.fts-entity-name {\n display: block;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.fts-entity-fields {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.fts-field-tag {\n display: inline-block;\n padding: 1px 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n}\n\n.fts-entity-meta {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 2px;\n flex-shrink: 0;\n}\n\n.fts-entity-title-field,\n.fts-entity-snippet-field {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.fts-entity-title-field i,\n.fts-entity-snippet-field i {\n margin-right: 4px;\n font-size: 10px;\n}\n\n/* ===== Search Scopes Manager ===== */\n\n.scope-manager {\n display: grid;\n grid-template-columns: 260px 1fr;\n gap: 16px;\n min-height: 420px;\n}\n\n.scope-manager-list {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.scope-manager-list-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 4px 6px 8px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.scope-manager-new-btn {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-link);\n padding: 3px 8px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.7rem;\n font-weight: 500;\n text-transform: none;\n letter-spacing: normal;\n}\n\n.scope-manager-new-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-brand-primary);\n}\n\n.scope-manager-loading,\n.scope-manager-empty,\n.scope-manager-empty-detail {\n padding: 16px;\n color: var(--mj-text-muted);\n text-align: center;\n font-size: 0.85rem;\n}\n\n.scope-manager-empty-detail {\n padding: 40px 24px;\n background: var(--mj-bg-surface-card);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n}\n\n.scope-manager-list-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 6px;\n text-align: left;\n transition: background 120ms ease;\n}\n\n.scope-manager-list-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.scope-manager-list-item.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n.scope-manager-list-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.scope-manager-badge {\n font-size: 0.625rem;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.scope-manager-detail {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-width: 0;\n}\n\n.scope-manager-tabs {\n display: flex;\n align-items: center;\n gap: 4px;\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 8px;\n flex-wrap: wrap;\n}\n\n.scope-manager-tab {\n background: transparent;\n border: none;\n padding: 6px 12px;\n color: var(--mj-text-secondary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 4px;\n transition: background 120ms ease, color 120ms ease;\n}\n\n.scope-manager-tab:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.scope-manager-tab.active {\n color: var(--mj-brand-primary);\n border-bottom: 2px solid var(--mj-brand-primary);\n border-radius: 0;\n font-weight: 500;\n}\n\n.scope-manager-tab-spacer {\n flex: 1;\n}\n\n.scope-manager-save-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 6px 14px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-save-btn:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.scope-manager-delete-btn {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-status-error-text);\n padding: 6px 10px;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.scope-manager-delete-btn:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error-border);\n}\n\n.scope-manager-open-btn {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-primary);\n padding: 6px 12px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-open-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.scope-definition-grid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px 16px;\n}\n\n.scope-definition-grid label {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n}\n\n.scope-definition-grid label > span {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.scope-definition-full {\n grid-column: 1 / -1;\n}\n\n.scope-definition-toggle {\n flex-direction: row;\n align-items: center;\n gap: 8px;\n}\n\n.scope-definition-toggle input[type=\"checkbox\"] {\n accent-color: var(--mj-brand-primary);\n}\n\n.scope-code-block {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n padding: 8px;\n}\n\n/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n Search Analytics section (P3.3)\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.search-analytics-kpi-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 12px;\n margin: 16px 0;\n}\n\n.search-analytics-kpi {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 14px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n}\n\n.search-analytics-kpi-label {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.search-analytics-kpi-value {\n font-size: 1.6rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-kpi-hint {\n color: var(--mj-text-muted);\n font-size: 0.72rem;\n}\n\n.search-analytics-h3 {\n margin: 22px 0 8px;\n font-size: 1rem;\n color: var(--mj-text-primary);\n}\n\n.search-analytics-empty {\n color: var(--mj-text-muted);\n font-size: 0.85rem;\n margin: 4px 0 14px;\n}\n\n.search-analytics-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.86rem;\n}\n\n.search-analytics-table thead th {\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 6px 10px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n.search-analytics-table tbody td {\n padding: 6px 10px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.search-analytics-refresh {\n margin-top: 16px;\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.9rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.82rem;\n}\n\n.search-analytics-refresh:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* \u2500\u2500\u2500 Permissions Audit (P2A.7) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.search-permissions-loading {\n padding: 1.2rem;\n color: var(--mj-text-secondary);\n font-style: italic;\n}\n\n.search-permissions-filters {\n display: grid;\n grid-template-columns: 1fr 1fr 180px 130px;\n gap: 0.5rem;\n margin-bottom: 0.8rem;\n}\n\n.search-permissions-filters .mj-input {\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n font-size: 0.85rem;\n}\n\n.search-permissions-summary {\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n margin-bottom: 0.6rem;\n}\n\n.search-permissions-empty {\n padding: 1.2rem;\n color: var(--mj-text-muted);\n text-align: center;\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n}\n\n.search-permissions-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.85rem;\n}\n\n.search-permissions-table th,\n.search-permissions-table td {\n padding: 0.5rem 0.7rem;\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n}\n\n.search-permissions-table th {\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n}\n\n.search-permissions-secondary {\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n}\n\n.search-permissions-tag {\n display: inline-block;\n padding: 0.1rem 0.5rem;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border-radius: 3px;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.search-permissions-level {\n display: inline-block;\n padding: 0.15rem 0.55rem;\n border-radius: 3px;\n font-size: 0.78rem;\n font-weight: 500;\n}\n\n.search-permissions-level-none {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n}\n\n.search-permissions-level-read {\n background: color-mix(in srgb, var(--mj-status-info) 12%, var(--mj-bg-surface));\n color: var(--mj-status-info-text);\n}\n\n.search-permissions-level-search {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n.search-permissions-level-manage {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n"] }]
|
|
2374
|
+
args: [{ standalone: false, selector: 'app-knowledge-config-resource', template: "<mj-page-layout>\n <mj-page-header\n Title=\"Knowledge Hub Configuration\"\n Icon=\"fa-solid fa-cogs\"\n Subtitle=\"Pipeline, vector store, search, and automation settings\">\n <div meta>\n @if (HasUnsavedChanges) {\n <mj-stat-badge\n Icon=\"fa-solid fa-circle-exclamation\"\n Label=\"Unsaved changes\"\n Variant=\"warning\">\n </mj-stat-badge>\n }\n </div>\n <div actions>\n @if (HasUnsavedChanges) {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"ResetConfiguration()\" [disabled]=\"IsSaving\" title=\"Discard unsaved changes\">\n <i class=\"fa-solid fa-arrow-rotate-left\"></i> Reset\n </button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"SaveConfiguration()\" [disabled]=\"IsSaving\" title=\"Save all settings\">\n <i class=\"fa-solid fa-floppy-disk\"></i> {{IsSaving ? 'Saving\u2026' : 'Save'}}\n </button>\n }\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\" [Padding]=\"false\">\n@if (IsLoading) {\n <div class=\"config-loading\">\n <mj-loading text=\"Loading configuration...\" size=\"medium\"></mj-loading>\n </div>\n} @else {\n <div class=\"config-layout\">\n <mj-left-nav\n [Sections]=\"navSections\"\n [ActiveId]=\"ActiveSection\"\n (ItemClicked)=\"onNavItemClicked($event)\">\n </mj-left-nav>\n\n <mj-left-nav-content>\n <mj-page-header-interior\n [Title]=\"currentSection?.Label || ''\"\n [Subtitle]=\"currentSection?.Description || ''\">\n </mj-page-header-interior>\n <mj-page-body-interior>\n <!-- Pipeline Settings -->\n @if (ActiveSection === 'pipeline') {\n <div class=\"config-section\">\n <div class=\"config-group\">\n <label class=\"config-toggle-row\">\n <div class=\"config-toggle-info\">\n <span class=\"config-label\">Auto-tag on Ingest</span>\n <span class=\"config-hint\">Automatically run autotagging when new content is ingested</span>\n </div>\n <input type=\"checkbox\" [(ngModel)]=\"PipelineSettings.AutotagOnIngest\" (change)=\"OnSettingChanged()\" class=\"config-checkbox\" />\n </label>\n\n <label class=\"config-toggle-row\">\n <div class=\"config-toggle-info\">\n <span class=\"config-label\">Vectorize on Ingest</span>\n <span class=\"config-hint\">Automatically create embeddings for new content</span>\n </div>\n <input type=\"checkbox\" [(ngModel)]=\"PipelineSettings.VectorizeOnIngest\" (change)=\"OnSettingChanged()\" class=\"config-checkbox\" />\n </label>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Default Batch Size</span>\n <span class=\"config-hint\">Number of items processed per batch</span>\n </div>\n <input type=\"number\" [(ngModel)]=\"PipelineSettings.DefaultBatchSize\" (input)=\"OnSettingChanged()\" class=\"config-input config-input-number\" min=\"10\" max=\"1000\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Max Concurrent Jobs</span>\n <span class=\"config-hint\">Maximum number of pipeline jobs running at once</span>\n </div>\n <input type=\"number\" [(ngModel)]=\"PipelineSettings.MaxConcurrentJobs\" (input)=\"OnSettingChanged()\" class=\"config-input config-input-number\" min=\"1\" max=\"10\" />\n </div>\n </div>\n </div>\n }\n\n <!-- Vector Database Settings -->\n @if (ActiveSection === 'vectordb') {\n <div class=\"config-section\">\n\n <!-- Setup Progress -->\n <div class=\"setup-progress\">\n <div class=\"setup-progress-header\">\n <span class=\"setup-progress-label\">Setup Progress</span>\n <span class=\"setup-progress-count\">{{ SetupStepsCompleted }} of 3 complete</span>\n </div>\n <div class=\"setup-progress-bar\">\n <div class=\"setup-progress-fill\" [style.width.%]=\"(SetupStepsCompleted / 3) * 100\"></div>\n </div>\n </div>\n\n <!-- Step 1: Providers -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasVectorDBProvider\" [class.setup-step-pending]=\"!HasVectorDBProvider\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasVectorDBProvider) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">1</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Vector Database Providers</span>\n @if (HasVectorDBProvider) {\n <span class=\"setup-step-status\">{{ VectorDBProviders.length }} provider(s) registered</span>\n } @else {\n <span class=\"setup-step-status\">No providers registered. Add a vector database provider (e.g., Pinecone, Weaviate) via the admin console.</span>\n }\n </div>\n </div>\n @if (HasVectorDBProvider) {\n <div class=\"setup-step-detail\">\n @for (provider of VectorDBProviders; track provider.ID) {\n <div class=\"provider-card\">\n <div class=\"provider-icon\">\n <i class=\"fa-solid fa-database\"></i>\n </div>\n <div class=\"provider-info\">\n <span class=\"provider-name\">{{ provider.Name }}</span>\n <span class=\"provider-class\">{{ provider.ClassKey }}</span>\n </div>\n <span class=\"config-status-badge config-status-active\">\n <i class=\"fa-solid fa-circle-check\"></i> Active\n </span>\n </div>\n <div class=\"provider-credential-row\">\n <label class=\"provider-credential-label\">\n <i class=\"fa-solid fa-key\"></i> API Credential\n </label>\n <div class=\"provider-credential-picker\">\n <select class=\"provider-credential-select\"\n [(ngModel)]=\"provider.CredentialID\"\n (change)=\"SaveProviderCredential(provider)\"\n [disabled]=\"IsSavingCredential\">\n <option [ngValue]=\"null\">None (use environment variable)</option>\n @for (cred of AvailableCredentials; track cred.ID) {\n <option [ngValue]=\"cred.ID\">{{ cred.Name }}</option>\n }\n </select>\n @if (IsSavingCredential) {\n <i class=\"fa-solid fa-spinner fa-spin provider-credential-spinner\"></i>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Step 2: Embedding Model -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasEmbeddingModel\" [class.setup-step-pending]=\"!HasEmbeddingModel\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasEmbeddingModel) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">2</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Embedding Models</span>\n @if (HasEmbeddingModel) {\n <span class=\"setup-step-status\">{{ EmbeddingModels.length }} model(s) available</span>\n } @else {\n <span class=\"setup-step-status\">No embedding models found. Configure at least one in the AI app > Models tab.</span>\n }\n </div>\n </div>\n @if (HasEmbeddingModel) {\n <div class=\"setup-step-detail\">\n <div class=\"config-tag-list\">\n @for (model of EmbeddingModels; track model.ID) {\n <span class=\"config-tag\">{{ model.Name }}</span>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Step 3: Vector Indexes -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasVectorIndex\" [class.setup-step-pending]=\"!HasVectorIndex\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasVectorIndex) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">3</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Vector Indexes</span>\n @if (HasVectorIndex) {\n <span class=\"setup-step-status\">{{ VectorIndexes.length }} index(es) configured</span>\n } @else if (HasVectorDBProvider && HasEmbeddingModel) {\n <span class=\"setup-step-status\">No indexes yet \u2014 create one below.</span>\n } @else {\n <span class=\"setup-step-status\">Complete steps 1 and 2 first.</span>\n }\n </div>\n @if (HasVectorDBProvider && HasEmbeddingModel && !ShowCreateIndexForm) {\n <button class=\"setup-step-action\" (click)=\"OpenCreateIndexForm()\">\n <i class=\"fa-solid fa-plus\"></i> Create Index\n </button>\n }\n </div>\n\n <!-- Existing Indexes -->\n @if (HasVectorIndex) {\n <div class=\"setup-step-detail\">\n @for (idx of VectorIndexes; track idx.ID) {\n <div class=\"index-card\">\n <div class=\"index-icon\">\n <i class=\"fa-solid fa-cubes\"></i>\n </div>\n <div class=\"index-info\">\n <span class=\"index-name\">{{ idx.Name }}</span>\n <span class=\"index-meta\">\n <i class=\"fa-solid fa-database\"></i> {{ idx.VectorDatabase }}\n \u00B7 \n <i class=\"fa-solid fa-microchip\"></i> {{ idx.EmbeddingModel }}\n </span>\n </div>\n <div class=\"index-actions\">\n <span class=\"config-status-badge config-status-active\">\n <i class=\"fa-solid fa-circle-check\"></i> Active\n </span>\n <button class=\"index-delete-btn\" (click)=\"DeleteIndex(idx.ID)\" title=\"Delete index\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Create Index Form -->\n @if (ShowCreateIndexForm) {\n <div class=\"create-index-form\">\n <h4 class=\"create-index-title\">\n <i class=\"fa-solid fa-plus-circle\"></i> Create New Vector Index\n </h4>\n <div class=\"create-index-fields\">\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Index Name</label>\n <input type=\"text\"\n class=\"config-input\"\n [(ngModel)]=\"NewIndexName\"\n placeholder=\"e.g., mj-knowledge-index\" />\n </div>\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Vector Database</label>\n <select class=\"config-select\" [(ngModel)]=\"NewIndexVectorDBID\">\n @for (db of VectorDBProviders; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Embedding Model</label>\n <select class=\"config-select\" [(ngModel)]=\"NewIndexEmbeddingModelID\">\n @for (model of EmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"create-index-actions\">\n <button class=\"create-index-submit\" (click)=\"CreateIndex()\" [disabled]=\"IsCreatingIndex\">\n @if (IsCreatingIndex) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Creating...\n } @else {\n <i class=\"fa-solid fa-plus\"></i> Create Index\n }\n </button>\n <button class=\"create-index-cancel\" (click)=\"CancelCreateIndex()\" [disabled]=\"IsCreatingIndex\">\n Cancel\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Full-Text Indexes -->\n @if (ActiveSection === 'fulltext') {\n <div class=\"config-section\">\n\n @if (IsLoadingFTSEntities) {\n <mj-loading text=\"Discovering searchable entities...\" size=\"medium\"></mj-loading>\n } @else if (FTSEntities.length === 0) {\n <div class=\"config-empty-state\">\n <i class=\"fa-solid fa-text-width config-empty-icon\"></i>\n <h3 class=\"config-empty-title\">No Searchable Entities Found</h3>\n <p class=\"config-empty-text\">No entities with text fields were discovered. Ensure your database schema includes entities with varchar/nvarchar columns.</p>\n </div>\n } @else {\n <div class=\"fts-entity-controls\">\n <div class=\"fts-summary\">\n <span class=\"fts-summary-count\">{{ EnabledFTSCount }} of {{ FTSEntities.length }} entities enabled for search</span>\n <input type=\"text\" class=\"config-input fts-filter-input\" placeholder=\"Filter entities...\" [(ngModel)]=\"FTSFilterText\" />\n </div>\n </div>\n\n <div class=\"fts-entity-list\">\n @for (entity of FilteredFTSEntities; track entity.EntityName) {\n <div class=\"fts-entity-card\" [class.fts-entity-enabled]=\"entity.Enabled\">\n <div class=\"fts-entity-toggle\">\n <input type=\"checkbox\" [(ngModel)]=\"entity.Enabled\" (change)=\"OnFTSEntityToggled(entity)\" class=\"config-checkbox\" />\n </div>\n <div class=\"fts-entity-info\">\n <span class=\"fts-entity-name\">{{ entity.EntityName }}</span>\n <div class=\"fts-entity-fields\">\n @for (field of entity.IndexedFields; track field) {\n <span class=\"fts-field-tag\">{{ field }}</span>\n }\n </div>\n </div>\n <div class=\"fts-entity-meta\">\n <span class=\"fts-entity-title-field\" title=\"Title field\">\n <i class=\"fa-solid fa-heading\"></i> {{ entity.TitleField }}\n </span>\n @if (entity.SnippetField !== entity.TitleField) {\n <span class=\"fts-entity-snippet-field\" title=\"Snippet field\">\n <i class=\"fa-solid fa-align-left\"></i> {{ entity.SnippetField }}\n </span>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Embedding Models -->\n @if (ActiveSection === 'embedding') {\n <div class=\"config-section\">\n\n @if (HasEmbeddingModel) {\n <div class=\"config-group\">\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Active Model</span>\n <span class=\"config-hint\">Currently selected embedding model</span>\n </div>\n <span class=\"config-value-display\">{{ EmbeddingModelName }}</span>\n </div>\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Available Models</span>\n <span class=\"config-hint\">{{ EmbeddingModels.length }} embedding model(s) configured</span>\n </div>\n <div class=\"config-tag-list\">\n @for (model of EmbeddingModels; track model.ID) {\n <span class=\"config-tag\">{{ model.Name }}</span>\n }\n </div>\n </div>\n </div>\n <p class=\"config-section-note\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Manage embedding models in the AI Dashboard > Models tab.\n </p>\n } @else {\n <div class=\"config-empty-state\">\n <i class=\"fa-solid fa-microchip config-empty-icon\"></i>\n <h3 class=\"config-empty-title\">No Embedding Models Found</h3>\n <p class=\"config-empty-text\">\n Embedding models are required to convert text into vectors for semantic search and duplicate detection.\n Configure at least one embedding model (e.g., text-embedding-3-small) in the AI Dashboard > Models tab.\n </p>\n </div>\n }\n </div>\n }\n\n <!-- Thresholds -->\n @if (ActiveSection === 'thresholds') {\n <div class=\"config-section\">\n\n <div class=\"config-group\">\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Duplicate Absolute Match</span>\n <span class=\"config-hint\">Score above which duplicates are auto-confirmed ({{ FormatThreshold(ThresholdSettings.DuplicateAbsolute) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.DuplicateAbsolute\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.5\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Duplicate Potential Match</span>\n <span class=\"config-hint\">Score above which duplicates are flagged for review ({{ FormatThreshold(ThresholdSettings.DuplicatePotential) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.DuplicatePotential\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.3\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Search Relevance</span>\n <span class=\"config-hint\">Minimum score for search results ({{ FormatThreshold(ThresholdSettings.SearchRelevance) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.SearchRelevance\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Autotag Confidence</span>\n <span class=\"config-hint\">Minimum confidence for accepting auto-generated tags ({{ FormatThreshold(ThresholdSettings.AutotagConfidence) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.AutotagConfidence\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.3\" max=\"1\" step=\"0.01\" />\n </div>\n </div>\n </div>\n }\n\n <!-- Search Scopes Section -->\n @if (ActiveSection === 'search-scopes') {\n <div class=\"config-section\">\n <div class=\"scope-manager\">\n <!-- Scope list -->\n <aside class=\"scope-manager-list\">\n <div class=\"scope-manager-list-header\">\n <span>Scopes ({{ SearchScopes.length }})</span>\n <button type=\"button\" class=\"scope-manager-new-btn\" (click)=\"CreateNewScope()\">\n <i class=\"fa-solid fa-plus\"></i> New\n </button>\n </div>\n @if (IsLoadingScopes) {\n <div class=\"scope-manager-loading\">Loading…</div>\n } @else if (SearchScopes.length === 0) {\n <div class=\"scope-manager-empty\">\n No scopes defined yet. Click <strong>New</strong> to create one.\n </div>\n } @else {\n @for (s of SearchScopes; track s.ID) {\n <button\n type=\"button\"\n class=\"scope-manager-list-item\"\n [class.active]=\"ActiveScopeID === s.ID\"\n (click)=\"SelectScope(s.ID)\">\n <i [class]=\"s.Icon || 'fa-solid fa-filter'\" aria-hidden=\"true\"></i>\n <span class=\"scope-manager-list-name\">{{ s.Name }}</span>\n @if (s.IsGlobal) {\n <span class=\"scope-manager-badge\">Global</span>\n } @else if (s.IsDefault) {\n <span class=\"scope-manager-badge\">Default</span>\n }\n </button>\n }\n }\n </aside>\n\n <!-- Scope detail -->\n <section class=\"scope-manager-detail\">\n @if (ActiveScope) {\n <!-- Tab strip -->\n <div class=\"scope-manager-tabs\">\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'definition'\" (click)=\"SelectScopeTab('definition')\">Definition</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'providers'\" (click)=\"SelectScopeTab('providers')\">Providers</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'indexes'\" (click)=\"SelectScopeTab('indexes')\">External Indexes</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'entities'\" (click)=\"SelectScopeTab('entities')\">Entities</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'storage'\" (click)=\"SelectScopeTab('storage')\">Storage</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'permissions'\" (click)=\"SelectScopeTab('permissions')\">Permissions</button>\n <div class=\"scope-manager-tab-spacer\"></div>\n @if (ActiveScope.ID) {\n <button type=\"button\" class=\"scope-manager-open-btn\"\n (click)=\"OpenActiveScopeFullForm()\"\n title=\"Open the full custom form for this scope (Live Preview, Fusion Weights, Reranker, Test Queries, Execution Logs)\">\n <i class=\"fa-solid fa-up-right-from-square\"></i> Open Full Form\n </button>\n }\n <button type=\"button\" class=\"scope-manager-save-btn\" (click)=\"SaveActiveScope()\">\n <i class=\"fa-solid fa-save\"></i> Save\n </button>\n @if (!ActiveScope.IsGlobal) {\n <button type=\"button\" class=\"scope-manager-delete-btn\" (click)=\"DeleteActiveScope()\" title=\"Delete scope\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n\n <!-- Definition tab -->\n @if (ActiveScopeTab === 'definition') {\n <div class=\"scope-definition-grid\">\n <label>\n <span>Name</span>\n <input type=\"text\" class=\"mj-input\" [value]=\"ActiveScope.Name\" (change)=\"ActiveScope.Name = $any($event.target).value\">\n </label>\n <label>\n <span>Icon (Font Awesome class)</span>\n <input type=\"text\" class=\"mj-input\" [value]=\"ActiveScope.Icon || ''\" (change)=\"ActiveScope.Icon = $any($event.target).value\">\n </label>\n <label class=\"scope-definition-full\">\n <span>Description</span>\n <textarea rows=\"2\" class=\"mj-textarea\" [value]=\"ActiveScope.Description || ''\" (change)=\"ActiveScope.Description = $any($event.target).value\"></textarea>\n </label>\n <label>\n <span>Status</span>\n <select class=\"mj-input\" [value]=\"ActiveScope.Status\" (change)=\"ActiveScope.Status = $any($event.target).value\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </label>\n <label>\n <span>Start at</span>\n <input type=\"datetime-local\" class=\"mj-input\" [value]=\"FormatScopeDate(ActiveScope.StartAt)\" (change)=\"SetScopeDate(ActiveScope, 'StartAt', $any($event.target).value)\">\n </label>\n <label>\n <span>End at</span>\n <input type=\"datetime-local\" class=\"mj-input\" [value]=\"FormatScopeDate(ActiveScope.EndAt)\" (change)=\"SetScopeDate(ActiveScope, 'EndAt', $any($event.target).value)\">\n </label>\n <label class=\"scope-definition-toggle\">\n <input type=\"checkbox\" [checked]=\"ActiveScope.IsDefault\" (change)=\"ActiveScope.IsDefault = $any($event.target).checked\" [disabled]=\"ActiveScope.IsGlobal\">\n <span>Default scope \u2014 picked when users/agents don't specify one</span>\n </label>\n <label class=\"scope-definition-toggle\">\n <input type=\"checkbox\" [checked]=\"ActiveScope.IsGlobal\" disabled>\n <span>Global \u2014 reserved for the built-in Global scope (read-only)</span>\n </label>\n <label class=\"scope-definition-full\">\n <span>Scope Config (JSON)</span>\n <textarea rows=\"4\" class=\"mj-textarea scope-code-block\" spellcheck=\"false\" [value]=\"ActiveScope.ScopeConfig || ''\" (change)=\"ActiveScope.ScopeConfig = $any($event.target).value\"></textarea>\n </label>\n <label class=\"scope-definition-full\">\n <span>Search Context Config (JSON)</span>\n <textarea rows=\"4\" class=\"mj-textarea scope-code-block\" spellcheck=\"false\" [value]=\"ActiveScope.SearchContextConfig || ''\" (change)=\"ActiveScope.SearchContextConfig = $any($event.target).value\"></textarea>\n </label>\n </div>\n }\n\n @if (ActiveScopeTab === 'providers') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Providers\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeProviderColumns\"\n AddButtonLabel=\"+ Add provider\"\n EmptyMessage=\"No providers assigned. Without any providers, this scope searches nothing.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'indexes') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope External Indexes\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeExternalIndexColumns\"\n AddButtonLabel=\"+ Add external index\"\n EmptyMessage=\"No external indexes configured for this scope.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'entities') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Entities\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeEntityColumns\"\n AddButtonLabel=\"+ Add entity\"\n EmptyMessage=\"No entities configured. Scoped entity search will return no rows.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'storage') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Storage Accounts\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeStorageColumns\"\n AddButtonLabel=\"+ Add storage folder\"\n EmptyMessage=\"No storage accounts linked to this scope.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'permissions') {\n <div class=\"scope-permissions-help\" style=\"margin-bottom: 12px; padding: 8px 12px; background: var(--mj-bg-surface-card); border-left: 3px solid var(--mj-brand-primary); border-radius: 4px;\">\n <p style=\"margin: 0; font-size: 0.95em;\">\n <i class=\"fa-solid fa-shield-halved\" style=\"color: var(--mj-brand-primary);\"></i>\n <strong>Per-user / per-role grants on this scope.</strong>\n Each row binds <em>either</em> a User <em>or</em> a Role (not both). Levels:\n <code>None</code> = explicit deny that overrides role grants,\n <code>Read</code> = view scope metadata,\n <code>Search</code> = invoke ScopedSearchAction,\n <code>Manage</code> = full edit including authoring permissions.\n Combined with <code>AIAgent.SearchScopeAccess</code> via the resolver \u2014 see the spec for the full resolution order.\n </p>\n </div>\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Permissions\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopePermissionColumns\"\n AddButtonLabel=\"+ Grant access\"\n EmptyMessage=\"No explicit grants. Access falls back to agent SearchScopeAccess only.\">\n </mj-search-scope-child-grid>\n }\n } @else {\n <div class=\"scope-manager-empty-detail\">\n Select a scope on the left, or click <strong>New</strong> to create one.\n </div>\n }\n </section>\n </div>\n </div>\n }\n\n <!-- Search Analytics Section (P3.3) \u2014 driven by SearchExecutionLog -->\n @if (ActiveSection === 'search-analytics') {\n <div class=\"config-section-content\">\n\n @if (AnalyticsLoading) {\n <mj-loading text=\"Loading analytics\u2026\" size=\"medium\"></mj-loading>\n } @else if (!AnalyticsLoaded) {\n <button class=\"mj-input\" type=\"button\" (click)=\"LoadSearchAnalytics()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Load analytics\n </button>\n } @else {\n <div class=\"search-analytics-kpi-grid\">\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Total runs</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsTotalRuns | number }}</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Success rate</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsSuccessRate }}%</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Hit rate</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsHitRate }}%</span>\n <span class=\"search-analytics-kpi-hint\">% of successful runs that returned \u22651 result</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Avg latency</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsAvgLatencyMs }}ms</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">P95 latency</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsP95LatencyMs }}ms</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Reranker spend</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsTotalRerankerCostCents | number:'1.0-2' }}\u00A2</span>\n </div>\n </div>\n\n <h3 class=\"search-analytics-h3\">Top scopes by volume</h3>\n @if (AnalyticsTopScopes.length === 0) {\n <p class=\"search-analytics-empty\">No runs in the window.</p>\n } @else {\n <table class=\"search-analytics-table\">\n <thead>\n <tr><th>Scope</th><th>Runs</th><th>Avg latency</th></tr>\n </thead>\n <tbody>\n @for (s of AnalyticsTopScopes; track s.ScopeID) {\n <tr>\n <td>{{ s.Name }}</td>\n <td>{{ s.Count | number }}</td>\n <td>{{ s.AvgLatencyMs }}ms</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <h3 class=\"search-analytics-h3\">Reranker spend by driver</h3>\n @if (AnalyticsRerankerSpend.length === 0) {\n <p class=\"search-analytics-empty\">No rerank invocations in the window.</p>\n } @else {\n <table class=\"search-analytics-table\">\n <thead>\n <tr><th>Reranker</th><th>Calls</th><th>Total cents</th></tr>\n </thead>\n <tbody>\n @for (r of AnalyticsRerankerSpend; track r.Reranker) {\n <tr>\n <td>{{ r.Reranker }}</td>\n <td>{{ r.Count | number }}</td>\n <td>{{ r.TotalCents | number:'1.0-2' }}\u00A2</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <h3 class=\"search-analytics-h3\">Top failure reasons</h3>\n @if (AnalyticsTopFailures.length === 0) {\n <p class=\"search-analytics-empty\">No failures in the window.</p>\n } @else {\n <table class=\"search-analytics-table\">\n <thead>\n <tr><th>Reason</th><th>Count</th></tr>\n </thead>\n <tbody>\n @for (f of AnalyticsTopFailures; track f.Reason) {\n <tr>\n <td>{{ f.Reason }}</td>\n <td>{{ f.Count | number }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <button class=\"mj-input search-analytics-refresh\" type=\"button\" (click)=\"LoadSearchAnalytics()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n }\n </div>\n }\n\n <!-- Permissions Audit Section (P2A.7) -->\n @if (ActiveSection === 'search-permissions') {\n <div class=\"config-section-content\">\n @if (PermissionsLoading) {\n <div class=\"search-permissions-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading permission rows...\n </div>\n }\n\n @if (PermissionsLoaded && !PermissionsLoading) {\n <div class=\"search-permissions-filters\">\n <input class=\"mj-input\" type=\"text\" placeholder=\"Filter by scope name...\" [(ngModel)]=\"PermissionsFilterScope\" />\n <input class=\"mj-input\" type=\"text\" placeholder=\"Filter by user/role (name or email)...\" [(ngModel)]=\"PermissionsFilterPrincipal\" />\n <select class=\"mj-input\" [(ngModel)]=\"PermissionsFilterLevel\">\n <option value=\"\">All levels</option>\n <option value=\"None\">None</option>\n <option value=\"Read\">Read</option>\n <option value=\"Search\">Search</option>\n <option value=\"Manage\">Manage</option>\n </select>\n <button class=\"mj-input\" type=\"button\" (click)=\"RefreshPermissionsAudit()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n </div>\n\n <div class=\"search-permissions-summary\">\n Showing {{ FilteredPermissionsRows.length }} of {{ PermissionsRows.length }} rows\n </div>\n\n @if (FilteredPermissionsRows.length === 0) {\n <div class=\"search-permissions-empty\">\n No permission rows match your filters.\n </div>\n } @else {\n <table class=\"search-permissions-table\">\n <thead>\n <tr>\n <th>Scope</th>\n <th>Principal</th>\n <th>Type</th>\n <th>Permission Level</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredPermissionsRows; track row.ID) {\n <tr>\n <td>{{ row.SearchScopeName }}</td>\n <td>\n @if (row.UserID) {\n {{ row.UserName }} <span class=\"search-permissions-secondary\">({{ row.UserEmail }})</span>\n } @else {\n {{ row.RoleName }}\n }\n </td>\n <td>\n @if (row.UserID) { <span class=\"search-permissions-tag\">User</span> }\n @if (row.RoleID) { <span class=\"search-permissions-tag\">Role</span> }\n </td>\n <td>\n <span class=\"search-permissions-level search-permissions-level-{{ row.PermissionLevel | lowercase }}\">{{ row.PermissionLevel }}</span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n }\n </div>\n }\n\n <!-- Scheduling Section -->\n @if (ActiveSection === 'scheduling') {\n <div class=\"config-section-content\">\n <div style=\"margin-top: 16px;\">\n <app-scheduling-resource [HideToolbar]=\"true\"></app-scheduling-resource>\n </div>\n </div>\n }\n\n <!-- Save Bar -->\n @if (HasUnsavedChanges) {\n <div class=\"config-save-bar\">\n <span class=\"config-save-text\">You have unsaved changes</span>\n <button class=\"config-save-btn\" (click)=\"SaveConfiguration()\" [disabled]=\"IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-save\"></i> Save Changes\n }\n </button>\n <button class=\"config-reset-btn\" (click)=\"ResetConfiguration()\" [disabled]=\"IsSaving\">\n Reset\n </button>\n </div>\n }\n </mj-page-body-interior>\n </mj-left-nav-content>\n </div>\n}\n </mj-page-body>\n</mj-page-layout>\n", styles: ["/* Knowledge Configuration - Settings Page with Left Nav */\n\n\n.config-loading {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 400px;\n}\n\n/*\n Layout \u2014 <mj-left-nav> rail + <mj-left-nav-content> pane. The shared\n primitives own the rail width, nav item styling, and content sizing; we just\n need a flex-row wrapper so they sit side-by-side.\n*/\n.config-layout {\n display: flex;\n height: 100%;\n min-height: 500px;\n}\n\n/* Section title + description are now rendered by <mj-page-header-interior>\n (one shared instance bound to currentSection at the top of the content area).\n The legacy .config-section-title / .config-section-desc rules and the\n .config-content wrapper were retired with that migration; .config-section\n remains as a thin readability constraint on the form bodies. */\n.config-section {\n max-width: 700px;\n}\n\n/* Config Groups */\n.config-group {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.config-toggle-row,\n.config-field-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n border-radius: 8px;\n transition: background 0.1s ease;\n gap: 1rem;\n}\n\n.config-toggle-row:hover,\n.config-field-row:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.config-toggle-info,\n.config-field-info {\n display: flex;\n flex-direction: column;\n gap: 0.15rem;\n flex: 1;\n}\n\n.config-label {\n font-weight: 500;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n}\n\n.config-hint {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.config-checkbox {\n width: 1.1rem;\n height: 1.1rem;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n}\n\n.config-input {\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n font-family: inherit;\n}\n\n.config-input-number {\n width: 80px;\n text-align: center;\n}\n\n.config-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.config-slider {\n width: 200px;\n accent-color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.config-value-display {\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n padding: 0.3rem 0.6rem;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-family: monospace;\n}\n\n/* Placeholder */\n.config-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 1.5rem;\n text-align: center;\n gap: 1rem;\n color: var(--mj-text-muted);\n}\n\n.config-placeholder-icon {\n font-size: 2.5rem;\n}\n\n/* ---- Setup Progress Bar ---- */\n\n.setup-progress {\n margin-bottom: 1.5rem;\n padding: 1rem 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n}\n\n.setup-progress-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.5rem;\n}\n\n.setup-progress-label {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.setup-progress-count {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.setup-progress-bar {\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.setup-progress-fill {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n transition: width 0.4s ease;\n}\n\n/* ---- Setup Steps ---- */\n\n.setup-step {\n padding: 1rem 1.25rem;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n margin-bottom: 0.75rem;\n transition: border-color 0.2s;\n}\n\n.setup-step-complete {\n border-color: var(--mj-status-success-border);\n background: color-mix(in srgb, var(--mj-status-success) 3%, var(--mj-bg-surface));\n}\n\n.setup-step-pending {\n border-color: var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.setup-step-header {\n display: flex;\n align-items: flex-start;\n gap: 0.85rem;\n}\n\n.setup-step-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex-shrink: 0;\n margin-top: 1px;\n}\n\n.setup-step-complete .setup-step-indicator i {\n font-size: 1.25rem;\n color: var(--mj-status-success);\n}\n\n.setup-step-number {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n font-weight: 700;\n}\n\n.setup-step-info {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n flex: 1;\n}\n\n.setup-step-title {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.setup-step-status {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.setup-step-complete .setup-step-status {\n color: var(--mj-status-success-text);\n}\n\n/* ---- Config Group Title ---- */\n\n.config-group-title {\n margin: 0 0 0.75rem 0;\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n/* ---- Status Badge ---- */\n\n.config-status-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 0.75rem;\n font-weight: 600;\n}\n\n.config-status-active {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n/* ---- Step Detail Area ---- */\n\n.setup-step-detail {\n margin-top: 0.75rem;\n padding-left: 2.85rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.setup-step-action {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s;\n flex-shrink: 0;\n}\n\n.setup-step-action:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n/* ---- Provider Cards ---- */\n\n.provider-card {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n}\n\n.provider-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.provider-info {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.provider-name {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.provider-class {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n font-family: monospace;\n}\n\n/* ---- Provider Credential Row ---- */\n\n.provider-credential-row {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 1rem 0.75rem;\n margin-top: -0.25rem;\n}\n\n.provider-credential-label {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.provider-credential-label i {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.provider-credential-picker {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex: 1;\n min-width: 0;\n}\n\n.provider-credential-select {\n flex: 1;\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.8rem;\n}\n\n.provider-credential-select:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.provider-credential-spinner {\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n}\n\n/* ---- Index Cards ---- */\n\n.index-card {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n transition: border-color 0.15s;\n}\n\n.index-card:hover {\n border-color: var(--mj-border-default);\n}\n\n.index-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.index-info {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.index-name {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.index-meta {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 3px;\n}\n\n.index-meta i {\n font-size: 0.65rem;\n}\n\n.index-actions {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex-shrink: 0;\n}\n\n.index-delete-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.index-delete-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error);\n}\n\n/* ---- Create Index Form ---- */\n\n.create-index-form {\n margin-top: 0.75rem;\n padding: 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 2px solid var(--mj-brand-primary);\n border-radius: 10px;\n margin-left: 2.85rem;\n}\n\n.create-index-title {\n margin: 0 0 1rem 0;\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.create-index-title i {\n color: var(--mj-brand-primary);\n}\n\n.create-index-fields {\n display: flex;\n flex-direction: column;\n gap: 0.85rem;\n}\n\n.create-index-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.create-index-label {\n font-size: 0.78rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.config-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n}\n\n.config-select:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.create-index-actions {\n display: flex;\n gap: 8px;\n margin-top: 1rem;\n}\n\n.create-index-submit {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 18px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s;\n}\n\n.create-index-submit:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.create-index-submit:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.create-index-cancel {\n padding: 8px 18px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.create-index-cancel:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* Empty State for unconfigured sections */\n.config-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 2rem;\n text-align: center;\n gap: 0.75rem;\n border: 2px dashed var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface-sunken);\n}\n\n.config-empty-icon {\n font-size: 2.5rem;\n color: var(--mj-text-disabled);\n}\n\n.config-empty-title {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.config-empty-text {\n margin: 0;\n font-size: 0.85rem;\n color: var(--mj-text-muted);\n max-width: 480px;\n line-height: 1.5;\n}\n\n/* Tag list for showing multiple models */\n.config-tag-list {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.config-tag {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 500;\n}\n\n/* Section note */\n.config-section-note {\n margin-top: 1rem;\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.config-section-note i {\n color: var(--mj-status-info);\n}\n\n/* Save Bar */\n.config-save-bar {\n position: sticky;\n bottom: 0;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n margin-top: 2rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n}\n\n.config-save-text {\n flex: 1;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n}\n\n.config-save-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.5rem 1rem;\n border-radius: 6px;\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.85rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.config-save-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.config-save-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.config-reset-btn {\n padding: 0.5rem 0.75rem;\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n cursor: pointer;\n}\n\n.config-reset-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n}\n\n/* Mobile responsive */\n@media (max-width: 768px) {\n .config-layout {\n flex-direction: column;\n }\n\n .config-nav {\n width: 100%;\n flex-direction: row;\n overflow-x: auto;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 0;\n }\n\n .config-nav-header {\n display: none;\n }\n\n .config-nav-item {\n white-space: nowrap;\n padding: 0.6rem 1rem;\n }\n\n .config-nav-item-active {\n border-left: none;\n border-bottom: 3px solid var(--mj-brand-primary);\n }\n\n .config-content {\n padding: 1rem;\n }\n}\n\n/* Full-Text Search Entity Management */\n.fts-entity-controls {\n margin-bottom: 16px;\n}\n\n.fts-summary {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n}\n\n.fts-summary-count {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.fts-filter-input {\n max-width: 240px;\n}\n\n.fts-entity-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.fts-entity-card {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: border-color 0.15s, background 0.15s;\n}\n\n.fts-entity-card:hover {\n border-color: var(--mj-border-strong);\n}\n\n.fts-entity-card.fts-entity-enabled {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-brand-primary) 3%, var(--mj-bg-surface));\n}\n\n.fts-entity-toggle {\n flex-shrink: 0;\n}\n\n.fts-entity-info {\n flex: 1;\n min-width: 0;\n}\n\n.fts-entity-name {\n display: block;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.fts-entity-fields {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.fts-field-tag {\n display: inline-block;\n padding: 1px 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n}\n\n.fts-entity-meta {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 2px;\n flex-shrink: 0;\n}\n\n.fts-entity-title-field,\n.fts-entity-snippet-field {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.fts-entity-title-field i,\n.fts-entity-snippet-field i {\n margin-right: 4px;\n font-size: 10px;\n}\n\n/* ===== Search Scopes Manager ===== */\n\n.scope-manager {\n display: grid;\n grid-template-columns: 260px 1fr;\n gap: 16px;\n min-height: 420px;\n}\n\n.scope-manager-list {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.scope-manager-list-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 4px 6px 8px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.scope-manager-new-btn {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-link);\n padding: 3px 8px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.7rem;\n font-weight: 500;\n text-transform: none;\n letter-spacing: normal;\n}\n\n.scope-manager-new-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-brand-primary);\n}\n\n.scope-manager-loading,\n.scope-manager-empty,\n.scope-manager-empty-detail {\n padding: 16px;\n color: var(--mj-text-muted);\n text-align: center;\n font-size: 0.85rem;\n}\n\n.scope-manager-empty-detail {\n padding: 40px 24px;\n background: var(--mj-bg-surface-card);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n}\n\n.scope-manager-list-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 6px;\n text-align: left;\n transition: background 120ms ease;\n}\n\n.scope-manager-list-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.scope-manager-list-item.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n.scope-manager-list-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.scope-manager-badge {\n font-size: 0.625rem;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.scope-manager-detail {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-width: 0;\n}\n\n.scope-manager-tabs {\n display: flex;\n align-items: center;\n gap: 4px;\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 8px;\n flex-wrap: wrap;\n}\n\n.scope-manager-tab {\n background: transparent;\n border: none;\n padding: 6px 12px;\n color: var(--mj-text-secondary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 4px;\n transition: background 120ms ease, color 120ms ease;\n}\n\n.scope-manager-tab:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.scope-manager-tab.active {\n color: var(--mj-brand-primary);\n border-bottom: 2px solid var(--mj-brand-primary);\n border-radius: 0;\n font-weight: 500;\n}\n\n.scope-manager-tab-spacer {\n flex: 1;\n}\n\n.scope-manager-save-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 6px 14px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-save-btn:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.scope-manager-delete-btn {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-status-error-text);\n padding: 6px 10px;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.scope-manager-delete-btn:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error-border);\n}\n\n.scope-manager-open-btn {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-primary);\n padding: 6px 12px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-open-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.scope-definition-grid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px 16px;\n}\n\n.scope-definition-grid label {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n}\n\n.scope-definition-grid label > span {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.scope-definition-full {\n grid-column: 1 / -1;\n}\n\n.scope-definition-toggle {\n flex-direction: row;\n align-items: center;\n gap: 8px;\n}\n\n.scope-definition-toggle input[type=\"checkbox\"] {\n accent-color: var(--mj-brand-primary);\n}\n\n.scope-code-block {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n padding: 8px;\n}\n\n/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n Search Analytics section (P3.3)\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.search-analytics-kpi-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 12px;\n margin: 16px 0;\n}\n\n.search-analytics-kpi {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 14px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n}\n\n.search-analytics-kpi-label {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.search-analytics-kpi-value {\n font-size: 1.6rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-kpi-hint {\n color: var(--mj-text-muted);\n font-size: 0.72rem;\n}\n\n.search-analytics-h3 {\n margin: 22px 0 8px;\n font-size: 1rem;\n color: var(--mj-text-primary);\n}\n\n.search-analytics-empty {\n color: var(--mj-text-muted);\n font-size: 0.85rem;\n margin: 4px 0 14px;\n}\n\n.search-analytics-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.86rem;\n}\n\n.search-analytics-table thead th {\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 6px 10px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n.search-analytics-table tbody td {\n padding: 6px 10px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.search-analytics-refresh {\n margin-top: 16px;\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.9rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.82rem;\n}\n\n.search-analytics-refresh:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* \u2500\u2500\u2500 Permissions Audit (P2A.7) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.search-permissions-loading {\n padding: 1.2rem;\n color: var(--mj-text-secondary);\n font-style: italic;\n}\n\n.search-permissions-filters {\n display: grid;\n grid-template-columns: 1fr 1fr 180px 130px;\n gap: 0.5rem;\n margin-bottom: 0.8rem;\n}\n\n.search-permissions-filters .mj-input {\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n font-size: 0.85rem;\n}\n\n.search-permissions-summary {\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n margin-bottom: 0.6rem;\n}\n\n.search-permissions-empty {\n padding: 1.2rem;\n color: var(--mj-text-muted);\n text-align: center;\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n}\n\n.search-permissions-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.85rem;\n}\n\n.search-permissions-table th,\n.search-permissions-table td {\n padding: 0.5rem 0.7rem;\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n}\n\n.search-permissions-table th {\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n}\n\n.search-permissions-secondary {\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n}\n\n.search-permissions-tag {\n display: inline-block;\n padding: 0.1rem 0.5rem;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border-radius: 3px;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.search-permissions-level {\n display: inline-block;\n padding: 0.15rem 0.55rem;\n border-radius: 3px;\n font-size: 0.78rem;\n font-weight: 500;\n}\n\n.search-permissions-level-none {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n}\n\n.search-permissions-level-read {\n background: color-mix(in srgb, var(--mj-status-info) 12%, var(--mj-bg-surface));\n color: var(--mj-status-info-text);\n}\n\n.search-permissions-level-search {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n.search-permissions-level-manage {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n"] }]
|
|
2388
2375
|
}], null, null); })();
|
|
2389
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KnowledgeConfigResourceComponent, { className: "KnowledgeConfigResourceComponent", filePath: "src/KnowledgeHub/components/config/knowledge-config-resource.component.ts", lineNumber:
|
|
2376
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KnowledgeConfigResourceComponent, { className: "KnowledgeConfigResourceComponent", filePath: "src/KnowledgeHub/components/config/knowledge-config-resource.component.ts", lineNumber: 100 }); })();
|
|
2390
2377
|
/** Tree-shaking prevention */
|
|
2391
2378
|
export function LoadKnowledgeConfigResource() {
|
|
2392
2379
|
// Prevents tree-shaking
|