@memberjunction/ng-dashboards 5.21.0 → 5.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -0
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +364 -362
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +2 -2
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +313 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2792 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +382 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +2683 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -0
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +191 -197
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +9 -8
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +305 -299
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +319 -313
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +240 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -0
- package/dist/AI/components/vectors/vector-management-resource.component.js +1767 -0
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -0
- package/dist/AI/index.d.ts +3 -0
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +6 -0
- package/dist/AI/index.js.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.d.ts +50 -7
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js +161 -193
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +10 -12
- package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.js +13 -19
- package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js +12 -14
- package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.js +61 -68
- package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
- package/dist/APIKeys/api-usage-panel.component.js +10 -11
- package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
- package/dist/Actions/components/actions-list-view.component.js +82 -96
- package/dist/Actions/components/actions-list-view.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +130 -134
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +40 -46
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/Actions/components/code-management.component.js +2 -2
- package/dist/Actions/components/code-management.component.js.map +1 -1
- package/dist/Actions/components/entity-integration.component.js +2 -2
- package/dist/Actions/components/entity-integration.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +127 -132
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/executions-list-view.component.js +2 -2
- package/dist/Actions/components/executions-list-view.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.js +11 -17
- package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +5 -11
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-list-item.component.js +8 -10
- package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-toolbar.component.js +112 -133
- package/dist/Actions/components/explorer/action-toolbar.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-tree-panel.component.js +63 -83
- package/dist/Actions/components/explorer/action-tree-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-action-panel.component.js +17 -21
- package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.js +17 -21
- package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.js +2 -2
- package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
- package/dist/Actions/components/security-permissions.component.js +2 -2
- package/dist/Actions/components/security-permissions.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +13 -5
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +168 -145
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +4 -5
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +197 -200
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +5 -7
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +142 -148
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/browser/component-browser.component.js +153 -166
- package/dist/ComponentStudio/components/browser/component-browser.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +15 -20
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +16 -21
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js +18 -23
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/spec-editor.component.js +25 -30
- package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +10 -11
- package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +24 -35
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/text-import-dialog.component.js +15 -17
- package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +7 -6
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +6 -5
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +7 -6
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +11 -0
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +57 -0
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js +9 -9
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +10 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +35 -11
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.d.ts +1 -0
- package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.js +8 -4
- package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +181 -1
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +1704 -182
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +4 -4
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +246 -259
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/widgets/integration-card.component.js +7 -9
- package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
- package/dist/Integration/integration.module.d.ts +6 -10
- package/dist/Integration/integration.module.d.ts.map +1 -1
- package/dist/Integration/integration.module.js +12 -20
- package/dist/Integration/integration.module.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +106 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +607 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +126 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +1086 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.d.ts +56 -0
- package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.js +291 -0
- package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.js.map +1 -0
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +85 -0
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +461 -0
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/index.d.ts +5 -0
- package/dist/KnowledgeHub/index.d.ts.map +1 -0
- package/dist/KnowledgeHub/index.js +6 -0
- package/dist/KnowledgeHub/index.js.map +1 -0
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +9 -7
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +5 -4
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +10 -9
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js +141 -132
- package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
- package/dist/MCP/components/mcp-log-detail-panel.component.js +4 -4
- package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +141 -128
- package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
- package/dist/MCP/components/mcp-test-tool-dialog.component.js +210 -218
- package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +2 -2
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp.module.d.ts +6 -9
- package/dist/MCP/mcp.module.d.ts.map +1 -1
- package/dist/MCP/mcp.module.js +20 -22
- package/dist/MCP/mcp.module.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +5 -1
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +5 -4
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +6 -5
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +93 -92
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +1 -0
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +7 -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 +63 -8
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts +9 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.js +109 -62
- package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +2 -1
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +241 -200
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts +7 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +63 -8
- package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +7 -5
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +9 -1
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +122 -54
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/actions-dashboards.module.d.ts +8 -13
- package/dist/actions-dashboards.module.d.ts.map +1 -1
- package/dist/actions-dashboards.module.js +6 -27
- package/dist/actions-dashboards.module.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +14 -11
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +58 -44
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +4 -8
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +0 -19
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/component-studio-dashboards.module.d.ts +7 -11
- package/dist/component-studio-dashboards.module.d.ts.map +1 -1
- package/dist/component-studio-dashboards.module.js +22 -34
- package/dist/component-studio-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +13 -18
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +18 -31
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/credentials-dashboards.module.d.ts +5 -8
- package/dist/credentials-dashboards.module.d.ts.map +1 -1
- package/dist/credentials-dashboards.module.js +3 -19
- package/dist/credentials-dashboards.module.js.map +1 -1
- package/dist/data-explorer-dashboards.module.d.ts +7 -13
- package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
- package/dist/data-explorer-dashboards.module.js +0 -27
- package/dist/data-explorer-dashboards.module.js.map +1 -1
- package/dist/lists-dashboards.module.d.ts +5 -8
- package/dist/lists-dashboards.module.d.ts.map +1 -1
- package/dist/lists-dashboards.module.js +3 -19
- package/dist/lists-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +5 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +6 -1
- package/dist/public-api.js.map +1 -1
- package/dist/scheduling-dashboards.module.d.ts +6 -10
- package/dist/scheduling-dashboards.module.d.ts.map +1 -1
- package/dist/scheduling-dashboards.module.js +3 -23
- package/dist/scheduling-dashboards.module.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +7 -12
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +4 -27
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +47 -53
|
@@ -0,0 +1,1086 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* @fileoverview Knowledge Hub Configuration Resource Component
|
|
9
|
+
*
|
|
10
|
+
* Full configuration dashboard for Knowledge Hub infrastructure:
|
|
11
|
+
* Vector DB provider management, vector index CRUD, embedding model selection,
|
|
12
|
+
* pipeline settings, full-text index config, and scoring thresholds.
|
|
13
|
+
*/
|
|
14
|
+
import { Component, ChangeDetectorRef, inject } from '@angular/core';
|
|
15
|
+
import { Subject } from 'rxjs';
|
|
16
|
+
import { Metadata, RunView } from '@memberjunction/core';
|
|
17
|
+
import { KnowledgeHubMetadataEngine } from '@memberjunction/core-entities';
|
|
18
|
+
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
19
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
20
|
+
import { MJNotificationService } from '@memberjunction/ng-notifications';
|
|
21
|
+
import * as i0 from "@angular/core";
|
|
22
|
+
import * as i1 from "@angular/forms";
|
|
23
|
+
import * as i2 from "@memberjunction/ng-shared-generic";
|
|
24
|
+
const _forTrack0 = ($index, $item) => $item.ID;
|
|
25
|
+
const _forTrack1 = ($index, $item) => $item.EntityName;
|
|
26
|
+
function KnowledgeConfigResourceComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
27
|
+
i0.ɵɵelementStart(0, "div", 0);
|
|
28
|
+
i0.ɵɵelement(1, "mj-loading", 2);
|
|
29
|
+
i0.ɵɵelementEnd();
|
|
30
|
+
} }
|
|
31
|
+
function KnowledgeConfigResourceComponent_Conditional_1_For_7_Template(rf, ctx) { if (rf & 1) {
|
|
32
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
33
|
+
i0.ɵɵelementStart(0, "button", 10);
|
|
34
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_1_For_7_Template_button_click_0_listener() { const section_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.SelectSection(section_r2.ID)); });
|
|
35
|
+
i0.ɵɵelement(1, "i");
|
|
36
|
+
i0.ɵɵelementStart(2, "span");
|
|
37
|
+
i0.ɵɵtext(3);
|
|
38
|
+
i0.ɵɵelementEnd()();
|
|
39
|
+
} if (rf & 2) {
|
|
40
|
+
const section_r2 = ctx.$implicit;
|
|
41
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
42
|
+
i0.ɵɵclassProp("config-nav-item-active", ctx_r2.ActiveSection === section_r2.ID);
|
|
43
|
+
i0.ɵɵadvance();
|
|
44
|
+
i0.ɵɵclassMap(section_r2.Icon);
|
|
45
|
+
i0.ɵɵadvance(2);
|
|
46
|
+
i0.ɵɵtextInterpolate(section_r2.Label);
|
|
47
|
+
} }
|
|
48
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
49
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
50
|
+
i0.ɵɵelementStart(0, "div", 8)(1, "h2", 11);
|
|
51
|
+
i0.ɵɵtext(2, "Pipeline Settings");
|
|
52
|
+
i0.ɵɵelementEnd();
|
|
53
|
+
i0.ɵɵelementStart(3, "p", 12);
|
|
54
|
+
i0.ɵɵtext(4, "Configure how the Knowledge Pipeline processes incoming content.");
|
|
55
|
+
i0.ɵɵelementEnd();
|
|
56
|
+
i0.ɵɵelementStart(5, "div", 13)(6, "label", 14)(7, "div", 15)(8, "span", 16);
|
|
57
|
+
i0.ɵɵtext(9, "Auto-tag on Ingest");
|
|
58
|
+
i0.ɵɵelementEnd();
|
|
59
|
+
i0.ɵɵelementStart(10, "span", 17);
|
|
60
|
+
i0.ɵɵtext(11, "Automatically run autotagging when new content is ingested");
|
|
61
|
+
i0.ɵɵelementEnd()();
|
|
62
|
+
i0.ɵɵelementStart(12, "input", 18);
|
|
63
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_9_Template_input_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.PipelineSettings.AutotagOnIngest, $event) || (ctx_r2.PipelineSettings.AutotagOnIngest = $event); return i0.ɵɵresetView($event); });
|
|
64
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_9_Template_input_change_12_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnSettingChanged()); });
|
|
65
|
+
i0.ɵɵelementEnd()();
|
|
66
|
+
i0.ɵɵelementStart(13, "label", 14)(14, "div", 15)(15, "span", 16);
|
|
67
|
+
i0.ɵɵtext(16, "Vectorize on Ingest");
|
|
68
|
+
i0.ɵɵelementEnd();
|
|
69
|
+
i0.ɵɵelementStart(17, "span", 17);
|
|
70
|
+
i0.ɵɵtext(18, "Automatically create embeddings for new content");
|
|
71
|
+
i0.ɵɵelementEnd()();
|
|
72
|
+
i0.ɵɵelementStart(19, "input", 18);
|
|
73
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_9_Template_input_ngModelChange_19_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.PipelineSettings.VectorizeOnIngest, $event) || (ctx_r2.PipelineSettings.VectorizeOnIngest = $event); return i0.ɵɵresetView($event); });
|
|
74
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_9_Template_input_change_19_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnSettingChanged()); });
|
|
75
|
+
i0.ɵɵelementEnd()();
|
|
76
|
+
i0.ɵɵelementStart(20, "div", 19)(21, "div", 20)(22, "span", 16);
|
|
77
|
+
i0.ɵɵtext(23, "Default Batch Size");
|
|
78
|
+
i0.ɵɵelementEnd();
|
|
79
|
+
i0.ɵɵelementStart(24, "span", 17);
|
|
80
|
+
i0.ɵɵtext(25, "Number of items processed per batch");
|
|
81
|
+
i0.ɵɵelementEnd()();
|
|
82
|
+
i0.ɵɵelementStart(26, "input", 21);
|
|
83
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_9_Template_input_ngModelChange_26_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.PipelineSettings.DefaultBatchSize, $event) || (ctx_r2.PipelineSettings.DefaultBatchSize = $event); return i0.ɵɵresetView($event); });
|
|
84
|
+
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_9_Template_input_input_26_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnSettingChanged()); });
|
|
85
|
+
i0.ɵɵelementEnd()();
|
|
86
|
+
i0.ɵɵelementStart(27, "div", 19)(28, "div", 20)(29, "span", 16);
|
|
87
|
+
i0.ɵɵtext(30, "Max Concurrent Jobs");
|
|
88
|
+
i0.ɵɵelementEnd();
|
|
89
|
+
i0.ɵɵelementStart(31, "span", 17);
|
|
90
|
+
i0.ɵɵtext(32, "Maximum number of pipeline jobs running at once");
|
|
91
|
+
i0.ɵɵelementEnd()();
|
|
92
|
+
i0.ɵɵelementStart(33, "input", 22);
|
|
93
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_9_Template_input_ngModelChange_33_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.PipelineSettings.MaxConcurrentJobs, $event) || (ctx_r2.PipelineSettings.MaxConcurrentJobs = $event); return i0.ɵɵresetView($event); });
|
|
94
|
+
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_9_Template_input_input_33_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnSettingChanged()); });
|
|
95
|
+
i0.ɵɵelementEnd()()()();
|
|
96
|
+
} if (rf & 2) {
|
|
97
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
98
|
+
i0.ɵɵadvance(12);
|
|
99
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.PipelineSettings.AutotagOnIngest);
|
|
100
|
+
i0.ɵɵadvance(7);
|
|
101
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.PipelineSettings.VectorizeOnIngest);
|
|
102
|
+
i0.ɵɵadvance(7);
|
|
103
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.PipelineSettings.DefaultBatchSize);
|
|
104
|
+
i0.ɵɵadvance(7);
|
|
105
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.PipelineSettings.MaxConcurrentJobs);
|
|
106
|
+
} }
|
|
107
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
108
|
+
i0.ɵɵelement(0, "i", 32);
|
|
109
|
+
} }
|
|
110
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
111
|
+
i0.ɵɵelementStart(0, "span", 33);
|
|
112
|
+
i0.ɵɵtext(1, "1");
|
|
113
|
+
i0.ɵɵelementEnd();
|
|
114
|
+
} }
|
|
115
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
116
|
+
i0.ɵɵelementStart(0, "span", 36);
|
|
117
|
+
i0.ɵɵtext(1);
|
|
118
|
+
i0.ɵɵelementEnd();
|
|
119
|
+
} if (rf & 2) {
|
|
120
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
121
|
+
i0.ɵɵadvance();
|
|
122
|
+
i0.ɵɵtextInterpolate1("", ctx_r2.VectorDBProviders.length, " provider(s) registered");
|
|
123
|
+
} }
|
|
124
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
125
|
+
i0.ɵɵelementStart(0, "span", 36);
|
|
126
|
+
i0.ɵɵtext(1, "No providers registered. Add a vector database provider (e.g., Pinecone, Weaviate) via the admin console.");
|
|
127
|
+
i0.ɵɵelementEnd();
|
|
128
|
+
} }
|
|
129
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_23_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
130
|
+
i0.ɵɵelementStart(0, "div", 40)(1, "div", 41);
|
|
131
|
+
i0.ɵɵelement(2, "i", 42);
|
|
132
|
+
i0.ɵɵelementEnd();
|
|
133
|
+
i0.ɵɵelementStart(3, "div", 43)(4, "span", 44);
|
|
134
|
+
i0.ɵɵtext(5);
|
|
135
|
+
i0.ɵɵelementEnd();
|
|
136
|
+
i0.ɵɵelementStart(6, "span", 45);
|
|
137
|
+
i0.ɵɵtext(7);
|
|
138
|
+
i0.ɵɵelementEnd()();
|
|
139
|
+
i0.ɵɵelementStart(8, "span", 46);
|
|
140
|
+
i0.ɵɵelement(9, "i", 32);
|
|
141
|
+
i0.ɵɵtext(10, " Active ");
|
|
142
|
+
i0.ɵɵelementEnd()();
|
|
143
|
+
} if (rf & 2) {
|
|
144
|
+
const provider_r5 = ctx.$implicit;
|
|
145
|
+
i0.ɵɵadvance(5);
|
|
146
|
+
i0.ɵɵtextInterpolate(provider_r5.Name);
|
|
147
|
+
i0.ɵɵadvance(2);
|
|
148
|
+
i0.ɵɵtextInterpolate(provider_r5.ClassKey);
|
|
149
|
+
} }
|
|
150
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
151
|
+
i0.ɵɵelementStart(0, "div", 37);
|
|
152
|
+
i0.ɵɵrepeaterCreate(1, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_23_For_2_Template, 11, 2, "div", 40, _forTrack0);
|
|
153
|
+
i0.ɵɵelementEnd();
|
|
154
|
+
} if (rf & 2) {
|
|
155
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
156
|
+
i0.ɵɵadvance();
|
|
157
|
+
i0.ɵɵrepeater(ctx_r2.VectorDBProviders);
|
|
158
|
+
} }
|
|
159
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_27_Template(rf, ctx) { if (rf & 1) {
|
|
160
|
+
i0.ɵɵelement(0, "i", 32);
|
|
161
|
+
} }
|
|
162
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_28_Template(rf, ctx) { if (rf & 1) {
|
|
163
|
+
i0.ɵɵelementStart(0, "span", 33);
|
|
164
|
+
i0.ɵɵtext(1, "2");
|
|
165
|
+
i0.ɵɵelementEnd();
|
|
166
|
+
} }
|
|
167
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_32_Template(rf, ctx) { if (rf & 1) {
|
|
168
|
+
i0.ɵɵelementStart(0, "span", 36);
|
|
169
|
+
i0.ɵɵtext(1);
|
|
170
|
+
i0.ɵɵelementEnd();
|
|
171
|
+
} if (rf & 2) {
|
|
172
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
173
|
+
i0.ɵɵadvance();
|
|
174
|
+
i0.ɵɵtextInterpolate1("", ctx_r2.EmbeddingModels.length, " model(s) available");
|
|
175
|
+
} }
|
|
176
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_33_Template(rf, ctx) { if (rf & 1) {
|
|
177
|
+
i0.ɵɵelementStart(0, "span", 36);
|
|
178
|
+
i0.ɵɵtext(1, "No embedding models found. Configure at least one in the AI app > Models tab.");
|
|
179
|
+
i0.ɵɵelementEnd();
|
|
180
|
+
} }
|
|
181
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_34_For_3_Template(rf, ctx) { if (rf & 1) {
|
|
182
|
+
i0.ɵɵelementStart(0, "span", 48);
|
|
183
|
+
i0.ɵɵtext(1);
|
|
184
|
+
i0.ɵɵelementEnd();
|
|
185
|
+
} if (rf & 2) {
|
|
186
|
+
const model_r6 = ctx.$implicit;
|
|
187
|
+
i0.ɵɵadvance();
|
|
188
|
+
i0.ɵɵtextInterpolate(model_r6.Name);
|
|
189
|
+
} }
|
|
190
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_34_Template(rf, ctx) { if (rf & 1) {
|
|
191
|
+
i0.ɵɵelementStart(0, "div", 37)(1, "div", 47);
|
|
192
|
+
i0.ɵɵrepeaterCreate(2, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_34_For_3_Template, 2, 1, "span", 48, _forTrack0);
|
|
193
|
+
i0.ɵɵelementEnd()();
|
|
194
|
+
} if (rf & 2) {
|
|
195
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
196
|
+
i0.ɵɵadvance(2);
|
|
197
|
+
i0.ɵɵrepeater(ctx_r2.EmbeddingModels);
|
|
198
|
+
} }
|
|
199
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_38_Template(rf, ctx) { if (rf & 1) {
|
|
200
|
+
i0.ɵɵelement(0, "i", 32);
|
|
201
|
+
} }
|
|
202
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_39_Template(rf, ctx) { if (rf & 1) {
|
|
203
|
+
i0.ɵɵelementStart(0, "span", 33);
|
|
204
|
+
i0.ɵɵtext(1, "3");
|
|
205
|
+
i0.ɵɵelementEnd();
|
|
206
|
+
} }
|
|
207
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_43_Template(rf, ctx) { if (rf & 1) {
|
|
208
|
+
i0.ɵɵelementStart(0, "span", 36);
|
|
209
|
+
i0.ɵɵtext(1);
|
|
210
|
+
i0.ɵɵelementEnd();
|
|
211
|
+
} if (rf & 2) {
|
|
212
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
213
|
+
i0.ɵɵadvance();
|
|
214
|
+
i0.ɵɵtextInterpolate1("", ctx_r2.VectorIndexes.length, " index(es) configured");
|
|
215
|
+
} }
|
|
216
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_44_Template(rf, ctx) { if (rf & 1) {
|
|
217
|
+
i0.ɵɵelementStart(0, "span", 36);
|
|
218
|
+
i0.ɵɵtext(1, "No indexes yet \u2014 create one below.");
|
|
219
|
+
i0.ɵɵelementEnd();
|
|
220
|
+
} }
|
|
221
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_45_Template(rf, ctx) { if (rf & 1) {
|
|
222
|
+
i0.ɵɵelementStart(0, "span", 36);
|
|
223
|
+
i0.ɵɵtext(1, "Complete steps 1 and 2 first.");
|
|
224
|
+
i0.ɵɵelementEnd();
|
|
225
|
+
} }
|
|
226
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_46_Template(rf, ctx) { if (rf & 1) {
|
|
227
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
228
|
+
i0.ɵɵelementStart(0, "button", 49);
|
|
229
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_46_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OpenCreateIndexForm()); });
|
|
230
|
+
i0.ɵɵelement(1, "i", 50);
|
|
231
|
+
i0.ɵɵtext(2, " Create Index ");
|
|
232
|
+
i0.ɵɵelementEnd();
|
|
233
|
+
} }
|
|
234
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_47_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
235
|
+
const _r8 = i0.ɵɵgetCurrentView();
|
|
236
|
+
i0.ɵɵelementStart(0, "div", 51)(1, "div", 52);
|
|
237
|
+
i0.ɵɵelement(2, "i", 53);
|
|
238
|
+
i0.ɵɵelementEnd();
|
|
239
|
+
i0.ɵɵelementStart(3, "div", 54)(4, "span", 55);
|
|
240
|
+
i0.ɵɵtext(5);
|
|
241
|
+
i0.ɵɵelementEnd();
|
|
242
|
+
i0.ɵɵelementStart(6, "span", 56);
|
|
243
|
+
i0.ɵɵelement(7, "i", 42);
|
|
244
|
+
i0.ɵɵtext(8);
|
|
245
|
+
i0.ɵɵelement(9, "i", 57);
|
|
246
|
+
i0.ɵɵtext(10);
|
|
247
|
+
i0.ɵɵelementEnd()();
|
|
248
|
+
i0.ɵɵelementStart(11, "div", 58)(12, "span", 46);
|
|
249
|
+
i0.ɵɵelement(13, "i", 32);
|
|
250
|
+
i0.ɵɵtext(14, " Active ");
|
|
251
|
+
i0.ɵɵelementEnd();
|
|
252
|
+
i0.ɵɵelementStart(15, "button", 59);
|
|
253
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_47_For_2_Template_button_click_15_listener() { const idx_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.DeleteIndex(idx_r9.ID)); });
|
|
254
|
+
i0.ɵɵelement(16, "i", 60);
|
|
255
|
+
i0.ɵɵelementEnd()()();
|
|
256
|
+
} if (rf & 2) {
|
|
257
|
+
const idx_r9 = ctx.$implicit;
|
|
258
|
+
i0.ɵɵadvance(5);
|
|
259
|
+
i0.ɵɵtextInterpolate(idx_r9.Name);
|
|
260
|
+
i0.ɵɵadvance(3);
|
|
261
|
+
i0.ɵɵtextInterpolate1(" ", idx_r9.VectorDatabase, " \u00A0\u00B7\u00A0 ");
|
|
262
|
+
i0.ɵɵadvance(2);
|
|
263
|
+
i0.ɵɵtextInterpolate1(" ", idx_r9.EmbeddingModel, " ");
|
|
264
|
+
} }
|
|
265
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_47_Template(rf, ctx) { if (rf & 1) {
|
|
266
|
+
i0.ɵɵelementStart(0, "div", 37);
|
|
267
|
+
i0.ɵɵrepeaterCreate(1, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_47_For_2_Template, 17, 3, "div", 51, _forTrack0);
|
|
268
|
+
i0.ɵɵelementEnd();
|
|
269
|
+
} if (rf & 2) {
|
|
270
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
271
|
+
i0.ɵɵadvance();
|
|
272
|
+
i0.ɵɵrepeater(ctx_r2.VectorIndexes);
|
|
273
|
+
} }
|
|
274
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_48_For_14_Template(rf, ctx) { if (rf & 1) {
|
|
275
|
+
i0.ɵɵelementStart(0, "option", 68);
|
|
276
|
+
i0.ɵɵtext(1);
|
|
277
|
+
i0.ɵɵelementEnd();
|
|
278
|
+
} if (rf & 2) {
|
|
279
|
+
const db_r11 = ctx.$implicit;
|
|
280
|
+
i0.ɵɵproperty("value", db_r11.ID);
|
|
281
|
+
i0.ɵɵadvance();
|
|
282
|
+
i0.ɵɵtextInterpolate(db_r11.Name);
|
|
283
|
+
} }
|
|
284
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_48_For_20_Template(rf, ctx) { if (rf & 1) {
|
|
285
|
+
i0.ɵɵelementStart(0, "option", 68);
|
|
286
|
+
i0.ɵɵtext(1);
|
|
287
|
+
i0.ɵɵelementEnd();
|
|
288
|
+
} if (rf & 2) {
|
|
289
|
+
const model_r12 = ctx.$implicit;
|
|
290
|
+
i0.ɵɵproperty("value", model_r12.ID);
|
|
291
|
+
i0.ɵɵadvance();
|
|
292
|
+
i0.ɵɵtextInterpolate(model_r12.Name);
|
|
293
|
+
} }
|
|
294
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_48_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
295
|
+
i0.ɵɵelement(0, "i", 72);
|
|
296
|
+
i0.ɵɵtext(1, " Creating... ");
|
|
297
|
+
} }
|
|
298
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_48_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
299
|
+
i0.ɵɵelement(0, "i", 50);
|
|
300
|
+
i0.ɵɵtext(1, " Create Index ");
|
|
301
|
+
} }
|
|
302
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_48_Template(rf, ctx) { if (rf & 1) {
|
|
303
|
+
const _r10 = i0.ɵɵgetCurrentView();
|
|
304
|
+
i0.ɵɵelementStart(0, "div", 39)(1, "h4", 61);
|
|
305
|
+
i0.ɵɵelement(2, "i", 62);
|
|
306
|
+
i0.ɵɵtext(3, " Create New Vector Index ");
|
|
307
|
+
i0.ɵɵelementEnd();
|
|
308
|
+
i0.ɵɵelementStart(4, "div", 63)(5, "div", 64)(6, "label", 65);
|
|
309
|
+
i0.ɵɵtext(7, "Index Name");
|
|
310
|
+
i0.ɵɵelementEnd();
|
|
311
|
+
i0.ɵɵelementStart(8, "input", 66);
|
|
312
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_48_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.NewIndexName, $event) || (ctx_r2.NewIndexName = $event); return i0.ɵɵresetView($event); });
|
|
313
|
+
i0.ɵɵelementEnd()();
|
|
314
|
+
i0.ɵɵelementStart(9, "div", 64)(10, "label", 65);
|
|
315
|
+
i0.ɵɵtext(11, "Vector Database");
|
|
316
|
+
i0.ɵɵelementEnd();
|
|
317
|
+
i0.ɵɵelementStart(12, "select", 67);
|
|
318
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_48_Template_select_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.NewIndexVectorDBID, $event) || (ctx_r2.NewIndexVectorDBID = $event); return i0.ɵɵresetView($event); });
|
|
319
|
+
i0.ɵɵrepeaterCreate(13, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_48_For_14_Template, 2, 2, "option", 68, _forTrack0);
|
|
320
|
+
i0.ɵɵelementEnd()();
|
|
321
|
+
i0.ɵɵelementStart(15, "div", 64)(16, "label", 65);
|
|
322
|
+
i0.ɵɵtext(17, "Embedding Model");
|
|
323
|
+
i0.ɵɵelementEnd();
|
|
324
|
+
i0.ɵɵelementStart(18, "select", 67);
|
|
325
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_48_Template_select_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.NewIndexEmbeddingModelID, $event) || (ctx_r2.NewIndexEmbeddingModelID = $event); return i0.ɵɵresetView($event); });
|
|
326
|
+
i0.ɵɵrepeaterCreate(19, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_48_For_20_Template, 2, 2, "option", 68, _forTrack0);
|
|
327
|
+
i0.ɵɵelementEnd()()();
|
|
328
|
+
i0.ɵɵelementStart(21, "div", 69)(22, "button", 70);
|
|
329
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_48_Template_button_click_22_listener() { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.CreateIndex()); });
|
|
330
|
+
i0.ɵɵconditionalCreate(23, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_48_Conditional_23_Template, 2, 0)(24, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_48_Conditional_24_Template, 2, 0);
|
|
331
|
+
i0.ɵɵelementEnd();
|
|
332
|
+
i0.ɵɵelementStart(25, "button", 71);
|
|
333
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_48_Template_button_click_25_listener() { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.CancelCreateIndex()); });
|
|
334
|
+
i0.ɵɵtext(26, " Cancel ");
|
|
335
|
+
i0.ɵɵelementEnd()()();
|
|
336
|
+
} if (rf & 2) {
|
|
337
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
338
|
+
i0.ɵɵadvance(8);
|
|
339
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.NewIndexName);
|
|
340
|
+
i0.ɵɵadvance(4);
|
|
341
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.NewIndexVectorDBID);
|
|
342
|
+
i0.ɵɵadvance();
|
|
343
|
+
i0.ɵɵrepeater(ctx_r2.VectorDBProviders);
|
|
344
|
+
i0.ɵɵadvance(5);
|
|
345
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.NewIndexEmbeddingModelID);
|
|
346
|
+
i0.ɵɵadvance();
|
|
347
|
+
i0.ɵɵrepeater(ctx_r2.EmbeddingModels);
|
|
348
|
+
i0.ɵɵadvance(3);
|
|
349
|
+
i0.ɵɵproperty("disabled", ctx_r2.IsCreatingIndex);
|
|
350
|
+
i0.ɵɵadvance();
|
|
351
|
+
i0.ɵɵconditional(ctx_r2.IsCreatingIndex ? 23 : 24);
|
|
352
|
+
i0.ɵɵadvance(2);
|
|
353
|
+
i0.ɵɵproperty("disabled", ctx_r2.IsCreatingIndex);
|
|
354
|
+
} }
|
|
355
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
356
|
+
i0.ɵɵelementStart(0, "div", 8)(1, "h2", 11);
|
|
357
|
+
i0.ɵɵtext(2, "Vector Database");
|
|
358
|
+
i0.ɵɵelementEnd();
|
|
359
|
+
i0.ɵɵelementStart(3, "p", 12);
|
|
360
|
+
i0.ɵɵtext(4, "Manage the shared vector index and database connection.");
|
|
361
|
+
i0.ɵɵelementEnd();
|
|
362
|
+
i0.ɵɵelementStart(5, "div", 23)(6, "div", 24)(7, "span", 25);
|
|
363
|
+
i0.ɵɵtext(8, "Setup Progress");
|
|
364
|
+
i0.ɵɵelementEnd();
|
|
365
|
+
i0.ɵɵelementStart(9, "span", 26);
|
|
366
|
+
i0.ɵɵtext(10);
|
|
367
|
+
i0.ɵɵelementEnd()();
|
|
368
|
+
i0.ɵɵelementStart(11, "div", 27);
|
|
369
|
+
i0.ɵɵelement(12, "div", 28);
|
|
370
|
+
i0.ɵɵelementEnd()();
|
|
371
|
+
i0.ɵɵelementStart(13, "div", 29)(14, "div", 30)(15, "div", 31);
|
|
372
|
+
i0.ɵɵconditionalCreate(16, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_16_Template, 1, 0, "i", 32)(17, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_17_Template, 2, 0, "span", 33);
|
|
373
|
+
i0.ɵɵelementEnd();
|
|
374
|
+
i0.ɵɵelementStart(18, "div", 34)(19, "span", 35);
|
|
375
|
+
i0.ɵɵtext(20, "Vector Database Providers");
|
|
376
|
+
i0.ɵɵelementEnd();
|
|
377
|
+
i0.ɵɵconditionalCreate(21, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_21_Template, 2, 1, "span", 36)(22, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_22_Template, 2, 0, "span", 36);
|
|
378
|
+
i0.ɵɵelementEnd()();
|
|
379
|
+
i0.ɵɵconditionalCreate(23, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_23_Template, 3, 0, "div", 37);
|
|
380
|
+
i0.ɵɵelementEnd();
|
|
381
|
+
i0.ɵɵelementStart(24, "div", 29)(25, "div", 30)(26, "div", 31);
|
|
382
|
+
i0.ɵɵconditionalCreate(27, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_27_Template, 1, 0, "i", 32)(28, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_28_Template, 2, 0, "span", 33);
|
|
383
|
+
i0.ɵɵelementEnd();
|
|
384
|
+
i0.ɵɵelementStart(29, "div", 34)(30, "span", 35);
|
|
385
|
+
i0.ɵɵtext(31, "Embedding Models");
|
|
386
|
+
i0.ɵɵelementEnd();
|
|
387
|
+
i0.ɵɵconditionalCreate(32, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_32_Template, 2, 1, "span", 36)(33, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_33_Template, 2, 0, "span", 36);
|
|
388
|
+
i0.ɵɵelementEnd()();
|
|
389
|
+
i0.ɵɵconditionalCreate(34, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_34_Template, 4, 0, "div", 37);
|
|
390
|
+
i0.ɵɵelementEnd();
|
|
391
|
+
i0.ɵɵelementStart(35, "div", 29)(36, "div", 30)(37, "div", 31);
|
|
392
|
+
i0.ɵɵconditionalCreate(38, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_38_Template, 1, 0, "i", 32)(39, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_39_Template, 2, 0, "span", 33);
|
|
393
|
+
i0.ɵɵelementEnd();
|
|
394
|
+
i0.ɵɵelementStart(40, "div", 34)(41, "span", 35);
|
|
395
|
+
i0.ɵɵtext(42, "Vector Indexes");
|
|
396
|
+
i0.ɵɵelementEnd();
|
|
397
|
+
i0.ɵɵconditionalCreate(43, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_43_Template, 2, 1, "span", 36)(44, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_44_Template, 2, 0, "span", 36)(45, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_45_Template, 2, 0, "span", 36);
|
|
398
|
+
i0.ɵɵelementEnd();
|
|
399
|
+
i0.ɵɵconditionalCreate(46, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_46_Template, 3, 0, "button", 38);
|
|
400
|
+
i0.ɵɵelementEnd();
|
|
401
|
+
i0.ɵɵconditionalCreate(47, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_47_Template, 3, 0, "div", 37);
|
|
402
|
+
i0.ɵɵconditionalCreate(48, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Conditional_48_Template, 27, 6, "div", 39);
|
|
403
|
+
i0.ɵɵelementEnd()();
|
|
404
|
+
} if (rf & 2) {
|
|
405
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
406
|
+
i0.ɵɵadvance(10);
|
|
407
|
+
i0.ɵɵtextInterpolate1("", ctx_r2.SetupStepsCompleted, " of 3 complete");
|
|
408
|
+
i0.ɵɵadvance(2);
|
|
409
|
+
i0.ɵɵstyleProp("width", ctx_r2.SetupStepsCompleted / 3 * 100, "%");
|
|
410
|
+
i0.ɵɵadvance();
|
|
411
|
+
i0.ɵɵclassProp("setup-step-complete", ctx_r2.HasVectorDBProvider)("setup-step-pending", !ctx_r2.HasVectorDBProvider);
|
|
412
|
+
i0.ɵɵadvance(3);
|
|
413
|
+
i0.ɵɵconditional(ctx_r2.HasVectorDBProvider ? 16 : 17);
|
|
414
|
+
i0.ɵɵadvance(5);
|
|
415
|
+
i0.ɵɵconditional(ctx_r2.HasVectorDBProvider ? 21 : 22);
|
|
416
|
+
i0.ɵɵadvance(2);
|
|
417
|
+
i0.ɵɵconditional(ctx_r2.HasVectorDBProvider ? 23 : -1);
|
|
418
|
+
i0.ɵɵadvance();
|
|
419
|
+
i0.ɵɵclassProp("setup-step-complete", ctx_r2.HasEmbeddingModel)("setup-step-pending", !ctx_r2.HasEmbeddingModel);
|
|
420
|
+
i0.ɵɵadvance(3);
|
|
421
|
+
i0.ɵɵconditional(ctx_r2.HasEmbeddingModel ? 27 : 28);
|
|
422
|
+
i0.ɵɵadvance(5);
|
|
423
|
+
i0.ɵɵconditional(ctx_r2.HasEmbeddingModel ? 32 : 33);
|
|
424
|
+
i0.ɵɵadvance(2);
|
|
425
|
+
i0.ɵɵconditional(ctx_r2.HasEmbeddingModel ? 34 : -1);
|
|
426
|
+
i0.ɵɵadvance();
|
|
427
|
+
i0.ɵɵclassProp("setup-step-complete", ctx_r2.HasVectorIndex)("setup-step-pending", !ctx_r2.HasVectorIndex);
|
|
428
|
+
i0.ɵɵadvance(3);
|
|
429
|
+
i0.ɵɵconditional(ctx_r2.HasVectorIndex ? 38 : 39);
|
|
430
|
+
i0.ɵɵadvance(5);
|
|
431
|
+
i0.ɵɵconditional(ctx_r2.HasVectorIndex ? 43 : ctx_r2.HasVectorDBProvider && ctx_r2.HasEmbeddingModel ? 44 : 45);
|
|
432
|
+
i0.ɵɵadvance(3);
|
|
433
|
+
i0.ɵɵconditional(ctx_r2.HasVectorDBProvider && ctx_r2.HasEmbeddingModel && !ctx_r2.ShowCreateIndexForm ? 46 : -1);
|
|
434
|
+
i0.ɵɵadvance();
|
|
435
|
+
i0.ɵɵconditional(ctx_r2.HasVectorIndex ? 47 : -1);
|
|
436
|
+
i0.ɵɵadvance();
|
|
437
|
+
i0.ɵɵconditional(ctx_r2.ShowCreateIndexForm ? 48 : -1);
|
|
438
|
+
} }
|
|
439
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
440
|
+
i0.ɵɵelement(0, "mj-loading", 73);
|
|
441
|
+
} }
|
|
442
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
443
|
+
i0.ɵɵelementStart(0, "div", 74);
|
|
444
|
+
i0.ɵɵelement(1, "i", 75);
|
|
445
|
+
i0.ɵɵelementStart(2, "h3", 76);
|
|
446
|
+
i0.ɵɵtext(3, "No Searchable Entities Found");
|
|
447
|
+
i0.ɵɵelementEnd();
|
|
448
|
+
i0.ɵɵelementStart(4, "p", 77);
|
|
449
|
+
i0.ɵɵtext(5, "No entities with text fields were discovered. Ensure your database schema includes entities with varchar/nvarchar columns.");
|
|
450
|
+
i0.ɵɵelementEnd()();
|
|
451
|
+
} }
|
|
452
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Conditional_7_For_7_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
453
|
+
i0.ɵɵelementStart(0, "span", 89);
|
|
454
|
+
i0.ɵɵtext(1);
|
|
455
|
+
i0.ɵɵelementEnd();
|
|
456
|
+
} if (rf & 2) {
|
|
457
|
+
const field_r16 = ctx.$implicit;
|
|
458
|
+
i0.ɵɵadvance();
|
|
459
|
+
i0.ɵɵtextInterpolate(field_r16);
|
|
460
|
+
} }
|
|
461
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Conditional_7_For_7_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
462
|
+
i0.ɵɵelementStart(0, "span", 93);
|
|
463
|
+
i0.ɵɵelement(1, "i", 94);
|
|
464
|
+
i0.ɵɵtext(2);
|
|
465
|
+
i0.ɵɵelementEnd();
|
|
466
|
+
} if (rf & 2) {
|
|
467
|
+
const entity_r15 = i0.ɵɵnextContext().$implicit;
|
|
468
|
+
i0.ɵɵadvance(2);
|
|
469
|
+
i0.ɵɵtextInterpolate1(" ", entity_r15.SnippetField, " ");
|
|
470
|
+
} }
|
|
471
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Conditional_7_For_7_Template(rf, ctx) { if (rf & 1) {
|
|
472
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
473
|
+
i0.ɵɵelementStart(0, "div", 84)(1, "div", 85)(2, "input", 18);
|
|
474
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Conditional_7_For_7_Template_input_ngModelChange_2_listener($event) { const entity_r15 = i0.ɵɵrestoreView(_r14).$implicit; i0.ɵɵtwoWayBindingSet(entity_r15.Enabled, $event) || (entity_r15.Enabled = $event); return i0.ɵɵresetView($event); });
|
|
475
|
+
i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Conditional_7_For_7_Template_input_change_2_listener() { const entity_r15 = i0.ɵɵrestoreView(_r14).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.OnFTSEntityToggled(entity_r15)); });
|
|
476
|
+
i0.ɵɵelementEnd()();
|
|
477
|
+
i0.ɵɵelementStart(3, "div", 86)(4, "span", 87);
|
|
478
|
+
i0.ɵɵtext(5);
|
|
479
|
+
i0.ɵɵelementEnd();
|
|
480
|
+
i0.ɵɵelementStart(6, "div", 88);
|
|
481
|
+
i0.ɵɵrepeaterCreate(7, KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Conditional_7_For_7_For_8_Template, 2, 1, "span", 89, i0.ɵɵrepeaterTrackByIdentity);
|
|
482
|
+
i0.ɵɵelementEnd()();
|
|
483
|
+
i0.ɵɵelementStart(9, "div", 90)(10, "span", 91);
|
|
484
|
+
i0.ɵɵelement(11, "i", 92);
|
|
485
|
+
i0.ɵɵtext(12);
|
|
486
|
+
i0.ɵɵelementEnd();
|
|
487
|
+
i0.ɵɵconditionalCreate(13, KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Conditional_7_For_7_Conditional_13_Template, 3, 1, "span", 93);
|
|
488
|
+
i0.ɵɵelementEnd()();
|
|
489
|
+
} if (rf & 2) {
|
|
490
|
+
const entity_r15 = ctx.$implicit;
|
|
491
|
+
i0.ɵɵclassProp("fts-entity-enabled", entity_r15.Enabled);
|
|
492
|
+
i0.ɵɵadvance(2);
|
|
493
|
+
i0.ɵɵtwoWayProperty("ngModel", entity_r15.Enabled);
|
|
494
|
+
i0.ɵɵadvance(3);
|
|
495
|
+
i0.ɵɵtextInterpolate(entity_r15.EntityName);
|
|
496
|
+
i0.ɵɵadvance(2);
|
|
497
|
+
i0.ɵɵrepeater(entity_r15.IndexedFields);
|
|
498
|
+
i0.ɵɵadvance(5);
|
|
499
|
+
i0.ɵɵtextInterpolate1(" ", entity_r15.TitleField, " ");
|
|
500
|
+
i0.ɵɵadvance();
|
|
501
|
+
i0.ɵɵconditional(entity_r15.SnippetField !== entity_r15.TitleField ? 13 : -1);
|
|
502
|
+
} }
|
|
503
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
504
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
505
|
+
i0.ɵɵelementStart(0, "div", 78)(1, "div", 79)(2, "span", 80);
|
|
506
|
+
i0.ɵɵtext(3);
|
|
507
|
+
i0.ɵɵelementEnd();
|
|
508
|
+
i0.ɵɵelementStart(4, "input", 81);
|
|
509
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Conditional_7_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.FTSFilterText, $event) || (ctx_r2.FTSFilterText = $event); return i0.ɵɵresetView($event); });
|
|
510
|
+
i0.ɵɵelementEnd()()();
|
|
511
|
+
i0.ɵɵelementStart(5, "div", 82);
|
|
512
|
+
i0.ɵɵrepeaterCreate(6, KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Conditional_7_For_7_Template, 14, 6, "div", 83, _forTrack1);
|
|
513
|
+
i0.ɵɵelementEnd();
|
|
514
|
+
} if (rf & 2) {
|
|
515
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
516
|
+
i0.ɵɵadvance(3);
|
|
517
|
+
i0.ɵɵtextInterpolate2("", ctx_r2.EnabledFTSCount, " of ", ctx_r2.FTSEntities.length, " entities enabled for search");
|
|
518
|
+
i0.ɵɵadvance();
|
|
519
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.FTSFilterText);
|
|
520
|
+
i0.ɵɵadvance(2);
|
|
521
|
+
i0.ɵɵrepeater(ctx_r2.FilteredFTSEntities);
|
|
522
|
+
} }
|
|
523
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
524
|
+
i0.ɵɵelementStart(0, "div", 8)(1, "h2", 11);
|
|
525
|
+
i0.ɵɵtext(2, "Full-Text Search Entities");
|
|
526
|
+
i0.ɵɵelementEnd();
|
|
527
|
+
i0.ɵɵelementStart(3, "p", 12);
|
|
528
|
+
i0.ɵɵtext(4, "Configure which entities are included in full-text search. Entities with text fields (Name, Description, etc.) are automatically discovered.");
|
|
529
|
+
i0.ɵɵelementEnd();
|
|
530
|
+
i0.ɵɵconditionalCreate(5, KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Conditional_5_Template, 1, 0, "mj-loading", 73)(6, KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Conditional_6_Template, 6, 0, "div", 74)(7, KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Conditional_7_Template, 8, 3);
|
|
531
|
+
i0.ɵɵelementEnd();
|
|
532
|
+
} if (rf & 2) {
|
|
533
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
534
|
+
i0.ɵɵadvance(5);
|
|
535
|
+
i0.ɵɵconditional(ctx_r2.IsLoadingFTSEntities ? 5 : ctx_r2.FTSEntities.length === 0 ? 6 : 7);
|
|
536
|
+
} }
|
|
537
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_12_Conditional_5_For_17_Template(rf, ctx) { if (rf & 1) {
|
|
538
|
+
i0.ɵɵelementStart(0, "span", 48);
|
|
539
|
+
i0.ɵɵtext(1);
|
|
540
|
+
i0.ɵɵelementEnd();
|
|
541
|
+
} if (rf & 2) {
|
|
542
|
+
const model_r17 = ctx.$implicit;
|
|
543
|
+
i0.ɵɵadvance();
|
|
544
|
+
i0.ɵɵtextInterpolate(model_r17.Name);
|
|
545
|
+
} }
|
|
546
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_12_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
547
|
+
i0.ɵɵelementStart(0, "div", 13)(1, "div", 19)(2, "div", 20)(3, "span", 16);
|
|
548
|
+
i0.ɵɵtext(4, "Active Model");
|
|
549
|
+
i0.ɵɵelementEnd();
|
|
550
|
+
i0.ɵɵelementStart(5, "span", 17);
|
|
551
|
+
i0.ɵɵtext(6, "Currently selected embedding model");
|
|
552
|
+
i0.ɵɵelementEnd()();
|
|
553
|
+
i0.ɵɵelementStart(7, "span", 95);
|
|
554
|
+
i0.ɵɵtext(8);
|
|
555
|
+
i0.ɵɵelementEnd()();
|
|
556
|
+
i0.ɵɵelementStart(9, "div", 19)(10, "div", 20)(11, "span", 16);
|
|
557
|
+
i0.ɵɵtext(12, "Available Models");
|
|
558
|
+
i0.ɵɵelementEnd();
|
|
559
|
+
i0.ɵɵelementStart(13, "span", 17);
|
|
560
|
+
i0.ɵɵtext(14);
|
|
561
|
+
i0.ɵɵelementEnd()();
|
|
562
|
+
i0.ɵɵelementStart(15, "div", 47);
|
|
563
|
+
i0.ɵɵrepeaterCreate(16, KnowledgeConfigResourceComponent_Conditional_1_Conditional_12_Conditional_5_For_17_Template, 2, 1, "span", 48, _forTrack0);
|
|
564
|
+
i0.ɵɵelementEnd()()();
|
|
565
|
+
i0.ɵɵelementStart(18, "p", 96);
|
|
566
|
+
i0.ɵɵelement(19, "i", 97);
|
|
567
|
+
i0.ɵɵtext(20, " Manage embedding models in the AI Dashboard > Models tab. ");
|
|
568
|
+
i0.ɵɵelementEnd();
|
|
569
|
+
} if (rf & 2) {
|
|
570
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
571
|
+
i0.ɵɵadvance(8);
|
|
572
|
+
i0.ɵɵtextInterpolate(ctx_r2.EmbeddingModelName);
|
|
573
|
+
i0.ɵɵadvance(6);
|
|
574
|
+
i0.ɵɵtextInterpolate1("", ctx_r2.EmbeddingModels.length, " embedding model(s) configured");
|
|
575
|
+
i0.ɵɵadvance(2);
|
|
576
|
+
i0.ɵɵrepeater(ctx_r2.EmbeddingModels);
|
|
577
|
+
} }
|
|
578
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_12_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
579
|
+
i0.ɵɵelementStart(0, "div", 74);
|
|
580
|
+
i0.ɵɵelement(1, "i", 98);
|
|
581
|
+
i0.ɵɵelementStart(2, "h3", 76);
|
|
582
|
+
i0.ɵɵtext(3, "No Embedding Models Found");
|
|
583
|
+
i0.ɵɵelementEnd();
|
|
584
|
+
i0.ɵɵelementStart(4, "p", 77);
|
|
585
|
+
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. ");
|
|
586
|
+
i0.ɵɵelementEnd()();
|
|
587
|
+
} }
|
|
588
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
589
|
+
i0.ɵɵelementStart(0, "div", 8)(1, "h2", 11);
|
|
590
|
+
i0.ɵɵtext(2, "Embedding Models");
|
|
591
|
+
i0.ɵɵelementEnd();
|
|
592
|
+
i0.ɵɵelementStart(3, "p", 12);
|
|
593
|
+
i0.ɵɵtext(4, "AI models used for generating vector embeddings from text.");
|
|
594
|
+
i0.ɵɵelementEnd();
|
|
595
|
+
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", 74);
|
|
596
|
+
i0.ɵɵelementEnd();
|
|
597
|
+
} if (rf & 2) {
|
|
598
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
599
|
+
i0.ɵɵadvance(5);
|
|
600
|
+
i0.ɵɵconditional(ctx_r2.HasEmbeddingModel ? 5 : 6);
|
|
601
|
+
} }
|
|
602
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
603
|
+
const _r18 = i0.ɵɵgetCurrentView();
|
|
604
|
+
i0.ɵɵelementStart(0, "div", 8)(1, "h2", 11);
|
|
605
|
+
i0.ɵɵtext(2, "Scoring Thresholds");
|
|
606
|
+
i0.ɵɵelementEnd();
|
|
607
|
+
i0.ɵɵelementStart(3, "p", 12);
|
|
608
|
+
i0.ɵɵtext(4, "Set the scoring thresholds used by search, duplicate detection, and autotagging.");
|
|
609
|
+
i0.ɵɵelementEnd();
|
|
610
|
+
i0.ɵɵelementStart(5, "div", 13)(6, "div", 19)(7, "div", 20)(8, "span", 16);
|
|
611
|
+
i0.ɵɵtext(9, "Duplicate Absolute Match");
|
|
612
|
+
i0.ɵɵelementEnd();
|
|
613
|
+
i0.ɵɵelementStart(10, "span", 17);
|
|
614
|
+
i0.ɵɵtext(11);
|
|
615
|
+
i0.ɵɵelementEnd()();
|
|
616
|
+
i0.ɵɵelementStart(12, "input", 99);
|
|
617
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_13_Template_input_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.ThresholdSettings.DuplicateAbsolute, $event) || (ctx_r2.ThresholdSettings.DuplicateAbsolute = $event); return i0.ɵɵresetView($event); });
|
|
618
|
+
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_13_Template_input_input_12_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnSettingChanged()); });
|
|
619
|
+
i0.ɵɵelementEnd()();
|
|
620
|
+
i0.ɵɵelementStart(13, "div", 19)(14, "div", 20)(15, "span", 16);
|
|
621
|
+
i0.ɵɵtext(16, "Duplicate Potential Match");
|
|
622
|
+
i0.ɵɵelementEnd();
|
|
623
|
+
i0.ɵɵelementStart(17, "span", 17);
|
|
624
|
+
i0.ɵɵtext(18);
|
|
625
|
+
i0.ɵɵelementEnd()();
|
|
626
|
+
i0.ɵɵelementStart(19, "input", 100);
|
|
627
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_13_Template_input_ngModelChange_19_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.ThresholdSettings.DuplicatePotential, $event) || (ctx_r2.ThresholdSettings.DuplicatePotential = $event); return i0.ɵɵresetView($event); });
|
|
628
|
+
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_13_Template_input_input_19_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnSettingChanged()); });
|
|
629
|
+
i0.ɵɵelementEnd()();
|
|
630
|
+
i0.ɵɵelementStart(20, "div", 19)(21, "div", 20)(22, "span", 16);
|
|
631
|
+
i0.ɵɵtext(23, "Search Relevance");
|
|
632
|
+
i0.ɵɵelementEnd();
|
|
633
|
+
i0.ɵɵelementStart(24, "span", 17);
|
|
634
|
+
i0.ɵɵtext(25);
|
|
635
|
+
i0.ɵɵelementEnd()();
|
|
636
|
+
i0.ɵɵelementStart(26, "input", 101);
|
|
637
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_13_Template_input_ngModelChange_26_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.ThresholdSettings.SearchRelevance, $event) || (ctx_r2.ThresholdSettings.SearchRelevance = $event); return i0.ɵɵresetView($event); });
|
|
638
|
+
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_13_Template_input_input_26_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnSettingChanged()); });
|
|
639
|
+
i0.ɵɵelementEnd()();
|
|
640
|
+
i0.ɵɵelementStart(27, "div", 19)(28, "div", 20)(29, "span", 16);
|
|
641
|
+
i0.ɵɵtext(30, "Autotag Confidence");
|
|
642
|
+
i0.ɵɵelementEnd();
|
|
643
|
+
i0.ɵɵelementStart(31, "span", 17);
|
|
644
|
+
i0.ɵɵtext(32);
|
|
645
|
+
i0.ɵɵelementEnd()();
|
|
646
|
+
i0.ɵɵelementStart(33, "input", 100);
|
|
647
|
+
i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_13_Template_input_ngModelChange_33_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.ThresholdSettings.AutotagConfidence, $event) || (ctx_r2.ThresholdSettings.AutotagConfidence = $event); return i0.ɵɵresetView($event); });
|
|
648
|
+
i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_13_Template_input_input_33_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnSettingChanged()); });
|
|
649
|
+
i0.ɵɵelementEnd()()()();
|
|
650
|
+
} if (rf & 2) {
|
|
651
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
652
|
+
i0.ɵɵadvance(11);
|
|
653
|
+
i0.ɵɵtextInterpolate1("Score above which duplicates are auto-confirmed (", ctx_r2.FormatThreshold(ctx_r2.ThresholdSettings.DuplicateAbsolute), ")");
|
|
654
|
+
i0.ɵɵadvance();
|
|
655
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.ThresholdSettings.DuplicateAbsolute);
|
|
656
|
+
i0.ɵɵadvance(6);
|
|
657
|
+
i0.ɵɵtextInterpolate1("Score above which duplicates are flagged for review (", ctx_r2.FormatThreshold(ctx_r2.ThresholdSettings.DuplicatePotential), ")");
|
|
658
|
+
i0.ɵɵadvance();
|
|
659
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.ThresholdSettings.DuplicatePotential);
|
|
660
|
+
i0.ɵɵadvance(6);
|
|
661
|
+
i0.ɵɵtextInterpolate1("Minimum score for search results (", ctx_r2.FormatThreshold(ctx_r2.ThresholdSettings.SearchRelevance), ")");
|
|
662
|
+
i0.ɵɵadvance();
|
|
663
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.ThresholdSettings.SearchRelevance);
|
|
664
|
+
i0.ɵɵadvance(6);
|
|
665
|
+
i0.ɵɵtextInterpolate1("Minimum confidence for accepting auto-generated tags (", ctx_r2.FormatThreshold(ctx_r2.ThresholdSettings.AutotagConfidence), ")");
|
|
666
|
+
i0.ɵɵadvance();
|
|
667
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.ThresholdSettings.AutotagConfidence);
|
|
668
|
+
} }
|
|
669
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_14_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
670
|
+
i0.ɵɵelement(0, "i", 72);
|
|
671
|
+
i0.ɵɵtext(1, " Saving... ");
|
|
672
|
+
} }
|
|
673
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_14_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
674
|
+
i0.ɵɵelement(0, "i", 105);
|
|
675
|
+
i0.ɵɵtext(1, " Save Changes ");
|
|
676
|
+
} }
|
|
677
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
678
|
+
const _r19 = i0.ɵɵgetCurrentView();
|
|
679
|
+
i0.ɵɵelementStart(0, "div", 9)(1, "span", 102);
|
|
680
|
+
i0.ɵɵtext(2, "You have unsaved changes");
|
|
681
|
+
i0.ɵɵelementEnd();
|
|
682
|
+
i0.ɵɵelementStart(3, "button", 103);
|
|
683
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_14_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.SaveConfiguration()); });
|
|
684
|
+
i0.ɵɵconditionalCreate(4, KnowledgeConfigResourceComponent_Conditional_1_Conditional_14_Conditional_4_Template, 2, 0)(5, KnowledgeConfigResourceComponent_Conditional_1_Conditional_14_Conditional_5_Template, 2, 0);
|
|
685
|
+
i0.ɵɵelementEnd();
|
|
686
|
+
i0.ɵɵelementStart(6, "button", 104);
|
|
687
|
+
i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_1_Conditional_14_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.ResetConfiguration()); });
|
|
688
|
+
i0.ɵɵtext(7, " Reset ");
|
|
689
|
+
i0.ɵɵelementEnd()();
|
|
690
|
+
} if (rf & 2) {
|
|
691
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
692
|
+
i0.ɵɵadvance(3);
|
|
693
|
+
i0.ɵɵproperty("disabled", ctx_r2.IsSaving);
|
|
694
|
+
i0.ɵɵadvance();
|
|
695
|
+
i0.ɵɵconditional(ctx_r2.IsSaving ? 4 : 5);
|
|
696
|
+
i0.ɵɵadvance(2);
|
|
697
|
+
i0.ɵɵproperty("disabled", ctx_r2.IsSaving);
|
|
698
|
+
} }
|
|
699
|
+
function KnowledgeConfigResourceComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
700
|
+
i0.ɵɵelementStart(0, "div", 1)(1, "nav", 3)(2, "div", 4);
|
|
701
|
+
i0.ɵɵelement(3, "i", 5);
|
|
702
|
+
i0.ɵɵelementStart(4, "span");
|
|
703
|
+
i0.ɵɵtext(5, "Configuration");
|
|
704
|
+
i0.ɵɵelementEnd()();
|
|
705
|
+
i0.ɵɵrepeaterCreate(6, KnowledgeConfigResourceComponent_Conditional_1_For_7_Template, 4, 5, "button", 6, _forTrack0);
|
|
706
|
+
i0.ɵɵelementEnd();
|
|
707
|
+
i0.ɵɵelementStart(8, "div", 7);
|
|
708
|
+
i0.ɵɵconditionalCreate(9, KnowledgeConfigResourceComponent_Conditional_1_Conditional_9_Template, 34, 4, "div", 8);
|
|
709
|
+
i0.ɵɵconditionalCreate(10, KnowledgeConfigResourceComponent_Conditional_1_Conditional_10_Template, 49, 26, "div", 8);
|
|
710
|
+
i0.ɵɵconditionalCreate(11, KnowledgeConfigResourceComponent_Conditional_1_Conditional_11_Template, 8, 1, "div", 8);
|
|
711
|
+
i0.ɵɵconditionalCreate(12, KnowledgeConfigResourceComponent_Conditional_1_Conditional_12_Template, 7, 1, "div", 8);
|
|
712
|
+
i0.ɵɵconditionalCreate(13, KnowledgeConfigResourceComponent_Conditional_1_Conditional_13_Template, 34, 8, "div", 8);
|
|
713
|
+
i0.ɵɵconditionalCreate(14, KnowledgeConfigResourceComponent_Conditional_1_Conditional_14_Template, 8, 3, "div", 9);
|
|
714
|
+
i0.ɵɵelementEnd()();
|
|
715
|
+
} if (rf & 2) {
|
|
716
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
717
|
+
i0.ɵɵadvance(6);
|
|
718
|
+
i0.ɵɵrepeater(ctx_r2.Sections);
|
|
719
|
+
i0.ɵɵadvance(3);
|
|
720
|
+
i0.ɵɵconditional(ctx_r2.ActiveSection === "pipeline" ? 9 : -1);
|
|
721
|
+
i0.ɵɵadvance();
|
|
722
|
+
i0.ɵɵconditional(ctx_r2.ActiveSection === "vectordb" ? 10 : -1);
|
|
723
|
+
i0.ɵɵadvance();
|
|
724
|
+
i0.ɵɵconditional(ctx_r2.ActiveSection === "fulltext" ? 11 : -1);
|
|
725
|
+
i0.ɵɵadvance();
|
|
726
|
+
i0.ɵɵconditional(ctx_r2.ActiveSection === "embedding" ? 12 : -1);
|
|
727
|
+
i0.ɵɵadvance();
|
|
728
|
+
i0.ɵɵconditional(ctx_r2.ActiveSection === "thresholds" ? 13 : -1);
|
|
729
|
+
i0.ɵɵadvance();
|
|
730
|
+
i0.ɵɵconditional(ctx_r2.HasUnsavedChanges ? 14 : -1);
|
|
731
|
+
} }
|
|
732
|
+
let KnowledgeConfigResourceComponent = class KnowledgeConfigResourceComponent extends BaseResourceComponent {
|
|
733
|
+
cdr = inject(ChangeDetectorRef);
|
|
734
|
+
destroy$ = new Subject();
|
|
735
|
+
async GetResourceDisplayName(_data) {
|
|
736
|
+
return 'Configuration';
|
|
737
|
+
}
|
|
738
|
+
async GetResourceIconClass(_data) {
|
|
739
|
+
return 'fa-solid fa-gear';
|
|
740
|
+
}
|
|
741
|
+
// --- Navigation ---
|
|
742
|
+
Sections = [
|
|
743
|
+
{ ID: 'pipeline', Label: 'Pipeline', Icon: 'fa-solid fa-diagram-project', Description: 'Configure the knowledge ingestion pipeline stages' },
|
|
744
|
+
{ ID: 'vectordb', Label: 'Vector Database', Icon: 'fa-solid fa-database', Description: 'Manage vector database connections and indexes' },
|
|
745
|
+
{ ID: 'fulltext', Label: 'Full-Text Indexes', Icon: 'fa-solid fa-text-width', Description: 'Configure SQL full-text search indexes' },
|
|
746
|
+
{ ID: 'embedding', Label: 'Embedding Models', Icon: 'fa-solid fa-microchip', Description: 'Select and configure embedding models' },
|
|
747
|
+
{ ID: 'thresholds', Label: 'Thresholds', Icon: 'fa-solid fa-sliders', Description: 'Set scoring thresholds for search and deduplication' },
|
|
748
|
+
];
|
|
749
|
+
ActiveSection = 'pipeline';
|
|
750
|
+
IsLoading = true;
|
|
751
|
+
IsSaving = false;
|
|
752
|
+
HasUnsavedChanges = false;
|
|
753
|
+
// --- Pipeline ---
|
|
754
|
+
PipelineSettings = {
|
|
755
|
+
AutotagOnIngest: true,
|
|
756
|
+
VectorizeOnIngest: true,
|
|
757
|
+
DefaultBatchSize: 100,
|
|
758
|
+
MaxConcurrentJobs: 3
|
|
759
|
+
};
|
|
760
|
+
// --- Thresholds ---
|
|
761
|
+
ThresholdSettings = {
|
|
762
|
+
DuplicateAbsolute: 0.95,
|
|
763
|
+
DuplicatePotential: 0.75,
|
|
764
|
+
SearchRelevance: 0.3,
|
|
765
|
+
AutotagConfidence: 0.7
|
|
766
|
+
};
|
|
767
|
+
// --- Vector DB Providers ---
|
|
768
|
+
VectorDBProviders = [];
|
|
769
|
+
get HasVectorDBProvider() { return this.VectorDBProviders.length > 0; }
|
|
770
|
+
// --- Vector Indexes ---
|
|
771
|
+
VectorIndexes = [];
|
|
772
|
+
get HasVectorIndex() { return this.VectorIndexes.length > 0; }
|
|
773
|
+
// --- Embedding Models ---
|
|
774
|
+
EmbeddingModels = [];
|
|
775
|
+
get HasEmbeddingModel() { return this.EmbeddingModels.length > 0; }
|
|
776
|
+
get EmbeddingModelName() { return this.EmbeddingModels.length > 0 ? this.EmbeddingModels[0].Name : ''; }
|
|
777
|
+
// --- Entity Documents (for persisting thresholds) ---
|
|
778
|
+
entityDocuments = [];
|
|
779
|
+
// --- Setup Progress ---
|
|
780
|
+
get SetupStepsCompleted() {
|
|
781
|
+
let count = 0;
|
|
782
|
+
if (this.HasVectorDBProvider)
|
|
783
|
+
count++;
|
|
784
|
+
if (this.HasEmbeddingModel)
|
|
785
|
+
count++;
|
|
786
|
+
if (this.HasVectorIndex)
|
|
787
|
+
count++;
|
|
788
|
+
return count;
|
|
789
|
+
}
|
|
790
|
+
get VectorSetupComplete() {
|
|
791
|
+
return this.HasVectorDBProvider && this.HasVectorIndex && this.HasEmbeddingModel;
|
|
792
|
+
}
|
|
793
|
+
// --- Full-Text Search Entities ---
|
|
794
|
+
FTSEntities = [];
|
|
795
|
+
IsLoadingFTSEntities = false;
|
|
796
|
+
FTSFilterText = '';
|
|
797
|
+
get EnabledFTSCount() {
|
|
798
|
+
return this.FTSEntities.filter(e => e.Enabled).length;
|
|
799
|
+
}
|
|
800
|
+
get FilteredFTSEntities() {
|
|
801
|
+
if (!this.FTSFilterText.trim())
|
|
802
|
+
return this.FTSEntities;
|
|
803
|
+
const filter = this.FTSFilterText.toLowerCase();
|
|
804
|
+
return this.FTSEntities.filter(e => e.EntityName.toLowerCase().includes(filter));
|
|
805
|
+
}
|
|
806
|
+
// --- Create Index Form ---
|
|
807
|
+
ShowCreateIndexForm = false;
|
|
808
|
+
IsCreatingIndex = false;
|
|
809
|
+
NewIndexName = '';
|
|
810
|
+
NewIndexVectorDBID = '';
|
|
811
|
+
NewIndexEmbeddingModelID = '';
|
|
812
|
+
ngAfterViewInit() {
|
|
813
|
+
this.loadConfiguration();
|
|
814
|
+
}
|
|
815
|
+
ngOnDestroy() {
|
|
816
|
+
this.destroy$.next();
|
|
817
|
+
this.destroy$.complete();
|
|
818
|
+
}
|
|
819
|
+
// ================================================================
|
|
820
|
+
// Public Methods
|
|
821
|
+
// ================================================================
|
|
822
|
+
SelectSection(sectionId) {
|
|
823
|
+
this.ActiveSection = sectionId;
|
|
824
|
+
this.cdr.detectChanges();
|
|
825
|
+
}
|
|
826
|
+
OnSettingChanged() {
|
|
827
|
+
this.HasUnsavedChanges = true;
|
|
828
|
+
this.cdr.detectChanges();
|
|
829
|
+
}
|
|
830
|
+
async SaveConfiguration() {
|
|
831
|
+
this.IsSaving = true;
|
|
832
|
+
this.cdr.detectChanges();
|
|
833
|
+
try {
|
|
834
|
+
await this.persistThresholdsToEntityDocuments();
|
|
835
|
+
this.HasUnsavedChanges = false;
|
|
836
|
+
MJNotificationService.Instance.CreateSimpleNotification('Configuration saved', 'success', 2000);
|
|
837
|
+
}
|
|
838
|
+
catch (error) {
|
|
839
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
840
|
+
console.error('[KnowledgeConfig] Save failed:', msg);
|
|
841
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Save failed: ${msg}`, 'error', 5000);
|
|
842
|
+
}
|
|
843
|
+
finally {
|
|
844
|
+
this.IsSaving = false;
|
|
845
|
+
this.cdr.detectChanges();
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
ResetConfiguration() {
|
|
849
|
+
this.loadConfiguration();
|
|
850
|
+
this.HasUnsavedChanges = false;
|
|
851
|
+
this.cdr.detectChanges();
|
|
852
|
+
}
|
|
853
|
+
/** Handle toggling an FTS entity */
|
|
854
|
+
OnFTSEntityToggled(entity) {
|
|
855
|
+
this.HasUnsavedChanges = true;
|
|
856
|
+
this.cdr.detectChanges();
|
|
857
|
+
}
|
|
858
|
+
FormatThreshold(value) {
|
|
859
|
+
return `${Math.round(value * 100)}%`;
|
|
860
|
+
}
|
|
861
|
+
/** Open the create index inline form */
|
|
862
|
+
OpenCreateIndexForm() {
|
|
863
|
+
this.ShowCreateIndexForm = true;
|
|
864
|
+
this.NewIndexName = 'mj-knowledge-index';
|
|
865
|
+
this.NewIndexVectorDBID = this.VectorDBProviders.length > 0 ? this.VectorDBProviders[0].ID : '';
|
|
866
|
+
this.NewIndexEmbeddingModelID = this.EmbeddingModels.length > 0 ? this.EmbeddingModels[0].ID : '';
|
|
867
|
+
this.cdr.detectChanges();
|
|
868
|
+
}
|
|
869
|
+
/** Cancel creating an index */
|
|
870
|
+
CancelCreateIndex() {
|
|
871
|
+
this.ShowCreateIndexForm = false;
|
|
872
|
+
this.cdr.detectChanges();
|
|
873
|
+
}
|
|
874
|
+
/** Create a new vector index */
|
|
875
|
+
async CreateIndex() {
|
|
876
|
+
if (!this.NewIndexName.trim() || !this.NewIndexVectorDBID || !this.NewIndexEmbeddingModelID) {
|
|
877
|
+
MJNotificationService.Instance.CreateSimpleNotification('Please fill in all fields', 'warning', 3000);
|
|
878
|
+
return;
|
|
879
|
+
}
|
|
880
|
+
this.IsCreatingIndex = true;
|
|
881
|
+
this.cdr.detectChanges();
|
|
882
|
+
try {
|
|
883
|
+
const md = new Metadata();
|
|
884
|
+
const index = await md.GetEntityObject('MJ: Vector Indexes');
|
|
885
|
+
index.NewRecord();
|
|
886
|
+
index.Name = this.NewIndexName.trim();
|
|
887
|
+
index.VectorDatabaseID = this.NewIndexVectorDBID;
|
|
888
|
+
index.EmbeddingModelID = this.NewIndexEmbeddingModelID;
|
|
889
|
+
index.Description = `Knowledge Hub vector index created ${new Date().toLocaleDateString()}`;
|
|
890
|
+
const saved = await index.Save();
|
|
891
|
+
if (saved) {
|
|
892
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Vector index "${this.NewIndexName}" created successfully`, 'success', 3000);
|
|
893
|
+
this.ShowCreateIndexForm = false;
|
|
894
|
+
await this.loadConfiguration();
|
|
895
|
+
}
|
|
896
|
+
else {
|
|
897
|
+
const msg = index.LatestResult?.CompleteMessage || 'Unknown error';
|
|
898
|
+
console.error('[KnowledgeConfig] Failed to create index:', msg);
|
|
899
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Failed to create index: ${msg}`, 'error', 5000);
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
catch (error) {
|
|
903
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
904
|
+
console.error('[KnowledgeConfig] Error creating index:', msg);
|
|
905
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);
|
|
906
|
+
}
|
|
907
|
+
finally {
|
|
908
|
+
this.IsCreatingIndex = false;
|
|
909
|
+
this.cdr.detectChanges();
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
/** Delete a vector index */
|
|
913
|
+
async DeleteIndex(indexId) {
|
|
914
|
+
const idx = this.VectorIndexes.find(i => UUIDsEqual(i.ID, indexId));
|
|
915
|
+
if (!idx)
|
|
916
|
+
return;
|
|
917
|
+
try {
|
|
918
|
+
const md = new Metadata();
|
|
919
|
+
const entity = await md.GetEntityObject('MJ: Vector Indexes');
|
|
920
|
+
const loaded = await entity.Load(indexId);
|
|
921
|
+
if (!loaded) {
|
|
922
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Could not load vector index "${idx.Name}"`, 'error', 3000);
|
|
923
|
+
return;
|
|
924
|
+
}
|
|
925
|
+
const deleted = await entity.Delete();
|
|
926
|
+
if (deleted) {
|
|
927
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Index "${idx.Name}" deleted`, 'success', 2000);
|
|
928
|
+
await this.loadConfiguration();
|
|
929
|
+
}
|
|
930
|
+
else {
|
|
931
|
+
const msg = entity.LatestResult?.CompleteMessage || 'Unknown error';
|
|
932
|
+
console.error('[KnowledgeConfig] Delete failed:', msg);
|
|
933
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Delete failed: ${msg}`, 'error', 5000);
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
catch (error) {
|
|
937
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
938
|
+
console.error('[KnowledgeConfig] Error deleting index:', msg);
|
|
939
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
// ================================================================
|
|
943
|
+
// Private Methods
|
|
944
|
+
// ================================================================
|
|
945
|
+
async loadConfiguration() {
|
|
946
|
+
this.IsLoading = true;
|
|
947
|
+
this.cdr.detectChanges();
|
|
948
|
+
try {
|
|
949
|
+
// Use KnowledgeHubMetadataEngine for cached vector DBs, indexes, and entity docs
|
|
950
|
+
const engine = KnowledgeHubMetadataEngine.Instance;
|
|
951
|
+
await engine.Config(false);
|
|
952
|
+
this.loadVectorDBProvidersFromEngine(engine.VectorDatabases);
|
|
953
|
+
this.loadVectorIndexesFromEngine(engine.VectorIndexes);
|
|
954
|
+
this.loadEntityDocumentsAndThresholds(engine.GetActiveEntityDocuments());
|
|
955
|
+
// AI Models come from a different domain — fetch via RunView
|
|
956
|
+
const rv = new RunView();
|
|
957
|
+
const modelsResult = await rv.RunView({
|
|
958
|
+
EntityName: 'MJ: AI Models',
|
|
959
|
+
ResultType: 'simple'
|
|
960
|
+
});
|
|
961
|
+
this.loadEmbeddingModels(modelsResult.Success ? modelsResult.Results : []);
|
|
962
|
+
}
|
|
963
|
+
catch (error) {
|
|
964
|
+
console.error('[KnowledgeConfig] Error loading configuration:', error);
|
|
965
|
+
}
|
|
966
|
+
finally {
|
|
967
|
+
this.IsLoading = false;
|
|
968
|
+
this.cdr.detectChanges();
|
|
969
|
+
}
|
|
970
|
+
// Load FTS entities in background (doesn't block main config)
|
|
971
|
+
this.loadFTSEntities();
|
|
972
|
+
}
|
|
973
|
+
async loadFTSEntities() {
|
|
974
|
+
this.IsLoadingFTSEntities = true;
|
|
975
|
+
this.cdr.detectChanges();
|
|
976
|
+
try {
|
|
977
|
+
const md = new Metadata();
|
|
978
|
+
const allEntities = md.Entities;
|
|
979
|
+
const ftsEntities = [];
|
|
980
|
+
for (const entity of allEntities) {
|
|
981
|
+
const textFields = entity.Fields.filter((f) => !f.IsPrimaryKey &&
|
|
982
|
+
!f.Name.startsWith('__mj') &&
|
|
983
|
+
(f.Type.toLowerCase().includes('varchar') ||
|
|
984
|
+
f.Type.toLowerCase().includes('text') ||
|
|
985
|
+
f.Type.toLowerCase() === 'ntext') &&
|
|
986
|
+
f.MaxLength !== 1);
|
|
987
|
+
if (textFields.length === 0)
|
|
988
|
+
continue;
|
|
989
|
+
const preferredTitleNames = ['Name', 'Title', 'Subject', 'Label'];
|
|
990
|
+
const preferredSnippetNames = ['Description', 'Summary', 'Body', 'Content', 'Text', 'Notes'];
|
|
991
|
+
const titleField = textFields.find((f) => preferredTitleNames.includes(f.Name))?.Name
|
|
992
|
+
|| textFields[0]?.Name || 'Name';
|
|
993
|
+
const snippetField = textFields.find((f) => preferredSnippetNames.includes(f.Name) && f.Name !== titleField)?.Name || titleField;
|
|
994
|
+
ftsEntities.push({
|
|
995
|
+
EntityName: entity.Name,
|
|
996
|
+
IndexedFields: textFields.slice(0, 4).map((f) => f.Name),
|
|
997
|
+
TitleField: titleField,
|
|
998
|
+
SnippetField: snippetField,
|
|
999
|
+
Enabled: true,
|
|
1000
|
+
});
|
|
1001
|
+
}
|
|
1002
|
+
ftsEntities.sort((a, b) => a.EntityName.localeCompare(b.EntityName));
|
|
1003
|
+
this.FTSEntities = ftsEntities;
|
|
1004
|
+
}
|
|
1005
|
+
catch (error) {
|
|
1006
|
+
console.error('[KnowledgeConfig] Error loading FTS entities:', error);
|
|
1007
|
+
}
|
|
1008
|
+
finally {
|
|
1009
|
+
this.IsLoadingFTSEntities = false;
|
|
1010
|
+
this.cdr.detectChanges();
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
loadVectorDBProvidersFromEngine(dbs) {
|
|
1014
|
+
this.VectorDBProviders = dbs.map(db => ({
|
|
1015
|
+
ID: db.ID,
|
|
1016
|
+
Name: db.Name,
|
|
1017
|
+
ClassKey: db.ClassKey || '',
|
|
1018
|
+
Description: db.Description || ''
|
|
1019
|
+
}));
|
|
1020
|
+
}
|
|
1021
|
+
loadVectorIndexesFromEngine(indexes) {
|
|
1022
|
+
this.VectorIndexes = indexes.map(vi => ({
|
|
1023
|
+
ID: vi.ID,
|
|
1024
|
+
Name: vi.Name || 'Unnamed Index',
|
|
1025
|
+
EmbeddingModel: vi.EmbeddingModel || '',
|
|
1026
|
+
EmbeddingModelID: vi.EmbeddingModelID || '',
|
|
1027
|
+
VectorDatabase: vi.VectorDatabase || '',
|
|
1028
|
+
VectorDatabaseID: vi.VectorDatabaseID || ''
|
|
1029
|
+
}));
|
|
1030
|
+
}
|
|
1031
|
+
/** Load entity documents and seed threshold settings from the first document's values */
|
|
1032
|
+
loadEntityDocumentsAndThresholds(docs) {
|
|
1033
|
+
this.entityDocuments = docs;
|
|
1034
|
+
if (docs.length > 0) {
|
|
1035
|
+
// Use the first entity document's thresholds as the canonical values
|
|
1036
|
+
const doc = docs[0];
|
|
1037
|
+
this.ThresholdSettings.DuplicatePotential = doc.PotentialMatchThreshold;
|
|
1038
|
+
this.ThresholdSettings.DuplicateAbsolute = doc.AbsoluteMatchThreshold;
|
|
1039
|
+
}
|
|
1040
|
+
}
|
|
1041
|
+
/** Persist threshold settings back to all active entity documents */
|
|
1042
|
+
async persistThresholdsToEntityDocuments() {
|
|
1043
|
+
if (this.entityDocuments.length === 0) {
|
|
1044
|
+
return; // No entity documents to update
|
|
1045
|
+
}
|
|
1046
|
+
for (const doc of this.entityDocuments) {
|
|
1047
|
+
doc.PotentialMatchThreshold = this.ThresholdSettings.DuplicatePotential;
|
|
1048
|
+
doc.AbsoluteMatchThreshold = this.ThresholdSettings.DuplicateAbsolute;
|
|
1049
|
+
const saved = await doc.Save();
|
|
1050
|
+
if (!saved) {
|
|
1051
|
+
const msg = doc.LatestResult?.CompleteMessage || 'Unknown error';
|
|
1052
|
+
throw new Error(`Failed to save entity document "${doc.Name}": ${msg}`);
|
|
1053
|
+
}
|
|
1054
|
+
}
|
|
1055
|
+
}
|
|
1056
|
+
loadEmbeddingModels(records) {
|
|
1057
|
+
this.EmbeddingModels = records
|
|
1058
|
+
.filter(m => String(m['AIModelType'] || '').toLowerCase().includes('embedding') ||
|
|
1059
|
+
String(m['Name'] || '').toLowerCase().includes('embedding') ||
|
|
1060
|
+
String(m['Name'] || '').toLowerCase().includes('embed'))
|
|
1061
|
+
.map(m => ({
|
|
1062
|
+
ID: String(m['ID']),
|
|
1063
|
+
Name: String(m['Name'])
|
|
1064
|
+
}));
|
|
1065
|
+
}
|
|
1066
|
+
static ɵfac = /*@__PURE__*/ (() => { let ɵKnowledgeConfigResourceComponent_BaseFactory; return function KnowledgeConfigResourceComponent_Factory(__ngFactoryType__) { return (ɵKnowledgeConfigResourceComponent_BaseFactory || (ɵKnowledgeConfigResourceComponent_BaseFactory = i0.ɵɵgetInheritedFactory(KnowledgeConfigResourceComponent)))(__ngFactoryType__ || KnowledgeConfigResourceComponent); }; })();
|
|
1067
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KnowledgeConfigResourceComponent, selectors: [["app-knowledge-config-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, "config-loading"], [1, "config-layout"], ["text", "Loading configuration...", "size", "medium"], [1, "config-nav"], [1, "config-nav-header"], [1, "fa-solid", "fa-cogs"], [1, "config-nav-item", 3, "config-nav-item-active"], [1, "config-content"], [1, "config-section"], [1, "config-save-bar"], [1, "config-nav-item", 3, "click"], [1, "config-section-title"], [1, "config-section-desc"], [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, "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, "config-save-text"], [1, "config-save-btn", 3, "click", "disabled"], [1, "config-reset-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-save"]], template: function KnowledgeConfigResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1068
|
+
i0.ɵɵconditionalCreate(0, KnowledgeConfigResourceComponent_Conditional_0_Template, 2, 0, "div", 0)(1, KnowledgeConfigResourceComponent_Conditional_1_Template, 15, 6, "div", 1);
|
|
1069
|
+
} if (rf & 2) {
|
|
1070
|
+
i0.ɵɵconditional(ctx.IsLoading ? 0 : 1);
|
|
1071
|
+
} }, 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], 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.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}"] });
|
|
1072
|
+
};
|
|
1073
|
+
KnowledgeConfigResourceComponent = __decorate([
|
|
1074
|
+
RegisterClass(BaseResourceComponent, 'KnowledgeConfigResource')
|
|
1075
|
+
], KnowledgeConfigResourceComponent);
|
|
1076
|
+
export { KnowledgeConfigResourceComponent };
|
|
1077
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(KnowledgeConfigResourceComponent, [{
|
|
1078
|
+
type: Component,
|
|
1079
|
+
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 }\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 <!-- 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/* ---- 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"] }]
|
|
1080
|
+
}], null, null); })();
|
|
1081
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KnowledgeConfigResourceComponent, { className: "KnowledgeConfigResourceComponent", filePath: "src/KnowledgeHub/components/config/knowledge-config-resource.component.ts", lineNumber: 81 }); })();
|
|
1082
|
+
/** Tree-shaking prevention */
|
|
1083
|
+
export function LoadKnowledgeConfigResource() {
|
|
1084
|
+
// Prevents tree-shaking
|
|
1085
|
+
}
|
|
1086
|
+
//# sourceMappingURL=knowledge-config-resource.component.js.map
|