@memberjunction/ng-dashboards 5.35.0 → 5.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.js +3 -3
  2. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  3. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +22 -1
  4. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  5. package/dist/AI/components/analytics/ai-analytics-resource.component.js +157 -137
  6. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  7. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +28 -0
  8. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  9. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2075 -2068
  10. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  11. package/dist/AI/components/models/model-management.component.js +4 -4
  12. package/dist/AI/components/models/model-management.component.js.map +1 -1
  13. package/dist/AI/components/prompts/prompt-management.component.js +3 -3
  14. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  15. package/dist/AI/components/tags/tags-resource.component.d.ts +15 -0
  16. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  17. package/dist/AI/components/tags/tags-resource.component.js +1411 -1424
  18. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  19. package/dist/APIKeys/api-keys-resource.component.d.ts +12 -8
  20. package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
  21. package/dist/APIKeys/api-keys-resource.component.js +329 -371
  22. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  23. package/dist/Actions/components/actions-overview.component.js +137 -142
  24. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  25. package/dist/Actions/components/execution-monitoring.component.js +111 -116
  26. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  27. package/dist/Admin/admin-data-schema.component.js +13 -65
  28. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  29. package/dist/Admin/admin-dev-tools-resource.component.js +13 -65
  30. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  31. package/dist/Admin/admin-identity-access.component.js +13 -65
  32. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  33. package/dist/Admin/admin-monitoring.component.js +13 -65
  34. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  35. package/dist/Admin/base-admin-container.component.d.ts +9 -7
  36. package/dist/Admin/base-admin-container.component.d.ts.map +1 -1
  37. package/dist/Admin/base-admin-container.component.js +26 -17
  38. package/dist/Admin/base-admin-container.component.js.map +1 -1
  39. package/dist/ApplicationRoles/application-roles-resource.component.js +74 -67
  40. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  41. package/dist/Communication/communication-new-message-resource.component.d.ts +93 -0
  42. package/dist/Communication/communication-new-message-resource.component.d.ts.map +1 -0
  43. package/dist/Communication/communication-new-message-resource.component.js +661 -0
  44. package/dist/Communication/communication-new-message-resource.component.js.map +1 -0
  45. package/dist/Credentials/components/credentials-categories-resource.component.js +152 -159
  46. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  47. package/dist/Credentials/components/credentials-types-resource.component.js +151 -155
  48. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  49. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +20 -21
  50. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
  51. package/dist/DatabaseDesigner/components/entity-list.component.d.ts +2 -0
  52. package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -1
  53. package/dist/DatabaseDesigner/components/entity-list.component.js +131 -125
  54. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  55. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
  56. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  57. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +7 -1
  58. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  59. package/dist/DevTools/app-state-inspector.component.d.ts +5 -0
  60. package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -1
  61. package/dist/DevTools/app-state-inspector.component.js +46 -72
  62. package/dist/DevTools/app-state-inspector.component.js.map +1 -1
  63. package/dist/DevTools/class-registry.component.js +88 -100
  64. package/dist/DevTools/class-registry.component.js.map +1 -1
  65. package/dist/DevTools/event-monitor.component.js +158 -168
  66. package/dist/DevTools/event-monitor.component.js.map +1 -1
  67. package/dist/DevTools/graphql-console.component.js +257 -264
  68. package/dist/DevTools/graphql-console.component.js.map +1 -1
  69. package/dist/DevTools/layout-inspector.component.d.ts +5 -0
  70. package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
  71. package/dist/DevTools/layout-inspector.component.js +46 -64
  72. package/dist/DevTools/layout-inspector.component.js.map +1 -1
  73. package/dist/DevTools/lazy-module-status.component.js +75 -84
  74. package/dist/DevTools/lazy-module-status.component.js.map +1 -1
  75. package/dist/DevTools/settings-explorer.component.js +76 -85
  76. package/dist/DevTools/settings-explorer.component.js.map +1 -1
  77. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +2 -0
  78. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  79. package/dist/EntityAdmin/entity-admin-dashboard.component.js +7 -3
  80. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  81. package/dist/Integration/components/activity/activity.component.js +97 -99
  82. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  83. package/dist/Integration/components/connections/connections.component.js +842 -855
  84. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  85. package/dist/Integration/components/pipelines/pipelines.component.js +502 -517
  86. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  87. package/dist/Integration/components/schedules/schedules.component.js +78 -89
  88. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  89. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +5 -0
  90. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
  91. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1120 -1128
  92. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  93. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +11 -0
  94. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
  95. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +606 -661
  96. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  97. package/dist/Lists/components/lists-browse-resource.component.d.ts +102 -0
  98. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  99. package/dist/Lists/components/lists-browse-resource.component.js +1179 -504
  100. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  101. package/dist/Lists/components/lists-operations-resource.component.d.ts +133 -3
  102. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  103. package/dist/Lists/components/lists-operations-resource.component.js +1527 -327
  104. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  105. package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts +29 -0
  106. package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts.map +1 -0
  107. package/dist/Lists/components/lists-shared-with-me-resource.component.js +77 -0
  108. package/dist/Lists/components/lists-shared-with-me-resource.component.js.map +1 -0
  109. package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts +6 -0
  110. package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts.map +1 -1
  111. package/dist/Lists/components/venn-diagram/venn-diagram.component.js +35 -7
  112. package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
  113. package/dist/Lists/index.d.ts +1 -0
  114. package/dist/Lists/index.d.ts.map +1 -1
  115. package/dist/Lists/index.js +1 -0
  116. package/dist/Lists/index.js.map +1 -1
  117. package/dist/Lists/services/list-set-operations.service.d.ts +93 -2
  118. package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
  119. package/dist/Lists/services/list-set-operations.service.js +236 -10
  120. package/dist/Lists/services/list-set-operations.service.js.map +1 -1
  121. package/dist/MCP/mcp-dashboard.component.js +19 -19
  122. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  123. package/dist/Scheduling/scheduling-dashboard.component.js +58 -60
  124. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  125. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +13 -3
  126. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  127. package/dist/SystemDiagnostics/system-diagnostics.component.js +1007 -1252
  128. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  129. package/dist/Testing/components/testing-explorer.component.d.ts +31 -6
  130. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  131. package/dist/Testing/components/testing-explorer.component.js +543 -629
  132. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  133. package/dist/Testing/testing-dashboard.component.js +50 -49
  134. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  135. package/dist/ai-dashboards.module.d.ts +1 -1
  136. package/dist/ai-dashboards.module.d.ts.map +1 -1
  137. package/dist/ai-dashboards.module.js +16 -1
  138. package/dist/ai-dashboards.module.js.map +1 -1
  139. package/dist/communication-dashboards.module.d.ts +9 -7
  140. package/dist/communication-dashboards.module.d.ts.map +1 -1
  141. package/dist/communication-dashboards.module.js +13 -4
  142. package/dist/communication-dashboards.module.js.map +1 -1
  143. package/dist/core-dashboards.module.d.ts +1 -1
  144. package/dist/core-dashboards.module.d.ts.map +1 -1
  145. package/dist/core-dashboards.module.js +16 -1
  146. package/dist/core-dashboards.module.js.map +1 -1
  147. package/dist/lists-dashboards.module.d.ts +10 -9
  148. package/dist/lists-dashboards.module.d.ts.map +1 -1
  149. package/dist/lists-dashboards.module.js +13 -2
  150. package/dist/lists-dashboards.module.js.map +1 -1
  151. package/dist/public-api.d.ts +1 -0
  152. package/dist/public-api.d.ts.map +1 -1
  153. package/dist/public-api.js +1 -0
  154. package/dist/public-api.js.map +1 -1
  155. package/dist/testing-dashboards.module.d.ts +1 -1
  156. package/dist/testing-dashboards.module.d.ts.map +1 -1
  157. package/dist/testing-dashboards.module.js +13 -1
  158. package/dist/testing-dashboards.module.js.map +1 -1
  159. package/package.json +53 -52
@@ -59,74 +59,51 @@ function KnowledgeConfigResourceComponent_Conditional_7_Template(rf, ctx) { if (
59
59
  i0.ɵɵelement(1, "mj-loading", 11);
60
60
  i0.ɵɵelementEnd();
61
61
  } }
62
- function KnowledgeConfigResourceComponent_Conditional_8_For_7_Template(rf, ctx) { if (rf & 1) {
63
- const _r3 = i0.ɵɵgetCurrentView();
64
- i0.ɵɵelementStart(0, "button", 20);
65
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_For_7_Template_button_click_0_listener() { const section_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SelectSection(section_r4.ID)); });
66
- i0.ɵɵelement(1, "i");
67
- i0.ɵɵelementStart(2, "span");
68
- i0.ɵɵtext(3);
69
- i0.ɵɵelementEnd()();
70
- } if (rf & 2) {
71
- const section_r4 = ctx.$implicit;
72
- const ctx_r1 = i0.ɵɵnextContext(2);
73
- i0.ɵɵclassProp("config-nav-item-active", ctx_r1.ActiveSection === section_r4.ID);
74
- i0.ɵɵadvance();
75
- i0.ɵɵclassMap(section_r4.Icon);
76
- i0.ɵɵadvance(2);
77
- i0.ɵɵtextInterpolate(section_r4.Label);
78
- } }
79
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template(rf, ctx) { if (rf & 1) {
80
- const _r5 = i0.ɵɵgetCurrentView();
81
- i0.ɵɵelementStart(0, "div", 17)(1, "h2", 21);
82
- i0.ɵɵtext(2, "Pipeline Settings");
62
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template(rf, ctx) { if (rf & 1) {
63
+ const _r4 = i0.ɵɵgetCurrentView();
64
+ i0.ɵɵelementStart(0, "div", 14)(1, "div", 17)(2, "label", 18)(3, "div", 19)(4, "span", 20);
65
+ i0.ɵɵtext(5, "Auto-tag on Ingest");
83
66
  i0.ɵɵelementEnd();
84
- i0.ɵɵelementStart(3, "p", 22);
85
- i0.ɵɵtext(4, "Configure how the Knowledge Pipeline processes incoming content.");
86
- i0.ɵɵelementEnd();
87
- i0.ɵɵelementStart(5, "div", 23)(6, "label", 24)(7, "div", 25)(8, "span", 26);
88
- i0.ɵɵtext(9, "Auto-tag on Ingest");
89
- i0.ɵɵelementEnd();
90
- i0.ɵɵelementStart(10, "span", 27);
91
- i0.ɵɵtext(11, "Automatically run autotagging when new content is ingested");
67
+ i0.ɵɵelementStart(6, "span", 21);
68
+ i0.ɵɵtext(7, "Automatically run autotagging when new content is ingested");
92
69
  i0.ɵɵelementEnd()();
93
- i0.ɵɵelementStart(12, "input", 28);
94
- i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.PipelineSettings.AutotagOnIngest, $event) || (ctx_r1.PipelineSettings.AutotagOnIngest = $event); return i0.ɵɵresetView($event); });
95
- i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_change_12_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
70
+ i0.ɵɵelementStart(8, "input", 22);
71
+ i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.PipelineSettings.AutotagOnIngest, $event) || (ctx_r1.PipelineSettings.AutotagOnIngest = $event); return i0.ɵɵresetView($event); });
72
+ i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_change_8_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
96
73
  i0.ɵɵelementEnd()();
97
- i0.ɵɵelementStart(13, "label", 24)(14, "div", 25)(15, "span", 26);
98
- i0.ɵɵtext(16, "Vectorize on Ingest");
74
+ i0.ɵɵelementStart(9, "label", 18)(10, "div", 19)(11, "span", 20);
75
+ i0.ɵɵtext(12, "Vectorize on Ingest");
99
76
  i0.ɵɵelementEnd();
100
- i0.ɵɵelementStart(17, "span", 27);
101
- i0.ɵɵtext(18, "Automatically create embeddings for new content");
77
+ i0.ɵɵelementStart(13, "span", 21);
78
+ i0.ɵɵtext(14, "Automatically create embeddings for new content");
102
79
  i0.ɵɵelementEnd()();
103
- i0.ɵɵelementStart(19, "input", 28);
104
- i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_ngModelChange_19_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.PipelineSettings.VectorizeOnIngest, $event) || (ctx_r1.PipelineSettings.VectorizeOnIngest = $event); return i0.ɵɵresetView($event); });
105
- i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_change_19_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
80
+ i0.ɵɵelementStart(15, "input", 22);
81
+ i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_ngModelChange_15_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.PipelineSettings.VectorizeOnIngest, $event) || (ctx_r1.PipelineSettings.VectorizeOnIngest = $event); return i0.ɵɵresetView($event); });
82
+ i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_change_15_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
106
83
  i0.ɵɵelementEnd()();
107
- i0.ɵɵelementStart(20, "div", 29)(21, "div", 30)(22, "span", 26);
108
- i0.ɵɵtext(23, "Default Batch Size");
84
+ i0.ɵɵelementStart(16, "div", 23)(17, "div", 24)(18, "span", 20);
85
+ i0.ɵɵtext(19, "Default Batch Size");
109
86
  i0.ɵɵelementEnd();
110
- i0.ɵɵelementStart(24, "span", 27);
111
- i0.ɵɵtext(25, "Number of items processed per batch");
87
+ i0.ɵɵelementStart(20, "span", 21);
88
+ i0.ɵɵtext(21, "Number of items processed per batch");
112
89
  i0.ɵɵelementEnd()();
113
- i0.ɵɵelementStart(26, "input", 31);
114
- i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_ngModelChange_26_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.PipelineSettings.DefaultBatchSize, $event) || (ctx_r1.PipelineSettings.DefaultBatchSize = $event); return i0.ɵɵresetView($event); });
115
- i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_input_26_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
90
+ i0.ɵɵelementStart(22, "input", 25);
91
+ i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_ngModelChange_22_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.PipelineSettings.DefaultBatchSize, $event) || (ctx_r1.PipelineSettings.DefaultBatchSize = $event); return i0.ɵɵresetView($event); });
92
+ i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_input_22_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
116
93
  i0.ɵɵelementEnd()();
117
- i0.ɵɵelementStart(27, "div", 29)(28, "div", 30)(29, "span", 26);
118
- i0.ɵɵtext(30, "Max Concurrent Jobs");
94
+ i0.ɵɵelementStart(23, "div", 23)(24, "div", 24)(25, "span", 20);
95
+ i0.ɵɵtext(26, "Max Concurrent Jobs");
119
96
  i0.ɵɵelementEnd();
120
- i0.ɵɵelementStart(31, "span", 27);
121
- i0.ɵɵtext(32, "Maximum number of pipeline jobs running at once");
97
+ i0.ɵɵelementStart(27, "span", 21);
98
+ i0.ɵɵtext(28, "Maximum number of pipeline jobs running at once");
122
99
  i0.ɵɵelementEnd()();
123
- i0.ɵɵelementStart(33, "input", 32);
124
- i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_ngModelChange_33_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.PipelineSettings.MaxConcurrentJobs, $event) || (ctx_r1.PipelineSettings.MaxConcurrentJobs = $event); return i0.ɵɵresetView($event); });
125
- i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_input_33_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
100
+ i0.ɵɵelementStart(29, "input", 26);
101
+ i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_ngModelChange_29_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.PipelineSettings.MaxConcurrentJobs, $event) || (ctx_r1.PipelineSettings.MaxConcurrentJobs = $event); return i0.ɵɵresetView($event); });
102
+ i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template_input_input_29_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
126
103
  i0.ɵɵelementEnd()()()();
127
104
  } if (rf & 2) {
128
105
  const ctx_r1 = i0.ɵɵnextContext(2);
129
- i0.ɵɵadvance(12);
106
+ i0.ɵɵadvance(8);
130
107
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.PipelineSettings.AutotagOnIngest);
131
108
  i0.ɵɵadvance(7);
132
109
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.PipelineSettings.VectorizeOnIngest);
@@ -135,16 +112,16 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template(r
135
112
  i0.ɵɵadvance(7);
136
113
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.PipelineSettings.MaxConcurrentJobs);
137
114
  } }
138
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_16_Template(rf, ctx) { if (rf & 1) {
139
- i0.ɵɵelement(0, "i", 42);
115
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_12_Template(rf, ctx) { if (rf & 1) {
116
+ i0.ɵɵelement(0, "i", 36);
140
117
  } }
141
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_17_Template(rf, ctx) { if (rf & 1) {
142
- i0.ɵɵelementStart(0, "span", 43);
118
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_13_Template(rf, ctx) { if (rf & 1) {
119
+ i0.ɵɵelementStart(0, "span", 37);
143
120
  i0.ɵɵtext(1, "1");
144
121
  i0.ɵɵelementEnd();
145
122
  } }
146
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_21_Template(rf, ctx) { if (rf & 1) {
147
- i0.ɵɵelementStart(0, "span", 46);
123
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_17_Template(rf, ctx) { if (rf & 1) {
124
+ i0.ɵɵelementStart(0, "span", 40);
148
125
  i0.ɵɵtext(1);
149
126
  i0.ɵɵelementEnd();
150
127
  } if (rf & 2) {
@@ -152,62 +129,62 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Condition
152
129
  i0.ɵɵadvance();
153
130
  i0.ɵɵtextInterpolate1("", ctx_r1.VectorDBProviders.length, " provider(s) registered");
154
131
  } }
155
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_22_Template(rf, ctx) { if (rf & 1) {
156
- i0.ɵɵelementStart(0, "span", 46);
132
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_18_Template(rf, ctx) { if (rf & 1) {
133
+ i0.ɵɵelementStart(0, "span", 40);
157
134
  i0.ɵɵtext(1, "No providers registered. Add a vector database provider (e.g., Pinecone, Weaviate) via the admin console.");
158
135
  i0.ɵɵelementEnd();
159
136
  } }
160
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_23_For_2_For_20_Template(rf, ctx) { if (rf & 1) {
161
- i0.ɵɵelementStart(0, "option", 62);
137
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_For_20_Template(rf, ctx) { if (rf & 1) {
138
+ i0.ɵɵelementStart(0, "option", 56);
162
139
  i0.ɵɵtext(1);
163
140
  i0.ɵɵelementEnd();
164
141
  } if (rf & 2) {
165
- const cred_r8 = ctx.$implicit;
166
- i0.ɵɵproperty("ngValue", cred_r8.ID);
142
+ const cred_r7 = ctx.$implicit;
143
+ i0.ɵɵproperty("ngValue", cred_r7.ID);
167
144
  i0.ɵɵadvance();
168
- i0.ɵɵtextInterpolate(cred_r8.Name);
145
+ i0.ɵɵtextInterpolate(cred_r7.Name);
169
146
  } }
170
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_23_For_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
171
- i0.ɵɵelement(0, "i", 63);
147
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
148
+ i0.ɵɵelement(0, "i", 57);
172
149
  } }
173
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_23_For_2_Template(rf, ctx) { if (rf & 1) {
174
- const _r6 = i0.ɵɵgetCurrentView();
175
- i0.ɵɵelementStart(0, "div", 50)(1, "div", 51);
176
- i0.ɵɵelement(2, "i", 52);
150
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Template(rf, ctx) { if (rf & 1) {
151
+ const _r5 = i0.ɵɵgetCurrentView();
152
+ i0.ɵɵelementStart(0, "div", 44)(1, "div", 45);
153
+ i0.ɵɵelement(2, "i", 46);
177
154
  i0.ɵɵelementEnd();
178
- i0.ɵɵelementStart(3, "div", 53)(4, "span", 54);
155
+ i0.ɵɵelementStart(3, "div", 47)(4, "span", 48);
179
156
  i0.ɵɵtext(5);
180
157
  i0.ɵɵelementEnd();
181
- i0.ɵɵelementStart(6, "span", 55);
158
+ i0.ɵɵelementStart(6, "span", 49);
182
159
  i0.ɵɵtext(7);
183
160
  i0.ɵɵelementEnd()();
184
- i0.ɵɵelementStart(8, "span", 56);
185
- i0.ɵɵelement(9, "i", 42);
161
+ i0.ɵɵelementStart(8, "span", 50);
162
+ i0.ɵɵelement(9, "i", 36);
186
163
  i0.ɵɵtext(10, " Active ");
187
164
  i0.ɵɵelementEnd()();
188
- i0.ɵɵelementStart(11, "div", 57)(12, "label", 58);
189
- i0.ɵɵelement(13, "i", 59);
165
+ i0.ɵɵelementStart(11, "div", 51)(12, "label", 52);
166
+ i0.ɵɵelement(13, "i", 53);
190
167
  i0.ɵɵtext(14, " API Credential ");
191
168
  i0.ɵɵelementEnd();
192
- i0.ɵɵelementStart(15, "div", 60)(16, "select", 61);
193
- i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_23_For_2_Template_select_ngModelChange_16_listener($event) { const provider_r7 = i0.ɵɵrestoreView(_r6).$implicit; i0.ɵɵtwoWayBindingSet(provider_r7.CredentialID, $event) || (provider_r7.CredentialID = $event); return i0.ɵɵresetView($event); });
194
- i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_23_For_2_Template_select_change_16_listener() { const provider_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SaveProviderCredential(provider_r7)); });
195
- i0.ɵɵelementStart(17, "option", 62);
169
+ i0.ɵɵelementStart(15, "div", 54)(16, "select", 55);
170
+ i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Template_select_ngModelChange_16_listener($event) { const provider_r6 = i0.ɵɵrestoreView(_r5).$implicit; i0.ɵɵtwoWayBindingSet(provider_r6.CredentialID, $event) || (provider_r6.CredentialID = $event); return i0.ɵɵresetView($event); });
171
+ i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Template_select_change_16_listener() { const provider_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SaveProviderCredential(provider_r6)); });
172
+ i0.ɵɵelementStart(17, "option", 56);
196
173
  i0.ɵɵtext(18, "None (use environment variable)");
197
174
  i0.ɵɵelementEnd();
198
- i0.ɵɵrepeaterCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_23_For_2_For_20_Template, 2, 2, "option", 62, _forTrack0);
175
+ i0.ɵɵrepeaterCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_For_20_Template, 2, 2, "option", 56, _forTrack0);
199
176
  i0.ɵɵelementEnd();
200
- i0.ɵɵconditionalCreate(21, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_23_For_2_Conditional_21_Template, 1, 0, "i", 63);
177
+ i0.ɵɵconditionalCreate(21, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Conditional_21_Template, 1, 0, "i", 57);
201
178
  i0.ɵɵelementEnd()();
202
179
  } if (rf & 2) {
203
- const provider_r7 = ctx.$implicit;
180
+ const provider_r6 = ctx.$implicit;
204
181
  const ctx_r1 = i0.ɵɵnextContext(4);
205
182
  i0.ɵɵadvance(5);
206
- i0.ɵɵtextInterpolate(provider_r7.Name);
183
+ i0.ɵɵtextInterpolate(provider_r6.Name);
207
184
  i0.ɵɵadvance(2);
208
- i0.ɵɵtextInterpolate(provider_r7.ClassKey);
185
+ i0.ɵɵtextInterpolate(provider_r6.ClassKey);
209
186
  i0.ɵɵadvance(9);
210
- i0.ɵɵtwoWayProperty("ngModel", provider_r7.CredentialID);
187
+ i0.ɵɵtwoWayProperty("ngModel", provider_r6.CredentialID);
211
188
  i0.ɵɵproperty("disabled", ctx_r1.IsSavingCredential);
212
189
  i0.ɵɵadvance();
213
190
  i0.ɵɵproperty("ngValue", null);
@@ -216,25 +193,25 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Condition
216
193
  i0.ɵɵadvance(2);
217
194
  i0.ɵɵconditional(ctx_r1.IsSavingCredential ? 21 : -1);
218
195
  } }
219
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_23_Template(rf, ctx) { if (rf & 1) {
220
- i0.ɵɵelementStart(0, "div", 47);
221
- i0.ɵɵrepeaterCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_23_For_2_Template, 22, 6, null, null, _forTrack0);
196
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_Template(rf, ctx) { if (rf & 1) {
197
+ i0.ɵɵelementStart(0, "div", 41);
198
+ i0.ɵɵrepeaterCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Template, 22, 6, null, null, _forTrack0);
222
199
  i0.ɵɵelementEnd();
223
200
  } if (rf & 2) {
224
201
  const ctx_r1 = i0.ɵɵnextContext(3);
225
202
  i0.ɵɵadvance();
226
203
  i0.ɵɵrepeater(ctx_r1.VectorDBProviders);
227
204
  } }
228
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_27_Template(rf, ctx) { if (rf & 1) {
229
- i0.ɵɵelement(0, "i", 42);
205
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_23_Template(rf, ctx) { if (rf & 1) {
206
+ i0.ɵɵelement(0, "i", 36);
230
207
  } }
231
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_28_Template(rf, ctx) { if (rf & 1) {
232
- i0.ɵɵelementStart(0, "span", 43);
208
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_24_Template(rf, ctx) { if (rf & 1) {
209
+ i0.ɵɵelementStart(0, "span", 37);
233
210
  i0.ɵɵtext(1, "2");
234
211
  i0.ɵɵelementEnd();
235
212
  } }
236
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_32_Template(rf, ctx) { if (rf & 1) {
237
- i0.ɵɵelementStart(0, "span", 46);
213
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_28_Template(rf, ctx) { if (rf & 1) {
214
+ i0.ɵɵelementStart(0, "span", 40);
238
215
  i0.ɵɵtext(1);
239
216
  i0.ɵɵelementEnd();
240
217
  } if (rf & 2) {
@@ -242,39 +219,39 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Condition
242
219
  i0.ɵɵadvance();
243
220
  i0.ɵɵtextInterpolate1("", ctx_r1.EmbeddingModels.length, " model(s) available");
244
221
  } }
245
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_33_Template(rf, ctx) { if (rf & 1) {
246
- i0.ɵɵelementStart(0, "span", 46);
222
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_29_Template(rf, ctx) { if (rf & 1) {
223
+ i0.ɵɵelementStart(0, "span", 40);
247
224
  i0.ɵɵtext(1, "No embedding models found. Configure at least one in the AI app > Models tab.");
248
225
  i0.ɵɵelementEnd();
249
226
  } }
250
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_34_For_3_Template(rf, ctx) { if (rf & 1) {
251
- i0.ɵɵelementStart(0, "span", 65);
227
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_30_For_3_Template(rf, ctx) { if (rf & 1) {
228
+ i0.ɵɵelementStart(0, "span", 59);
252
229
  i0.ɵɵtext(1);
253
230
  i0.ɵɵelementEnd();
254
231
  } if (rf & 2) {
255
- const model_r9 = ctx.$implicit;
232
+ const model_r8 = ctx.$implicit;
256
233
  i0.ɵɵadvance();
257
- i0.ɵɵtextInterpolate(model_r9.Name);
234
+ i0.ɵɵtextInterpolate(model_r8.Name);
258
235
  } }
259
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_34_Template(rf, ctx) { if (rf & 1) {
260
- i0.ɵɵelementStart(0, "div", 47)(1, "div", 64);
261
- i0.ɵɵrepeaterCreate(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_34_For_3_Template, 2, 1, "span", 65, _forTrack0);
236
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_30_Template(rf, ctx) { if (rf & 1) {
237
+ i0.ɵɵelementStart(0, "div", 41)(1, "div", 58);
238
+ i0.ɵɵrepeaterCreate(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_30_For_3_Template, 2, 1, "span", 59, _forTrack0);
262
239
  i0.ɵɵelementEnd()();
263
240
  } if (rf & 2) {
264
241
  const ctx_r1 = i0.ɵɵnextContext(3);
265
242
  i0.ɵɵadvance(2);
266
243
  i0.ɵɵrepeater(ctx_r1.EmbeddingModels);
267
244
  } }
268
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_38_Template(rf, ctx) { if (rf & 1) {
269
- i0.ɵɵelement(0, "i", 42);
245
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_34_Template(rf, ctx) { if (rf & 1) {
246
+ i0.ɵɵelement(0, "i", 36);
270
247
  } }
271
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_39_Template(rf, ctx) { if (rf & 1) {
272
- i0.ɵɵelementStart(0, "span", 43);
248
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_35_Template(rf, ctx) { if (rf & 1) {
249
+ i0.ɵɵelementStart(0, "span", 37);
273
250
  i0.ɵɵtext(1, "3");
274
251
  i0.ɵɵelementEnd();
275
252
  } }
276
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_43_Template(rf, ctx) { if (rf & 1) {
277
- i0.ɵɵelementStart(0, "span", 46);
253
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_39_Template(rf, ctx) { if (rf & 1) {
254
+ i0.ɵɵelementStart(0, "span", 40);
278
255
  i0.ɵɵtext(1);
279
256
  i0.ɵɵelementEnd();
280
257
  } if (rf & 2) {
@@ -282,124 +259,124 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Condition
282
259
  i0.ɵɵadvance();
283
260
  i0.ɵɵtextInterpolate1("", ctx_r1.VectorIndexes.length, " index(es) configured");
284
261
  } }
285
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_44_Template(rf, ctx) { if (rf & 1) {
286
- i0.ɵɵelementStart(0, "span", 46);
262
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_40_Template(rf, ctx) { if (rf & 1) {
263
+ i0.ɵɵelementStart(0, "span", 40);
287
264
  i0.ɵɵtext(1, "No indexes yet \u2014 create one below.");
288
265
  i0.ɵɵelementEnd();
289
266
  } }
290
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_45_Template(rf, ctx) { if (rf & 1) {
291
- i0.ɵɵelementStart(0, "span", 46);
267
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_41_Template(rf, ctx) { if (rf & 1) {
268
+ i0.ɵɵelementStart(0, "span", 40);
292
269
  i0.ɵɵtext(1, "Complete steps 1 and 2 first.");
293
270
  i0.ɵɵelementEnd();
294
271
  } }
295
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_46_Template(rf, ctx) { if (rf & 1) {
296
- const _r10 = i0.ɵɵgetCurrentView();
297
- i0.ɵɵelementStart(0, "button", 66);
298
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_46_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenCreateIndexForm()); });
299
- i0.ɵɵelement(1, "i", 67);
272
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_42_Template(rf, ctx) { if (rf & 1) {
273
+ const _r9 = i0.ɵɵgetCurrentView();
274
+ i0.ɵɵelementStart(0, "button", 60);
275
+ i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_42_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenCreateIndexForm()); });
276
+ i0.ɵɵelement(1, "i", 61);
300
277
  i0.ɵɵtext(2, " Create Index ");
301
278
  i0.ɵɵelementEnd();
302
279
  } }
303
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_47_For_2_Template(rf, ctx) { if (rf & 1) {
304
- const _r11 = i0.ɵɵgetCurrentView();
305
- i0.ɵɵelementStart(0, "div", 68)(1, "div", 69);
306
- i0.ɵɵelement(2, "i", 70);
280
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_43_For_2_Template(rf, ctx) { if (rf & 1) {
281
+ const _r10 = i0.ɵɵgetCurrentView();
282
+ i0.ɵɵelementStart(0, "div", 62)(1, "div", 63);
283
+ i0.ɵɵelement(2, "i", 64);
307
284
  i0.ɵɵelementEnd();
308
- i0.ɵɵelementStart(3, "div", 71)(4, "span", 72);
285
+ i0.ɵɵelementStart(3, "div", 65)(4, "span", 66);
309
286
  i0.ɵɵtext(5);
310
287
  i0.ɵɵelementEnd();
311
- i0.ɵɵelementStart(6, "span", 73);
312
- i0.ɵɵelement(7, "i", 52);
288
+ i0.ɵɵelementStart(6, "span", 67);
289
+ i0.ɵɵelement(7, "i", 46);
313
290
  i0.ɵɵtext(8);
314
- i0.ɵɵelement(9, "i", 74);
291
+ i0.ɵɵelement(9, "i", 68);
315
292
  i0.ɵɵtext(10);
316
293
  i0.ɵɵelementEnd()();
317
- i0.ɵɵelementStart(11, "div", 75)(12, "span", 56);
318
- i0.ɵɵelement(13, "i", 42);
294
+ i0.ɵɵelementStart(11, "div", 69)(12, "span", 50);
295
+ i0.ɵɵelement(13, "i", 36);
319
296
  i0.ɵɵtext(14, " Active ");
320
297
  i0.ɵɵelementEnd();
321
- i0.ɵɵelementStart(15, "button", 76);
322
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_47_For_2_Template_button_click_15_listener() { const idx_r12 = i0.ɵɵrestoreView(_r11).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.DeleteIndex(idx_r12.ID)); });
323
- i0.ɵɵelement(16, "i", 77);
298
+ i0.ɵɵelementStart(15, "button", 70);
299
+ i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_43_For_2_Template_button_click_15_listener() { const idx_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.DeleteIndex(idx_r11.ID)); });
300
+ i0.ɵɵelement(16, "i", 71);
324
301
  i0.ɵɵelementEnd()()();
325
302
  } if (rf & 2) {
326
- const idx_r12 = ctx.$implicit;
303
+ const idx_r11 = ctx.$implicit;
327
304
  i0.ɵɵadvance(5);
328
- i0.ɵɵtextInterpolate(idx_r12.Name);
305
+ i0.ɵɵtextInterpolate(idx_r11.Name);
329
306
  i0.ɵɵadvance(3);
330
- i0.ɵɵtextInterpolate1(" ", idx_r12.VectorDatabase, " \u00A0\u00B7\u00A0 ");
307
+ i0.ɵɵtextInterpolate1(" ", idx_r11.VectorDatabase, " \u00A0\u00B7\u00A0 ");
331
308
  i0.ɵɵadvance(2);
332
- i0.ɵɵtextInterpolate1(" ", idx_r12.EmbeddingModel, " ");
309
+ i0.ɵɵtextInterpolate1(" ", idx_r11.EmbeddingModel, " ");
333
310
  } }
334
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_47_Template(rf, ctx) { if (rf & 1) {
335
- i0.ɵɵelementStart(0, "div", 47);
336
- i0.ɵɵrepeaterCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_47_For_2_Template, 17, 3, "div", 68, _forTrack0);
311
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_43_Template(rf, ctx) { if (rf & 1) {
312
+ i0.ɵɵelementStart(0, "div", 41);
313
+ i0.ɵɵrepeaterCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_43_For_2_Template, 17, 3, "div", 62, _forTrack0);
337
314
  i0.ɵɵelementEnd();
338
315
  } if (rf & 2) {
339
316
  const ctx_r1 = i0.ɵɵnextContext(3);
340
317
  i0.ɵɵadvance();
341
318
  i0.ɵɵrepeater(ctx_r1.VectorIndexes);
342
319
  } }
343
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_For_14_Template(rf, ctx) { if (rf & 1) {
344
- i0.ɵɵelementStart(0, "option", 85);
320
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_For_14_Template(rf, ctx) { if (rf & 1) {
321
+ i0.ɵɵelementStart(0, "option", 79);
345
322
  i0.ɵɵtext(1);
346
323
  i0.ɵɵelementEnd();
347
324
  } if (rf & 2) {
348
- const db_r14 = ctx.$implicit;
349
- i0.ɵɵproperty("value", db_r14.ID);
325
+ const db_r13 = ctx.$implicit;
326
+ i0.ɵɵproperty("value", db_r13.ID);
350
327
  i0.ɵɵadvance();
351
- i0.ɵɵtextInterpolate(db_r14.Name);
328
+ i0.ɵɵtextInterpolate(db_r13.Name);
352
329
  } }
353
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_For_20_Template(rf, ctx) { if (rf & 1) {
354
- i0.ɵɵelementStart(0, "option", 85);
330
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_For_20_Template(rf, ctx) { if (rf & 1) {
331
+ i0.ɵɵelementStart(0, "option", 79);
355
332
  i0.ɵɵtext(1);
356
333
  i0.ɵɵelementEnd();
357
334
  } if (rf & 2) {
358
- const model_r15 = ctx.$implicit;
359
- i0.ɵɵproperty("value", model_r15.ID);
335
+ const model_r14 = ctx.$implicit;
336
+ i0.ɵɵproperty("value", model_r14.ID);
360
337
  i0.ɵɵadvance();
361
- i0.ɵɵtextInterpolate(model_r15.Name);
338
+ i0.ɵɵtextInterpolate(model_r14.Name);
362
339
  } }
363
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Conditional_23_Template(rf, ctx) { if (rf & 1) {
364
- i0.ɵɵelement(0, "i", 89);
340
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Conditional_23_Template(rf, ctx) { if (rf & 1) {
341
+ i0.ɵɵelement(0, "i", 83);
365
342
  i0.ɵɵtext(1, " Creating... ");
366
343
  } }
367
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Conditional_24_Template(rf, ctx) { if (rf & 1) {
368
- i0.ɵɵelement(0, "i", 67);
344
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Conditional_24_Template(rf, ctx) { if (rf & 1) {
345
+ i0.ɵɵelement(0, "i", 61);
369
346
  i0.ɵɵtext(1, " Create Index ");
370
347
  } }
371
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Template(rf, ctx) { if (rf & 1) {
372
- const _r13 = i0.ɵɵgetCurrentView();
373
- i0.ɵɵelementStart(0, "div", 49)(1, "h4", 78);
374
- i0.ɵɵelement(2, "i", 79);
348
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template(rf, ctx) { if (rf & 1) {
349
+ const _r12 = i0.ɵɵgetCurrentView();
350
+ i0.ɵɵelementStart(0, "div", 43)(1, "h4", 72);
351
+ i0.ɵɵelement(2, "i", 73);
375
352
  i0.ɵɵtext(3, " Create New Vector Index ");
376
353
  i0.ɵɵelementEnd();
377
- i0.ɵɵelementStart(4, "div", 80)(5, "div", 81)(6, "label", 82);
354
+ i0.ɵɵelementStart(4, "div", 74)(5, "div", 75)(6, "label", 76);
378
355
  i0.ɵɵtext(7, "Index Name");
379
356
  i0.ɵɵelementEnd();
380
- i0.ɵɵelementStart(8, "input", 83);
381
- i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.NewIndexName, $event) || (ctx_r1.NewIndexName = $event); return i0.ɵɵresetView($event); });
357
+ i0.ɵɵelementStart(8, "input", 77);
358
+ i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.NewIndexName, $event) || (ctx_r1.NewIndexName = $event); return i0.ɵɵresetView($event); });
382
359
  i0.ɵɵelementEnd()();
383
- i0.ɵɵelementStart(9, "div", 81)(10, "label", 82);
360
+ i0.ɵɵelementStart(9, "div", 75)(10, "label", 76);
384
361
  i0.ɵɵtext(11, "Vector Database");
385
362
  i0.ɵɵelementEnd();
386
- i0.ɵɵelementStart(12, "select", 84);
387
- i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Template_select_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.NewIndexVectorDBID, $event) || (ctx_r1.NewIndexVectorDBID = $event); return i0.ɵɵresetView($event); });
388
- i0.ɵɵrepeaterCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_For_14_Template, 2, 2, "option", 85, _forTrack0);
363
+ i0.ɵɵelementStart(12, "select", 78);
364
+ i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template_select_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.NewIndexVectorDBID, $event) || (ctx_r1.NewIndexVectorDBID = $event); return i0.ɵɵresetView($event); });
365
+ i0.ɵɵrepeaterCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_For_14_Template, 2, 2, "option", 79, _forTrack0);
389
366
  i0.ɵɵelementEnd()();
390
- i0.ɵɵelementStart(15, "div", 81)(16, "label", 82);
367
+ i0.ɵɵelementStart(15, "div", 75)(16, "label", 76);
391
368
  i0.ɵɵtext(17, "Embedding Model");
392
369
  i0.ɵɵelementEnd();
393
- i0.ɵɵelementStart(18, "select", 84);
394
- i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Template_select_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.NewIndexEmbeddingModelID, $event) || (ctx_r1.NewIndexEmbeddingModelID = $event); return i0.ɵɵresetView($event); });
395
- i0.ɵɵrepeaterCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_For_20_Template, 2, 2, "option", 85, _forTrack0);
370
+ i0.ɵɵelementStart(18, "select", 78);
371
+ i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template_select_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.NewIndexEmbeddingModelID, $event) || (ctx_r1.NewIndexEmbeddingModelID = $event); return i0.ɵɵresetView($event); });
372
+ i0.ɵɵrepeaterCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_For_20_Template, 2, 2, "option", 79, _forTrack0);
396
373
  i0.ɵɵelementEnd()()();
397
- i0.ɵɵelementStart(21, "div", 86)(22, "button", 87);
398
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Template_button_click_22_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CreateIndex()); });
399
- i0.ɵɵconditionalCreate(23, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Conditional_23_Template, 2, 0)(24, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Conditional_24_Template, 2, 0);
374
+ i0.ɵɵelementStart(21, "div", 80)(22, "button", 81);
375
+ i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template_button_click_22_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CreateIndex()); });
376
+ i0.ɵɵconditionalCreate(23, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Conditional_23_Template, 2, 0)(24, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Conditional_24_Template, 2, 0);
400
377
  i0.ɵɵelementEnd();
401
- i0.ɵɵelementStart(25, "button", 88);
402
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Template_button_click_25_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CancelCreateIndex()); });
378
+ i0.ɵɵelementStart(25, "button", 82);
379
+ i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template_button_click_25_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CancelCreateIndex()); });
403
380
  i0.ɵɵtext(26, " Cancel ");
404
381
  i0.ɵɵelementEnd()()();
405
382
  } if (rf & 2) {
@@ -421,164 +398,158 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Condition
421
398
  i0.ɵɵadvance(2);
422
399
  i0.ɵɵproperty("disabled", ctx_r1.IsCreatingIndex);
423
400
  } }
424
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Template(rf, ctx) { if (rf & 1) {
425
- i0.ɵɵelementStart(0, "div", 17)(1, "h2", 21);
426
- i0.ɵɵtext(2, "Vector Database");
427
- i0.ɵɵelementEnd();
428
- i0.ɵɵelementStart(3, "p", 22);
429
- i0.ɵɵtext(4, "Manage the shared vector index and database connection.");
401
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Template(rf, ctx) { if (rf & 1) {
402
+ i0.ɵɵelementStart(0, "div", 14)(1, "div", 27)(2, "div", 28)(3, "span", 29);
403
+ i0.ɵɵtext(4, "Setup Progress");
430
404
  i0.ɵɵelementEnd();
431
- i0.ɵɵelementStart(5, "div", 33)(6, "div", 34)(7, "span", 35);
432
- i0.ɵɵtext(8, "Setup Progress");
433
- i0.ɵɵelementEnd();
434
- i0.ɵɵelementStart(9, "span", 36);
435
- i0.ɵɵtext(10);
405
+ i0.ɵɵelementStart(5, "span", 30);
406
+ i0.ɵɵtext(6);
436
407
  i0.ɵɵelementEnd()();
437
- i0.ɵɵelementStart(11, "div", 37);
438
- i0.ɵɵelement(12, "div", 38);
408
+ i0.ɵɵelementStart(7, "div", 31);
409
+ i0.ɵɵelement(8, "div", 32);
439
410
  i0.ɵɵelementEnd()();
440
- i0.ɵɵelementStart(13, "div", 39)(14, "div", 40)(15, "div", 41);
441
- i0.ɵɵconditionalCreate(16, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_16_Template, 1, 0, "i", 42)(17, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_17_Template, 2, 0, "span", 43);
411
+ i0.ɵɵelementStart(9, "div", 33)(10, "div", 34)(11, "div", 35);
412
+ i0.ɵɵconditionalCreate(12, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_12_Template, 1, 0, "i", 36)(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_13_Template, 2, 0, "span", 37);
442
413
  i0.ɵɵelementEnd();
443
- i0.ɵɵelementStart(18, "div", 44)(19, "span", 45);
444
- i0.ɵɵtext(20, "Vector Database Providers");
414
+ i0.ɵɵelementStart(14, "div", 38)(15, "span", 39);
415
+ i0.ɵɵtext(16, "Vector Database Providers");
445
416
  i0.ɵɵelementEnd();
446
- i0.ɵɵconditionalCreate(21, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_21_Template, 2, 1, "span", 46)(22, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_22_Template, 2, 0, "span", 46);
417
+ i0.ɵɵconditionalCreate(17, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_17_Template, 2, 1, "span", 40)(18, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_18_Template, 2, 0, "span", 40);
447
418
  i0.ɵɵelementEnd()();
448
- i0.ɵɵconditionalCreate(23, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_23_Template, 3, 0, "div", 47);
419
+ i0.ɵɵconditionalCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_Template, 3, 0, "div", 41);
449
420
  i0.ɵɵelementEnd();
450
- i0.ɵɵelementStart(24, "div", 39)(25, "div", 40)(26, "div", 41);
451
- i0.ɵɵconditionalCreate(27, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_27_Template, 1, 0, "i", 42)(28, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_28_Template, 2, 0, "span", 43);
421
+ i0.ɵɵelementStart(20, "div", 33)(21, "div", 34)(22, "div", 35);
422
+ i0.ɵɵconditionalCreate(23, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_23_Template, 1, 0, "i", 36)(24, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_24_Template, 2, 0, "span", 37);
452
423
  i0.ɵɵelementEnd();
453
- i0.ɵɵelementStart(29, "div", 44)(30, "span", 45);
454
- i0.ɵɵtext(31, "Embedding Models");
424
+ i0.ɵɵelementStart(25, "div", 38)(26, "span", 39);
425
+ i0.ɵɵtext(27, "Embedding Models");
455
426
  i0.ɵɵelementEnd();
456
- i0.ɵɵconditionalCreate(32, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_32_Template, 2, 1, "span", 46)(33, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_33_Template, 2, 0, "span", 46);
427
+ i0.ɵɵconditionalCreate(28, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_28_Template, 2, 1, "span", 40)(29, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_29_Template, 2, 0, "span", 40);
457
428
  i0.ɵɵelementEnd()();
458
- i0.ɵɵconditionalCreate(34, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_34_Template, 4, 0, "div", 47);
429
+ i0.ɵɵconditionalCreate(30, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_30_Template, 4, 0, "div", 41);
459
430
  i0.ɵɵelementEnd();
460
- i0.ɵɵelementStart(35, "div", 39)(36, "div", 40)(37, "div", 41);
461
- i0.ɵɵconditionalCreate(38, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_38_Template, 1, 0, "i", 42)(39, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_39_Template, 2, 0, "span", 43);
431
+ i0.ɵɵelementStart(31, "div", 33)(32, "div", 34)(33, "div", 35);
432
+ i0.ɵɵconditionalCreate(34, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_34_Template, 1, 0, "i", 36)(35, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_35_Template, 2, 0, "span", 37);
462
433
  i0.ɵɵelementEnd();
463
- i0.ɵɵelementStart(40, "div", 44)(41, "span", 45);
464
- i0.ɵɵtext(42, "Vector Indexes");
434
+ i0.ɵɵelementStart(36, "div", 38)(37, "span", 39);
435
+ i0.ɵɵtext(38, "Vector Indexes");
465
436
  i0.ɵɵelementEnd();
466
- i0.ɵɵconditionalCreate(43, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_43_Template, 2, 1, "span", 46)(44, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_44_Template, 2, 0, "span", 46)(45, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_45_Template, 2, 0, "span", 46);
437
+ i0.ɵɵconditionalCreate(39, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_39_Template, 2, 1, "span", 40)(40, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_40_Template, 2, 0, "span", 40)(41, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_41_Template, 2, 0, "span", 40);
467
438
  i0.ɵɵelementEnd();
468
- i0.ɵɵconditionalCreate(46, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_46_Template, 3, 0, "button", 48);
439
+ i0.ɵɵconditionalCreate(42, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_42_Template, 3, 0, "button", 42);
469
440
  i0.ɵɵelementEnd();
470
- i0.ɵɵconditionalCreate(47, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_47_Template, 3, 0, "div", 47);
471
- i0.ɵɵconditionalCreate(48, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_48_Template, 27, 6, "div", 49);
441
+ i0.ɵɵconditionalCreate(43, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_43_Template, 3, 0, "div", 41);
442
+ i0.ɵɵconditionalCreate(44, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template, 27, 6, "div", 43);
472
443
  i0.ɵɵelementEnd()();
473
444
  } if (rf & 2) {
474
445
  const ctx_r1 = i0.ɵɵnextContext(2);
475
- i0.ɵɵadvance(10);
446
+ i0.ɵɵadvance(6);
476
447
  i0.ɵɵtextInterpolate1("", ctx_r1.SetupStepsCompleted, " of 3 complete");
477
448
  i0.ɵɵadvance(2);
478
449
  i0.ɵɵstyleProp("width", ctx_r1.SetupStepsCompleted / 3 * 100, "%");
479
450
  i0.ɵɵadvance();
480
451
  i0.ɵɵclassProp("setup-step-complete", ctx_r1.HasVectorDBProvider)("setup-step-pending", !ctx_r1.HasVectorDBProvider);
481
452
  i0.ɵɵadvance(3);
482
- i0.ɵɵconditional(ctx_r1.HasVectorDBProvider ? 16 : 17);
453
+ i0.ɵɵconditional(ctx_r1.HasVectorDBProvider ? 12 : 13);
483
454
  i0.ɵɵadvance(5);
484
- i0.ɵɵconditional(ctx_r1.HasVectorDBProvider ? 21 : 22);
455
+ i0.ɵɵconditional(ctx_r1.HasVectorDBProvider ? 17 : 18);
485
456
  i0.ɵɵadvance(2);
486
- i0.ɵɵconditional(ctx_r1.HasVectorDBProvider ? 23 : -1);
457
+ i0.ɵɵconditional(ctx_r1.HasVectorDBProvider ? 19 : -1);
487
458
  i0.ɵɵadvance();
488
459
  i0.ɵɵclassProp("setup-step-complete", ctx_r1.HasEmbeddingModel)("setup-step-pending", !ctx_r1.HasEmbeddingModel);
489
460
  i0.ɵɵadvance(3);
490
- i0.ɵɵconditional(ctx_r1.HasEmbeddingModel ? 27 : 28);
461
+ i0.ɵɵconditional(ctx_r1.HasEmbeddingModel ? 23 : 24);
491
462
  i0.ɵɵadvance(5);
492
- i0.ɵɵconditional(ctx_r1.HasEmbeddingModel ? 32 : 33);
463
+ i0.ɵɵconditional(ctx_r1.HasEmbeddingModel ? 28 : 29);
493
464
  i0.ɵɵadvance(2);
494
- i0.ɵɵconditional(ctx_r1.HasEmbeddingModel ? 34 : -1);
465
+ i0.ɵɵconditional(ctx_r1.HasEmbeddingModel ? 30 : -1);
495
466
  i0.ɵɵadvance();
496
467
  i0.ɵɵclassProp("setup-step-complete", ctx_r1.HasVectorIndex)("setup-step-pending", !ctx_r1.HasVectorIndex);
497
468
  i0.ɵɵadvance(3);
498
- i0.ɵɵconditional(ctx_r1.HasVectorIndex ? 38 : 39);
469
+ i0.ɵɵconditional(ctx_r1.HasVectorIndex ? 34 : 35);
499
470
  i0.ɵɵadvance(5);
500
- i0.ɵɵconditional(ctx_r1.HasVectorIndex ? 43 : ctx_r1.HasVectorDBProvider && ctx_r1.HasEmbeddingModel ? 44 : 45);
471
+ i0.ɵɵconditional(ctx_r1.HasVectorIndex ? 39 : ctx_r1.HasVectorDBProvider && ctx_r1.HasEmbeddingModel ? 40 : 41);
501
472
  i0.ɵɵadvance(3);
502
- i0.ɵɵconditional(ctx_r1.HasVectorDBProvider && ctx_r1.HasEmbeddingModel && !ctx_r1.ShowCreateIndexForm ? 46 : -1);
473
+ i0.ɵɵconditional(ctx_r1.HasVectorDBProvider && ctx_r1.HasEmbeddingModel && !ctx_r1.ShowCreateIndexForm ? 42 : -1);
503
474
  i0.ɵɵadvance();
504
- i0.ɵɵconditional(ctx_r1.HasVectorIndex ? 47 : -1);
475
+ i0.ɵɵconditional(ctx_r1.HasVectorIndex ? 43 : -1);
505
476
  i0.ɵɵadvance();
506
- i0.ɵɵconditional(ctx_r1.ShowCreateIndexForm ? 48 : -1);
477
+ i0.ɵɵconditional(ctx_r1.ShowCreateIndexForm ? 44 : -1);
507
478
  } }
508
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_5_Template(rf, ctx) { if (rf & 1) {
509
- i0.ɵɵelement(0, "mj-loading", 90);
479
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_1_Template(rf, ctx) { if (rf & 1) {
480
+ i0.ɵɵelement(0, "mj-loading", 84);
510
481
  } }
511
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_6_Template(rf, ctx) { if (rf & 1) {
512
- i0.ɵɵelementStart(0, "div", 91);
513
- i0.ɵɵelement(1, "i", 92);
514
- i0.ɵɵelementStart(2, "h3", 93);
482
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_2_Template(rf, ctx) { if (rf & 1) {
483
+ i0.ɵɵelementStart(0, "div", 85);
484
+ i0.ɵɵelement(1, "i", 86);
485
+ i0.ɵɵelementStart(2, "h3", 87);
515
486
  i0.ɵɵtext(3, "No Searchable Entities Found");
516
487
  i0.ɵɵelementEnd();
517
- i0.ɵɵelementStart(4, "p", 94);
488
+ i0.ɵɵelementStart(4, "p", 88);
518
489
  i0.ɵɵtext(5, "No entities with text fields were discovered. Ensure your database schema includes entities with varchar/nvarchar columns.");
519
490
  i0.ɵɵelementEnd()();
520
491
  } }
521
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_For_7_For_8_Template(rf, ctx) { if (rf & 1) {
522
- i0.ɵɵelementStart(0, "span", 106);
492
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_For_8_Template(rf, ctx) { if (rf & 1) {
493
+ i0.ɵɵelementStart(0, "span", 100);
523
494
  i0.ɵɵtext(1);
524
495
  i0.ɵɵelementEnd();
525
496
  } if (rf & 2) {
526
- const field_r19 = ctx.$implicit;
497
+ const field_r18 = ctx.$implicit;
527
498
  i0.ɵɵadvance();
528
- i0.ɵɵtextInterpolate(field_r19);
499
+ i0.ɵɵtextInterpolate(field_r18);
529
500
  } }
530
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_For_7_Conditional_13_Template(rf, ctx) { if (rf & 1) {
531
- i0.ɵɵelementStart(0, "span", 110);
532
- i0.ɵɵelement(1, "i", 111);
501
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Conditional_13_Template(rf, ctx) { if (rf & 1) {
502
+ i0.ɵɵelementStart(0, "span", 104);
503
+ i0.ɵɵelement(1, "i", 105);
533
504
  i0.ɵɵtext(2);
534
505
  i0.ɵɵelementEnd();
535
506
  } if (rf & 2) {
536
- const entity_r18 = i0.ɵɵnextContext().$implicit;
507
+ const entity_r17 = i0.ɵɵnextContext().$implicit;
537
508
  i0.ɵɵadvance(2);
538
- i0.ɵɵtextInterpolate1(" ", entity_r18.SnippetField, " ");
509
+ i0.ɵɵtextInterpolate1(" ", entity_r17.SnippetField, " ");
539
510
  } }
540
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_For_7_Template(rf, ctx) { if (rf & 1) {
541
- const _r17 = i0.ɵɵgetCurrentView();
542
- i0.ɵɵelementStart(0, "div", 101)(1, "div", 102)(2, "input", 28);
543
- i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_For_7_Template_input_ngModelChange_2_listener($event) { const entity_r18 = i0.ɵɵrestoreView(_r17).$implicit; i0.ɵɵtwoWayBindingSet(entity_r18.Enabled, $event) || (entity_r18.Enabled = $event); return i0.ɵɵresetView($event); });
544
- i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_For_7_Template_input_change_2_listener() { const entity_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnFTSEntityToggled(entity_r18)); });
511
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Template(rf, ctx) { if (rf & 1) {
512
+ const _r16 = i0.ɵɵgetCurrentView();
513
+ i0.ɵɵelementStart(0, "div", 95)(1, "div", 96)(2, "input", 22);
514
+ i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Template_input_ngModelChange_2_listener($event) { const entity_r17 = i0.ɵɵrestoreView(_r16).$implicit; i0.ɵɵtwoWayBindingSet(entity_r17.Enabled, $event) || (entity_r17.Enabled = $event); return i0.ɵɵresetView($event); });
515
+ i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Template_input_change_2_listener() { const entity_r17 = i0.ɵɵrestoreView(_r16).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnFTSEntityToggled(entity_r17)); });
545
516
  i0.ɵɵelementEnd()();
546
- i0.ɵɵelementStart(3, "div", 103)(4, "span", 104);
517
+ i0.ɵɵelementStart(3, "div", 97)(4, "span", 98);
547
518
  i0.ɵɵtext(5);
548
519
  i0.ɵɵelementEnd();
549
- i0.ɵɵelementStart(6, "div", 105);
550
- i0.ɵɵrepeaterCreate(7, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_For_7_For_8_Template, 2, 1, "span", 106, i0.ɵɵrepeaterTrackByIdentity);
520
+ i0.ɵɵelementStart(6, "div", 99);
521
+ i0.ɵɵrepeaterCreate(7, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_For_8_Template, 2, 1, "span", 100, i0.ɵɵrepeaterTrackByIdentity);
551
522
  i0.ɵɵelementEnd()();
552
- i0.ɵɵelementStart(9, "div", 107)(10, "span", 108);
553
- i0.ɵɵelement(11, "i", 109);
523
+ i0.ɵɵelementStart(9, "div", 101)(10, "span", 102);
524
+ i0.ɵɵelement(11, "i", 103);
554
525
  i0.ɵɵtext(12);
555
526
  i0.ɵɵelementEnd();
556
- i0.ɵɵconditionalCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_For_7_Conditional_13_Template, 3, 1, "span", 110);
527
+ i0.ɵɵconditionalCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Conditional_13_Template, 3, 1, "span", 104);
557
528
  i0.ɵɵelementEnd()();
558
529
  } if (rf & 2) {
559
- const entity_r18 = ctx.$implicit;
560
- i0.ɵɵclassProp("fts-entity-enabled", entity_r18.Enabled);
530
+ const entity_r17 = ctx.$implicit;
531
+ i0.ɵɵclassProp("fts-entity-enabled", entity_r17.Enabled);
561
532
  i0.ɵɵadvance(2);
562
- i0.ɵɵtwoWayProperty("ngModel", entity_r18.Enabled);
533
+ i0.ɵɵtwoWayProperty("ngModel", entity_r17.Enabled);
563
534
  i0.ɵɵadvance(3);
564
- i0.ɵɵtextInterpolate(entity_r18.EntityName);
535
+ i0.ɵɵtextInterpolate(entity_r17.EntityName);
565
536
  i0.ɵɵadvance(2);
566
- i0.ɵɵrepeater(entity_r18.IndexedFields);
537
+ i0.ɵɵrepeater(entity_r17.IndexedFields);
567
538
  i0.ɵɵadvance(5);
568
- i0.ɵɵtextInterpolate1(" ", entity_r18.TitleField, " ");
539
+ i0.ɵɵtextInterpolate1(" ", entity_r17.TitleField, " ");
569
540
  i0.ɵɵadvance();
570
- i0.ɵɵconditional(entity_r18.SnippetField !== entity_r18.TitleField ? 13 : -1);
541
+ i0.ɵɵconditional(entity_r17.SnippetField !== entity_r17.TitleField ? 13 : -1);
571
542
  } }
572
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_Template(rf, ctx) { if (rf & 1) {
573
- const _r16 = i0.ɵɵgetCurrentView();
574
- i0.ɵɵelementStart(0, "div", 95)(1, "div", 96)(2, "span", 97);
543
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_Template(rf, ctx) { if (rf & 1) {
544
+ const _r15 = i0.ɵɵgetCurrentView();
545
+ i0.ɵɵelementStart(0, "div", 89)(1, "div", 90)(2, "span", 91);
575
546
  i0.ɵɵtext(3);
576
547
  i0.ɵɵelementEnd();
577
- i0.ɵɵelementStart(4, "input", 98);
578
- i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.FTSFilterText, $event) || (ctx_r1.FTSFilterText = $event); return i0.ɵɵresetView($event); });
548
+ i0.ɵɵelementStart(4, "input", 92);
549
+ i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.FTSFilterText, $event) || (ctx_r1.FTSFilterText = $event); return i0.ɵɵresetView($event); });
579
550
  i0.ɵɵelementEnd()()();
580
- i0.ɵɵelementStart(5, "div", 99);
581
- i0.ɵɵrepeaterCreate(6, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_For_7_Template, 14, 6, "div", 100, _forTrack1);
551
+ i0.ɵɵelementStart(5, "div", 93);
552
+ i0.ɵɵrepeaterCreate(6, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Template, 14, 6, "div", 94, _forTrack1);
582
553
  i0.ɵɵelementEnd();
583
554
  } if (rf & 2) {
584
555
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -589,50 +560,45 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Condition
589
560
  i0.ɵɵadvance(2);
590
561
  i0.ɵɵrepeater(ctx_r1.FilteredFTSEntities);
591
562
  } }
592
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Template(rf, ctx) { if (rf & 1) {
593
- i0.ɵɵelementStart(0, "div", 17)(1, "h2", 21);
594
- i0.ɵɵtext(2, "Full-Text Search Entities");
595
- i0.ɵɵelementEnd();
596
- i0.ɵɵelementStart(3, "p", 22);
597
- i0.ɵɵtext(4, "Configure which entities are included in full-text search. Entities with text fields (Name, Description, etc.) are automatically discovered.");
598
- i0.ɵɵelementEnd();
599
- i0.ɵɵconditionalCreate(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_5_Template, 1, 0, "mj-loading", 90)(6, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_6_Template, 6, 0, "div", 91)(7, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_7_Template, 8, 3);
563
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Template(rf, ctx) { if (rf & 1) {
564
+ i0.ɵɵelementStart(0, "div", 14);
565
+ i0.ɵɵconditionalCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_1_Template, 1, 0, "mj-loading", 84)(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_2_Template, 6, 0, "div", 85)(3, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_Template, 8, 3);
600
566
  i0.ɵɵelementEnd();
601
567
  } if (rf & 2) {
602
568
  const ctx_r1 = i0.ɵɵnextContext(2);
603
- i0.ɵɵadvance(5);
604
- i0.ɵɵconditional(ctx_r1.IsLoadingFTSEntities ? 5 : ctx_r1.FTSEntities.length === 0 ? 6 : 7);
569
+ i0.ɵɵadvance();
570
+ i0.ɵɵconditional(ctx_r1.IsLoadingFTSEntities ? 1 : ctx_r1.FTSEntities.length === 0 ? 2 : 3);
605
571
  } }
606
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_5_For_17_Template(rf, ctx) { if (rf & 1) {
607
- i0.ɵɵelementStart(0, "span", 65);
572
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_1_For_17_Template(rf, ctx) { if (rf & 1) {
573
+ i0.ɵɵelementStart(0, "span", 59);
608
574
  i0.ɵɵtext(1);
609
575
  i0.ɵɵelementEnd();
610
576
  } if (rf & 2) {
611
- const model_r20 = ctx.$implicit;
577
+ const model_r19 = ctx.$implicit;
612
578
  i0.ɵɵadvance();
613
- i0.ɵɵtextInterpolate(model_r20.Name);
579
+ i0.ɵɵtextInterpolate(model_r19.Name);
614
580
  } }
615
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_5_Template(rf, ctx) { if (rf & 1) {
616
- i0.ɵɵelementStart(0, "div", 23)(1, "div", 29)(2, "div", 30)(3, "span", 26);
581
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_1_Template(rf, ctx) { if (rf & 1) {
582
+ i0.ɵɵelementStart(0, "div", 17)(1, "div", 23)(2, "div", 24)(3, "span", 20);
617
583
  i0.ɵɵtext(4, "Active Model");
618
584
  i0.ɵɵelementEnd();
619
- i0.ɵɵelementStart(5, "span", 27);
585
+ i0.ɵɵelementStart(5, "span", 21);
620
586
  i0.ɵɵtext(6, "Currently selected embedding model");
621
587
  i0.ɵɵelementEnd()();
622
- i0.ɵɵelementStart(7, "span", 112);
588
+ i0.ɵɵelementStart(7, "span", 106);
623
589
  i0.ɵɵtext(8);
624
590
  i0.ɵɵelementEnd()();
625
- i0.ɵɵelementStart(9, "div", 29)(10, "div", 30)(11, "span", 26);
591
+ i0.ɵɵelementStart(9, "div", 23)(10, "div", 24)(11, "span", 20);
626
592
  i0.ɵɵtext(12, "Available Models");
627
593
  i0.ɵɵelementEnd();
628
- i0.ɵɵelementStart(13, "span", 27);
594
+ i0.ɵɵelementStart(13, "span", 21);
629
595
  i0.ɵɵtext(14);
630
596
  i0.ɵɵelementEnd()();
631
- i0.ɵɵelementStart(15, "div", 64);
632
- i0.ɵɵrepeaterCreate(16, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_5_For_17_Template, 2, 1, "span", 65, _forTrack0);
597
+ i0.ɵɵelementStart(15, "div", 58);
598
+ i0.ɵɵrepeaterCreate(16, KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_1_For_17_Template, 2, 1, "span", 59, _forTrack0);
633
599
  i0.ɵɵelementEnd()()();
634
- i0.ɵɵelementStart(18, "p", 113);
635
- i0.ɵɵelement(19, "i", 114);
600
+ i0.ɵɵelementStart(18, "p", 107);
601
+ i0.ɵɵelement(19, "i", 108);
636
602
  i0.ɵɵtext(20, " Manage embedding models in the AI Dashboard > Models tab. ");
637
603
  i0.ɵɵelementEnd();
638
604
  } if (rf & 2) {
@@ -644,81 +610,70 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Condition
644
610
  i0.ɵɵadvance(2);
645
611
  i0.ɵɵrepeater(ctx_r1.EmbeddingModels);
646
612
  } }
647
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_6_Template(rf, ctx) { if (rf & 1) {
648
- i0.ɵɵelementStart(0, "div", 91);
649
- i0.ɵɵelement(1, "i", 115);
650
- i0.ɵɵelementStart(2, "h3", 93);
613
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_2_Template(rf, ctx) { if (rf & 1) {
614
+ i0.ɵɵelementStart(0, "div", 85);
615
+ i0.ɵɵelement(1, "i", 109);
616
+ i0.ɵɵelementStart(2, "h3", 87);
651
617
  i0.ɵɵtext(3, "No Embedding Models Found");
652
618
  i0.ɵɵelementEnd();
653
- i0.ɵɵelementStart(4, "p", 94);
619
+ i0.ɵɵelementStart(4, "p", 88);
654
620
  i0.ɵɵtext(5, " Embedding models are required to convert text into vectors for semantic search and duplicate detection. Configure at least one embedding model (e.g., text-embedding-3-small) in the AI Dashboard > Models tab. ");
655
621
  i0.ɵɵelementEnd()();
656
622
  } }
657
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Template(rf, ctx) { if (rf & 1) {
658
- i0.ɵɵelementStart(0, "div", 17)(1, "h2", 21);
659
- i0.ɵɵtext(2, "Embedding Models");
660
- i0.ɵɵelementEnd();
661
- i0.ɵɵelementStart(3, "p", 22);
662
- i0.ɵɵtext(4, "AI models used for generating vector embeddings from text.");
663
- i0.ɵɵelementEnd();
664
- i0.ɵɵconditionalCreate(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_5_Template, 21, 2)(6, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_6_Template, 6, 0, "div", 91);
623
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Template(rf, ctx) { if (rf & 1) {
624
+ i0.ɵɵelementStart(0, "div", 14);
625
+ i0.ɵɵconditionalCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_1_Template, 21, 2)(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_2_Template, 6, 0, "div", 85);
665
626
  i0.ɵɵelementEnd();
666
627
  } if (rf & 2) {
667
628
  const ctx_r1 = i0.ɵɵnextContext(2);
668
- i0.ɵɵadvance(5);
669
- i0.ɵɵconditional(ctx_r1.HasEmbeddingModel ? 5 : 6);
629
+ i0.ɵɵadvance();
630
+ i0.ɵɵconditional(ctx_r1.HasEmbeddingModel ? 1 : 2);
670
631
  } }
671
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template(rf, ctx) { if (rf & 1) {
672
- const _r21 = i0.ɵɵgetCurrentView();
673
- i0.ɵɵelementStart(0, "div", 17)(1, "h2", 21);
674
- i0.ɵɵtext(2, "Scoring Thresholds");
675
- i0.ɵɵelementEnd();
676
- i0.ɵɵelementStart(3, "p", 22);
677
- i0.ɵɵtext(4, "Set the scoring thresholds used by search, duplicate detection, and autotagging.");
678
- i0.ɵɵelementEnd();
679
- i0.ɵɵelementStart(5, "div", 23)(6, "div", 29)(7, "div", 30)(8, "span", 26);
680
- i0.ɵɵtext(9, "Duplicate Absolute Match");
632
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template(rf, ctx) { if (rf & 1) {
633
+ const _r20 = i0.ɵɵgetCurrentView();
634
+ i0.ɵɵelementStart(0, "div", 14)(1, "div", 17)(2, "div", 23)(3, "div", 24)(4, "span", 20);
635
+ i0.ɵɵtext(5, "Duplicate Absolute Match");
681
636
  i0.ɵɵelementEnd();
682
- i0.ɵɵelementStart(10, "span", 27);
683
- i0.ɵɵtext(11);
637
+ i0.ɵɵelementStart(6, "span", 21);
638
+ i0.ɵɵtext(7);
684
639
  i0.ɵɵelementEnd()();
685
- i0.ɵɵelementStart(12, "input", 116);
686
- i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template_input_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ThresholdSettings.DuplicateAbsolute, $event) || (ctx_r1.ThresholdSettings.DuplicateAbsolute = $event); return i0.ɵɵresetView($event); });
687
- i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template_input_input_12_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
640
+ i0.ɵɵelementStart(8, "input", 110);
641
+ i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ThresholdSettings.DuplicateAbsolute, $event) || (ctx_r1.ThresholdSettings.DuplicateAbsolute = $event); return i0.ɵɵresetView($event); });
642
+ i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_input_8_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
688
643
  i0.ɵɵelementEnd()();
689
- i0.ɵɵelementStart(13, "div", 29)(14, "div", 30)(15, "span", 26);
690
- i0.ɵɵtext(16, "Duplicate Potential Match");
644
+ i0.ɵɵelementStart(9, "div", 23)(10, "div", 24)(11, "span", 20);
645
+ i0.ɵɵtext(12, "Duplicate Potential Match");
691
646
  i0.ɵɵelementEnd();
692
- i0.ɵɵelementStart(17, "span", 27);
693
- i0.ɵɵtext(18);
647
+ i0.ɵɵelementStart(13, "span", 21);
648
+ i0.ɵɵtext(14);
694
649
  i0.ɵɵelementEnd()();
695
- i0.ɵɵelementStart(19, "input", 117);
696
- i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template_input_ngModelChange_19_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ThresholdSettings.DuplicatePotential, $event) || (ctx_r1.ThresholdSettings.DuplicatePotential = $event); return i0.ɵɵresetView($event); });
697
- i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template_input_input_19_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
650
+ i0.ɵɵelementStart(15, "input", 111);
651
+ i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_ngModelChange_15_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ThresholdSettings.DuplicatePotential, $event) || (ctx_r1.ThresholdSettings.DuplicatePotential = $event); return i0.ɵɵresetView($event); });
652
+ i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_input_15_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
698
653
  i0.ɵɵelementEnd()();
699
- i0.ɵɵelementStart(20, "div", 29)(21, "div", 30)(22, "span", 26);
700
- i0.ɵɵtext(23, "Search Relevance");
654
+ i0.ɵɵelementStart(16, "div", 23)(17, "div", 24)(18, "span", 20);
655
+ i0.ɵɵtext(19, "Search Relevance");
701
656
  i0.ɵɵelementEnd();
702
- i0.ɵɵelementStart(24, "span", 27);
703
- i0.ɵɵtext(25);
657
+ i0.ɵɵelementStart(20, "span", 21);
658
+ i0.ɵɵtext(21);
704
659
  i0.ɵɵelementEnd()();
705
- i0.ɵɵelementStart(26, "input", 118);
706
- i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template_input_ngModelChange_26_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ThresholdSettings.SearchRelevance, $event) || (ctx_r1.ThresholdSettings.SearchRelevance = $event); return i0.ɵɵresetView($event); });
707
- i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template_input_input_26_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
660
+ i0.ɵɵelementStart(22, "input", 112);
661
+ i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_ngModelChange_22_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ThresholdSettings.SearchRelevance, $event) || (ctx_r1.ThresholdSettings.SearchRelevance = $event); return i0.ɵɵresetView($event); });
662
+ i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_input_22_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
708
663
  i0.ɵɵelementEnd()();
709
- i0.ɵɵelementStart(27, "div", 29)(28, "div", 30)(29, "span", 26);
710
- i0.ɵɵtext(30, "Autotag Confidence");
664
+ i0.ɵɵelementStart(23, "div", 23)(24, "div", 24)(25, "span", 20);
665
+ i0.ɵɵtext(26, "Autotag Confidence");
711
666
  i0.ɵɵelementEnd();
712
- i0.ɵɵelementStart(31, "span", 27);
713
- i0.ɵɵtext(32);
667
+ i0.ɵɵelementStart(27, "span", 21);
668
+ i0.ɵɵtext(28);
714
669
  i0.ɵɵelementEnd()();
715
- i0.ɵɵelementStart(33, "input", 117);
716
- i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template_input_ngModelChange_33_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ThresholdSettings.AutotagConfidence, $event) || (ctx_r1.ThresholdSettings.AutotagConfidence = $event); return i0.ɵɵresetView($event); });
717
- i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template_input_input_33_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
670
+ i0.ɵɵelementStart(29, "input", 111);
671
+ i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_ngModelChange_29_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ThresholdSettings.AutotagConfidence, $event) || (ctx_r1.ThresholdSettings.AutotagConfidence = $event); return i0.ɵɵresetView($event); });
672
+ i0.ɵɵlistener("input", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template_input_input_29_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSettingChanged()); });
718
673
  i0.ɵɵelementEnd()()()();
719
674
  } if (rf & 2) {
720
675
  const ctx_r1 = i0.ɵɵnextContext(2);
721
- i0.ɵɵadvance(11);
676
+ i0.ɵɵadvance(7);
722
677
  i0.ɵɵtextInterpolate1("Score above which duplicates are auto-confirmed (", ctx_r1.FormatThreshold(ctx_r1.ThresholdSettings.DuplicateAbsolute), ")");
723
678
  i0.ɵɵadvance();
724
679
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ThresholdSettings.DuplicateAbsolute);
@@ -735,13 +690,13 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template(
735
690
  i0.ɵɵadvance();
736
691
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ThresholdSettings.AutotagConfidence);
737
692
  } }
738
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_14_Template(rf, ctx) { if (rf & 1) {
739
- i0.ɵɵelementStart(0, "div", 124);
693
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_9_Template(rf, ctx) { if (rf & 1) {
694
+ i0.ɵɵelementStart(0, "div", 117);
740
695
  i0.ɵɵtext(1, "Loading\u2026");
741
696
  i0.ɵɵelementEnd();
742
697
  } }
743
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_15_Template(rf, ctx) { if (rf & 1) {
744
- i0.ɵɵelementStart(0, "div", 125);
698
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_10_Template(rf, ctx) { if (rf & 1) {
699
+ i0.ɵɵelementStart(0, "div", 118);
745
700
  i0.ɵɵtext(1, " No scopes defined yet. Click ");
746
701
  i0.ɵɵelementStart(2, "strong");
747
702
  i0.ɵɵtext(3, "New");
@@ -749,123 +704,123 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Condition
749
704
  i0.ɵɵtext(4, " to create one. ");
750
705
  i0.ɵɵelementEnd();
751
706
  } }
752
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_16_For_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
753
- i0.ɵɵelementStart(0, "span", 132);
707
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
708
+ i0.ɵɵelementStart(0, "span", 125);
754
709
  i0.ɵɵtext(1, "Global");
755
710
  i0.ɵɵelementEnd();
756
711
  } }
757
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_16_For_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
758
- i0.ɵɵelementStart(0, "span", 132);
712
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
713
+ i0.ɵɵelementStart(0, "span", 125);
759
714
  i0.ɵɵtext(1, "Default");
760
715
  i0.ɵɵelementEnd();
761
716
  } }
762
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_16_For_1_Template(rf, ctx) { if (rf & 1) {
763
- const _r23 = i0.ɵɵgetCurrentView();
764
- i0.ɵɵelementStart(0, "button", 129);
765
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_16_For_1_Template_button_click_0_listener() { const s_r24 = i0.ɵɵrestoreView(_r23).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SelectScope(s_r24.ID)); });
766
- i0.ɵɵelement(1, "i", 130);
767
- i0.ɵɵelementStart(2, "span", 131);
717
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Template(rf, ctx) { if (rf & 1) {
718
+ const _r22 = i0.ɵɵgetCurrentView();
719
+ i0.ɵɵelementStart(0, "button", 122);
720
+ i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Template_button_click_0_listener() { const s_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SelectScope(s_r23.ID)); });
721
+ i0.ɵɵelement(1, "i", 123);
722
+ i0.ɵɵelementStart(2, "span", 124);
768
723
  i0.ɵɵtext(3);
769
724
  i0.ɵɵelementEnd();
770
- i0.ɵɵconditionalCreate(4, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_16_For_1_Conditional_4_Template, 2, 0, "span", 132)(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_16_For_1_Conditional_5_Template, 2, 0, "span", 132);
725
+ i0.ɵɵconditionalCreate(4, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Conditional_4_Template, 2, 0, "span", 125)(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Conditional_5_Template, 2, 0, "span", 125);
771
726
  i0.ɵɵelementEnd();
772
727
  } if (rf & 2) {
773
- const s_r24 = ctx.$implicit;
728
+ const s_r23 = ctx.$implicit;
774
729
  const ctx_r1 = i0.ɵɵnextContext(4);
775
- i0.ɵɵclassProp("active", ctx_r1.ActiveScopeID === s_r24.ID);
730
+ i0.ɵɵclassProp("active", ctx_r1.ActiveScopeID === s_r23.ID);
776
731
  i0.ɵɵadvance();
777
- i0.ɵɵclassMap(s_r24.Icon || "fa-solid fa-filter");
732
+ i0.ɵɵclassMap(s_r23.Icon || "fa-solid fa-filter");
778
733
  i0.ɵɵadvance(2);
779
- i0.ɵɵtextInterpolate(s_r24.Name);
734
+ i0.ɵɵtextInterpolate(s_r23.Name);
780
735
  i0.ɵɵadvance();
781
- i0.ɵɵconditional(s_r24.IsGlobal ? 4 : s_r24.IsDefault ? 5 : -1);
736
+ i0.ɵɵconditional(s_r23.IsGlobal ? 4 : s_r23.IsDefault ? 5 : -1);
782
737
  } }
783
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_16_Template(rf, ctx) { if (rf & 1) {
784
- i0.ɵɵrepeaterCreate(0, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_16_For_1_Template, 6, 6, "button", 128, _forTrack0);
738
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_Template(rf, ctx) { if (rf & 1) {
739
+ i0.ɵɵrepeaterCreate(0, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Template, 6, 6, "button", 121, _forTrack0);
785
740
  } if (rf & 2) {
786
741
  const ctx_r1 = i0.ɵɵnextContext(3);
787
742
  i0.ɵɵrepeater(ctx_r1.SearchScopes);
788
743
  } }
789
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_14_Template(rf, ctx) { if (rf & 1) {
790
- const _r26 = i0.ɵɵgetCurrentView();
791
- i0.ɵɵelementStart(0, "button", 145);
792
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_14_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OpenActiveScopeFullForm()); });
793
- i0.ɵɵelement(1, "i", 146);
744
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_14_Template(rf, ctx) { if (rf & 1) {
745
+ const _r25 = i0.ɵɵgetCurrentView();
746
+ i0.ɵɵelementStart(0, "button", 138);
747
+ i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_14_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OpenActiveScopeFullForm()); });
748
+ i0.ɵɵelement(1, "i", 139);
794
749
  i0.ɵɵtext(2, " Open Full Form ");
795
750
  i0.ɵɵelementEnd();
796
751
  } }
797
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_18_Template(rf, ctx) { if (rf & 1) {
798
- const _r27 = i0.ɵɵgetCurrentView();
799
- i0.ɵɵelementStart(0, "button", 147);
800
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_18_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.DeleteActiveScope()); });
801
- i0.ɵɵelement(1, "i", 148);
752
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_18_Template(rf, ctx) { if (rf & 1) {
753
+ const _r26 = i0.ɵɵgetCurrentView();
754
+ i0.ɵɵelementStart(0, "button", 140);
755
+ i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_18_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.DeleteActiveScope()); });
756
+ i0.ɵɵelement(1, "i", 141);
802
757
  i0.ɵɵelementEnd();
803
758
  } }
804
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template(rf, ctx) { if (rf & 1) {
805
- const _r28 = i0.ɵɵgetCurrentView();
806
- i0.ɵɵelementStart(0, "div", 140)(1, "label")(2, "span");
759
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template(rf, ctx) { if (rf & 1) {
760
+ const _r27 = i0.ɵɵgetCurrentView();
761
+ i0.ɵɵelementStart(0, "div", 133)(1, "label")(2, "span");
807
762
  i0.ɵɵtext(3, "Name");
808
763
  i0.ɵɵelementEnd();
809
- i0.ɵɵelementStart(4, "input", 149);
810
- i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template_input_change_4_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.Name = $event.target.value); });
764
+ i0.ɵɵelementStart(4, "input", 142);
765
+ i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_input_change_4_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.Name = $event.target.value); });
811
766
  i0.ɵɵelementEnd()();
812
767
  i0.ɵɵelementStart(5, "label")(6, "span");
813
768
  i0.ɵɵtext(7, "Icon (Font Awesome class)");
814
769
  i0.ɵɵelementEnd();
815
- i0.ɵɵelementStart(8, "input", 149);
816
- i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template_input_change_8_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.Icon = $event.target.value); });
770
+ i0.ɵɵelementStart(8, "input", 142);
771
+ i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_input_change_8_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.Icon = $event.target.value); });
817
772
  i0.ɵɵelementEnd()();
818
- i0.ɵɵelementStart(9, "label", 150)(10, "span");
773
+ i0.ɵɵelementStart(9, "label", 143)(10, "span");
819
774
  i0.ɵɵtext(11, "Description");
820
775
  i0.ɵɵelementEnd();
821
- i0.ɵɵelementStart(12, "textarea", 151);
822
- i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template_textarea_change_12_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.Description = $event.target.value); });
776
+ i0.ɵɵelementStart(12, "textarea", 144);
777
+ i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_textarea_change_12_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.Description = $event.target.value); });
823
778
  i0.ɵɵelementEnd()();
824
779
  i0.ɵɵelementStart(13, "label")(14, "span");
825
780
  i0.ɵɵtext(15, "Status");
826
781
  i0.ɵɵelementEnd();
827
- i0.ɵɵelementStart(16, "select", 152);
828
- i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template_select_change_16_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.Status = $event.target.value); });
829
- i0.ɵɵelementStart(17, "option", 153);
782
+ i0.ɵɵelementStart(16, "select", 145);
783
+ i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_select_change_16_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.Status = $event.target.value); });
784
+ i0.ɵɵelementStart(17, "option", 146);
830
785
  i0.ɵɵtext(18, "Active");
831
786
  i0.ɵɵelementEnd();
832
- i0.ɵɵelementStart(19, "option", 154);
787
+ i0.ɵɵelementStart(19, "option", 147);
833
788
  i0.ɵɵtext(20, "Inactive");
834
789
  i0.ɵɵelementEnd()()();
835
790
  i0.ɵɵelementStart(21, "label")(22, "span");
836
791
  i0.ɵɵtext(23, "Start at");
837
792
  i0.ɵɵelementEnd();
838
- i0.ɵɵelementStart(24, "input", 155);
839
- i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template_input_change_24_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SetScopeDate(ctx_r1.ActiveScope, "StartAt", $event.target.value)); });
793
+ i0.ɵɵelementStart(24, "input", 148);
794
+ i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_input_change_24_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SetScopeDate(ctx_r1.ActiveScope, "StartAt", $event.target.value)); });
840
795
  i0.ɵɵelementEnd()();
841
796
  i0.ɵɵelementStart(25, "label")(26, "span");
842
797
  i0.ɵɵtext(27, "End at");
843
798
  i0.ɵɵelementEnd();
844
- i0.ɵɵelementStart(28, "input", 155);
845
- i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template_input_change_28_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SetScopeDate(ctx_r1.ActiveScope, "EndAt", $event.target.value)); });
799
+ i0.ɵɵelementStart(28, "input", 148);
800
+ i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_input_change_28_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SetScopeDate(ctx_r1.ActiveScope, "EndAt", $event.target.value)); });
846
801
  i0.ɵɵelementEnd()();
847
- i0.ɵɵelementStart(29, "label", 156)(30, "input", 157);
848
- i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template_input_change_30_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.IsDefault = $event.target.checked); });
802
+ i0.ɵɵelementStart(29, "label", 149)(30, "input", 150);
803
+ i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_input_change_30_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.IsDefault = $event.target.checked); });
849
804
  i0.ɵɵelementEnd();
850
805
  i0.ɵɵelementStart(31, "span");
851
806
  i0.ɵɵtext(32, "Default scope \u2014 picked when users/agents don't specify one");
852
807
  i0.ɵɵelementEnd()();
853
- i0.ɵɵelementStart(33, "label", 156);
854
- i0.ɵɵelement(34, "input", 158);
808
+ i0.ɵɵelementStart(33, "label", 149);
809
+ i0.ɵɵelement(34, "input", 151);
855
810
  i0.ɵɵelementStart(35, "span");
856
811
  i0.ɵɵtext(36, "Global \u2014 reserved for the built-in Global scope (read-only)");
857
812
  i0.ɵɵelementEnd()();
858
- i0.ɵɵelementStart(37, "label", 150)(38, "span");
813
+ i0.ɵɵelementStart(37, "label", 143)(38, "span");
859
814
  i0.ɵɵtext(39, "Scope Config (JSON)");
860
815
  i0.ɵɵelementEnd();
861
- i0.ɵɵelementStart(40, "textarea", 159);
862
- i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template_textarea_change_40_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.ScopeConfig = $event.target.value); });
816
+ i0.ɵɵelementStart(40, "textarea", 152);
817
+ i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_textarea_change_40_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.ScopeConfig = $event.target.value); });
863
818
  i0.ɵɵelementEnd()();
864
- i0.ɵɵelementStart(41, "label", 150)(42, "span");
819
+ i0.ɵɵelementStart(41, "label", 143)(42, "span");
865
820
  i0.ɵɵtext(43, "Search Context Config (JSON)");
866
821
  i0.ɵɵelementEnd();
867
- i0.ɵɵelementStart(44, "textarea", 159);
868
- i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template_textarea_change_44_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.SearchContextConfig = $event.target.value); });
822
+ i0.ɵɵelementStart(44, "textarea", 152);
823
+ i0.ɵɵlistener("change", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template_textarea_change_44_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ActiveScope.SearchContextConfig = $event.target.value); });
869
824
  i0.ɵɵelementEnd()()();
870
825
  } if (rf & 2) {
871
826
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -890,33 +845,33 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Condition
890
845
  i0.ɵɵadvance(4);
891
846
  i0.ɵɵproperty("value", ctx_r1.ActiveScope.SearchContextConfig || "");
892
847
  } }
893
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_20_Template(rf, ctx) { if (rf & 1) {
894
- i0.ɵɵelement(0, "mj-search-scope-child-grid", 141);
848
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_20_Template(rf, ctx) { if (rf & 1) {
849
+ i0.ɵɵelement(0, "mj-search-scope-child-grid", 134);
895
850
  } if (rf & 2) {
896
851
  const ctx_r1 = i0.ɵɵnextContext(4);
897
852
  i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopeProviderColumns);
898
853
  } }
899
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_21_Template(rf, ctx) { if (rf & 1) {
900
- i0.ɵɵelement(0, "mj-search-scope-child-grid", 142);
854
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_21_Template(rf, ctx) { if (rf & 1) {
855
+ i0.ɵɵelement(0, "mj-search-scope-child-grid", 135);
901
856
  } if (rf & 2) {
902
857
  const ctx_r1 = i0.ɵɵnextContext(4);
903
858
  i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopeExternalIndexColumns);
904
859
  } }
905
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_22_Template(rf, ctx) { if (rf & 1) {
906
- i0.ɵɵelement(0, "mj-search-scope-child-grid", 143);
860
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_22_Template(rf, ctx) { if (rf & 1) {
861
+ i0.ɵɵelement(0, "mj-search-scope-child-grid", 136);
907
862
  } if (rf & 2) {
908
863
  const ctx_r1 = i0.ɵɵnextContext(4);
909
864
  i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopeEntityColumns);
910
865
  } }
911
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_23_Template(rf, ctx) { if (rf & 1) {
912
- i0.ɵɵelement(0, "mj-search-scope-child-grid", 144);
866
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_23_Template(rf, ctx) { if (rf & 1) {
867
+ i0.ɵɵelement(0, "mj-search-scope-child-grid", 137);
913
868
  } if (rf & 2) {
914
869
  const ctx_r1 = i0.ɵɵnextContext(4);
915
870
  i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopeStorageColumns);
916
871
  } }
917
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_24_Template(rf, ctx) { if (rf & 1) {
918
- i0.ɵɵelementStart(0, "div", 160)(1, "p", 161);
919
- i0.ɵɵelement(2, "i", 162);
872
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_24_Template(rf, ctx) { if (rf & 1) {
873
+ i0.ɵɵelementStart(0, "div", 153)(1, "p", 154);
874
+ i0.ɵɵelement(2, "i", 155);
920
875
  i0.ɵɵelementStart(3, "strong");
921
876
  i0.ɵɵtext(4, "Per-user / per-role grants on this scope.");
922
877
  i0.ɵɵelementEnd();
@@ -950,53 +905,53 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Condition
950
905
  i0.ɵɵelementEnd();
951
906
  i0.ɵɵtext(26, " via the resolver \u2014 see the spec for the full resolution order. ");
952
907
  i0.ɵɵelementEnd()();
953
- i0.ɵɵelement(27, "mj-search-scope-child-grid", 163);
908
+ i0.ɵɵelement(27, "mj-search-scope-child-grid", 156);
954
909
  } if (rf & 2) {
955
910
  const ctx_r1 = i0.ɵɵnextContext(4);
956
911
  i0.ɵɵadvance(27);
957
912
  i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopePermissionColumns);
958
913
  } }
959
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Template(rf, ctx) { if (rf & 1) {
960
- const _r25 = i0.ɵɵgetCurrentView();
961
- i0.ɵɵelementStart(0, "div", 133)(1, "button", 134);
962
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("definition")); });
914
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template(rf, ctx) { if (rf & 1) {
915
+ const _r24 = i0.ɵɵgetCurrentView();
916
+ i0.ɵɵelementStart(0, "div", 126)(1, "button", 127);
917
+ i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("definition")); });
963
918
  i0.ɵɵtext(2, "Definition");
964
919
  i0.ɵɵelementEnd();
965
- i0.ɵɵelementStart(3, "button", 134);
966
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("providers")); });
920
+ i0.ɵɵelementStart(3, "button", 127);
921
+ i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("providers")); });
967
922
  i0.ɵɵtext(4, "Providers");
968
923
  i0.ɵɵelementEnd();
969
- i0.ɵɵelementStart(5, "button", 134);
970
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("indexes")); });
924
+ i0.ɵɵelementStart(5, "button", 127);
925
+ i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("indexes")); });
971
926
  i0.ɵɵtext(6, "External Indexes");
972
927
  i0.ɵɵelementEnd();
973
- i0.ɵɵelementStart(7, "button", 134);
974
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("entities")); });
928
+ i0.ɵɵelementStart(7, "button", 127);
929
+ i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("entities")); });
975
930
  i0.ɵɵtext(8, "Entities");
976
931
  i0.ɵɵelementEnd();
977
- i0.ɵɵelementStart(9, "button", 134);
978
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("storage")); });
932
+ i0.ɵɵelementStart(9, "button", 127);
933
+ i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("storage")); });
979
934
  i0.ɵɵtext(10, "Storage");
980
935
  i0.ɵɵelementEnd();
981
- i0.ɵɵelementStart(11, "button", 134);
982
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("permissions")); });
936
+ i0.ɵɵelementStart(11, "button", 127);
937
+ i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectScopeTab("permissions")); });
983
938
  i0.ɵɵtext(12, "Permissions");
984
939
  i0.ɵɵelementEnd();
985
- i0.ɵɵelement(13, "div", 135);
986
- i0.ɵɵconditionalCreate(14, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_14_Template, 3, 0, "button", 136);
987
- i0.ɵɵelementStart(15, "button", 137);
988
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SaveActiveScope()); });
989
- i0.ɵɵelement(16, "i", 138);
940
+ i0.ɵɵelement(13, "div", 128);
941
+ i0.ɵɵconditionalCreate(14, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_14_Template, 3, 0, "button", 129);
942
+ i0.ɵɵelementStart(15, "button", 130);
943
+ i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SaveActiveScope()); });
944
+ i0.ɵɵelement(16, "i", 131);
990
945
  i0.ɵɵtext(17, " Save ");
991
946
  i0.ɵɵelementEnd();
992
- i0.ɵɵconditionalCreate(18, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_18_Template, 2, 0, "button", 139);
947
+ i0.ɵɵconditionalCreate(18, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_18_Template, 2, 0, "button", 132);
993
948
  i0.ɵɵelementEnd();
994
- i0.ɵɵconditionalCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_19_Template, 45, 11, "div", 140);
995
- i0.ɵɵconditionalCreate(20, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_20_Template, 1, 2, "mj-search-scope-child-grid", 141);
996
- i0.ɵɵconditionalCreate(21, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_21_Template, 1, 2, "mj-search-scope-child-grid", 142);
997
- i0.ɵɵconditionalCreate(22, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_22_Template, 1, 2, "mj-search-scope-child-grid", 143);
998
- i0.ɵɵconditionalCreate(23, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_23_Template, 1, 2, "mj-search-scope-child-grid", 144);
999
- i0.ɵɵconditionalCreate(24, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Conditional_24_Template, 28, 2);
949
+ i0.ɵɵconditionalCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template, 45, 11, "div", 133);
950
+ i0.ɵɵconditionalCreate(20, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_20_Template, 1, 2, "mj-search-scope-child-grid", 134);
951
+ i0.ɵɵconditionalCreate(21, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_21_Template, 1, 2, "mj-search-scope-child-grid", 135);
952
+ i0.ɵɵconditionalCreate(22, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_22_Template, 1, 2, "mj-search-scope-child-grid", 136);
953
+ i0.ɵɵconditionalCreate(23, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_23_Template, 1, 2, "mj-search-scope-child-grid", 137);
954
+ i0.ɵɵconditionalCreate(24, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_24_Template, 28, 2);
1000
955
  } if (rf & 2) {
1001
956
  const ctx_r1 = i0.ɵɵnextContext(3);
1002
957
  i0.ɵɵadvance();
@@ -1028,8 +983,8 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Condition
1028
983
  i0.ɵɵadvance();
1029
984
  i0.ɵɵconditional(ctx_r1.ActiveScopeTab === "permissions" ? 24 : -1);
1030
985
  } }
1031
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_19_Template(rf, ctx) { if (rf & 1) {
1032
- i0.ɵɵelementStart(0, "div", 127);
986
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_14_Template(rf, ctx) { if (rf & 1) {
987
+ i0.ɵɵelementStart(0, "div", 120);
1033
988
  i0.ɵɵtext(1, " Select a scope on the left, or click ");
1034
989
  i0.ɵɵelementStart(2, "strong");
1035
990
  i0.ɵɵtext(3, "New");
@@ -1037,54 +992,47 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Condition
1037
992
  i0.ɵɵtext(4, " to create one. ");
1038
993
  i0.ɵɵelementEnd();
1039
994
  } }
1040
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template(rf, ctx) { if (rf & 1) {
1041
- const _r22 = i0.ɵɵgetCurrentView();
1042
- i0.ɵɵelementStart(0, "div", 17)(1, "h2", 21);
1043
- i0.ɵɵelement(2, "i", 119);
1044
- i0.ɵɵtext(3, " Search Scopes");
1045
- i0.ɵɵelementEnd();
1046
- i0.ɵɵelementStart(4, "p", 22);
1047
- i0.ɵɵtext(5, " Define reusable search scopes that filter which providers, entities, external indexes, and storage accounts participate in a scoped search. Scopes can be assigned to AI agents for pre-execution RAG or agent-invoked search. ");
1048
- i0.ɵɵelementEnd();
1049
- i0.ɵɵelementStart(6, "div", 120)(7, "aside", 121)(8, "div", 122)(9, "span");
1050
- i0.ɵɵtext(10);
995
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Template(rf, ctx) { if (rf & 1) {
996
+ const _r21 = i0.ɵɵgetCurrentView();
997
+ i0.ɵɵelementStart(0, "div", 14)(1, "div", 113)(2, "aside", 114)(3, "div", 115)(4, "span");
998
+ i0.ɵɵtext(5);
1051
999
  i0.ɵɵelementEnd();
1052
- i0.ɵɵelementStart(11, "button", 123);
1053
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r22); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CreateNewScope()); });
1054
- i0.ɵɵelement(12, "i", 67);
1055
- i0.ɵɵtext(13, " New ");
1000
+ i0.ɵɵelementStart(6, "button", 116);
1001
+ i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CreateNewScope()); });
1002
+ i0.ɵɵelement(7, "i", 61);
1003
+ i0.ɵɵtext(8, " New ");
1056
1004
  i0.ɵɵelementEnd()();
1057
- i0.ɵɵconditionalCreate(14, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_14_Template, 2, 0, "div", 124)(15, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_15_Template, 5, 0, "div", 125)(16, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_16_Template, 2, 0);
1005
+ i0.ɵɵconditionalCreate(9, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_9_Template, 2, 0, "div", 117)(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_10_Template, 5, 0, "div", 118)(11, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_Template, 2, 0);
1058
1006
  i0.ɵɵelementEnd();
1059
- i0.ɵɵelementStart(17, "section", 126);
1060
- i0.ɵɵconditionalCreate(18, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_18_Template, 25, 20)(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_19_Template, 5, 0, "div", 127);
1007
+ i0.ɵɵelementStart(12, "section", 119);
1008
+ i0.ɵɵconditionalCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template, 25, 20)(14, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_14_Template, 5, 0, "div", 120);
1061
1009
  i0.ɵɵelementEnd()()();
1062
1010
  } if (rf & 2) {
1063
1011
  const ctx_r1 = i0.ɵɵnextContext(2);
1064
- i0.ɵɵadvance(10);
1012
+ i0.ɵɵadvance(5);
1065
1013
  i0.ɵɵtextInterpolate1("Scopes (", ctx_r1.SearchScopes.length, ")");
1066
1014
  i0.ɵɵadvance(4);
1067
- i0.ɵɵconditional(ctx_r1.IsLoadingScopes ? 14 : ctx_r1.SearchScopes.length === 0 ? 15 : 16);
1015
+ i0.ɵɵconditional(ctx_r1.IsLoadingScopes ? 9 : ctx_r1.SearchScopes.length === 0 ? 10 : 11);
1068
1016
  i0.ɵɵadvance(4);
1069
- i0.ɵɵconditional(ctx_r1.ActiveScope ? 18 : 19);
1017
+ i0.ɵɵconditional(ctx_r1.ActiveScope ? 13 : 14);
1070
1018
  } }
1071
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_9_Template(rf, ctx) { if (rf & 1) {
1072
- i0.ɵɵelement(0, "mj-loading", 165);
1019
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_1_Template(rf, ctx) { if (rf & 1) {
1020
+ i0.ɵɵelement(0, "mj-loading", 157);
1073
1021
  } }
1074
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_10_Template(rf, ctx) { if (rf & 1) {
1075
- const _r29 = i0.ɵɵgetCurrentView();
1076
- i0.ɵɵelementStart(0, "button", 167);
1077
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_10_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.LoadSearchAnalytics()); });
1078
- i0.ɵɵelement(1, "i", 168);
1022
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_2_Template(rf, ctx) { if (rf & 1) {
1023
+ const _r28 = i0.ɵɵgetCurrentView();
1024
+ i0.ɵɵelementStart(0, "button", 159);
1025
+ i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.LoadSearchAnalytics()); });
1026
+ i0.ɵɵelement(1, "i", 160);
1079
1027
  i0.ɵɵtext(2, " Load analytics ");
1080
1028
  i0.ɵɵelementEnd();
1081
1029
  } }
1082
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_37_Template(rf, ctx) { if (rf & 1) {
1083
- i0.ɵɵelementStart(0, "p", 175);
1030
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_37_Template(rf, ctx) { if (rf & 1) {
1031
+ i0.ɵɵelementStart(0, "p", 167);
1084
1032
  i0.ɵɵtext(1, "No runs in the window.");
1085
1033
  i0.ɵɵelementEnd();
1086
1034
  } }
1087
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_38_For_11_Template(rf, ctx) { if (rf & 1) {
1035
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_38_For_11_Template(rf, ctx) { if (rf & 1) {
1088
1036
  i0.ɵɵelementStart(0, "tr")(1, "td");
1089
1037
  i0.ɵɵtext(2);
1090
1038
  i0.ɵɵelementEnd();
@@ -1096,16 +1044,16 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Condition
1096
1044
  i0.ɵɵtext(7);
1097
1045
  i0.ɵɵelementEnd()();
1098
1046
  } if (rf & 2) {
1099
- const s_r31 = ctx.$implicit;
1047
+ const s_r30 = ctx.$implicit;
1100
1048
  i0.ɵɵadvance(2);
1101
- i0.ɵɵtextInterpolate(s_r31.Name);
1049
+ i0.ɵɵtextInterpolate(s_r30.Name);
1102
1050
  i0.ɵɵadvance(2);
1103
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 3, s_r31.Count));
1051
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 3, s_r30.Count));
1104
1052
  i0.ɵɵadvance(3);
1105
- i0.ɵɵtextInterpolate1("", s_r31.AvgLatencyMs, "ms");
1053
+ i0.ɵɵtextInterpolate1("", s_r30.AvgLatencyMs, "ms");
1106
1054
  } }
1107
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_38_Template(rf, ctx) { if (rf & 1) {
1108
- i0.ɵɵelementStart(0, "table", 176)(1, "thead")(2, "tr")(3, "th");
1055
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_38_Template(rf, ctx) { if (rf & 1) {
1056
+ i0.ɵɵelementStart(0, "table", 168)(1, "thead")(2, "tr")(3, "th");
1109
1057
  i0.ɵɵtext(4, "Scope");
1110
1058
  i0.ɵɵelementEnd();
1111
1059
  i0.ɵɵelementStart(5, "th");
@@ -1115,19 +1063,19 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Condition
1115
1063
  i0.ɵɵtext(8, "Avg latency");
1116
1064
  i0.ɵɵelementEnd()()();
1117
1065
  i0.ɵɵelementStart(9, "tbody");
1118
- i0.ɵɵrepeaterCreate(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_38_For_11_Template, 8, 5, "tr", null, _forTrack2);
1066
+ i0.ɵɵrepeaterCreate(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_38_For_11_Template, 8, 5, "tr", null, _forTrack2);
1119
1067
  i0.ɵɵelementEnd()();
1120
1068
  } if (rf & 2) {
1121
1069
  const ctx_r1 = i0.ɵɵnextContext(4);
1122
1070
  i0.ɵɵadvance(10);
1123
1071
  i0.ɵɵrepeater(ctx_r1.AnalyticsTopScopes);
1124
1072
  } }
1125
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_41_Template(rf, ctx) { if (rf & 1) {
1126
- i0.ɵɵelementStart(0, "p", 175);
1073
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_41_Template(rf, ctx) { if (rf & 1) {
1074
+ i0.ɵɵelementStart(0, "p", 167);
1127
1075
  i0.ɵɵtext(1, "No rerank invocations in the window.");
1128
1076
  i0.ɵɵelementEnd();
1129
1077
  } }
1130
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_42_For_11_Template(rf, ctx) { if (rf & 1) {
1078
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_42_For_11_Template(rf, ctx) { if (rf & 1) {
1131
1079
  i0.ɵɵelementStart(0, "tr")(1, "td");
1132
1080
  i0.ɵɵtext(2);
1133
1081
  i0.ɵɵelementEnd();
@@ -1140,16 +1088,16 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Condition
1140
1088
  i0.ɵɵpipe(8, "number");
1141
1089
  i0.ɵɵelementEnd()();
1142
1090
  } if (rf & 2) {
1143
- const r_r32 = ctx.$implicit;
1091
+ const r_r31 = ctx.$implicit;
1144
1092
  i0.ɵɵadvance(2);
1145
- i0.ɵɵtextInterpolate(r_r32.Reranker);
1093
+ i0.ɵɵtextInterpolate(r_r31.Reranker);
1146
1094
  i0.ɵɵadvance(2);
1147
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 3, r_r32.Count));
1095
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 3, r_r31.Count));
1148
1096
  i0.ɵɵadvance(3);
1149
- i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(8, 5, r_r32.TotalCents, "1.0-2"), "\u00A2");
1097
+ i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(8, 5, r_r31.TotalCents, "1.0-2"), "\u00A2");
1150
1098
  } }
1151
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_42_Template(rf, ctx) { if (rf & 1) {
1152
- i0.ɵɵelementStart(0, "table", 176)(1, "thead")(2, "tr")(3, "th");
1099
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_42_Template(rf, ctx) { if (rf & 1) {
1100
+ i0.ɵɵelementStart(0, "table", 168)(1, "thead")(2, "tr")(3, "th");
1153
1101
  i0.ɵɵtext(4, "Reranker");
1154
1102
  i0.ɵɵelementEnd();
1155
1103
  i0.ɵɵelementStart(5, "th");
@@ -1159,19 +1107,19 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Condition
1159
1107
  i0.ɵɵtext(8, "Total cents");
1160
1108
  i0.ɵɵelementEnd()()();
1161
1109
  i0.ɵɵelementStart(9, "tbody");
1162
- i0.ɵɵrepeaterCreate(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_42_For_11_Template, 9, 8, "tr", null, _forTrack3);
1110
+ i0.ɵɵrepeaterCreate(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_42_For_11_Template, 9, 8, "tr", null, _forTrack3);
1163
1111
  i0.ɵɵelementEnd()();
1164
1112
  } if (rf & 2) {
1165
1113
  const ctx_r1 = i0.ɵɵnextContext(4);
1166
1114
  i0.ɵɵadvance(10);
1167
1115
  i0.ɵɵrepeater(ctx_r1.AnalyticsRerankerSpend);
1168
1116
  } }
1169
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_45_Template(rf, ctx) { if (rf & 1) {
1170
- i0.ɵɵelementStart(0, "p", 175);
1117
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_45_Template(rf, ctx) { if (rf & 1) {
1118
+ i0.ɵɵelementStart(0, "p", 167);
1171
1119
  i0.ɵɵtext(1, "No failures in the window.");
1172
1120
  i0.ɵɵelementEnd();
1173
1121
  } }
1174
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_46_For_9_Template(rf, ctx) { if (rf & 1) {
1122
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_46_For_9_Template(rf, ctx) { if (rf & 1) {
1175
1123
  i0.ɵɵelementStart(0, "tr")(1, "td");
1176
1124
  i0.ɵɵtext(2);
1177
1125
  i0.ɵɵelementEnd();
@@ -1180,85 +1128,85 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Condition
1180
1128
  i0.ɵɵpipe(5, "number");
1181
1129
  i0.ɵɵelementEnd()();
1182
1130
  } if (rf & 2) {
1183
- const f_r33 = ctx.$implicit;
1131
+ const f_r32 = ctx.$implicit;
1184
1132
  i0.ɵɵadvance(2);
1185
- i0.ɵɵtextInterpolate(f_r33.Reason);
1133
+ i0.ɵɵtextInterpolate(f_r32.Reason);
1186
1134
  i0.ɵɵadvance(2);
1187
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 2, f_r33.Count));
1135
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 2, f_r32.Count));
1188
1136
  } }
1189
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_46_Template(rf, ctx) { if (rf & 1) {
1190
- i0.ɵɵelementStart(0, "table", 176)(1, "thead")(2, "tr")(3, "th");
1137
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_46_Template(rf, ctx) { if (rf & 1) {
1138
+ i0.ɵɵelementStart(0, "table", 168)(1, "thead")(2, "tr")(3, "th");
1191
1139
  i0.ɵɵtext(4, "Reason");
1192
1140
  i0.ɵɵelementEnd();
1193
1141
  i0.ɵɵelementStart(5, "th");
1194
1142
  i0.ɵɵtext(6, "Count");
1195
1143
  i0.ɵɵelementEnd()()();
1196
1144
  i0.ɵɵelementStart(7, "tbody");
1197
- i0.ɵɵrepeaterCreate(8, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_46_For_9_Template, 6, 4, "tr", null, _forTrack4);
1145
+ i0.ɵɵrepeaterCreate(8, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_46_For_9_Template, 6, 4, "tr", null, _forTrack4);
1198
1146
  i0.ɵɵelementEnd()();
1199
1147
  } if (rf & 2) {
1200
1148
  const ctx_r1 = i0.ɵɵnextContext(4);
1201
1149
  i0.ɵɵadvance(8);
1202
1150
  i0.ɵɵrepeater(ctx_r1.AnalyticsTopFailures);
1203
1151
  } }
1204
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Template(rf, ctx) { if (rf & 1) {
1205
- const _r30 = i0.ɵɵgetCurrentView();
1206
- i0.ɵɵelementStart(0, "div", 169)(1, "div", 170)(2, "span", 171);
1152
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1153
+ const _r29 = i0.ɵɵgetCurrentView();
1154
+ i0.ɵɵelementStart(0, "div", 161)(1, "div", 162)(2, "span", 163);
1207
1155
  i0.ɵɵtext(3, "Total runs");
1208
1156
  i0.ɵɵelementEnd();
1209
- i0.ɵɵelementStart(4, "span", 172);
1157
+ i0.ɵɵelementStart(4, "span", 164);
1210
1158
  i0.ɵɵtext(5);
1211
1159
  i0.ɵɵpipe(6, "number");
1212
1160
  i0.ɵɵelementEnd()();
1213
- i0.ɵɵelementStart(7, "div", 170)(8, "span", 171);
1161
+ i0.ɵɵelementStart(7, "div", 162)(8, "span", 163);
1214
1162
  i0.ɵɵtext(9, "Success rate");
1215
1163
  i0.ɵɵelementEnd();
1216
- i0.ɵɵelementStart(10, "span", 172);
1164
+ i0.ɵɵelementStart(10, "span", 164);
1217
1165
  i0.ɵɵtext(11);
1218
1166
  i0.ɵɵelementEnd()();
1219
- i0.ɵɵelementStart(12, "div", 170)(13, "span", 171);
1167
+ i0.ɵɵelementStart(12, "div", 162)(13, "span", 163);
1220
1168
  i0.ɵɵtext(14, "Hit rate");
1221
1169
  i0.ɵɵelementEnd();
1222
- i0.ɵɵelementStart(15, "span", 172);
1170
+ i0.ɵɵelementStart(15, "span", 164);
1223
1171
  i0.ɵɵtext(16);
1224
1172
  i0.ɵɵelementEnd();
1225
- i0.ɵɵelementStart(17, "span", 173);
1173
+ i0.ɵɵelementStart(17, "span", 165);
1226
1174
  i0.ɵɵtext(18, "% of successful runs that returned \u22651 result");
1227
1175
  i0.ɵɵelementEnd()();
1228
- i0.ɵɵelementStart(19, "div", 170)(20, "span", 171);
1176
+ i0.ɵɵelementStart(19, "div", 162)(20, "span", 163);
1229
1177
  i0.ɵɵtext(21, "Avg latency");
1230
1178
  i0.ɵɵelementEnd();
1231
- i0.ɵɵelementStart(22, "span", 172);
1179
+ i0.ɵɵelementStart(22, "span", 164);
1232
1180
  i0.ɵɵtext(23);
1233
1181
  i0.ɵɵelementEnd()();
1234
- i0.ɵɵelementStart(24, "div", 170)(25, "span", 171);
1182
+ i0.ɵɵelementStart(24, "div", 162)(25, "span", 163);
1235
1183
  i0.ɵɵtext(26, "P95 latency");
1236
1184
  i0.ɵɵelementEnd();
1237
- i0.ɵɵelementStart(27, "span", 172);
1185
+ i0.ɵɵelementStart(27, "span", 164);
1238
1186
  i0.ɵɵtext(28);
1239
1187
  i0.ɵɵelementEnd()();
1240
- i0.ɵɵelementStart(29, "div", 170)(30, "span", 171);
1188
+ i0.ɵɵelementStart(29, "div", 162)(30, "span", 163);
1241
1189
  i0.ɵɵtext(31, "Reranker spend");
1242
1190
  i0.ɵɵelementEnd();
1243
- i0.ɵɵelementStart(32, "span", 172);
1191
+ i0.ɵɵelementStart(32, "span", 164);
1244
1192
  i0.ɵɵtext(33);
1245
1193
  i0.ɵɵpipe(34, "number");
1246
1194
  i0.ɵɵelementEnd()()();
1247
- i0.ɵɵelementStart(35, "h3", 174);
1195
+ i0.ɵɵelementStart(35, "h3", 166);
1248
1196
  i0.ɵɵtext(36, "Top scopes by volume");
1249
1197
  i0.ɵɵelementEnd();
1250
- i0.ɵɵconditionalCreate(37, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_37_Template, 2, 0, "p", 175)(38, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_38_Template, 12, 0, "table", 176);
1251
- i0.ɵɵelementStart(39, "h3", 174);
1198
+ i0.ɵɵconditionalCreate(37, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_37_Template, 2, 0, "p", 167)(38, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_38_Template, 12, 0, "table", 168);
1199
+ i0.ɵɵelementStart(39, "h3", 166);
1252
1200
  i0.ɵɵtext(40, "Reranker spend by driver");
1253
1201
  i0.ɵɵelementEnd();
1254
- i0.ɵɵconditionalCreate(41, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_41_Template, 2, 0, "p", 175)(42, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_42_Template, 12, 0, "table", 176);
1255
- i0.ɵɵelementStart(43, "h3", 174);
1202
+ i0.ɵɵconditionalCreate(41, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_41_Template, 2, 0, "p", 167)(42, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_42_Template, 12, 0, "table", 168);
1203
+ i0.ɵɵelementStart(43, "h3", 166);
1256
1204
  i0.ɵɵtext(44, "Top failure reasons");
1257
1205
  i0.ɵɵelementEnd();
1258
- i0.ɵɵconditionalCreate(45, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_45_Template, 2, 0, "p", 175)(46, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Conditional_46_Template, 10, 0, "table", 176);
1259
- i0.ɵɵelementStart(47, "button", 177);
1260
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Template_button_click_47_listener() { i0.ɵɵrestoreView(_r30); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.LoadSearchAnalytics()); });
1261
- i0.ɵɵelement(48, "i", 168);
1206
+ i0.ɵɵconditionalCreate(45, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_45_Template, 2, 0, "p", 167)(46, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_46_Template, 10, 0, "table", 168);
1207
+ i0.ɵɵelementStart(47, "button", 169);
1208
+ i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Template_button_click_47_listener() { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.LoadSearchAnalytics()); });
1209
+ i0.ɵɵelement(48, "i", 160);
1262
1210
  i0.ɵɵtext(49, " Refresh ");
1263
1211
  i0.ɵɵelementEnd();
1264
1212
  } if (rf & 2) {
@@ -1282,95 +1230,85 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Condition
1282
1230
  i0.ɵɵadvance(4);
1283
1231
  i0.ɵɵconditional(ctx_r1.AnalyticsTopFailures.length === 0 ? 45 : 46);
1284
1232
  } }
1285
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Template(rf, ctx) { if (rf & 1) {
1286
- i0.ɵɵelementStart(0, "div", 18)(1, "h2", 21);
1287
- i0.ɵɵelement(2, "i", 164);
1288
- i0.ɵɵtext(3, " Search Analytics");
1289
- i0.ɵɵelementEnd();
1290
- i0.ɵɵelementStart(4, "p", 22);
1291
- i0.ɵɵtext(5, "Aggregated metrics over the last 5,000 search invocations from ");
1292
- i0.ɵɵelementStart(6, "code");
1293
- i0.ɵɵtext(7, "MJ: Search Execution Logs");
1294
- i0.ɵɵelementEnd();
1295
- i0.ɵɵtext(8, ". Use this to spot slow scopes, high-failure queries, or runaway reranker spend.");
1296
- i0.ɵɵelementEnd();
1297
- i0.ɵɵconditionalCreate(9, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_9_Template, 1, 0, "mj-loading", 165)(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_10_Template, 3, 0, "button", 166)(11, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Conditional_11_Template, 50, 14);
1233
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Template(rf, ctx) { if (rf & 1) {
1234
+ i0.ɵɵelementStart(0, "div", 15);
1235
+ i0.ɵɵconditionalCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_1_Template, 1, 0, "mj-loading", 157)(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_2_Template, 3, 0, "button", 158)(3, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Template, 50, 14);
1298
1236
  i0.ɵɵelementEnd();
1299
1237
  } if (rf & 2) {
1300
1238
  const ctx_r1 = i0.ɵɵnextContext(2);
1301
- i0.ɵɵadvance(9);
1302
- i0.ɵɵconditional(ctx_r1.AnalyticsLoading ? 9 : !ctx_r1.AnalyticsLoaded ? 10 : 11);
1239
+ i0.ɵɵadvance();
1240
+ i0.ɵɵconditional(ctx_r1.AnalyticsLoading ? 1 : !ctx_r1.AnalyticsLoaded ? 2 : 3);
1303
1241
  } }
1304
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_9_Template(rf, ctx) { if (rf & 1) {
1305
- i0.ɵɵelementStart(0, "div", 179);
1306
- i0.ɵɵelement(1, "i", 89);
1242
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_1_Template(rf, ctx) { if (rf & 1) {
1243
+ i0.ɵɵelementStart(0, "div", 170);
1244
+ i0.ɵɵelement(1, "i", 83);
1307
1245
  i0.ɵɵtext(2, " Loading permission rows... ");
1308
1246
  i0.ɵɵelementEnd();
1309
1247
  } }
1310
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_19_Template(rf, ctx) { if (rf & 1) {
1311
- i0.ɵɵelementStart(0, "div", 190);
1248
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_19_Template(rf, ctx) { if (rf & 1) {
1249
+ i0.ɵɵelementStart(0, "div", 181);
1312
1250
  i0.ɵɵtext(1, " No permission rows match your filters. ");
1313
1251
  i0.ɵɵelementEnd();
1314
1252
  } }
1315
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_For_13_Conditional_4_Template(rf, ctx) { if (rf & 1) {
1253
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_4_Template(rf, ctx) { if (rf & 1) {
1316
1254
  i0.ɵɵtext(0);
1317
- i0.ɵɵelementStart(1, "span", 193);
1255
+ i0.ɵɵelementStart(1, "span", 184);
1318
1256
  i0.ɵɵtext(2);
1319
1257
  i0.ɵɵelementEnd();
1320
1258
  } if (rf & 2) {
1321
- const row_r35 = i0.ɵɵnextContext().$implicit;
1322
- i0.ɵɵtextInterpolate1(" ", row_r35.UserName, " ");
1259
+ const row_r34 = i0.ɵɵnextContext().$implicit;
1260
+ i0.ɵɵtextInterpolate1(" ", row_r34.UserName, " ");
1323
1261
  i0.ɵɵadvance(2);
1324
- i0.ɵɵtextInterpolate1("(", row_r35.UserEmail, ")");
1262
+ i0.ɵɵtextInterpolate1("(", row_r34.UserEmail, ")");
1325
1263
  } }
1326
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_For_13_Conditional_5_Template(rf, ctx) { if (rf & 1) {
1264
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_5_Template(rf, ctx) { if (rf & 1) {
1327
1265
  i0.ɵɵtext(0);
1328
1266
  } if (rf & 2) {
1329
- const row_r35 = i0.ɵɵnextContext().$implicit;
1330
- i0.ɵɵtextInterpolate1(" ", row_r35.RoleName, " ");
1267
+ const row_r34 = i0.ɵɵnextContext().$implicit;
1268
+ i0.ɵɵtextInterpolate1(" ", row_r34.RoleName, " ");
1331
1269
  } }
1332
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_For_13_Conditional_7_Template(rf, ctx) { if (rf & 1) {
1333
- i0.ɵɵelementStart(0, "span", 192);
1270
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_7_Template(rf, ctx) { if (rf & 1) {
1271
+ i0.ɵɵelementStart(0, "span", 183);
1334
1272
  i0.ɵɵtext(1, "User");
1335
1273
  i0.ɵɵelementEnd();
1336
1274
  } }
1337
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_For_13_Conditional_8_Template(rf, ctx) { if (rf & 1) {
1338
- i0.ɵɵelementStart(0, "span", 192);
1275
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_8_Template(rf, ctx) { if (rf & 1) {
1276
+ i0.ɵɵelementStart(0, "span", 183);
1339
1277
  i0.ɵɵtext(1, "Role");
1340
1278
  i0.ɵɵelementEnd();
1341
1279
  } }
1342
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_For_13_Template(rf, ctx) { if (rf & 1) {
1280
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Template(rf, ctx) { if (rf & 1) {
1343
1281
  i0.ɵɵelementStart(0, "tr")(1, "td");
1344
1282
  i0.ɵɵtext(2);
1345
1283
  i0.ɵɵelementEnd();
1346
1284
  i0.ɵɵelementStart(3, "td");
1347
- i0.ɵɵconditionalCreate(4, KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_For_13_Conditional_4_Template, 3, 2)(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_For_13_Conditional_5_Template, 1, 1);
1285
+ i0.ɵɵconditionalCreate(4, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_4_Template, 3, 2)(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_5_Template, 1, 1);
1348
1286
  i0.ɵɵelementEnd();
1349
1287
  i0.ɵɵelementStart(6, "td");
1350
- i0.ɵɵconditionalCreate(7, KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_For_13_Conditional_7_Template, 2, 0, "span", 192);
1351
- i0.ɵɵconditionalCreate(8, KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_For_13_Conditional_8_Template, 2, 0, "span", 192);
1288
+ i0.ɵɵconditionalCreate(7, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_7_Template, 2, 0, "span", 183);
1289
+ i0.ɵɵconditionalCreate(8, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_8_Template, 2, 0, "span", 183);
1352
1290
  i0.ɵɵelementEnd();
1353
1291
  i0.ɵɵelementStart(9, "td")(10, "span");
1354
1292
  i0.ɵɵpipe(11, "lowercase");
1355
1293
  i0.ɵɵtext(12);
1356
1294
  i0.ɵɵelementEnd()()();
1357
1295
  } if (rf & 2) {
1358
- const row_r35 = ctx.$implicit;
1296
+ const row_r34 = ctx.$implicit;
1359
1297
  i0.ɵɵadvance(2);
1360
- i0.ɵɵtextInterpolate(row_r35.SearchScopeName);
1298
+ i0.ɵɵtextInterpolate(row_r34.SearchScopeName);
1361
1299
  i0.ɵɵadvance(2);
1362
- i0.ɵɵconditional(row_r35.UserID ? 4 : 5);
1300
+ i0.ɵɵconditional(row_r34.UserID ? 4 : 5);
1363
1301
  i0.ɵɵadvance(3);
1364
- i0.ɵɵconditional(row_r35.UserID ? 7 : -1);
1302
+ i0.ɵɵconditional(row_r34.UserID ? 7 : -1);
1365
1303
  i0.ɵɵadvance();
1366
- i0.ɵɵconditional(row_r35.RoleID ? 8 : -1);
1304
+ i0.ɵɵconditional(row_r34.RoleID ? 8 : -1);
1367
1305
  i0.ɵɵadvance(2);
1368
- i0.ɵɵclassMap(i0.ɵɵinterpolate1("search-permissions-level search-permissions-level-", i0.ɵɵpipeBind1(11, 8, row_r35.PermissionLevel)));
1306
+ i0.ɵɵclassMap(i0.ɵɵinterpolate1("search-permissions-level search-permissions-level-", i0.ɵɵpipeBind1(11, 8, row_r34.PermissionLevel)));
1369
1307
  i0.ɵɵadvance(2);
1370
- i0.ɵɵtextInterpolate(row_r35.PermissionLevel);
1308
+ i0.ɵɵtextInterpolate(row_r34.PermissionLevel);
1371
1309
  } }
1372
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_Template(rf, ctx) { if (rf & 1) {
1373
- i0.ɵɵelementStart(0, "table", 191)(1, "thead")(2, "tr")(3, "th");
1310
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_Template(rf, ctx) { if (rf & 1) {
1311
+ i0.ɵɵelementStart(0, "table", 182)(1, "thead")(2, "tr")(3, "th");
1374
1312
  i0.ɵɵtext(4, "Scope");
1375
1313
  i0.ɵɵelementEnd();
1376
1314
  i0.ɵɵelementStart(5, "th");
@@ -1383,47 +1321,47 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Condition
1383
1321
  i0.ɵɵtext(10, "Permission Level");
1384
1322
  i0.ɵɵelementEnd()()();
1385
1323
  i0.ɵɵelementStart(11, "tbody");
1386
- i0.ɵɵrepeaterCreate(12, KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_For_13_Template, 13, 10, "tr", null, _forTrack0);
1324
+ i0.ɵɵrepeaterCreate(12, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Template, 13, 10, "tr", null, _forTrack0);
1387
1325
  i0.ɵɵelementEnd()();
1388
1326
  } if (rf & 2) {
1389
1327
  const ctx_r1 = i0.ɵɵnextContext(4);
1390
1328
  i0.ɵɵadvance(12);
1391
1329
  i0.ɵɵrepeater(ctx_r1.FilteredPermissionsRows);
1392
1330
  } }
1393
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Template(rf, ctx) { if (rf & 1) {
1394
- const _r34 = i0.ɵɵgetCurrentView();
1395
- i0.ɵɵelementStart(0, "div", 180)(1, "input", 181);
1396
- i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Template_input_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.PermissionsFilterScope, $event) || (ctx_r1.PermissionsFilterScope = $event); return i0.ɵɵresetView($event); });
1331
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Template(rf, ctx) { if (rf & 1) {
1332
+ const _r33 = i0.ɵɵgetCurrentView();
1333
+ i0.ɵɵelementStart(0, "div", 171)(1, "input", 172);
1334
+ i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Template_input_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r33); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.PermissionsFilterScope, $event) || (ctx_r1.PermissionsFilterScope = $event); return i0.ɵɵresetView($event); });
1397
1335
  i0.ɵɵelementEnd();
1398
- i0.ɵɵelementStart(2, "input", 182);
1399
- i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Template_input_ngModelChange_2_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.PermissionsFilterPrincipal, $event) || (ctx_r1.PermissionsFilterPrincipal = $event); return i0.ɵɵresetView($event); });
1336
+ i0.ɵɵelementStart(2, "input", 173);
1337
+ i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Template_input_ngModelChange_2_listener($event) { i0.ɵɵrestoreView(_r33); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.PermissionsFilterPrincipal, $event) || (ctx_r1.PermissionsFilterPrincipal = $event); return i0.ɵɵresetView($event); });
1400
1338
  i0.ɵɵelementEnd();
1401
- i0.ɵɵelementStart(3, "select", 183);
1402
- i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Template_select_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.PermissionsFilterLevel, $event) || (ctx_r1.PermissionsFilterLevel = $event); return i0.ɵɵresetView($event); });
1403
- i0.ɵɵelementStart(4, "option", 184);
1339
+ i0.ɵɵelementStart(3, "select", 174);
1340
+ i0.ɵɵtwoWayListener("ngModelChange", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Template_select_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r33); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.PermissionsFilterLevel, $event) || (ctx_r1.PermissionsFilterLevel = $event); return i0.ɵɵresetView($event); });
1341
+ i0.ɵɵelementStart(4, "option", 175);
1404
1342
  i0.ɵɵtext(5, "All levels");
1405
1343
  i0.ɵɵelementEnd();
1406
- i0.ɵɵelementStart(6, "option", 185);
1344
+ i0.ɵɵelementStart(6, "option", 176);
1407
1345
  i0.ɵɵtext(7, "None");
1408
1346
  i0.ɵɵelementEnd();
1409
- i0.ɵɵelementStart(8, "option", 186);
1347
+ i0.ɵɵelementStart(8, "option", 177);
1410
1348
  i0.ɵɵtext(9, "Read");
1411
1349
  i0.ɵɵelementEnd();
1412
- i0.ɵɵelementStart(10, "option", 187);
1350
+ i0.ɵɵelementStart(10, "option", 178);
1413
1351
  i0.ɵɵtext(11, "Search");
1414
1352
  i0.ɵɵelementEnd();
1415
- i0.ɵɵelementStart(12, "option", 188);
1353
+ i0.ɵɵelementStart(12, "option", 179);
1416
1354
  i0.ɵɵtext(13, "Manage");
1417
1355
  i0.ɵɵelementEnd()();
1418
- i0.ɵɵelementStart(14, "button", 167);
1419
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.RefreshPermissionsAudit()); });
1420
- i0.ɵɵelement(15, "i", 168);
1356
+ i0.ɵɵelementStart(14, "button", 159);
1357
+ i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r33); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.RefreshPermissionsAudit()); });
1358
+ i0.ɵɵelement(15, "i", 160);
1421
1359
  i0.ɵɵtext(16, " Refresh ");
1422
1360
  i0.ɵɵelementEnd()();
1423
- i0.ɵɵelementStart(17, "div", 189);
1361
+ i0.ɵɵelementStart(17, "div", 180);
1424
1362
  i0.ɵɵtext(18);
1425
1363
  i0.ɵɵelementEnd();
1426
- i0.ɵɵconditionalCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_19_Template, 2, 0, "div", 190)(20, KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Conditional_20_Template, 14, 0, "table", 191);
1364
+ i0.ɵɵconditionalCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_19_Template, 2, 0, "div", 181)(20, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_Template, 14, 0, "table", 182);
1427
1365
  } if (rf & 2) {
1428
1366
  const ctx_r1 = i0.ɵɵnextContext(3);
1429
1367
  i0.ɵɵadvance();
@@ -1437,62 +1375,45 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Condition
1437
1375
  i0.ɵɵadvance();
1438
1376
  i0.ɵɵconditional(ctx_r1.FilteredPermissionsRows.length === 0 ? 19 : 20);
1439
1377
  } }
1440
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Template(rf, ctx) { if (rf & 1) {
1441
- i0.ɵɵelementStart(0, "div", 18)(1, "h2", 21);
1442
- i0.ɵɵelement(2, "i", 178);
1443
- i0.ɵɵtext(3, " Permissions");
1444
- i0.ɵɵelementEnd();
1445
- i0.ɵɵelementStart(4, "p", 22);
1446
- i0.ɵɵtext(5, " Cross-scope view of every ");
1447
- i0.ɵɵelementStart(6, "code");
1448
- i0.ɵɵtext(7, "SearchScopePermission");
1449
- i0.ɵɵelementEnd();
1450
- i0.ɵɵtext(8, " row. Filter by scope, by user/role, or by permission level to answer \"who has access to what\". Read-only \u2014 to add or edit a grant, open the SearchScope's full form and use its Permissions panel. ");
1451
- i0.ɵɵelementEnd();
1452
- i0.ɵɵconditionalCreate(9, KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_9_Template, 3, 0, "div", 179);
1453
- i0.ɵɵconditionalCreate(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Conditional_10_Template, 21, 6);
1378
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Template(rf, ctx) { if (rf & 1) {
1379
+ i0.ɵɵelementStart(0, "div", 15);
1380
+ i0.ɵɵconditionalCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_1_Template, 3, 0, "div", 170);
1381
+ i0.ɵɵconditionalCreate(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Template, 21, 6);
1454
1382
  i0.ɵɵelementEnd();
1455
1383
  } if (rf & 2) {
1456
1384
  const ctx_r1 = i0.ɵɵnextContext(2);
1457
- i0.ɵɵadvance(9);
1458
- i0.ɵɵconditional(ctx_r1.PermissionsLoading ? 9 : -1);
1459
1385
  i0.ɵɵadvance();
1460
- i0.ɵɵconditional(ctx_r1.PermissionsLoaded && !ctx_r1.PermissionsLoading ? 10 : -1);
1386
+ i0.ɵɵconditional(ctx_r1.PermissionsLoading ? 1 : -1);
1387
+ i0.ɵɵadvance();
1388
+ i0.ɵɵconditional(ctx_r1.PermissionsLoaded && !ctx_r1.PermissionsLoading ? 2 : -1);
1461
1389
  } }
1462
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_17_Template(rf, ctx) { if (rf & 1) {
1463
- i0.ɵɵelementStart(0, "div", 18)(1, "h2", 21);
1464
- i0.ɵɵelement(2, "i", 194);
1465
- i0.ɵɵtext(3, " Scheduling");
1466
- i0.ɵɵelementEnd();
1467
- i0.ɵɵelementStart(4, "p", 22);
1468
- i0.ɵɵtext(5, "Manage automated pipeline schedules for content classification and vector sync. Create schedules here or manage all schedules in the dedicated Scheduling app.");
1469
- i0.ɵɵelementEnd();
1470
- i0.ɵɵelementStart(6, "div", 195);
1471
- i0.ɵɵelement(7, "app-scheduling-resource", 196);
1390
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template(rf, ctx) { if (rf & 1) {
1391
+ i0.ɵɵelementStart(0, "div", 15)(1, "div", 185);
1392
+ i0.ɵɵelement(2, "app-scheduling-resource", 186);
1472
1393
  i0.ɵɵelementEnd()();
1473
1394
  } if (rf & 2) {
1474
- i0.ɵɵadvance(7);
1395
+ i0.ɵɵadvance(2);
1475
1396
  i0.ɵɵproperty("HideToolbar", true);
1476
1397
  } }
1477
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_18_Conditional_4_Template(rf, ctx) { if (rf & 1) {
1478
- i0.ɵɵelement(0, "i", 89);
1398
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_4_Template(rf, ctx) { if (rf & 1) {
1399
+ i0.ɵɵelement(0, "i", 83);
1479
1400
  i0.ɵɵtext(1, " Saving... ");
1480
1401
  } }
1481
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_18_Conditional_5_Template(rf, ctx) { if (rf & 1) {
1482
- i0.ɵɵelement(0, "i", 138);
1402
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_5_Template(rf, ctx) { if (rf & 1) {
1403
+ i0.ɵɵelement(0, "i", 131);
1483
1404
  i0.ɵɵtext(1, " Save Changes ");
1484
1405
  } }
1485
- function KnowledgeConfigResourceComponent_Conditional_8_Conditional_18_Template(rf, ctx) { if (rf & 1) {
1486
- const _r36 = i0.ɵɵgetCurrentView();
1487
- i0.ɵɵelementStart(0, "div", 19)(1, "span", 197);
1406
+ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template(rf, ctx) { if (rf & 1) {
1407
+ const _r35 = i0.ɵɵgetCurrentView();
1408
+ i0.ɵɵelementStart(0, "div", 16)(1, "span", 187);
1488
1409
  i0.ɵɵtext(2, "You have unsaved changes");
1489
1410
  i0.ɵɵelementEnd();
1490
- i0.ɵɵelementStart(3, "button", 198);
1491
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_18_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r36); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SaveConfiguration()); });
1492
- i0.ɵɵconditionalCreate(4, KnowledgeConfigResourceComponent_Conditional_8_Conditional_18_Conditional_4_Template, 2, 0)(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_18_Conditional_5_Template, 2, 0);
1411
+ i0.ɵɵelementStart(3, "button", 188);
1412
+ i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r35); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SaveConfiguration()); });
1413
+ i0.ɵɵconditionalCreate(4, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_4_Template, 2, 0)(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_5_Template, 2, 0);
1493
1414
  i0.ɵɵelementEnd();
1494
- i0.ɵɵelementStart(6, "button", 199);
1495
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_18_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r36); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ResetConfiguration()); });
1415
+ i0.ɵɵelementStart(6, "button", 189);
1416
+ i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r35); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ResetConfiguration()); });
1496
1417
  i0.ɵɵtext(7, " Reset ");
1497
1418
  i0.ɵɵelementEnd()();
1498
1419
  } if (rf & 2) {
@@ -1505,49 +1426,50 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_18_Template(
1505
1426
  i0.ɵɵproperty("disabled", ctx_r1.IsSaving);
1506
1427
  } }
1507
1428
  function KnowledgeConfigResourceComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
1508
- i0.ɵɵelementStart(0, "div", 6)(1, "nav", 12)(2, "div", 13);
1509
- i0.ɵɵelement(3, "i", 14);
1510
- i0.ɵɵelementStart(4, "span");
1511
- i0.ɵɵtext(5, "Configuration");
1512
- i0.ɵɵelementEnd()();
1513
- i0.ɵɵrepeaterCreate(6, KnowledgeConfigResourceComponent_Conditional_8_For_7_Template, 4, 5, "button", 15, _forTrack0);
1514
- i0.ɵɵelementEnd();
1515
- i0.ɵɵelementStart(8, "div", 16);
1516
- i0.ɵɵconditionalCreate(9, KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template, 34, 4, "div", 17);
1517
- i0.ɵɵconditionalCreate(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Template, 49, 26, "div", 17);
1518
- i0.ɵɵconditionalCreate(11, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Template, 8, 1, "div", 17);
1519
- i0.ɵɵconditionalCreate(12, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Template, 7, 1, "div", 17);
1520
- i0.ɵɵconditionalCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template, 34, 8, "div", 17);
1521
- i0.ɵɵconditionalCreate(14, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template, 20, 3, "div", 17);
1522
- i0.ɵɵconditionalCreate(15, KnowledgeConfigResourceComponent_Conditional_8_Conditional_15_Template, 12, 1, "div", 18);
1523
- i0.ɵɵconditionalCreate(16, KnowledgeConfigResourceComponent_Conditional_8_Conditional_16_Template, 11, 2, "div", 18);
1524
- i0.ɵɵconditionalCreate(17, KnowledgeConfigResourceComponent_Conditional_8_Conditional_17_Template, 8, 1, "div", 18);
1525
- i0.ɵɵconditionalCreate(18, KnowledgeConfigResourceComponent_Conditional_8_Conditional_18_Template, 8, 3, "div", 19);
1526
- i0.ɵɵelementEnd()();
1429
+ const _r3 = i0.ɵɵgetCurrentView();
1430
+ i0.ɵɵelementStart(0, "div", 6)(1, "mj-left-nav", 12);
1431
+ i0.ɵɵlistener("ItemClicked", function KnowledgeConfigResourceComponent_Conditional_8_Template_mj_left_nav_ItemClicked_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onNavItemClicked($event)); });
1432
+ i0.ɵɵelementEnd();
1433
+ i0.ɵɵelementStart(2, "mj-left-nav-content");
1434
+ i0.ɵɵelement(3, "mj-page-header-interior", 13);
1435
+ i0.ɵɵelementStart(4, "mj-page-body-interior");
1436
+ i0.ɵɵconditionalCreate(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template, 30, 4, "div", 14);
1437
+ i0.ɵɵconditionalCreate(6, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Template, 45, 26, "div", 14);
1438
+ i0.ɵɵconditionalCreate(7, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Template, 4, 1, "div", 14);
1439
+ i0.ɵɵconditionalCreate(8, KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Template, 3, 1, "div", 14);
1440
+ i0.ɵɵconditionalCreate(9, KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template, 30, 8, "div", 14);
1441
+ i0.ɵɵconditionalCreate(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Template, 15, 3, "div", 14);
1442
+ i0.ɵɵconditionalCreate(11, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Template, 4, 1, "div", 15);
1443
+ i0.ɵɵconditionalCreate(12, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Template, 3, 2, "div", 15);
1444
+ i0.ɵɵconditionalCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template, 3, 1, "div", 15);
1445
+ i0.ɵɵconditionalCreate(14, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template, 8, 3, "div", 16);
1446
+ i0.ɵɵelementEnd()()();
1527
1447
  } if (rf & 2) {
1528
1448
  const ctx_r1 = i0.ɵɵnextContext();
1529
- i0.ɵɵadvance(6);
1530
- i0.ɵɵrepeater(ctx_r1.Sections);
1531
- i0.ɵɵadvance(3);
1532
- i0.ɵɵconditional(ctx_r1.ActiveSection === "pipeline" ? 9 : -1);
1533
1449
  i0.ɵɵadvance();
1534
- i0.ɵɵconditional(ctx_r1.ActiveSection === "vectordb" ? 10 : -1);
1450
+ i0.ɵɵproperty("Sections", ctx_r1.navSections)("ActiveId", ctx_r1.ActiveSection);
1451
+ i0.ɵɵadvance(2);
1452
+ i0.ɵɵproperty("Title", (ctx_r1.currentSection == null ? null : ctx_r1.currentSection.Label) || "")("Subtitle", (ctx_r1.currentSection == null ? null : ctx_r1.currentSection.Description) || "");
1453
+ i0.ɵɵadvance(2);
1454
+ i0.ɵɵconditional(ctx_r1.ActiveSection === "pipeline" ? 5 : -1);
1455
+ i0.ɵɵadvance();
1456
+ i0.ɵɵconditional(ctx_r1.ActiveSection === "vectordb" ? 6 : -1);
1535
1457
  i0.ɵɵadvance();
1536
- i0.ɵɵconditional(ctx_r1.ActiveSection === "fulltext" ? 11 : -1);
1458
+ i0.ɵɵconditional(ctx_r1.ActiveSection === "fulltext" ? 7 : -1);
1537
1459
  i0.ɵɵadvance();
1538
- i0.ɵɵconditional(ctx_r1.ActiveSection === "embedding" ? 12 : -1);
1460
+ i0.ɵɵconditional(ctx_r1.ActiveSection === "embedding" ? 8 : -1);
1539
1461
  i0.ɵɵadvance();
1540
- i0.ɵɵconditional(ctx_r1.ActiveSection === "thresholds" ? 13 : -1);
1462
+ i0.ɵɵconditional(ctx_r1.ActiveSection === "thresholds" ? 9 : -1);
1541
1463
  i0.ɵɵadvance();
1542
- i0.ɵɵconditional(ctx_r1.ActiveSection === "search-scopes" ? 14 : -1);
1464
+ i0.ɵɵconditional(ctx_r1.ActiveSection === "search-scopes" ? 10 : -1);
1543
1465
  i0.ɵɵadvance();
1544
- i0.ɵɵconditional(ctx_r1.ActiveSection === "search-analytics" ? 15 : -1);
1466
+ i0.ɵɵconditional(ctx_r1.ActiveSection === "search-analytics" ? 11 : -1);
1545
1467
  i0.ɵɵadvance();
1546
- i0.ɵɵconditional(ctx_r1.ActiveSection === "search-permissions" ? 16 : -1);
1468
+ i0.ɵɵconditional(ctx_r1.ActiveSection === "search-permissions" ? 12 : -1);
1547
1469
  i0.ɵɵadvance();
1548
- i0.ɵɵconditional(ctx_r1.ActiveSection === "scheduling" ? 17 : -1);
1470
+ i0.ɵɵconditional(ctx_r1.ActiveSection === "scheduling" ? 13 : -1);
1549
1471
  i0.ɵɵadvance();
1550
- i0.ɵɵconditional(ctx_r1.HasUnsavedChanges ? 18 : -1);
1472
+ i0.ɵɵconditional(ctx_r1.HasUnsavedChanges ? 14 : -1);
1551
1473
  } }
1552
1474
  let KnowledgeConfigResourceComponent = class KnowledgeConfigResourceComponent extends BaseResourceComponent {
1553
1475
  cdr = inject(ChangeDetectorRef);
@@ -1709,6 +1631,29 @@ let KnowledgeConfigResourceComponent = class KnowledgeConfigResourceComponent ex
1709
1631
  // ================================================================
1710
1632
  // Public Methods
1711
1633
  // ================================================================
1634
+ /** Wraps `Sections` for `<mj-left-nav>`. Single unlabeled section. */
1635
+ get navSections() {
1636
+ return [{
1637
+ items: this.Sections.map(s => ({
1638
+ id: s.ID,
1639
+ label: s.Label,
1640
+ icon: s.Icon,
1641
+ description: s.Description
1642
+ }))
1643
+ }];
1644
+ }
1645
+ /**
1646
+ * Active section metadata — drives the `<mj-page-header-interior>` Title +
1647
+ * Subtitle for the current section. Reusing the existing Sections array
1648
+ * (already used to drive the left rail) keeps section identity DRY.
1649
+ */
1650
+ get currentSection() {
1651
+ return this.Sections.find(s => UUIDsEqual(s.ID, this.ActiveSection));
1652
+ }
1653
+ /** Adapter for `<mj-left-nav>`'s `(ItemClicked)` output. */
1654
+ onNavItemClicked(item) {
1655
+ this.SelectSection(item.id);
1656
+ }
1712
1657
  SelectSection(sectionId) {
1713
1658
  this.ActiveSection = sectionId;
1714
1659
  if (sectionId === 'search-scopes' && this.SearchScopes.length === 0) {
@@ -2399,7 +2344,7 @@ let KnowledgeConfigResourceComponent = class KnowledgeConfigResourceComponent ex
2399
2344
  }));
2400
2345
  }
2401
2346
  static ɵfac = /*@__PURE__*/ (() => { let ɵKnowledgeConfigResourceComponent_BaseFactory; return function KnowledgeConfigResourceComponent_Factory(__ngFactoryType__) { return (ɵKnowledgeConfigResourceComponent_BaseFactory || (ɵKnowledgeConfigResourceComponent_BaseFactory = i0.ɵɵgetInheritedFactory(KnowledgeConfigResourceComponent)))(__ngFactoryType__ || KnowledgeConfigResourceComponent); }; })();
2402
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KnowledgeConfigResourceComponent, selectors: [["app-knowledge-config-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 9, vars: 4, consts: [["Title", "Knowledge Hub Configuration", "Icon", "fa-solid fa-cogs", "Subtitle", "Pipeline, vector store, search, and automation settings"], ["meta", ""], ["Icon", "fa-solid fa-circle-exclamation", "Label", "Unsaved changes", "Variant", "warning"], ["actions", ""], [3, "Flex"], [1, "config-loading"], [1, "config-layout"], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Discard unsaved changes", 3, "click", "disabled"], [1, "fa-solid", "fa-arrow-rotate-left"], ["mjButton", "", "variant", "primary", "size", "sm", "title", "Save all settings", 3, "click", "disabled"], [1, "fa-solid", "fa-floppy-disk"], ["text", "Loading configuration...", "size", "medium"], [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-section-content"], [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, "provider-credential-row"], [1, "provider-credential-label"], [1, "fa-solid", "fa-key"], [1, "provider-credential-picker"], [1, "provider-credential-select", 3, "ngModelChange", "change", "ngModel", "disabled"], [3, "ngValue"], [1, "fa-solid", "fa-spinner", "fa-spin", "provider-credential-spinner"], [1, "config-tag-list"], [1, "config-tag"], [1, "setup-step-action", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "index-card"], [1, "index-icon"], [1, "fa-solid", "fa-cubes"], [1, "index-info"], [1, "index-name"], [1, "index-meta"], [1, "fa-solid", "fa-microchip"], [1, "index-actions"], ["title", "Delete index", 1, "index-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "create-index-title"], [1, "fa-solid", "fa-plus-circle"], [1, "create-index-fields"], [1, "create-index-field"], [1, "create-index-label"], ["type", "text", "placeholder", "e.g., mj-knowledge-index", 1, "config-input", 3, "ngModelChange", "ngModel"], [1, "config-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "create-index-actions"], [1, "create-index-submit", 3, "click", "disabled"], [1, "create-index-cancel", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], ["text", "Discovering searchable entities...", "size", "medium"], [1, "config-empty-state"], [1, "fa-solid", "fa-text-width", "config-empty-icon"], [1, "config-empty-title"], [1, "config-empty-text"], [1, "fts-entity-controls"], [1, "fts-summary"], [1, "fts-summary-count"], ["type", "text", "placeholder", "Filter entities...", 1, "config-input", "fts-filter-input", 3, "ngModelChange", "ngModel"], [1, "fts-entity-list"], [1, "fts-entity-card", 3, "fts-entity-enabled"], [1, "fts-entity-card"], [1, "fts-entity-toggle"], [1, "fts-entity-info"], [1, "fts-entity-name"], [1, "fts-entity-fields"], [1, "fts-field-tag"], [1, "fts-entity-meta"], ["title", "Title field", 1, "fts-entity-title-field"], [1, "fa-solid", "fa-heading"], ["title", "Snippet field", 1, "fts-entity-snippet-field"], [1, "fa-solid", "fa-align-left"], [1, "config-value-display"], [1, "config-section-note"], [1, "fa-solid", "fa-info-circle"], [1, "fa-solid", "fa-microchip", "config-empty-icon"], ["type", "range", "min", "0.5", "max", "1", "step", "0.01", 1, "config-slider", 3, "ngModelChange", "input", "ngModel"], ["type", "range", "min", "0.3", "max", "1", "step", "0.01", 1, "config-slider", 3, "ngModelChange", "input", "ngModel"], ["type", "range", "min", "0", "max", "1", "step", "0.01", 1, "config-slider", 3, "ngModelChange", "input", "ngModel"], [1, "fa-solid", "fa-compass-drafting"], [1, "scope-manager"], [1, "scope-manager-list"], [1, "scope-manager-list-header"], ["type", "button", 1, "scope-manager-new-btn", 3, "click"], [1, "scope-manager-loading"], [1, "scope-manager-empty"], [1, "scope-manager-detail"], [1, "scope-manager-empty-detail"], ["type", "button", 1, "scope-manager-list-item", 3, "active"], ["type", "button", 1, "scope-manager-list-item", 3, "click"], ["aria-hidden", "true"], [1, "scope-manager-list-name"], [1, "scope-manager-badge"], [1, "scope-manager-tabs"], ["type", "button", 1, "scope-manager-tab", 3, "click"], [1, "scope-manager-tab-spacer"], ["type", "button", "title", "Open the full custom form for this scope (Live Preview, Fusion Weights, Reranker, Test Queries, Execution Logs)", 1, "scope-manager-open-btn"], ["type", "button", 1, "scope-manager-save-btn", 3, "click"], [1, "fa-solid", "fa-save"], ["type", "button", "title", "Delete scope", 1, "scope-manager-delete-btn"], [1, "scope-definition-grid"], ["ChildEntityName", "MJ: Search Scope Providers", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Add provider", "EmptyMessage", "No providers assigned. Without any providers, this scope searches nothing.", 3, "ParentID", "Columns"], ["ChildEntityName", "MJ: Search Scope External Indexes", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Add external index", "EmptyMessage", "No external indexes configured for this scope.", 3, "ParentID", "Columns"], ["ChildEntityName", "MJ: Search Scope Entities", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Add entity", "EmptyMessage", "No entities configured. Scoped entity search will return no rows.", 3, "ParentID", "Columns"], ["ChildEntityName", "MJ: Search Scope Storage Accounts", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Add storage folder", "EmptyMessage", "No storage accounts linked to this scope.", 3, "ParentID", "Columns"], ["type", "button", "title", "Open the full custom form for this scope (Live Preview, Fusion Weights, Reranker, Test Queries, Execution Logs)", 1, "scope-manager-open-btn", 3, "click"], [1, "fa-solid", "fa-up-right-from-square"], ["type", "button", "title", "Delete scope", 1, "scope-manager-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash"], ["type", "text", 1, "mj-input", 3, "change", "value"], [1, "scope-definition-full"], ["rows", "2", 1, "mj-textarea", 3, "change", "value"], [1, "mj-input", 3, "change", "value"], ["value", "Active"], ["value", "Inactive"], ["type", "datetime-local", 1, "mj-input", 3, "change", "value"], [1, "scope-definition-toggle"], ["type", "checkbox", 3, "change", "checked", "disabled"], ["type", "checkbox", "disabled", "", 3, "checked"], ["rows", "4", "spellcheck", "false", 1, "mj-textarea", "scope-code-block", 3, "change", "value"], [1, "scope-permissions-help", 2, "margin-bottom", "12px", "padding", "8px 12px", "background", "var(--mj-bg-surface-card)", "border-left", "3px solid var(--mj-brand-primary)", "border-radius", "4px"], [2, "margin", "0", "font-size", "0.95em"], [1, "fa-solid", "fa-shield-halved", 2, "color", "var(--mj-brand-primary)"], ["ChildEntityName", "MJ: Search Scope Permissions", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Grant access", "EmptyMessage", "No explicit grants. Access falls back to agent SearchScopeAccess only.", 3, "ParentID", "Columns"], [1, "fa-solid", "fa-chart-line"], ["text", "Loading analytics\u2026", "size", "medium"], ["type", "button", 1, "mj-input"], ["type", "button", 1, "mj-input", 3, "click"], [1, "fa-solid", "fa-arrows-rotate"], [1, "search-analytics-kpi-grid"], [1, "search-analytics-kpi"], [1, "search-analytics-kpi-label"], [1, "search-analytics-kpi-value"], [1, "search-analytics-kpi-hint"], [1, "search-analytics-h3"], [1, "search-analytics-empty"], [1, "search-analytics-table"], ["type", "button", 1, "mj-input", "search-analytics-refresh", 3, "click"], [1, "fa-solid", "fa-shield-halved"], [1, "search-permissions-loading"], [1, "search-permissions-filters"], ["type", "text", "placeholder", "Filter by scope name...", 1, "mj-input", 3, "ngModelChange", "ngModel"], ["type", "text", "placeholder", "Filter by user/role (name or email)...", 1, "mj-input", 3, "ngModelChange", "ngModel"], [1, "mj-input", 3, "ngModelChange", "ngModel"], ["value", ""], ["value", "None"], ["value", "Read"], ["value", "Search"], ["value", "Manage"], [1, "search-permissions-summary"], [1, "search-permissions-empty"], [1, "search-permissions-table"], [1, "search-permissions-tag"], [1, "search-permissions-secondary"], [1, "fa-solid", "fa-clock"], [2, "margin-top", "16px"], [3, "HideToolbar"], [1, "config-save-text"], [1, "config-save-btn", 3, "click", "disabled"], [1, "config-reset-btn", 3, "click", "disabled"]], template: function KnowledgeConfigResourceComponent_Template(rf, ctx) { if (rf & 1) {
2347
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KnowledgeConfigResourceComponent, selectors: [["app-knowledge-config-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 9, vars: 5, consts: [["Title", "Knowledge Hub Configuration", "Icon", "fa-solid fa-cogs", "Subtitle", "Pipeline, vector store, search, and automation settings"], ["meta", ""], ["Icon", "fa-solid fa-circle-exclamation", "Label", "Unsaved changes", "Variant", "warning"], ["actions", ""], [3, "Flex", "Padding"], [1, "config-loading"], [1, "config-layout"], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Discard unsaved changes", 3, "click", "disabled"], [1, "fa-solid", "fa-arrow-rotate-left"], ["mjButton", "", "variant", "primary", "size", "sm", "title", "Save all settings", 3, "click", "disabled"], [1, "fa-solid", "fa-floppy-disk"], ["text", "Loading configuration...", "size", "medium"], [3, "ItemClicked", "Sections", "ActiveId"], [3, "Title", "Subtitle"], [1, "config-section"], [1, "config-section-content"], [1, "config-save-bar"], [1, "config-group"], [1, "config-toggle-row"], [1, "config-toggle-info"], [1, "config-label"], [1, "config-hint"], ["type", "checkbox", 1, "config-checkbox", 3, "ngModelChange", "change", "ngModel"], [1, "config-field-row"], [1, "config-field-info"], ["type", "number", "min", "10", "max", "1000", 1, "config-input", "config-input-number", 3, "ngModelChange", "input", "ngModel"], ["type", "number", "min", "1", "max", "10", 1, "config-input", "config-input-number", 3, "ngModelChange", "input", "ngModel"], [1, "setup-progress"], [1, "setup-progress-header"], [1, "setup-progress-label"], [1, "setup-progress-count"], [1, "setup-progress-bar"], [1, "setup-progress-fill"], [1, "setup-step"], [1, "setup-step-header"], [1, "setup-step-indicator"], [1, "fa-solid", "fa-circle-check"], [1, "setup-step-number"], [1, "setup-step-info"], [1, "setup-step-title"], [1, "setup-step-status"], [1, "setup-step-detail"], [1, "setup-step-action"], [1, "create-index-form"], [1, "provider-card"], [1, "provider-icon"], [1, "fa-solid", "fa-database"], [1, "provider-info"], [1, "provider-name"], [1, "provider-class"], [1, "config-status-badge", "config-status-active"], [1, "provider-credential-row"], [1, "provider-credential-label"], [1, "fa-solid", "fa-key"], [1, "provider-credential-picker"], [1, "provider-credential-select", 3, "ngModelChange", "change", "ngModel", "disabled"], [3, "ngValue"], [1, "fa-solid", "fa-spinner", "fa-spin", "provider-credential-spinner"], [1, "config-tag-list"], [1, "config-tag"], [1, "setup-step-action", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "index-card"], [1, "index-icon"], [1, "fa-solid", "fa-cubes"], [1, "index-info"], [1, "index-name"], [1, "index-meta"], [1, "fa-solid", "fa-microchip"], [1, "index-actions"], ["title", "Delete index", 1, "index-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "create-index-title"], [1, "fa-solid", "fa-plus-circle"], [1, "create-index-fields"], [1, "create-index-field"], [1, "create-index-label"], ["type", "text", "placeholder", "e.g., mj-knowledge-index", 1, "config-input", 3, "ngModelChange", "ngModel"], [1, "config-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "create-index-actions"], [1, "create-index-submit", 3, "click", "disabled"], [1, "create-index-cancel", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], ["text", "Discovering searchable entities...", "size", "medium"], [1, "config-empty-state"], [1, "fa-solid", "fa-text-width", "config-empty-icon"], [1, "config-empty-title"], [1, "config-empty-text"], [1, "fts-entity-controls"], [1, "fts-summary"], [1, "fts-summary-count"], ["type", "text", "placeholder", "Filter entities...", 1, "config-input", "fts-filter-input", 3, "ngModelChange", "ngModel"], [1, "fts-entity-list"], [1, "fts-entity-card", 3, "fts-entity-enabled"], [1, "fts-entity-card"], [1, "fts-entity-toggle"], [1, "fts-entity-info"], [1, "fts-entity-name"], [1, "fts-entity-fields"], [1, "fts-field-tag"], [1, "fts-entity-meta"], ["title", "Title field", 1, "fts-entity-title-field"], [1, "fa-solid", "fa-heading"], ["title", "Snippet field", 1, "fts-entity-snippet-field"], [1, "fa-solid", "fa-align-left"], [1, "config-value-display"], [1, "config-section-note"], [1, "fa-solid", "fa-info-circle"], [1, "fa-solid", "fa-microchip", "config-empty-icon"], ["type", "range", "min", "0.5", "max", "1", "step", "0.01", 1, "config-slider", 3, "ngModelChange", "input", "ngModel"], ["type", "range", "min", "0.3", "max", "1", "step", "0.01", 1, "config-slider", 3, "ngModelChange", "input", "ngModel"], ["type", "range", "min", "0", "max", "1", "step", "0.01", 1, "config-slider", 3, "ngModelChange", "input", "ngModel"], [1, "scope-manager"], [1, "scope-manager-list"], [1, "scope-manager-list-header"], ["type", "button", 1, "scope-manager-new-btn", 3, "click"], [1, "scope-manager-loading"], [1, "scope-manager-empty"], [1, "scope-manager-detail"], [1, "scope-manager-empty-detail"], ["type", "button", 1, "scope-manager-list-item", 3, "active"], ["type", "button", 1, "scope-manager-list-item", 3, "click"], ["aria-hidden", "true"], [1, "scope-manager-list-name"], [1, "scope-manager-badge"], [1, "scope-manager-tabs"], ["type", "button", 1, "scope-manager-tab", 3, "click"], [1, "scope-manager-tab-spacer"], ["type", "button", "title", "Open the full custom form for this scope (Live Preview, Fusion Weights, Reranker, Test Queries, Execution Logs)", 1, "scope-manager-open-btn"], ["type", "button", 1, "scope-manager-save-btn", 3, "click"], [1, "fa-solid", "fa-save"], ["type", "button", "title", "Delete scope", 1, "scope-manager-delete-btn"], [1, "scope-definition-grid"], ["ChildEntityName", "MJ: Search Scope Providers", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Add provider", "EmptyMessage", "No providers assigned. Without any providers, this scope searches nothing.", 3, "ParentID", "Columns"], ["ChildEntityName", "MJ: Search Scope External Indexes", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Add external index", "EmptyMessage", "No external indexes configured for this scope.", 3, "ParentID", "Columns"], ["ChildEntityName", "MJ: Search Scope Entities", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Add entity", "EmptyMessage", "No entities configured. Scoped entity search will return no rows.", 3, "ParentID", "Columns"], ["ChildEntityName", "MJ: Search Scope Storage Accounts", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Add storage folder", "EmptyMessage", "No storage accounts linked to this scope.", 3, "ParentID", "Columns"], ["type", "button", "title", "Open the full custom form for this scope (Live Preview, Fusion Weights, Reranker, Test Queries, Execution Logs)", 1, "scope-manager-open-btn", 3, "click"], [1, "fa-solid", "fa-up-right-from-square"], ["type", "button", "title", "Delete scope", 1, "scope-manager-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash"], ["type", "text", 1, "mj-input", 3, "change", "value"], [1, "scope-definition-full"], ["rows", "2", 1, "mj-textarea", 3, "change", "value"], [1, "mj-input", 3, "change", "value"], ["value", "Active"], ["value", "Inactive"], ["type", "datetime-local", 1, "mj-input", 3, "change", "value"], [1, "scope-definition-toggle"], ["type", "checkbox", 3, "change", "checked", "disabled"], ["type", "checkbox", "disabled", "", 3, "checked"], ["rows", "4", "spellcheck", "false", 1, "mj-textarea", "scope-code-block", 3, "change", "value"], [1, "scope-permissions-help", 2, "margin-bottom", "12px", "padding", "8px 12px", "background", "var(--mj-bg-surface-card)", "border-left", "3px solid var(--mj-brand-primary)", "border-radius", "4px"], [2, "margin", "0", "font-size", "0.95em"], [1, "fa-solid", "fa-shield-halved", 2, "color", "var(--mj-brand-primary)"], ["ChildEntityName", "MJ: Search Scope Permissions", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Grant access", "EmptyMessage", "No explicit grants. Access falls back to agent SearchScopeAccess only.", 3, "ParentID", "Columns"], ["text", "Loading analytics\u2026", "size", "medium"], ["type", "button", 1, "mj-input"], ["type", "button", 1, "mj-input", 3, "click"], [1, "fa-solid", "fa-arrows-rotate"], [1, "search-analytics-kpi-grid"], [1, "search-analytics-kpi"], [1, "search-analytics-kpi-label"], [1, "search-analytics-kpi-value"], [1, "search-analytics-kpi-hint"], [1, "search-analytics-h3"], [1, "search-analytics-empty"], [1, "search-analytics-table"], ["type", "button", 1, "mj-input", "search-analytics-refresh", 3, "click"], [1, "search-permissions-loading"], [1, "search-permissions-filters"], ["type", "text", "placeholder", "Filter by scope name...", 1, "mj-input", 3, "ngModelChange", "ngModel"], ["type", "text", "placeholder", "Filter by user/role (name or email)...", 1, "mj-input", 3, "ngModelChange", "ngModel"], [1, "mj-input", 3, "ngModelChange", "ngModel"], ["value", ""], ["value", "None"], ["value", "Read"], ["value", "Search"], ["value", "Manage"], [1, "search-permissions-summary"], [1, "search-permissions-empty"], [1, "search-permissions-table"], [1, "search-permissions-tag"], [1, "search-permissions-secondary"], [2, "margin-top", "16px"], [3, "HideToolbar"], [1, "config-save-text"], [1, "config-save-btn", 3, "click", "disabled"], [1, "config-reset-btn", 3, "click", "disabled"]], template: function KnowledgeConfigResourceComponent_Template(rf, ctx) { if (rf & 1) {
2403
2348
  i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 0)(2, "div", 1);
2404
2349
  i0.ɵɵconditionalCreate(3, KnowledgeConfigResourceComponent_Conditional_3_Template, 1, 0, "mj-stat-badge", 2);
2405
2350
  i0.ɵɵelementEnd();
@@ -2407,7 +2352,7 @@ let KnowledgeConfigResourceComponent = class KnowledgeConfigResourceComponent ex
2407
2352
  i0.ɵɵconditionalCreate(5, KnowledgeConfigResourceComponent_Conditional_5_Template, 6, 3);
2408
2353
  i0.ɵɵelementEnd()();
2409
2354
  i0.ɵɵelementStart(6, "mj-page-body", 4);
2410
- i0.ɵɵconditionalCreate(7, KnowledgeConfigResourceComponent_Conditional_7_Template, 2, 0, "div", 5)(8, KnowledgeConfigResourceComponent_Conditional_8_Template, 19, 10, "div", 6);
2355
+ i0.ɵɵconditionalCreate(7, KnowledgeConfigResourceComponent_Conditional_7_Template, 2, 0, "div", 5)(8, KnowledgeConfigResourceComponent_Conditional_8_Template, 15, 14, "div", 6);
2411
2356
  i0.ɵɵelementEnd()();
2412
2357
  } if (rf & 2) {
2413
2358
  i0.ɵɵadvance(3);
@@ -2415,10 +2360,10 @@ let KnowledgeConfigResourceComponent = class KnowledgeConfigResourceComponent ex
2415
2360
  i0.ɵɵadvance(2);
2416
2361
  i0.ɵɵconditional(ctx.HasUnsavedChanges ? 5 : -1);
2417
2362
  i0.ɵɵadvance();
2418
- i0.ɵɵproperty("Flex", true);
2363
+ i0.ɵɵproperty("Flex", true)("Padding", false);
2419
2364
  i0.ɵɵadvance();
2420
2365
  i0.ɵɵconditional(ctx.IsLoading ? 7 : 8);
2421
- } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.RangeValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.MaxValidator, i1.NgModel, i2.LoadingComponent, i3.SearchScopeChildGridComponent, i4.MJButtonDirective, i4.MJPageHeaderComponent, i4.MJPageLayoutComponent, i4.MJPageBodyComponent, i4.MJStatBadgeComponent, i5.SchedulingResourceComponent, i6.LowerCasePipe, i6.DecimalPipe], styles: ["\n\n\n\n.config-loading[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 400px;\n}\n\n.config-layout[_ngcontent-%COMP%] {\n display: flex;\n height: 100%;\n min-height: 500px;\n}\n\n\n\n.config-nav[_ngcontent-%COMP%] {\n width: 240px;\n border-right: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n padding: 0.5rem 0;\n}\n\n.config-nav-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n margin-bottom: 0.5rem;\n}\n\n.config-nav-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.6rem;\n padding: 0.55rem 1rem;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n cursor: pointer;\n text-align: left;\n transition: all 0.15s ease;\n width: 100%;\n}\n\n.config-nav-item[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.config-nav-item-active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n\n\n.config-content[_ngcontent-%COMP%] {\n flex: 1;\n padding: 1.5rem 2rem;\n overflow-y: auto;\n position: relative;\n}\n\n.config-section[_ngcontent-%COMP%] {\n max-width: 700px;\n}\n\n.config-section-title[_ngcontent-%COMP%] {\n font-size: 1.3rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 0.5rem;\n}\n\n.config-section-desc[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 0.9rem;\n margin-bottom: 1.5rem;\n line-height: 1.5;\n}\n\n\n\n.config-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.config-toggle-row[_ngcontent-%COMP%], \n.config-field-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n border-radius: 8px;\n transition: background 0.1s ease;\n gap: 1rem;\n}\n\n.config-toggle-row[_ngcontent-%COMP%]:hover, \n.config-field-row[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.config-toggle-info[_ngcontent-%COMP%], \n.config-field-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.15rem;\n flex: 1;\n}\n\n.config-label[_ngcontent-%COMP%] {\n font-weight: 500;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n}\n\n.config-hint[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.config-checkbox[_ngcontent-%COMP%] {\n width: 1.1rem;\n height: 1.1rem;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n}\n\n.config-input[_ngcontent-%COMP%] {\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n font-family: inherit;\n}\n\n.config-input-number[_ngcontent-%COMP%] {\n width: 80px;\n text-align: center;\n}\n\n.config-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.config-slider[_ngcontent-%COMP%] {\n width: 200px;\n accent-color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.config-value-display[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n padding: 0.3rem 0.6rem;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-family: monospace;\n}\n\n\n\n.config-placeholder[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 1.5rem;\n text-align: center;\n gap: 1rem;\n color: var(--mj-text-muted);\n}\n\n.config-placeholder-icon[_ngcontent-%COMP%] {\n font-size: 2.5rem;\n}\n\n\n\n\n.setup-progress[_ngcontent-%COMP%] {\n margin-bottom: 1.5rem;\n padding: 1rem 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n}\n\n.setup-progress-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.5rem;\n}\n\n.setup-progress-label[_ngcontent-%COMP%] {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.setup-progress-count[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.setup-progress-bar[_ngcontent-%COMP%] {\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.setup-progress-fill[_ngcontent-%COMP%] {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n transition: width 0.4s ease;\n}\n\n\n\n\n.setup-step[_ngcontent-%COMP%] {\n padding: 1rem 1.25rem;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n margin-bottom: 0.75rem;\n transition: border-color 0.2s;\n}\n\n.setup-step-complete[_ngcontent-%COMP%] {\n border-color: var(--mj-status-success-border);\n background: color-mix(in srgb, var(--mj-status-success) 3%, var(--mj-bg-surface));\n}\n\n.setup-step-pending[_ngcontent-%COMP%] {\n border-color: var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.setup-step-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 0.85rem;\n}\n\n.setup-step-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex-shrink: 0;\n margin-top: 1px;\n}\n\n.setup-step-complete[_ngcontent-%COMP%] .setup-step-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n color: var(--mj-status-success);\n}\n\n.setup-step-number[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n font-weight: 700;\n}\n\n.setup-step-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n flex: 1;\n}\n\n.setup-step-title[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.setup-step-status[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.setup-step-complete[_ngcontent-%COMP%] .setup-step-status[_ngcontent-%COMP%] {\n color: var(--mj-status-success-text);\n}\n\n\n\n\n.config-group-title[_ngcontent-%COMP%] {\n margin: 0 0 0.75rem 0;\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n\n\n\n.config-status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 0.75rem;\n font-weight: 600;\n}\n\n.config-status-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n\n\n\n.setup-step-detail[_ngcontent-%COMP%] {\n margin-top: 0.75rem;\n padding-left: 2.85rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.setup-step-action[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s;\n flex-shrink: 0;\n}\n\n.setup-step-action[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n\n\n\n.provider-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n}\n\n.provider-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.provider-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.provider-name[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.provider-class[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n font-family: monospace;\n}\n\n\n\n\n.provider-credential-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 1rem 0.75rem;\n margin-top: -0.25rem;\n}\n\n.provider-credential-label[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.provider-credential-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.provider-credential-picker[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex: 1;\n min-width: 0;\n}\n\n.provider-credential-select[_ngcontent-%COMP%] {\n flex: 1;\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.8rem;\n}\n\n.provider-credential-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.provider-credential-spinner[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n}\n\n\n\n\n.index-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n transition: border-color 0.15s;\n}\n\n.index-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-default);\n}\n\n.index-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.index-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.index-name[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.index-meta[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 3px;\n}\n\n.index-meta[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.65rem;\n}\n\n.index-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex-shrink: 0;\n}\n\n.index-delete-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.index-delete-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error);\n}\n\n\n\n\n.create-index-form[_ngcontent-%COMP%] {\n margin-top: 0.75rem;\n padding: 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 2px solid var(--mj-brand-primary);\n border-radius: 10px;\n margin-left: 2.85rem;\n}\n\n.create-index-title[_ngcontent-%COMP%] {\n margin: 0 0 1rem 0;\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.create-index-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.create-index-fields[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.85rem;\n}\n\n.create-index-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.create-index-label[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.config-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n}\n\n.config-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.create-index-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n margin-top: 1rem;\n}\n\n.create-index-submit[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 18px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s;\n}\n\n.create-index-submit[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.create-index-submit[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.create-index-cancel[_ngcontent-%COMP%] {\n padding: 8px 18px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.create-index-cancel[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n.config-empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 2rem;\n text-align: center;\n gap: 0.75rem;\n border: 2px dashed var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface-sunken);\n}\n\n.config-empty-icon[_ngcontent-%COMP%] {\n font-size: 2.5rem;\n color: var(--mj-text-disabled);\n}\n\n.config-empty-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.config-empty-text[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.85rem;\n color: var(--mj-text-muted);\n max-width: 480px;\n line-height: 1.5;\n}\n\n\n\n.config-tag-list[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.config-tag[_ngcontent-%COMP%] {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 500;\n}\n\n\n\n.config-section-note[_ngcontent-%COMP%] {\n margin-top: 1rem;\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.config-section-note[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-info);\n}\n\n\n\n.config-save-bar[_ngcontent-%COMP%] {\n position: sticky;\n bottom: 0;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n margin-top: 2rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n}\n\n.config-save-text[_ngcontent-%COMP%] {\n flex: 1;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n}\n\n.config-save-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.5rem 1rem;\n border-radius: 6px;\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.85rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.config-save-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.config-save-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.config-reset-btn[_ngcontent-%COMP%] {\n padding: 0.5rem 0.75rem;\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n cursor: pointer;\n}\n\n.config-reset-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n@media (max-width: 768px) {\n .config-layout[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .config-nav[_ngcontent-%COMP%] {\n width: 100%;\n flex-direction: row;\n overflow-x: auto;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 0;\n }\n\n .config-nav-header[_ngcontent-%COMP%] {\n display: none;\n }\n\n .config-nav-item[_ngcontent-%COMP%] {\n white-space: nowrap;\n padding: 0.6rem 1rem;\n }\n\n .config-nav-item-active[_ngcontent-%COMP%] {\n border-left: none;\n border-bottom: 3px solid var(--mj-brand-primary);\n }\n\n .config-content[_ngcontent-%COMP%] {\n padding: 1rem;\n }\n}\n\n\n\n.fts-entity-controls[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.fts-summary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n}\n\n.fts-summary-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.fts-filter-input[_ngcontent-%COMP%] {\n max-width: 240px;\n}\n\n.fts-entity-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.fts-entity-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: border-color 0.15s, background 0.15s;\n}\n\n.fts-entity-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.fts-entity-card.fts-entity-enabled[_ngcontent-%COMP%] {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-brand-primary) 3%, var(--mj-bg-surface));\n}\n\n.fts-entity-toggle[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.fts-entity-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.fts-entity-name[_ngcontent-%COMP%] {\n display: block;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.fts-entity-fields[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.fts-field-tag[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 1px 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n}\n\n.fts-entity-meta[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 2px;\n flex-shrink: 0;\n}\n\n.fts-entity-title-field[_ngcontent-%COMP%], \n.fts-entity-snippet-field[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.fts-entity-title-field[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.fts-entity-snippet-field[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 4px;\n font-size: 10px;\n}\n\n\n\n\n.scope-manager[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 260px 1fr;\n gap: 16px;\n min-height: 420px;\n}\n\n.scope-manager-list[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.scope-manager-list-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 4px 6px 8px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.scope-manager-new-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-link);\n padding: 3px 8px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.7rem;\n font-weight: 500;\n text-transform: none;\n letter-spacing: normal;\n}\n\n.scope-manager-new-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-brand-primary);\n}\n\n.scope-manager-loading[_ngcontent-%COMP%], \n.scope-manager-empty[_ngcontent-%COMP%], \n.scope-manager-empty-detail[_ngcontent-%COMP%] {\n padding: 16px;\n color: var(--mj-text-muted);\n text-align: center;\n font-size: 0.85rem;\n}\n\n.scope-manager-empty-detail[_ngcontent-%COMP%] {\n padding: 40px 24px;\n background: var(--mj-bg-surface-card);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n}\n\n.scope-manager-list-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 6px;\n text-align: left;\n transition: background 120ms ease;\n}\n\n.scope-manager-list-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.scope-manager-list-item.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n.scope-manager-list-name[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.scope-manager-badge[_ngcontent-%COMP%] {\n font-size: 0.625rem;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.scope-manager-detail[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-width: 0;\n}\n\n.scope-manager-tabs[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 8px;\n flex-wrap: wrap;\n}\n\n.scope-manager-tab[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 6px 12px;\n color: var(--mj-text-secondary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 4px;\n transition: background 120ms ease, color 120ms ease;\n}\n\n.scope-manager-tab[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.scope-manager-tab.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom: 2px solid var(--mj-brand-primary);\n border-radius: 0;\n font-weight: 500;\n}\n\n.scope-manager-tab-spacer[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.scope-manager-save-btn[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 6px 14px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-save-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.scope-manager-delete-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-status-error-text);\n padding: 6px 10px;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.scope-manager-delete-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error-border);\n}\n\n.scope-manager-open-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-primary);\n padding: 6px 12px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-open-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.scope-definition-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px 16px;\n}\n\n.scope-definition-grid[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n}\n\n.scope-definition-grid[_ngcontent-%COMP%] label[_ngcontent-%COMP%] > span[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.scope-definition-full[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.scope-definition-toggle[_ngcontent-%COMP%] {\n flex-direction: row;\n align-items: center;\n gap: 8px;\n}\n\n.scope-definition-toggle[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n accent-color: var(--mj-brand-primary);\n}\n\n.scope-code-block[_ngcontent-%COMP%] {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n padding: 8px;\n}\n\n\n\n\n\n.search-analytics-kpi-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 12px;\n margin: 16px 0;\n}\n\n.search-analytics-kpi[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 14px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n}\n\n.search-analytics-kpi-label[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.search-analytics-kpi-value[_ngcontent-%COMP%] {\n font-size: 1.6rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-kpi-hint[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.72rem;\n}\n\n.search-analytics-h3[_ngcontent-%COMP%] {\n margin: 22px 0 8px;\n font-size: 1rem;\n color: var(--mj-text-primary);\n}\n\n.search-analytics-empty[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.85rem;\n margin: 4px 0 14px;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.86rem;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 6px 10px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 6px 10px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.search-analytics-refresh[_ngcontent-%COMP%] {\n margin-top: 16px;\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.9rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.82rem;\n}\n\n.search-analytics-refresh[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n\n.search-permissions-loading[_ngcontent-%COMP%] {\n padding: 1.2rem;\n color: var(--mj-text-secondary);\n font-style: italic;\n}\n\n.search-permissions-filters[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr 180px 130px;\n gap: 0.5rem;\n margin-bottom: 0.8rem;\n}\n\n.search-permissions-filters[_ngcontent-%COMP%] .mj-input[_ngcontent-%COMP%] {\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n font-size: 0.85rem;\n}\n\n.search-permissions-summary[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n margin-bottom: 0.6rem;\n}\n\n.search-permissions-empty[_ngcontent-%COMP%] {\n padding: 1.2rem;\n color: var(--mj-text-muted);\n text-align: center;\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n}\n\n.search-permissions-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.85rem;\n}\n\n.search-permissions-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n.search-permissions-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 0.5rem 0.7rem;\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n}\n\n.search-permissions-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n}\n\n.search-permissions-secondary[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n}\n\n.search-permissions-tag[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 0.1rem 0.5rem;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border-radius: 3px;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.search-permissions-level[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 0.15rem 0.55rem;\n border-radius: 3px;\n font-size: 0.78rem;\n font-weight: 500;\n}\n\n.search-permissions-level-none[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n}\n\n.search-permissions-level-read[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 12%, var(--mj-bg-surface));\n color: var(--mj-status-info-text);\n}\n\n.search-permissions-level-search[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n.search-permissions-level-manage[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}"] });
2366
+ } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.RangeValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.MaxValidator, i1.NgModel, i2.LoadingComponent, i3.SearchScopeChildGridComponent, i4.MJButtonDirective, i4.MJPageHeaderComponent, i4.MJPageLayoutComponent, i4.MJPageBodyComponent, i4.MJPageHeaderInteriorComponent, i4.MJPageBodyInteriorComponent, i4.MJLeftNavComponent, i4.MJLeftNavContentComponent, i4.MJStatBadgeComponent, i5.SchedulingResourceComponent, i6.LowerCasePipe, i6.DecimalPipe], styles: ["\n\n\n\n.config-loading[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 400px;\n}\n\n\n\n\n\n\n\n.config-layout[_ngcontent-%COMP%] {\n display: flex;\n height: 100%;\n min-height: 500px;\n}\n\n\n\n\n\n\n\n.config-section[_ngcontent-%COMP%] {\n max-width: 700px;\n}\n\n\n\n.config-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.config-toggle-row[_ngcontent-%COMP%], \n.config-field-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n border-radius: 8px;\n transition: background 0.1s ease;\n gap: 1rem;\n}\n\n.config-toggle-row[_ngcontent-%COMP%]:hover, \n.config-field-row[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.config-toggle-info[_ngcontent-%COMP%], \n.config-field-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.15rem;\n flex: 1;\n}\n\n.config-label[_ngcontent-%COMP%] {\n font-weight: 500;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n}\n\n.config-hint[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.config-checkbox[_ngcontent-%COMP%] {\n width: 1.1rem;\n height: 1.1rem;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n}\n\n.config-input[_ngcontent-%COMP%] {\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n font-family: inherit;\n}\n\n.config-input-number[_ngcontent-%COMP%] {\n width: 80px;\n text-align: center;\n}\n\n.config-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.config-slider[_ngcontent-%COMP%] {\n width: 200px;\n accent-color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.config-value-display[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n padding: 0.3rem 0.6rem;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-family: monospace;\n}\n\n\n\n.config-placeholder[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 1.5rem;\n text-align: center;\n gap: 1rem;\n color: var(--mj-text-muted);\n}\n\n.config-placeholder-icon[_ngcontent-%COMP%] {\n font-size: 2.5rem;\n}\n\n\n\n\n.setup-progress[_ngcontent-%COMP%] {\n margin-bottom: 1.5rem;\n padding: 1rem 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n}\n\n.setup-progress-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.5rem;\n}\n\n.setup-progress-label[_ngcontent-%COMP%] {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.setup-progress-count[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.setup-progress-bar[_ngcontent-%COMP%] {\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.setup-progress-fill[_ngcontent-%COMP%] {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n transition: width 0.4s ease;\n}\n\n\n\n\n.setup-step[_ngcontent-%COMP%] {\n padding: 1rem 1.25rem;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n margin-bottom: 0.75rem;\n transition: border-color 0.2s;\n}\n\n.setup-step-complete[_ngcontent-%COMP%] {\n border-color: var(--mj-status-success-border);\n background: color-mix(in srgb, var(--mj-status-success) 3%, var(--mj-bg-surface));\n}\n\n.setup-step-pending[_ngcontent-%COMP%] {\n border-color: var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.setup-step-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 0.85rem;\n}\n\n.setup-step-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex-shrink: 0;\n margin-top: 1px;\n}\n\n.setup-step-complete[_ngcontent-%COMP%] .setup-step-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n color: var(--mj-status-success);\n}\n\n.setup-step-number[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n font-weight: 700;\n}\n\n.setup-step-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n flex: 1;\n}\n\n.setup-step-title[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.setup-step-status[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.setup-step-complete[_ngcontent-%COMP%] .setup-step-status[_ngcontent-%COMP%] {\n color: var(--mj-status-success-text);\n}\n\n\n\n\n.config-group-title[_ngcontent-%COMP%] {\n margin: 0 0 0.75rem 0;\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n\n\n\n.config-status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 0.75rem;\n font-weight: 600;\n}\n\n.config-status-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n\n\n\n.setup-step-detail[_ngcontent-%COMP%] {\n margin-top: 0.75rem;\n padding-left: 2.85rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.setup-step-action[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s;\n flex-shrink: 0;\n}\n\n.setup-step-action[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n\n\n\n.provider-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n}\n\n.provider-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.provider-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.provider-name[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.provider-class[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n font-family: monospace;\n}\n\n\n\n\n.provider-credential-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 1rem 0.75rem;\n margin-top: -0.25rem;\n}\n\n.provider-credential-label[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.provider-credential-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.provider-credential-picker[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex: 1;\n min-width: 0;\n}\n\n.provider-credential-select[_ngcontent-%COMP%] {\n flex: 1;\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.8rem;\n}\n\n.provider-credential-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.provider-credential-spinner[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n}\n\n\n\n\n.index-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n transition: border-color 0.15s;\n}\n\n.index-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-default);\n}\n\n.index-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.index-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.index-name[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.index-meta[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 3px;\n}\n\n.index-meta[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.65rem;\n}\n\n.index-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex-shrink: 0;\n}\n\n.index-delete-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.index-delete-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error);\n}\n\n\n\n\n.create-index-form[_ngcontent-%COMP%] {\n margin-top: 0.75rem;\n padding: 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 2px solid var(--mj-brand-primary);\n border-radius: 10px;\n margin-left: 2.85rem;\n}\n\n.create-index-title[_ngcontent-%COMP%] {\n margin: 0 0 1rem 0;\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.create-index-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.create-index-fields[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.85rem;\n}\n\n.create-index-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.create-index-label[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.config-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n}\n\n.config-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.create-index-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n margin-top: 1rem;\n}\n\n.create-index-submit[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 18px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s;\n}\n\n.create-index-submit[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.create-index-submit[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.create-index-cancel[_ngcontent-%COMP%] {\n padding: 8px 18px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.create-index-cancel[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n.config-empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 2rem;\n text-align: center;\n gap: 0.75rem;\n border: 2px dashed var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface-sunken);\n}\n\n.config-empty-icon[_ngcontent-%COMP%] {\n font-size: 2.5rem;\n color: var(--mj-text-disabled);\n}\n\n.config-empty-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.config-empty-text[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.85rem;\n color: var(--mj-text-muted);\n max-width: 480px;\n line-height: 1.5;\n}\n\n\n\n.config-tag-list[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.config-tag[_ngcontent-%COMP%] {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 500;\n}\n\n\n\n.config-section-note[_ngcontent-%COMP%] {\n margin-top: 1rem;\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.config-section-note[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-info);\n}\n\n\n\n.config-save-bar[_ngcontent-%COMP%] {\n position: sticky;\n bottom: 0;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n margin-top: 2rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n}\n\n.config-save-text[_ngcontent-%COMP%] {\n flex: 1;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n}\n\n.config-save-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.5rem 1rem;\n border-radius: 6px;\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.85rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.config-save-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.config-save-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.config-reset-btn[_ngcontent-%COMP%] {\n padding: 0.5rem 0.75rem;\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n cursor: pointer;\n}\n\n.config-reset-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n@media (max-width: 768px) {\n .config-layout[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .config-nav[_ngcontent-%COMP%] {\n width: 100%;\n flex-direction: row;\n overflow-x: auto;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 0;\n }\n\n .config-nav-header[_ngcontent-%COMP%] {\n display: none;\n }\n\n .config-nav-item[_ngcontent-%COMP%] {\n white-space: nowrap;\n padding: 0.6rem 1rem;\n }\n\n .config-nav-item-active[_ngcontent-%COMP%] {\n border-left: none;\n border-bottom: 3px solid var(--mj-brand-primary);\n }\n\n .config-content[_ngcontent-%COMP%] {\n padding: 1rem;\n }\n}\n\n\n\n.fts-entity-controls[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.fts-summary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n}\n\n.fts-summary-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.fts-filter-input[_ngcontent-%COMP%] {\n max-width: 240px;\n}\n\n.fts-entity-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.fts-entity-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: border-color 0.15s, background 0.15s;\n}\n\n.fts-entity-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.fts-entity-card.fts-entity-enabled[_ngcontent-%COMP%] {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-brand-primary) 3%, var(--mj-bg-surface));\n}\n\n.fts-entity-toggle[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.fts-entity-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.fts-entity-name[_ngcontent-%COMP%] {\n display: block;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.fts-entity-fields[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.fts-field-tag[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 1px 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n}\n\n.fts-entity-meta[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 2px;\n flex-shrink: 0;\n}\n\n.fts-entity-title-field[_ngcontent-%COMP%], \n.fts-entity-snippet-field[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.fts-entity-title-field[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.fts-entity-snippet-field[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 4px;\n font-size: 10px;\n}\n\n\n\n\n.scope-manager[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 260px 1fr;\n gap: 16px;\n min-height: 420px;\n}\n\n.scope-manager-list[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.scope-manager-list-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 4px 6px 8px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.scope-manager-new-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-link);\n padding: 3px 8px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.7rem;\n font-weight: 500;\n text-transform: none;\n letter-spacing: normal;\n}\n\n.scope-manager-new-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-brand-primary);\n}\n\n.scope-manager-loading[_ngcontent-%COMP%], \n.scope-manager-empty[_ngcontent-%COMP%], \n.scope-manager-empty-detail[_ngcontent-%COMP%] {\n padding: 16px;\n color: var(--mj-text-muted);\n text-align: center;\n font-size: 0.85rem;\n}\n\n.scope-manager-empty-detail[_ngcontent-%COMP%] {\n padding: 40px 24px;\n background: var(--mj-bg-surface-card);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n}\n\n.scope-manager-list-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 6px;\n text-align: left;\n transition: background 120ms ease;\n}\n\n.scope-manager-list-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.scope-manager-list-item.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n.scope-manager-list-name[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.scope-manager-badge[_ngcontent-%COMP%] {\n font-size: 0.625rem;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.scope-manager-detail[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-width: 0;\n}\n\n.scope-manager-tabs[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 8px;\n flex-wrap: wrap;\n}\n\n.scope-manager-tab[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 6px 12px;\n color: var(--mj-text-secondary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 4px;\n transition: background 120ms ease, color 120ms ease;\n}\n\n.scope-manager-tab[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.scope-manager-tab.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom: 2px solid var(--mj-brand-primary);\n border-radius: 0;\n font-weight: 500;\n}\n\n.scope-manager-tab-spacer[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.scope-manager-save-btn[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 6px 14px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-save-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.scope-manager-delete-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-status-error-text);\n padding: 6px 10px;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.scope-manager-delete-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error-border);\n}\n\n.scope-manager-open-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-primary);\n padding: 6px 12px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-open-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.scope-definition-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px 16px;\n}\n\n.scope-definition-grid[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n}\n\n.scope-definition-grid[_ngcontent-%COMP%] label[_ngcontent-%COMP%] > span[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.scope-definition-full[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.scope-definition-toggle[_ngcontent-%COMP%] {\n flex-direction: row;\n align-items: center;\n gap: 8px;\n}\n\n.scope-definition-toggle[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n accent-color: var(--mj-brand-primary);\n}\n\n.scope-code-block[_ngcontent-%COMP%] {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n padding: 8px;\n}\n\n\n\n\n\n.search-analytics-kpi-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 12px;\n margin: 16px 0;\n}\n\n.search-analytics-kpi[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 14px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n}\n\n.search-analytics-kpi-label[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.search-analytics-kpi-value[_ngcontent-%COMP%] {\n font-size: 1.6rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-kpi-hint[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.72rem;\n}\n\n.search-analytics-h3[_ngcontent-%COMP%] {\n margin: 22px 0 8px;\n font-size: 1rem;\n color: var(--mj-text-primary);\n}\n\n.search-analytics-empty[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.85rem;\n margin: 4px 0 14px;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.86rem;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 6px 10px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 6px 10px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.search-analytics-refresh[_ngcontent-%COMP%] {\n margin-top: 16px;\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.9rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.82rem;\n}\n\n.search-analytics-refresh[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n\n.search-permissions-loading[_ngcontent-%COMP%] {\n padding: 1.2rem;\n color: var(--mj-text-secondary);\n font-style: italic;\n}\n\n.search-permissions-filters[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr 180px 130px;\n gap: 0.5rem;\n margin-bottom: 0.8rem;\n}\n\n.search-permissions-filters[_ngcontent-%COMP%] .mj-input[_ngcontent-%COMP%] {\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n font-size: 0.85rem;\n}\n\n.search-permissions-summary[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n margin-bottom: 0.6rem;\n}\n\n.search-permissions-empty[_ngcontent-%COMP%] {\n padding: 1.2rem;\n color: var(--mj-text-muted);\n text-align: center;\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n}\n\n.search-permissions-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.85rem;\n}\n\n.search-permissions-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n.search-permissions-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 0.5rem 0.7rem;\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n}\n\n.search-permissions-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n}\n\n.search-permissions-secondary[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n}\n\n.search-permissions-tag[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 0.1rem 0.5rem;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border-radius: 3px;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.search-permissions-level[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 0.15rem 0.55rem;\n border-radius: 3px;\n font-size: 0.78rem;\n font-weight: 500;\n}\n\n.search-permissions-level-none[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n}\n\n.search-permissions-level-read[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 12%, var(--mj-bg-surface));\n color: var(--mj-status-info-text);\n}\n\n.search-permissions-level-search[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n.search-permissions-level-manage[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}"] });
2422
2367
  };
2423
2368
  KnowledgeConfigResourceComponent = __decorate([
2424
2369
  RegisterClass(BaseResourceComponent, 'KnowledgeConfigResource')
@@ -2426,9 +2371,9 @@ KnowledgeConfigResourceComponent = __decorate([
2426
2371
  export { KnowledgeConfigResourceComponent };
2427
2372
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(KnowledgeConfigResourceComponent, [{
2428
2373
  type: Component,
2429
- args: [{ standalone: false, selector: 'app-knowledge-config-resource', template: "<mj-page-layout>\n <mj-page-header\n Title=\"Knowledge Hub Configuration\"\n Icon=\"fa-solid fa-cogs\"\n Subtitle=\"Pipeline, vector store, search, and automation settings\">\n <div meta>\n @if (HasUnsavedChanges) {\n <mj-stat-badge\n Icon=\"fa-solid fa-circle-exclamation\"\n Label=\"Unsaved changes\"\n Variant=\"warning\">\n </mj-stat-badge>\n }\n </div>\n <div actions>\n @if (HasUnsavedChanges) {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"ResetConfiguration()\" [disabled]=\"IsSaving\" title=\"Discard unsaved changes\">\n <i class=\"fa-solid fa-arrow-rotate-left\"></i> Reset\n </button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"SaveConfiguration()\" [disabled]=\"IsSaving\" title=\"Save all settings\">\n <i class=\"fa-solid fa-floppy-disk\"></i> {{IsSaving ? 'Saving\u2026' : 'Save'}}\n </button>\n }\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\">\n@if (IsLoading) {\n <div class=\"config-loading\">\n <mj-loading text=\"Loading configuration...\" size=\"medium\"></mj-loading>\n </div>\n} @else {\n <div class=\"config-layout\">\n <!-- Left Navigation -->\n <nav class=\"config-nav\">\n <div class=\"config-nav-header\">\n <i class=\"fa-solid fa-cogs\"></i>\n <span>Configuration</span>\n </div>\n @for (section of Sections; track section.ID) {\n <button\n class=\"config-nav-item\"\n [class.config-nav-item-active]=\"ActiveSection === section.ID\"\n (click)=\"SelectSection(section.ID)\"\n >\n <i [class]=\"section.Icon\"></i>\n <span>{{ section.Label }}</span>\n </button>\n }\n </nav>\n\n <!-- Content Area -->\n <div class=\"config-content\">\n <!-- Pipeline Settings -->\n @if (ActiveSection === 'pipeline') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Pipeline Settings</h2>\n <p class=\"config-section-desc\">Configure how the Knowledge Pipeline processes incoming content.</p>\n\n <div class=\"config-group\">\n <label class=\"config-toggle-row\">\n <div class=\"config-toggle-info\">\n <span class=\"config-label\">Auto-tag on Ingest</span>\n <span class=\"config-hint\">Automatically run autotagging when new content is ingested</span>\n </div>\n <input type=\"checkbox\" [(ngModel)]=\"PipelineSettings.AutotagOnIngest\" (change)=\"OnSettingChanged()\" class=\"config-checkbox\" />\n </label>\n\n <label class=\"config-toggle-row\">\n <div class=\"config-toggle-info\">\n <span class=\"config-label\">Vectorize on Ingest</span>\n <span class=\"config-hint\">Automatically create embeddings for new content</span>\n </div>\n <input type=\"checkbox\" [(ngModel)]=\"PipelineSettings.VectorizeOnIngest\" (change)=\"OnSettingChanged()\" class=\"config-checkbox\" />\n </label>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Default Batch Size</span>\n <span class=\"config-hint\">Number of items processed per batch</span>\n </div>\n <input type=\"number\" [(ngModel)]=\"PipelineSettings.DefaultBatchSize\" (input)=\"OnSettingChanged()\" class=\"config-input config-input-number\" min=\"10\" max=\"1000\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Max Concurrent Jobs</span>\n <span class=\"config-hint\">Maximum number of pipeline jobs running at once</span>\n </div>\n <input type=\"number\" [(ngModel)]=\"PipelineSettings.MaxConcurrentJobs\" (input)=\"OnSettingChanged()\" class=\"config-input config-input-number\" min=\"1\" max=\"10\" />\n </div>\n </div>\n </div>\n }\n\n <!-- Vector Database Settings -->\n @if (ActiveSection === 'vectordb') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Vector Database</h2>\n <p class=\"config-section-desc\">Manage the shared vector index and database connection.</p>\n\n <!-- Setup Progress -->\n <div class=\"setup-progress\">\n <div class=\"setup-progress-header\">\n <span class=\"setup-progress-label\">Setup Progress</span>\n <span class=\"setup-progress-count\">{{ SetupStepsCompleted }} of 3 complete</span>\n </div>\n <div class=\"setup-progress-bar\">\n <div class=\"setup-progress-fill\" [style.width.%]=\"(SetupStepsCompleted / 3) * 100\"></div>\n </div>\n </div>\n\n <!-- Step 1: Providers -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasVectorDBProvider\" [class.setup-step-pending]=\"!HasVectorDBProvider\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasVectorDBProvider) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">1</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Vector Database Providers</span>\n @if (HasVectorDBProvider) {\n <span class=\"setup-step-status\">{{ VectorDBProviders.length }} provider(s) registered</span>\n } @else {\n <span class=\"setup-step-status\">No providers registered. Add a vector database provider (e.g., Pinecone, Weaviate) via the admin console.</span>\n }\n </div>\n </div>\n @if (HasVectorDBProvider) {\n <div class=\"setup-step-detail\">\n @for (provider of VectorDBProviders; track provider.ID) {\n <div class=\"provider-card\">\n <div class=\"provider-icon\">\n <i class=\"fa-solid fa-database\"></i>\n </div>\n <div class=\"provider-info\">\n <span class=\"provider-name\">{{ provider.Name }}</span>\n <span class=\"provider-class\">{{ provider.ClassKey }}</span>\n </div>\n <span class=\"config-status-badge config-status-active\">\n <i class=\"fa-solid fa-circle-check\"></i> Active\n </span>\n </div>\n <div class=\"provider-credential-row\">\n <label class=\"provider-credential-label\">\n <i class=\"fa-solid fa-key\"></i> API Credential\n </label>\n <div class=\"provider-credential-picker\">\n <select class=\"provider-credential-select\"\n [(ngModel)]=\"provider.CredentialID\"\n (change)=\"SaveProviderCredential(provider)\"\n [disabled]=\"IsSavingCredential\">\n <option [ngValue]=\"null\">None (use environment variable)</option>\n @for (cred of AvailableCredentials; track cred.ID) {\n <option [ngValue]=\"cred.ID\">{{ cred.Name }}</option>\n }\n </select>\n @if (IsSavingCredential) {\n <i class=\"fa-solid fa-spinner fa-spin provider-credential-spinner\"></i>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Step 2: Embedding Model -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasEmbeddingModel\" [class.setup-step-pending]=\"!HasEmbeddingModel\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasEmbeddingModel) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">2</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Embedding Models</span>\n @if (HasEmbeddingModel) {\n <span class=\"setup-step-status\">{{ EmbeddingModels.length }} model(s) available</span>\n } @else {\n <span class=\"setup-step-status\">No embedding models found. Configure at least one in the AI app > Models tab.</span>\n }\n </div>\n </div>\n @if (HasEmbeddingModel) {\n <div class=\"setup-step-detail\">\n <div class=\"config-tag-list\">\n @for (model of EmbeddingModels; track model.ID) {\n <span class=\"config-tag\">{{ model.Name }}</span>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Step 3: Vector Indexes -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasVectorIndex\" [class.setup-step-pending]=\"!HasVectorIndex\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasVectorIndex) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">3</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Vector Indexes</span>\n @if (HasVectorIndex) {\n <span class=\"setup-step-status\">{{ VectorIndexes.length }} index(es) configured</span>\n } @else if (HasVectorDBProvider && HasEmbeddingModel) {\n <span class=\"setup-step-status\">No indexes yet \u2014 create one below.</span>\n } @else {\n <span class=\"setup-step-status\">Complete steps 1 and 2 first.</span>\n }\n </div>\n @if (HasVectorDBProvider && HasEmbeddingModel && !ShowCreateIndexForm) {\n <button class=\"setup-step-action\" (click)=\"OpenCreateIndexForm()\">\n <i class=\"fa-solid fa-plus\"></i> Create Index\n </button>\n }\n </div>\n\n <!-- Existing Indexes -->\n @if (HasVectorIndex) {\n <div class=\"setup-step-detail\">\n @for (idx of VectorIndexes; track idx.ID) {\n <div class=\"index-card\">\n <div class=\"index-icon\">\n <i class=\"fa-solid fa-cubes\"></i>\n </div>\n <div class=\"index-info\">\n <span class=\"index-name\">{{ idx.Name }}</span>\n <span class=\"index-meta\">\n <i class=\"fa-solid fa-database\"></i> {{ idx.VectorDatabase }}\n &nbsp;\u00B7&nbsp;\n <i class=\"fa-solid fa-microchip\"></i> {{ idx.EmbeddingModel }}\n </span>\n </div>\n <div class=\"index-actions\">\n <span class=\"config-status-badge config-status-active\">\n <i class=\"fa-solid fa-circle-check\"></i> Active\n </span>\n <button class=\"index-delete-btn\" (click)=\"DeleteIndex(idx.ID)\" title=\"Delete index\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Create Index Form -->\n @if (ShowCreateIndexForm) {\n <div class=\"create-index-form\">\n <h4 class=\"create-index-title\">\n <i class=\"fa-solid fa-plus-circle\"></i> Create New Vector Index\n </h4>\n <div class=\"create-index-fields\">\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Index Name</label>\n <input type=\"text\"\n class=\"config-input\"\n [(ngModel)]=\"NewIndexName\"\n placeholder=\"e.g., mj-knowledge-index\" />\n </div>\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Vector Database</label>\n <select class=\"config-select\" [(ngModel)]=\"NewIndexVectorDBID\">\n @for (db of VectorDBProviders; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Embedding Model</label>\n <select class=\"config-select\" [(ngModel)]=\"NewIndexEmbeddingModelID\">\n @for (model of EmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"create-index-actions\">\n <button class=\"create-index-submit\" (click)=\"CreateIndex()\" [disabled]=\"IsCreatingIndex\">\n @if (IsCreatingIndex) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Creating...\n } @else {\n <i class=\"fa-solid fa-plus\"></i> Create Index\n }\n </button>\n <button class=\"create-index-cancel\" (click)=\"CancelCreateIndex()\" [disabled]=\"IsCreatingIndex\">\n Cancel\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Full-Text Indexes -->\n @if (ActiveSection === 'fulltext') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Full-Text Search Entities</h2>\n <p class=\"config-section-desc\">Configure which entities are included in full-text search. Entities with text fields (Name, Description, etc.) are automatically discovered.</p>\n\n @if (IsLoadingFTSEntities) {\n <mj-loading text=\"Discovering searchable entities...\" size=\"medium\"></mj-loading>\n } @else if (FTSEntities.length === 0) {\n <div class=\"config-empty-state\">\n <i class=\"fa-solid fa-text-width config-empty-icon\"></i>\n <h3 class=\"config-empty-title\">No Searchable Entities Found</h3>\n <p class=\"config-empty-text\">No entities with text fields were discovered. Ensure your database schema includes entities with varchar/nvarchar columns.</p>\n </div>\n } @else {\n <div class=\"fts-entity-controls\">\n <div class=\"fts-summary\">\n <span class=\"fts-summary-count\">{{ EnabledFTSCount }} of {{ FTSEntities.length }} entities enabled for search</span>\n <input type=\"text\" class=\"config-input fts-filter-input\" placeholder=\"Filter entities...\" [(ngModel)]=\"FTSFilterText\" />\n </div>\n </div>\n\n <div class=\"fts-entity-list\">\n @for (entity of FilteredFTSEntities; track entity.EntityName) {\n <div class=\"fts-entity-card\" [class.fts-entity-enabled]=\"entity.Enabled\">\n <div class=\"fts-entity-toggle\">\n <input type=\"checkbox\" [(ngModel)]=\"entity.Enabled\" (change)=\"OnFTSEntityToggled(entity)\" class=\"config-checkbox\" />\n </div>\n <div class=\"fts-entity-info\">\n <span class=\"fts-entity-name\">{{ entity.EntityName }}</span>\n <div class=\"fts-entity-fields\">\n @for (field of entity.IndexedFields; track field) {\n <span class=\"fts-field-tag\">{{ field }}</span>\n }\n </div>\n </div>\n <div class=\"fts-entity-meta\">\n <span class=\"fts-entity-title-field\" title=\"Title field\">\n <i class=\"fa-solid fa-heading\"></i> {{ entity.TitleField }}\n </span>\n @if (entity.SnippetField !== entity.TitleField) {\n <span class=\"fts-entity-snippet-field\" title=\"Snippet field\">\n <i class=\"fa-solid fa-align-left\"></i> {{ entity.SnippetField }}\n </span>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Embedding Models -->\n @if (ActiveSection === 'embedding') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Embedding Models</h2>\n <p class=\"config-section-desc\">AI models used for generating vector embeddings from text.</p>\n\n @if (HasEmbeddingModel) {\n <div class=\"config-group\">\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Active Model</span>\n <span class=\"config-hint\">Currently selected embedding model</span>\n </div>\n <span class=\"config-value-display\">{{ EmbeddingModelName }}</span>\n </div>\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Available Models</span>\n <span class=\"config-hint\">{{ EmbeddingModels.length }} embedding model(s) configured</span>\n </div>\n <div class=\"config-tag-list\">\n @for (model of EmbeddingModels; track model.ID) {\n <span class=\"config-tag\">{{ model.Name }}</span>\n }\n </div>\n </div>\n </div>\n <p class=\"config-section-note\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Manage embedding models in the AI Dashboard > Models tab.\n </p>\n } @else {\n <div class=\"config-empty-state\">\n <i class=\"fa-solid fa-microchip config-empty-icon\"></i>\n <h3 class=\"config-empty-title\">No Embedding Models Found</h3>\n <p class=\"config-empty-text\">\n Embedding models are required to convert text into vectors for semantic search and duplicate detection.\n Configure at least one embedding model (e.g., text-embedding-3-small) in the AI Dashboard > Models tab.\n </p>\n </div>\n }\n </div>\n }\n\n <!-- Thresholds -->\n @if (ActiveSection === 'thresholds') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Scoring Thresholds</h2>\n <p class=\"config-section-desc\">Set the scoring thresholds used by search, duplicate detection, and autotagging.</p>\n\n <div class=\"config-group\">\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Duplicate Absolute Match</span>\n <span class=\"config-hint\">Score above which duplicates are auto-confirmed ({{ FormatThreshold(ThresholdSettings.DuplicateAbsolute) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.DuplicateAbsolute\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.5\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Duplicate Potential Match</span>\n <span class=\"config-hint\">Score above which duplicates are flagged for review ({{ FormatThreshold(ThresholdSettings.DuplicatePotential) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.DuplicatePotential\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.3\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Search Relevance</span>\n <span class=\"config-hint\">Minimum score for search results ({{ FormatThreshold(ThresholdSettings.SearchRelevance) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.SearchRelevance\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Autotag Confidence</span>\n <span class=\"config-hint\">Minimum confidence for accepting auto-generated tags ({{ FormatThreshold(ThresholdSettings.AutotagConfidence) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.AutotagConfidence\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.3\" max=\"1\" step=\"0.01\" />\n </div>\n </div>\n </div>\n }\n\n <!-- Search Scopes Section -->\n @if (ActiveSection === 'search-scopes') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-compass-drafting\"></i> Search Scopes</h2>\n <p class=\"config-section-desc\">\n Define reusable search scopes that filter which providers, entities, external indexes, and storage accounts participate in a scoped search.\n Scopes can be assigned to AI agents for pre-execution RAG or agent-invoked search.\n </p>\n\n <div class=\"scope-manager\">\n <!-- Scope list -->\n <aside class=\"scope-manager-list\">\n <div class=\"scope-manager-list-header\">\n <span>Scopes ({{ SearchScopes.length }})</span>\n <button type=\"button\" class=\"scope-manager-new-btn\" (click)=\"CreateNewScope()\">\n <i class=\"fa-solid fa-plus\"></i> New\n </button>\n </div>\n @if (IsLoadingScopes) {\n <div class=\"scope-manager-loading\">Loading&hellip;</div>\n } @else if (SearchScopes.length === 0) {\n <div class=\"scope-manager-empty\">\n No scopes defined yet. Click <strong>New</strong> to create one.\n </div>\n } @else {\n @for (s of SearchScopes; track s.ID) {\n <button\n type=\"button\"\n class=\"scope-manager-list-item\"\n [class.active]=\"ActiveScopeID === s.ID\"\n (click)=\"SelectScope(s.ID)\">\n <i [class]=\"s.Icon || 'fa-solid fa-filter'\" aria-hidden=\"true\"></i>\n <span class=\"scope-manager-list-name\">{{ s.Name }}</span>\n @if (s.IsGlobal) {\n <span class=\"scope-manager-badge\">Global</span>\n } @else if (s.IsDefault) {\n <span class=\"scope-manager-badge\">Default</span>\n }\n </button>\n }\n }\n </aside>\n\n <!-- Scope detail -->\n <section class=\"scope-manager-detail\">\n @if (ActiveScope) {\n <!-- Tab strip -->\n <div class=\"scope-manager-tabs\">\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'definition'\" (click)=\"SelectScopeTab('definition')\">Definition</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'providers'\" (click)=\"SelectScopeTab('providers')\">Providers</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'indexes'\" (click)=\"SelectScopeTab('indexes')\">External Indexes</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'entities'\" (click)=\"SelectScopeTab('entities')\">Entities</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'storage'\" (click)=\"SelectScopeTab('storage')\">Storage</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'permissions'\" (click)=\"SelectScopeTab('permissions')\">Permissions</button>\n <div class=\"scope-manager-tab-spacer\"></div>\n @if (ActiveScope.ID) {\n <button type=\"button\" class=\"scope-manager-open-btn\"\n (click)=\"OpenActiveScopeFullForm()\"\n title=\"Open the full custom form for this scope (Live Preview, Fusion Weights, Reranker, Test Queries, Execution Logs)\">\n <i class=\"fa-solid fa-up-right-from-square\"></i> Open Full Form\n </button>\n }\n <button type=\"button\" class=\"scope-manager-save-btn\" (click)=\"SaveActiveScope()\">\n <i class=\"fa-solid fa-save\"></i> Save\n </button>\n @if (!ActiveScope.IsGlobal) {\n <button type=\"button\" class=\"scope-manager-delete-btn\" (click)=\"DeleteActiveScope()\" title=\"Delete scope\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n\n <!-- Definition tab -->\n @if (ActiveScopeTab === 'definition') {\n <div class=\"scope-definition-grid\">\n <label>\n <span>Name</span>\n <input type=\"text\" class=\"mj-input\" [value]=\"ActiveScope.Name\" (change)=\"ActiveScope.Name = $any($event.target).value\">\n </label>\n <label>\n <span>Icon (Font Awesome class)</span>\n <input type=\"text\" class=\"mj-input\" [value]=\"ActiveScope.Icon || ''\" (change)=\"ActiveScope.Icon = $any($event.target).value\">\n </label>\n <label class=\"scope-definition-full\">\n <span>Description</span>\n <textarea rows=\"2\" class=\"mj-textarea\" [value]=\"ActiveScope.Description || ''\" (change)=\"ActiveScope.Description = $any($event.target).value\"></textarea>\n </label>\n <label>\n <span>Status</span>\n <select class=\"mj-input\" [value]=\"ActiveScope.Status\" (change)=\"ActiveScope.Status = $any($event.target).value\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </label>\n <label>\n <span>Start at</span>\n <input type=\"datetime-local\" class=\"mj-input\" [value]=\"FormatScopeDate(ActiveScope.StartAt)\" (change)=\"SetScopeDate(ActiveScope, 'StartAt', $any($event.target).value)\">\n </label>\n <label>\n <span>End at</span>\n <input type=\"datetime-local\" class=\"mj-input\" [value]=\"FormatScopeDate(ActiveScope.EndAt)\" (change)=\"SetScopeDate(ActiveScope, 'EndAt', $any($event.target).value)\">\n </label>\n <label class=\"scope-definition-toggle\">\n <input type=\"checkbox\" [checked]=\"ActiveScope.IsDefault\" (change)=\"ActiveScope.IsDefault = $any($event.target).checked\" [disabled]=\"ActiveScope.IsGlobal\">\n <span>Default scope \u2014 picked when users/agents don't specify one</span>\n </label>\n <label class=\"scope-definition-toggle\">\n <input type=\"checkbox\" [checked]=\"ActiveScope.IsGlobal\" disabled>\n <span>Global \u2014 reserved for the built-in Global scope (read-only)</span>\n </label>\n <label class=\"scope-definition-full\">\n <span>Scope Config (JSON)</span>\n <textarea rows=\"4\" class=\"mj-textarea scope-code-block\" spellcheck=\"false\" [value]=\"ActiveScope.ScopeConfig || ''\" (change)=\"ActiveScope.ScopeConfig = $any($event.target).value\"></textarea>\n </label>\n <label class=\"scope-definition-full\">\n <span>Search Context Config (JSON)</span>\n <textarea rows=\"4\" class=\"mj-textarea scope-code-block\" spellcheck=\"false\" [value]=\"ActiveScope.SearchContextConfig || ''\" (change)=\"ActiveScope.SearchContextConfig = $any($event.target).value\"></textarea>\n </label>\n </div>\n }\n\n @if (ActiveScopeTab === 'providers') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Providers\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeProviderColumns\"\n AddButtonLabel=\"+ Add provider\"\n EmptyMessage=\"No providers assigned. Without any providers, this scope searches nothing.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'indexes') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope External Indexes\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeExternalIndexColumns\"\n AddButtonLabel=\"+ Add external index\"\n EmptyMessage=\"No external indexes configured for this scope.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'entities') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Entities\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeEntityColumns\"\n AddButtonLabel=\"+ Add entity\"\n EmptyMessage=\"No entities configured. Scoped entity search will return no rows.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'storage') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Storage Accounts\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeStorageColumns\"\n AddButtonLabel=\"+ Add storage folder\"\n EmptyMessage=\"No storage accounts linked to this scope.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'permissions') {\n <div class=\"scope-permissions-help\" style=\"margin-bottom: 12px; padding: 8px 12px; background: var(--mj-bg-surface-card); border-left: 3px solid var(--mj-brand-primary); border-radius: 4px;\">\n <p style=\"margin: 0; font-size: 0.95em;\">\n <i class=\"fa-solid fa-shield-halved\" style=\"color: var(--mj-brand-primary);\"></i>\n <strong>Per-user / per-role grants on this scope.</strong>\n Each row binds <em>either</em> a User <em>or</em> a Role (not both). Levels:\n <code>None</code> = explicit deny that overrides role grants,\n <code>Read</code> = view scope metadata,\n <code>Search</code> = invoke ScopedSearchAction,\n <code>Manage</code> = full edit including authoring permissions.\n Combined with <code>AIAgent.SearchScopeAccess</code> via the resolver \u2014 see the spec for the full resolution order.\n </p>\n </div>\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Permissions\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopePermissionColumns\"\n AddButtonLabel=\"+ Grant access\"\n EmptyMessage=\"No explicit grants. Access falls back to agent SearchScopeAccess only.\">\n </mj-search-scope-child-grid>\n }\n } @else {\n <div class=\"scope-manager-empty-detail\">\n Select a scope on the left, or click <strong>New</strong> to create one.\n </div>\n }\n </section>\n </div>\n </div>\n }\n\n <!-- Search Analytics Section (P3.3) \u2014 driven by SearchExecutionLog -->\n @if (ActiveSection === 'search-analytics') {\n <div class=\"config-section-content\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-chart-line\"></i> Search Analytics</h2>\n <p class=\"config-section-desc\">Aggregated metrics over the last 5,000 search invocations from <code>MJ: Search Execution Logs</code>. Use this to spot slow scopes, high-failure queries, or runaway reranker spend.</p>\n\n @if (AnalyticsLoading) {\n <mj-loading text=\"Loading analytics\u2026\" size=\"medium\"></mj-loading>\n } @else if (!AnalyticsLoaded) {\n <button class=\"mj-input\" type=\"button\" (click)=\"LoadSearchAnalytics()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Load analytics\n </button>\n } @else {\n <div class=\"search-analytics-kpi-grid\">\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Total runs</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsTotalRuns | number }}</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Success rate</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsSuccessRate }}%</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Hit rate</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsHitRate }}%</span>\n <span class=\"search-analytics-kpi-hint\">% of successful runs that returned \u22651 result</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Avg latency</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsAvgLatencyMs }}ms</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">P95 latency</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsP95LatencyMs }}ms</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Reranker spend</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsTotalRerankerCostCents | number:'1.0-2' }}\u00A2</span>\n </div>\n </div>\n\n <h3 class=\"search-analytics-h3\">Top scopes by volume</h3>\n @if (AnalyticsTopScopes.length === 0) {\n <p class=\"search-analytics-empty\">No runs in the window.</p>\n } @else {\n <table class=\"search-analytics-table\">\n <thead>\n <tr><th>Scope</th><th>Runs</th><th>Avg latency</th></tr>\n </thead>\n <tbody>\n @for (s of AnalyticsTopScopes; track s.ScopeID) {\n <tr>\n <td>{{ s.Name }}</td>\n <td>{{ s.Count | number }}</td>\n <td>{{ s.AvgLatencyMs }}ms</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <h3 class=\"search-analytics-h3\">Reranker spend by driver</h3>\n @if (AnalyticsRerankerSpend.length === 0) {\n <p class=\"search-analytics-empty\">No rerank invocations in the window.</p>\n } @else {\n <table class=\"search-analytics-table\">\n <thead>\n <tr><th>Reranker</th><th>Calls</th><th>Total cents</th></tr>\n </thead>\n <tbody>\n @for (r of AnalyticsRerankerSpend; track r.Reranker) {\n <tr>\n <td>{{ r.Reranker }}</td>\n <td>{{ r.Count | number }}</td>\n <td>{{ r.TotalCents | number:'1.0-2' }}\u00A2</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <h3 class=\"search-analytics-h3\">Top failure reasons</h3>\n @if (AnalyticsTopFailures.length === 0) {\n <p class=\"search-analytics-empty\">No failures in the window.</p>\n } @else {\n <table class=\"search-analytics-table\">\n <thead>\n <tr><th>Reason</th><th>Count</th></tr>\n </thead>\n <tbody>\n @for (f of AnalyticsTopFailures; track f.Reason) {\n <tr>\n <td>{{ f.Reason }}</td>\n <td>{{ f.Count | number }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <button class=\"mj-input search-analytics-refresh\" type=\"button\" (click)=\"LoadSearchAnalytics()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n }\n </div>\n }\n\n <!-- Permissions Audit Section (P2A.7) -->\n @if (ActiveSection === 'search-permissions') {\n <div class=\"config-section-content\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-shield-halved\"></i> Permissions</h2>\n <p class=\"config-section-desc\">\n Cross-scope view of every <code>SearchScopePermission</code> row. Filter by scope, by user/role, or by permission level to answer \"who has access to what\". Read-only \u2014 to add or edit a grant, open the SearchScope's full form and use its Permissions panel.\n </p>\n\n @if (PermissionsLoading) {\n <div class=\"search-permissions-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading permission rows...\n </div>\n }\n\n @if (PermissionsLoaded && !PermissionsLoading) {\n <div class=\"search-permissions-filters\">\n <input class=\"mj-input\" type=\"text\" placeholder=\"Filter by scope name...\" [(ngModel)]=\"PermissionsFilterScope\" />\n <input class=\"mj-input\" type=\"text\" placeholder=\"Filter by user/role (name or email)...\" [(ngModel)]=\"PermissionsFilterPrincipal\" />\n <select class=\"mj-input\" [(ngModel)]=\"PermissionsFilterLevel\">\n <option value=\"\">All levels</option>\n <option value=\"None\">None</option>\n <option value=\"Read\">Read</option>\n <option value=\"Search\">Search</option>\n <option value=\"Manage\">Manage</option>\n </select>\n <button class=\"mj-input\" type=\"button\" (click)=\"RefreshPermissionsAudit()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n </div>\n\n <div class=\"search-permissions-summary\">\n Showing {{ FilteredPermissionsRows.length }} of {{ PermissionsRows.length }} rows\n </div>\n\n @if (FilteredPermissionsRows.length === 0) {\n <div class=\"search-permissions-empty\">\n No permission rows match your filters.\n </div>\n } @else {\n <table class=\"search-permissions-table\">\n <thead>\n <tr>\n <th>Scope</th>\n <th>Principal</th>\n <th>Type</th>\n <th>Permission Level</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredPermissionsRows; track row.ID) {\n <tr>\n <td>{{ row.SearchScopeName }}</td>\n <td>\n @if (row.UserID) {\n {{ row.UserName }} <span class=\"search-permissions-secondary\">({{ row.UserEmail }})</span>\n } @else {\n {{ row.RoleName }}\n }\n </td>\n <td>\n @if (row.UserID) { <span class=\"search-permissions-tag\">User</span> }\n @if (row.RoleID) { <span class=\"search-permissions-tag\">Role</span> }\n </td>\n <td>\n <span class=\"search-permissions-level search-permissions-level-{{ row.PermissionLevel | lowercase }}\">{{ row.PermissionLevel }}</span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n }\n </div>\n }\n\n <!-- Scheduling Section -->\n @if (ActiveSection === 'scheduling') {\n <div class=\"config-section-content\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-clock\"></i> Scheduling</h2>\n <p class=\"config-section-desc\">Manage automated pipeline schedules for content classification and vector sync. Create schedules here or manage all schedules in the dedicated Scheduling app.</p>\n <div style=\"margin-top: 16px;\">\n <app-scheduling-resource [HideToolbar]=\"true\"></app-scheduling-resource>\n </div>\n </div>\n }\n\n <!-- Save Bar -->\n @if (HasUnsavedChanges) {\n <div class=\"config-save-bar\">\n <span class=\"config-save-text\">You have unsaved changes</span>\n <button class=\"config-save-btn\" (click)=\"SaveConfiguration()\" [disabled]=\"IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-save\"></i> Save Changes\n }\n </button>\n <button class=\"config-reset-btn\" (click)=\"ResetConfiguration()\" [disabled]=\"IsSaving\">\n Reset\n </button>\n </div>\n }\n </div>\n </div>\n}\n </mj-page-body>\n</mj-page-layout>\n", styles: ["/* Knowledge Configuration - Settings Page with Left Nav */\n\n\n.config-loading {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 400px;\n}\n\n.config-layout {\n display: flex;\n height: 100%;\n min-height: 500px;\n}\n\n/* Left Navigation */\n.config-nav {\n width: 240px;\n border-right: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n padding: 0.5rem 0;\n}\n\n.config-nav-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n margin-bottom: 0.5rem;\n}\n\n.config-nav-item {\n display: flex;\n align-items: center;\n gap: 0.6rem;\n padding: 0.55rem 1rem;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n cursor: pointer;\n text-align: left;\n transition: all 0.15s ease;\n width: 100%;\n}\n\n.config-nav-item:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.config-nav-item-active {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n/* Content Area */\n.config-content {\n flex: 1;\n padding: 1.5rem 2rem;\n overflow-y: auto;\n position: relative;\n}\n\n.config-section {\n max-width: 700px;\n}\n\n.config-section-title {\n font-size: 1.3rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 0.5rem;\n}\n\n.config-section-desc {\n color: var(--mj-text-secondary);\n font-size: 0.9rem;\n margin-bottom: 1.5rem;\n line-height: 1.5;\n}\n\n/* Config Groups */\n.config-group {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.config-toggle-row,\n.config-field-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n border-radius: 8px;\n transition: background 0.1s ease;\n gap: 1rem;\n}\n\n.config-toggle-row:hover,\n.config-field-row:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.config-toggle-info,\n.config-field-info {\n display: flex;\n flex-direction: column;\n gap: 0.15rem;\n flex: 1;\n}\n\n.config-label {\n font-weight: 500;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n}\n\n.config-hint {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.config-checkbox {\n width: 1.1rem;\n height: 1.1rem;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n}\n\n.config-input {\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n font-family: inherit;\n}\n\n.config-input-number {\n width: 80px;\n text-align: center;\n}\n\n.config-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.config-slider {\n width: 200px;\n accent-color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.config-value-display {\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n padding: 0.3rem 0.6rem;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-family: monospace;\n}\n\n/* Placeholder */\n.config-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 1.5rem;\n text-align: center;\n gap: 1rem;\n color: var(--mj-text-muted);\n}\n\n.config-placeholder-icon {\n font-size: 2.5rem;\n}\n\n/* ---- Setup Progress Bar ---- */\n\n.setup-progress {\n margin-bottom: 1.5rem;\n padding: 1rem 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n}\n\n.setup-progress-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.5rem;\n}\n\n.setup-progress-label {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.setup-progress-count {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.setup-progress-bar {\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.setup-progress-fill {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n transition: width 0.4s ease;\n}\n\n/* ---- Setup Steps ---- */\n\n.setup-step {\n padding: 1rem 1.25rem;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n margin-bottom: 0.75rem;\n transition: border-color 0.2s;\n}\n\n.setup-step-complete {\n border-color: var(--mj-status-success-border);\n background: color-mix(in srgb, var(--mj-status-success) 3%, var(--mj-bg-surface));\n}\n\n.setup-step-pending {\n border-color: var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.setup-step-header {\n display: flex;\n align-items: flex-start;\n gap: 0.85rem;\n}\n\n.setup-step-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex-shrink: 0;\n margin-top: 1px;\n}\n\n.setup-step-complete .setup-step-indicator i {\n font-size: 1.25rem;\n color: var(--mj-status-success);\n}\n\n.setup-step-number {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n font-weight: 700;\n}\n\n.setup-step-info {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n flex: 1;\n}\n\n.setup-step-title {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.setup-step-status {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.setup-step-complete .setup-step-status {\n color: var(--mj-status-success-text);\n}\n\n/* ---- Config Group Title ---- */\n\n.config-group-title {\n margin: 0 0 0.75rem 0;\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n/* ---- Status Badge ---- */\n\n.config-status-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 0.75rem;\n font-weight: 600;\n}\n\n.config-status-active {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n/* ---- Step Detail Area ---- */\n\n.setup-step-detail {\n margin-top: 0.75rem;\n padding-left: 2.85rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.setup-step-action {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s;\n flex-shrink: 0;\n}\n\n.setup-step-action:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n/* ---- Provider Cards ---- */\n\n.provider-card {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n}\n\n.provider-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.provider-info {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.provider-name {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.provider-class {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n font-family: monospace;\n}\n\n/* ---- Provider Credential Row ---- */\n\n.provider-credential-row {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 1rem 0.75rem;\n margin-top: -0.25rem;\n}\n\n.provider-credential-label {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.provider-credential-label i {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.provider-credential-picker {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex: 1;\n min-width: 0;\n}\n\n.provider-credential-select {\n flex: 1;\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.8rem;\n}\n\n.provider-credential-select:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.provider-credential-spinner {\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n}\n\n/* ---- Index Cards ---- */\n\n.index-card {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n transition: border-color 0.15s;\n}\n\n.index-card:hover {\n border-color: var(--mj-border-default);\n}\n\n.index-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.index-info {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.index-name {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.index-meta {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 3px;\n}\n\n.index-meta i {\n font-size: 0.65rem;\n}\n\n.index-actions {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex-shrink: 0;\n}\n\n.index-delete-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.index-delete-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error);\n}\n\n/* ---- Create Index Form ---- */\n\n.create-index-form {\n margin-top: 0.75rem;\n padding: 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 2px solid var(--mj-brand-primary);\n border-radius: 10px;\n margin-left: 2.85rem;\n}\n\n.create-index-title {\n margin: 0 0 1rem 0;\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.create-index-title i {\n color: var(--mj-brand-primary);\n}\n\n.create-index-fields {\n display: flex;\n flex-direction: column;\n gap: 0.85rem;\n}\n\n.create-index-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.create-index-label {\n font-size: 0.78rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.config-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n}\n\n.config-select:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.create-index-actions {\n display: flex;\n gap: 8px;\n margin-top: 1rem;\n}\n\n.create-index-submit {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 18px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s;\n}\n\n.create-index-submit:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.create-index-submit:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.create-index-cancel {\n padding: 8px 18px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.create-index-cancel:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* Empty State for unconfigured sections */\n.config-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 2rem;\n text-align: center;\n gap: 0.75rem;\n border: 2px dashed var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface-sunken);\n}\n\n.config-empty-icon {\n font-size: 2.5rem;\n color: var(--mj-text-disabled);\n}\n\n.config-empty-title {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.config-empty-text {\n margin: 0;\n font-size: 0.85rem;\n color: var(--mj-text-muted);\n max-width: 480px;\n line-height: 1.5;\n}\n\n/* Tag list for showing multiple models */\n.config-tag-list {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.config-tag {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 500;\n}\n\n/* Section note */\n.config-section-note {\n margin-top: 1rem;\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.config-section-note i {\n color: var(--mj-status-info);\n}\n\n/* Save Bar */\n.config-save-bar {\n position: sticky;\n bottom: 0;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n margin-top: 2rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n}\n\n.config-save-text {\n flex: 1;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n}\n\n.config-save-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.5rem 1rem;\n border-radius: 6px;\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.85rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.config-save-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.config-save-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.config-reset-btn {\n padding: 0.5rem 0.75rem;\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n cursor: pointer;\n}\n\n.config-reset-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n}\n\n/* Mobile responsive */\n@media (max-width: 768px) {\n .config-layout {\n flex-direction: column;\n }\n\n .config-nav {\n width: 100%;\n flex-direction: row;\n overflow-x: auto;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 0;\n }\n\n .config-nav-header {\n display: none;\n }\n\n .config-nav-item {\n white-space: nowrap;\n padding: 0.6rem 1rem;\n }\n\n .config-nav-item-active {\n border-left: none;\n border-bottom: 3px solid var(--mj-brand-primary);\n }\n\n .config-content {\n padding: 1rem;\n }\n}\n\n/* Full-Text Search Entity Management */\n.fts-entity-controls {\n margin-bottom: 16px;\n}\n\n.fts-summary {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n}\n\n.fts-summary-count {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.fts-filter-input {\n max-width: 240px;\n}\n\n.fts-entity-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.fts-entity-card {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: border-color 0.15s, background 0.15s;\n}\n\n.fts-entity-card:hover {\n border-color: var(--mj-border-strong);\n}\n\n.fts-entity-card.fts-entity-enabled {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-brand-primary) 3%, var(--mj-bg-surface));\n}\n\n.fts-entity-toggle {\n flex-shrink: 0;\n}\n\n.fts-entity-info {\n flex: 1;\n min-width: 0;\n}\n\n.fts-entity-name {\n display: block;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.fts-entity-fields {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.fts-field-tag {\n display: inline-block;\n padding: 1px 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n}\n\n.fts-entity-meta {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 2px;\n flex-shrink: 0;\n}\n\n.fts-entity-title-field,\n.fts-entity-snippet-field {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.fts-entity-title-field i,\n.fts-entity-snippet-field i {\n margin-right: 4px;\n font-size: 10px;\n}\n\n/* ===== Search Scopes Manager ===== */\n\n.scope-manager {\n display: grid;\n grid-template-columns: 260px 1fr;\n gap: 16px;\n min-height: 420px;\n}\n\n.scope-manager-list {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.scope-manager-list-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 4px 6px 8px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.scope-manager-new-btn {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-link);\n padding: 3px 8px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.7rem;\n font-weight: 500;\n text-transform: none;\n letter-spacing: normal;\n}\n\n.scope-manager-new-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-brand-primary);\n}\n\n.scope-manager-loading,\n.scope-manager-empty,\n.scope-manager-empty-detail {\n padding: 16px;\n color: var(--mj-text-muted);\n text-align: center;\n font-size: 0.85rem;\n}\n\n.scope-manager-empty-detail {\n padding: 40px 24px;\n background: var(--mj-bg-surface-card);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n}\n\n.scope-manager-list-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 6px;\n text-align: left;\n transition: background 120ms ease;\n}\n\n.scope-manager-list-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.scope-manager-list-item.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n.scope-manager-list-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.scope-manager-badge {\n font-size: 0.625rem;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.scope-manager-detail {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-width: 0;\n}\n\n.scope-manager-tabs {\n display: flex;\n align-items: center;\n gap: 4px;\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 8px;\n flex-wrap: wrap;\n}\n\n.scope-manager-tab {\n background: transparent;\n border: none;\n padding: 6px 12px;\n color: var(--mj-text-secondary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 4px;\n transition: background 120ms ease, color 120ms ease;\n}\n\n.scope-manager-tab:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.scope-manager-tab.active {\n color: var(--mj-brand-primary);\n border-bottom: 2px solid var(--mj-brand-primary);\n border-radius: 0;\n font-weight: 500;\n}\n\n.scope-manager-tab-spacer {\n flex: 1;\n}\n\n.scope-manager-save-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 6px 14px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-save-btn:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.scope-manager-delete-btn {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-status-error-text);\n padding: 6px 10px;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.scope-manager-delete-btn:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error-border);\n}\n\n.scope-manager-open-btn {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-primary);\n padding: 6px 12px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-open-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.scope-definition-grid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px 16px;\n}\n\n.scope-definition-grid label {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n}\n\n.scope-definition-grid label > span {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.scope-definition-full {\n grid-column: 1 / -1;\n}\n\n.scope-definition-toggle {\n flex-direction: row;\n align-items: center;\n gap: 8px;\n}\n\n.scope-definition-toggle input[type=\"checkbox\"] {\n accent-color: var(--mj-brand-primary);\n}\n\n.scope-code-block {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n padding: 8px;\n}\n\n/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n Search Analytics section (P3.3)\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.search-analytics-kpi-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 12px;\n margin: 16px 0;\n}\n\n.search-analytics-kpi {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 14px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n}\n\n.search-analytics-kpi-label {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.search-analytics-kpi-value {\n font-size: 1.6rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-kpi-hint {\n color: var(--mj-text-muted);\n font-size: 0.72rem;\n}\n\n.search-analytics-h3 {\n margin: 22px 0 8px;\n font-size: 1rem;\n color: var(--mj-text-primary);\n}\n\n.search-analytics-empty {\n color: var(--mj-text-muted);\n font-size: 0.85rem;\n margin: 4px 0 14px;\n}\n\n.search-analytics-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.86rem;\n}\n\n.search-analytics-table thead th {\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 6px 10px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n.search-analytics-table tbody td {\n padding: 6px 10px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.search-analytics-refresh {\n margin-top: 16px;\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.9rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.82rem;\n}\n\n.search-analytics-refresh:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* \u2500\u2500\u2500 Permissions Audit (P2A.7) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.search-permissions-loading {\n padding: 1.2rem;\n color: var(--mj-text-secondary);\n font-style: italic;\n}\n\n.search-permissions-filters {\n display: grid;\n grid-template-columns: 1fr 1fr 180px 130px;\n gap: 0.5rem;\n margin-bottom: 0.8rem;\n}\n\n.search-permissions-filters .mj-input {\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n font-size: 0.85rem;\n}\n\n.search-permissions-summary {\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n margin-bottom: 0.6rem;\n}\n\n.search-permissions-empty {\n padding: 1.2rem;\n color: var(--mj-text-muted);\n text-align: center;\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n}\n\n.search-permissions-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.85rem;\n}\n\n.search-permissions-table th,\n.search-permissions-table td {\n padding: 0.5rem 0.7rem;\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n}\n\n.search-permissions-table th {\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n}\n\n.search-permissions-secondary {\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n}\n\n.search-permissions-tag {\n display: inline-block;\n padding: 0.1rem 0.5rem;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border-radius: 3px;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.search-permissions-level {\n display: inline-block;\n padding: 0.15rem 0.55rem;\n border-radius: 3px;\n font-size: 0.78rem;\n font-weight: 500;\n}\n\n.search-permissions-level-none {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n}\n\n.search-permissions-level-read {\n background: color-mix(in srgb, var(--mj-status-info) 12%, var(--mj-bg-surface));\n color: var(--mj-status-info-text);\n}\n\n.search-permissions-level-search {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n.search-permissions-level-manage {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n"] }]
2374
+ args: [{ standalone: false, selector: 'app-knowledge-config-resource', template: "<mj-page-layout>\n <mj-page-header\n Title=\"Knowledge Hub Configuration\"\n Icon=\"fa-solid fa-cogs\"\n Subtitle=\"Pipeline, vector store, search, and automation settings\">\n <div meta>\n @if (HasUnsavedChanges) {\n <mj-stat-badge\n Icon=\"fa-solid fa-circle-exclamation\"\n Label=\"Unsaved changes\"\n Variant=\"warning\">\n </mj-stat-badge>\n }\n </div>\n <div actions>\n @if (HasUnsavedChanges) {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"ResetConfiguration()\" [disabled]=\"IsSaving\" title=\"Discard unsaved changes\">\n <i class=\"fa-solid fa-arrow-rotate-left\"></i> Reset\n </button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"SaveConfiguration()\" [disabled]=\"IsSaving\" title=\"Save all settings\">\n <i class=\"fa-solid fa-floppy-disk\"></i> {{IsSaving ? 'Saving\u2026' : 'Save'}}\n </button>\n }\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\" [Padding]=\"false\">\n@if (IsLoading) {\n <div class=\"config-loading\">\n <mj-loading text=\"Loading configuration...\" size=\"medium\"></mj-loading>\n </div>\n} @else {\n <div class=\"config-layout\">\n <mj-left-nav\n [Sections]=\"navSections\"\n [ActiveId]=\"ActiveSection\"\n (ItemClicked)=\"onNavItemClicked($event)\">\n </mj-left-nav>\n\n <mj-left-nav-content>\n <mj-page-header-interior\n [Title]=\"currentSection?.Label || ''\"\n [Subtitle]=\"currentSection?.Description || ''\">\n </mj-page-header-interior>\n <mj-page-body-interior>\n <!-- Pipeline Settings -->\n @if (ActiveSection === 'pipeline') {\n <div class=\"config-section\">\n <div class=\"config-group\">\n <label class=\"config-toggle-row\">\n <div class=\"config-toggle-info\">\n <span class=\"config-label\">Auto-tag on Ingest</span>\n <span class=\"config-hint\">Automatically run autotagging when new content is ingested</span>\n </div>\n <input type=\"checkbox\" [(ngModel)]=\"PipelineSettings.AutotagOnIngest\" (change)=\"OnSettingChanged()\" class=\"config-checkbox\" />\n </label>\n\n <label class=\"config-toggle-row\">\n <div class=\"config-toggle-info\">\n <span class=\"config-label\">Vectorize on Ingest</span>\n <span class=\"config-hint\">Automatically create embeddings for new content</span>\n </div>\n <input type=\"checkbox\" [(ngModel)]=\"PipelineSettings.VectorizeOnIngest\" (change)=\"OnSettingChanged()\" class=\"config-checkbox\" />\n </label>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Default Batch Size</span>\n <span class=\"config-hint\">Number of items processed per batch</span>\n </div>\n <input type=\"number\" [(ngModel)]=\"PipelineSettings.DefaultBatchSize\" (input)=\"OnSettingChanged()\" class=\"config-input config-input-number\" min=\"10\" max=\"1000\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Max Concurrent Jobs</span>\n <span class=\"config-hint\">Maximum number of pipeline jobs running at once</span>\n </div>\n <input type=\"number\" [(ngModel)]=\"PipelineSettings.MaxConcurrentJobs\" (input)=\"OnSettingChanged()\" class=\"config-input config-input-number\" min=\"1\" max=\"10\" />\n </div>\n </div>\n </div>\n }\n\n <!-- Vector Database Settings -->\n @if (ActiveSection === 'vectordb') {\n <div class=\"config-section\">\n\n <!-- Setup Progress -->\n <div class=\"setup-progress\">\n <div class=\"setup-progress-header\">\n <span class=\"setup-progress-label\">Setup Progress</span>\n <span class=\"setup-progress-count\">{{ SetupStepsCompleted }} of 3 complete</span>\n </div>\n <div class=\"setup-progress-bar\">\n <div class=\"setup-progress-fill\" [style.width.%]=\"(SetupStepsCompleted / 3) * 100\"></div>\n </div>\n </div>\n\n <!-- Step 1: Providers -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasVectorDBProvider\" [class.setup-step-pending]=\"!HasVectorDBProvider\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasVectorDBProvider) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">1</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Vector Database Providers</span>\n @if (HasVectorDBProvider) {\n <span class=\"setup-step-status\">{{ VectorDBProviders.length }} provider(s) registered</span>\n } @else {\n <span class=\"setup-step-status\">No providers registered. Add a vector database provider (e.g., Pinecone, Weaviate) via the admin console.</span>\n }\n </div>\n </div>\n @if (HasVectorDBProvider) {\n <div class=\"setup-step-detail\">\n @for (provider of VectorDBProviders; track provider.ID) {\n <div class=\"provider-card\">\n <div class=\"provider-icon\">\n <i class=\"fa-solid fa-database\"></i>\n </div>\n <div class=\"provider-info\">\n <span class=\"provider-name\">{{ provider.Name }}</span>\n <span class=\"provider-class\">{{ provider.ClassKey }}</span>\n </div>\n <span class=\"config-status-badge config-status-active\">\n <i class=\"fa-solid fa-circle-check\"></i> Active\n </span>\n </div>\n <div class=\"provider-credential-row\">\n <label class=\"provider-credential-label\">\n <i class=\"fa-solid fa-key\"></i> API Credential\n </label>\n <div class=\"provider-credential-picker\">\n <select class=\"provider-credential-select\"\n [(ngModel)]=\"provider.CredentialID\"\n (change)=\"SaveProviderCredential(provider)\"\n [disabled]=\"IsSavingCredential\">\n <option [ngValue]=\"null\">None (use environment variable)</option>\n @for (cred of AvailableCredentials; track cred.ID) {\n <option [ngValue]=\"cred.ID\">{{ cred.Name }}</option>\n }\n </select>\n @if (IsSavingCredential) {\n <i class=\"fa-solid fa-spinner fa-spin provider-credential-spinner\"></i>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Step 2: Embedding Model -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasEmbeddingModel\" [class.setup-step-pending]=\"!HasEmbeddingModel\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasEmbeddingModel) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">2</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Embedding Models</span>\n @if (HasEmbeddingModel) {\n <span class=\"setup-step-status\">{{ EmbeddingModels.length }} model(s) available</span>\n } @else {\n <span class=\"setup-step-status\">No embedding models found. Configure at least one in the AI app > Models tab.</span>\n }\n </div>\n </div>\n @if (HasEmbeddingModel) {\n <div class=\"setup-step-detail\">\n <div class=\"config-tag-list\">\n @for (model of EmbeddingModels; track model.ID) {\n <span class=\"config-tag\">{{ model.Name }}</span>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Step 3: Vector Indexes -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasVectorIndex\" [class.setup-step-pending]=\"!HasVectorIndex\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasVectorIndex) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">3</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Vector Indexes</span>\n @if (HasVectorIndex) {\n <span class=\"setup-step-status\">{{ VectorIndexes.length }} index(es) configured</span>\n } @else if (HasVectorDBProvider && HasEmbeddingModel) {\n <span class=\"setup-step-status\">No indexes yet \u2014 create one below.</span>\n } @else {\n <span class=\"setup-step-status\">Complete steps 1 and 2 first.</span>\n }\n </div>\n @if (HasVectorDBProvider && HasEmbeddingModel && !ShowCreateIndexForm) {\n <button class=\"setup-step-action\" (click)=\"OpenCreateIndexForm()\">\n <i class=\"fa-solid fa-plus\"></i> Create Index\n </button>\n }\n </div>\n\n <!-- Existing Indexes -->\n @if (HasVectorIndex) {\n <div class=\"setup-step-detail\">\n @for (idx of VectorIndexes; track idx.ID) {\n <div class=\"index-card\">\n <div class=\"index-icon\">\n <i class=\"fa-solid fa-cubes\"></i>\n </div>\n <div class=\"index-info\">\n <span class=\"index-name\">{{ idx.Name }}</span>\n <span class=\"index-meta\">\n <i class=\"fa-solid fa-database\"></i> {{ idx.VectorDatabase }}\n &nbsp;\u00B7&nbsp;\n <i class=\"fa-solid fa-microchip\"></i> {{ idx.EmbeddingModel }}\n </span>\n </div>\n <div class=\"index-actions\">\n <span class=\"config-status-badge config-status-active\">\n <i class=\"fa-solid fa-circle-check\"></i> Active\n </span>\n <button class=\"index-delete-btn\" (click)=\"DeleteIndex(idx.ID)\" title=\"Delete index\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Create Index Form -->\n @if (ShowCreateIndexForm) {\n <div class=\"create-index-form\">\n <h4 class=\"create-index-title\">\n <i class=\"fa-solid fa-plus-circle\"></i> Create New Vector Index\n </h4>\n <div class=\"create-index-fields\">\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Index Name</label>\n <input type=\"text\"\n class=\"config-input\"\n [(ngModel)]=\"NewIndexName\"\n placeholder=\"e.g., mj-knowledge-index\" />\n </div>\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Vector Database</label>\n <select class=\"config-select\" [(ngModel)]=\"NewIndexVectorDBID\">\n @for (db of VectorDBProviders; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Embedding Model</label>\n <select class=\"config-select\" [(ngModel)]=\"NewIndexEmbeddingModelID\">\n @for (model of EmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"create-index-actions\">\n <button class=\"create-index-submit\" (click)=\"CreateIndex()\" [disabled]=\"IsCreatingIndex\">\n @if (IsCreatingIndex) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Creating...\n } @else {\n <i class=\"fa-solid fa-plus\"></i> Create Index\n }\n </button>\n <button class=\"create-index-cancel\" (click)=\"CancelCreateIndex()\" [disabled]=\"IsCreatingIndex\">\n Cancel\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Full-Text Indexes -->\n @if (ActiveSection === 'fulltext') {\n <div class=\"config-section\">\n\n @if (IsLoadingFTSEntities) {\n <mj-loading text=\"Discovering searchable entities...\" size=\"medium\"></mj-loading>\n } @else if (FTSEntities.length === 0) {\n <div class=\"config-empty-state\">\n <i class=\"fa-solid fa-text-width config-empty-icon\"></i>\n <h3 class=\"config-empty-title\">No Searchable Entities Found</h3>\n <p class=\"config-empty-text\">No entities with text fields were discovered. Ensure your database schema includes entities with varchar/nvarchar columns.</p>\n </div>\n } @else {\n <div class=\"fts-entity-controls\">\n <div class=\"fts-summary\">\n <span class=\"fts-summary-count\">{{ EnabledFTSCount }} of {{ FTSEntities.length }} entities enabled for search</span>\n <input type=\"text\" class=\"config-input fts-filter-input\" placeholder=\"Filter entities...\" [(ngModel)]=\"FTSFilterText\" />\n </div>\n </div>\n\n <div class=\"fts-entity-list\">\n @for (entity of FilteredFTSEntities; track entity.EntityName) {\n <div class=\"fts-entity-card\" [class.fts-entity-enabled]=\"entity.Enabled\">\n <div class=\"fts-entity-toggle\">\n <input type=\"checkbox\" [(ngModel)]=\"entity.Enabled\" (change)=\"OnFTSEntityToggled(entity)\" class=\"config-checkbox\" />\n </div>\n <div class=\"fts-entity-info\">\n <span class=\"fts-entity-name\">{{ entity.EntityName }}</span>\n <div class=\"fts-entity-fields\">\n @for (field of entity.IndexedFields; track field) {\n <span class=\"fts-field-tag\">{{ field }}</span>\n }\n </div>\n </div>\n <div class=\"fts-entity-meta\">\n <span class=\"fts-entity-title-field\" title=\"Title field\">\n <i class=\"fa-solid fa-heading\"></i> {{ entity.TitleField }}\n </span>\n @if (entity.SnippetField !== entity.TitleField) {\n <span class=\"fts-entity-snippet-field\" title=\"Snippet field\">\n <i class=\"fa-solid fa-align-left\"></i> {{ entity.SnippetField }}\n </span>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Embedding Models -->\n @if (ActiveSection === 'embedding') {\n <div class=\"config-section\">\n\n @if (HasEmbeddingModel) {\n <div class=\"config-group\">\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Active Model</span>\n <span class=\"config-hint\">Currently selected embedding model</span>\n </div>\n <span class=\"config-value-display\">{{ EmbeddingModelName }}</span>\n </div>\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Available Models</span>\n <span class=\"config-hint\">{{ EmbeddingModels.length }} embedding model(s) configured</span>\n </div>\n <div class=\"config-tag-list\">\n @for (model of EmbeddingModels; track model.ID) {\n <span class=\"config-tag\">{{ model.Name }}</span>\n }\n </div>\n </div>\n </div>\n <p class=\"config-section-note\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Manage embedding models in the AI Dashboard > Models tab.\n </p>\n } @else {\n <div class=\"config-empty-state\">\n <i class=\"fa-solid fa-microchip config-empty-icon\"></i>\n <h3 class=\"config-empty-title\">No Embedding Models Found</h3>\n <p class=\"config-empty-text\">\n Embedding models are required to convert text into vectors for semantic search and duplicate detection.\n Configure at least one embedding model (e.g., text-embedding-3-small) in the AI Dashboard > Models tab.\n </p>\n </div>\n }\n </div>\n }\n\n <!-- Thresholds -->\n @if (ActiveSection === 'thresholds') {\n <div class=\"config-section\">\n\n <div class=\"config-group\">\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Duplicate Absolute Match</span>\n <span class=\"config-hint\">Score above which duplicates are auto-confirmed ({{ FormatThreshold(ThresholdSettings.DuplicateAbsolute) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.DuplicateAbsolute\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.5\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Duplicate Potential Match</span>\n <span class=\"config-hint\">Score above which duplicates are flagged for review ({{ FormatThreshold(ThresholdSettings.DuplicatePotential) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.DuplicatePotential\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.3\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Search Relevance</span>\n <span class=\"config-hint\">Minimum score for search results ({{ FormatThreshold(ThresholdSettings.SearchRelevance) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.SearchRelevance\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Autotag Confidence</span>\n <span class=\"config-hint\">Minimum confidence for accepting auto-generated tags ({{ FormatThreshold(ThresholdSettings.AutotagConfidence) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.AutotagConfidence\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.3\" max=\"1\" step=\"0.01\" />\n </div>\n </div>\n </div>\n }\n\n <!-- Search Scopes Section -->\n @if (ActiveSection === 'search-scopes') {\n <div class=\"config-section\">\n <div class=\"scope-manager\">\n <!-- Scope list -->\n <aside class=\"scope-manager-list\">\n <div class=\"scope-manager-list-header\">\n <span>Scopes ({{ SearchScopes.length }})</span>\n <button type=\"button\" class=\"scope-manager-new-btn\" (click)=\"CreateNewScope()\">\n <i class=\"fa-solid fa-plus\"></i> New\n </button>\n </div>\n @if (IsLoadingScopes) {\n <div class=\"scope-manager-loading\">Loading&hellip;</div>\n } @else if (SearchScopes.length === 0) {\n <div class=\"scope-manager-empty\">\n No scopes defined yet. Click <strong>New</strong> to create one.\n </div>\n } @else {\n @for (s of SearchScopes; track s.ID) {\n <button\n type=\"button\"\n class=\"scope-manager-list-item\"\n [class.active]=\"ActiveScopeID === s.ID\"\n (click)=\"SelectScope(s.ID)\">\n <i [class]=\"s.Icon || 'fa-solid fa-filter'\" aria-hidden=\"true\"></i>\n <span class=\"scope-manager-list-name\">{{ s.Name }}</span>\n @if (s.IsGlobal) {\n <span class=\"scope-manager-badge\">Global</span>\n } @else if (s.IsDefault) {\n <span class=\"scope-manager-badge\">Default</span>\n }\n </button>\n }\n }\n </aside>\n\n <!-- Scope detail -->\n <section class=\"scope-manager-detail\">\n @if (ActiveScope) {\n <!-- Tab strip -->\n <div class=\"scope-manager-tabs\">\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'definition'\" (click)=\"SelectScopeTab('definition')\">Definition</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'providers'\" (click)=\"SelectScopeTab('providers')\">Providers</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'indexes'\" (click)=\"SelectScopeTab('indexes')\">External Indexes</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'entities'\" (click)=\"SelectScopeTab('entities')\">Entities</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'storage'\" (click)=\"SelectScopeTab('storage')\">Storage</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'permissions'\" (click)=\"SelectScopeTab('permissions')\">Permissions</button>\n <div class=\"scope-manager-tab-spacer\"></div>\n @if (ActiveScope.ID) {\n <button type=\"button\" class=\"scope-manager-open-btn\"\n (click)=\"OpenActiveScopeFullForm()\"\n title=\"Open the full custom form for this scope (Live Preview, Fusion Weights, Reranker, Test Queries, Execution Logs)\">\n <i class=\"fa-solid fa-up-right-from-square\"></i> Open Full Form\n </button>\n }\n <button type=\"button\" class=\"scope-manager-save-btn\" (click)=\"SaveActiveScope()\">\n <i class=\"fa-solid fa-save\"></i> Save\n </button>\n @if (!ActiveScope.IsGlobal) {\n <button type=\"button\" class=\"scope-manager-delete-btn\" (click)=\"DeleteActiveScope()\" title=\"Delete scope\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n\n <!-- Definition tab -->\n @if (ActiveScopeTab === 'definition') {\n <div class=\"scope-definition-grid\">\n <label>\n <span>Name</span>\n <input type=\"text\" class=\"mj-input\" [value]=\"ActiveScope.Name\" (change)=\"ActiveScope.Name = $any($event.target).value\">\n </label>\n <label>\n <span>Icon (Font Awesome class)</span>\n <input type=\"text\" class=\"mj-input\" [value]=\"ActiveScope.Icon || ''\" (change)=\"ActiveScope.Icon = $any($event.target).value\">\n </label>\n <label class=\"scope-definition-full\">\n <span>Description</span>\n <textarea rows=\"2\" class=\"mj-textarea\" [value]=\"ActiveScope.Description || ''\" (change)=\"ActiveScope.Description = $any($event.target).value\"></textarea>\n </label>\n <label>\n <span>Status</span>\n <select class=\"mj-input\" [value]=\"ActiveScope.Status\" (change)=\"ActiveScope.Status = $any($event.target).value\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </label>\n <label>\n <span>Start at</span>\n <input type=\"datetime-local\" class=\"mj-input\" [value]=\"FormatScopeDate(ActiveScope.StartAt)\" (change)=\"SetScopeDate(ActiveScope, 'StartAt', $any($event.target).value)\">\n </label>\n <label>\n <span>End at</span>\n <input type=\"datetime-local\" class=\"mj-input\" [value]=\"FormatScopeDate(ActiveScope.EndAt)\" (change)=\"SetScopeDate(ActiveScope, 'EndAt', $any($event.target).value)\">\n </label>\n <label class=\"scope-definition-toggle\">\n <input type=\"checkbox\" [checked]=\"ActiveScope.IsDefault\" (change)=\"ActiveScope.IsDefault = $any($event.target).checked\" [disabled]=\"ActiveScope.IsGlobal\">\n <span>Default scope \u2014 picked when users/agents don't specify one</span>\n </label>\n <label class=\"scope-definition-toggle\">\n <input type=\"checkbox\" [checked]=\"ActiveScope.IsGlobal\" disabled>\n <span>Global \u2014 reserved for the built-in Global scope (read-only)</span>\n </label>\n <label class=\"scope-definition-full\">\n <span>Scope Config (JSON)</span>\n <textarea rows=\"4\" class=\"mj-textarea scope-code-block\" spellcheck=\"false\" [value]=\"ActiveScope.ScopeConfig || ''\" (change)=\"ActiveScope.ScopeConfig = $any($event.target).value\"></textarea>\n </label>\n <label class=\"scope-definition-full\">\n <span>Search Context Config (JSON)</span>\n <textarea rows=\"4\" class=\"mj-textarea scope-code-block\" spellcheck=\"false\" [value]=\"ActiveScope.SearchContextConfig || ''\" (change)=\"ActiveScope.SearchContextConfig = $any($event.target).value\"></textarea>\n </label>\n </div>\n }\n\n @if (ActiveScopeTab === 'providers') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Providers\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeProviderColumns\"\n AddButtonLabel=\"+ Add provider\"\n EmptyMessage=\"No providers assigned. Without any providers, this scope searches nothing.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'indexes') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope External Indexes\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeExternalIndexColumns\"\n AddButtonLabel=\"+ Add external index\"\n EmptyMessage=\"No external indexes configured for this scope.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'entities') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Entities\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeEntityColumns\"\n AddButtonLabel=\"+ Add entity\"\n EmptyMessage=\"No entities configured. Scoped entity search will return no rows.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'storage') {\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Storage Accounts\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopeStorageColumns\"\n AddButtonLabel=\"+ Add storage folder\"\n EmptyMessage=\"No storage accounts linked to this scope.\">\n </mj-search-scope-child-grid>\n }\n\n @if (ActiveScopeTab === 'permissions') {\n <div class=\"scope-permissions-help\" style=\"margin-bottom: 12px; padding: 8px 12px; background: var(--mj-bg-surface-card); border-left: 3px solid var(--mj-brand-primary); border-radius: 4px;\">\n <p style=\"margin: 0; font-size: 0.95em;\">\n <i class=\"fa-solid fa-shield-halved\" style=\"color: var(--mj-brand-primary);\"></i>\n <strong>Per-user / per-role grants on this scope.</strong>\n Each row binds <em>either</em> a User <em>or</em> a Role (not both). Levels:\n <code>None</code> = explicit deny that overrides role grants,\n <code>Read</code> = view scope metadata,\n <code>Search</code> = invoke ScopedSearchAction,\n <code>Manage</code> = full edit including authoring permissions.\n Combined with <code>AIAgent.SearchScopeAccess</code> via the resolver \u2014 see the spec for the full resolution order.\n </p>\n </div>\n <mj-search-scope-child-grid\n [ParentID]=\"ActiveScopeID\"\n ChildEntityName=\"MJ: Search Scope Permissions\"\n ParentFieldName=\"SearchScopeID\"\n [Columns]=\"ScopePermissionColumns\"\n AddButtonLabel=\"+ Grant access\"\n EmptyMessage=\"No explicit grants. Access falls back to agent SearchScopeAccess only.\">\n </mj-search-scope-child-grid>\n }\n } @else {\n <div class=\"scope-manager-empty-detail\">\n Select a scope on the left, or click <strong>New</strong> to create one.\n </div>\n }\n </section>\n </div>\n </div>\n }\n\n <!-- Search Analytics Section (P3.3) \u2014 driven by SearchExecutionLog -->\n @if (ActiveSection === 'search-analytics') {\n <div class=\"config-section-content\">\n\n @if (AnalyticsLoading) {\n <mj-loading text=\"Loading analytics\u2026\" size=\"medium\"></mj-loading>\n } @else if (!AnalyticsLoaded) {\n <button class=\"mj-input\" type=\"button\" (click)=\"LoadSearchAnalytics()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Load analytics\n </button>\n } @else {\n <div class=\"search-analytics-kpi-grid\">\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Total runs</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsTotalRuns | number }}</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Success rate</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsSuccessRate }}%</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Hit rate</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsHitRate }}%</span>\n <span class=\"search-analytics-kpi-hint\">% of successful runs that returned \u22651 result</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Avg latency</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsAvgLatencyMs }}ms</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">P95 latency</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsP95LatencyMs }}ms</span>\n </div>\n <div class=\"search-analytics-kpi\">\n <span class=\"search-analytics-kpi-label\">Reranker spend</span>\n <span class=\"search-analytics-kpi-value\">{{ AnalyticsTotalRerankerCostCents | number:'1.0-2' }}\u00A2</span>\n </div>\n </div>\n\n <h3 class=\"search-analytics-h3\">Top scopes by volume</h3>\n @if (AnalyticsTopScopes.length === 0) {\n <p class=\"search-analytics-empty\">No runs in the window.</p>\n } @else {\n <table class=\"search-analytics-table\">\n <thead>\n <tr><th>Scope</th><th>Runs</th><th>Avg latency</th></tr>\n </thead>\n <tbody>\n @for (s of AnalyticsTopScopes; track s.ScopeID) {\n <tr>\n <td>{{ s.Name }}</td>\n <td>{{ s.Count | number }}</td>\n <td>{{ s.AvgLatencyMs }}ms</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <h3 class=\"search-analytics-h3\">Reranker spend by driver</h3>\n @if (AnalyticsRerankerSpend.length === 0) {\n <p class=\"search-analytics-empty\">No rerank invocations in the window.</p>\n } @else {\n <table class=\"search-analytics-table\">\n <thead>\n <tr><th>Reranker</th><th>Calls</th><th>Total cents</th></tr>\n </thead>\n <tbody>\n @for (r of AnalyticsRerankerSpend; track r.Reranker) {\n <tr>\n <td>{{ r.Reranker }}</td>\n <td>{{ r.Count | number }}</td>\n <td>{{ r.TotalCents | number:'1.0-2' }}\u00A2</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <h3 class=\"search-analytics-h3\">Top failure reasons</h3>\n @if (AnalyticsTopFailures.length === 0) {\n <p class=\"search-analytics-empty\">No failures in the window.</p>\n } @else {\n <table class=\"search-analytics-table\">\n <thead>\n <tr><th>Reason</th><th>Count</th></tr>\n </thead>\n <tbody>\n @for (f of AnalyticsTopFailures; track f.Reason) {\n <tr>\n <td>{{ f.Reason }}</td>\n <td>{{ f.Count | number }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <button class=\"mj-input search-analytics-refresh\" type=\"button\" (click)=\"LoadSearchAnalytics()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n }\n </div>\n }\n\n <!-- Permissions Audit Section (P2A.7) -->\n @if (ActiveSection === 'search-permissions') {\n <div class=\"config-section-content\">\n @if (PermissionsLoading) {\n <div class=\"search-permissions-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading permission rows...\n </div>\n }\n\n @if (PermissionsLoaded && !PermissionsLoading) {\n <div class=\"search-permissions-filters\">\n <input class=\"mj-input\" type=\"text\" placeholder=\"Filter by scope name...\" [(ngModel)]=\"PermissionsFilterScope\" />\n <input class=\"mj-input\" type=\"text\" placeholder=\"Filter by user/role (name or email)...\" [(ngModel)]=\"PermissionsFilterPrincipal\" />\n <select class=\"mj-input\" [(ngModel)]=\"PermissionsFilterLevel\">\n <option value=\"\">All levels</option>\n <option value=\"None\">None</option>\n <option value=\"Read\">Read</option>\n <option value=\"Search\">Search</option>\n <option value=\"Manage\">Manage</option>\n </select>\n <button class=\"mj-input\" type=\"button\" (click)=\"RefreshPermissionsAudit()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n </div>\n\n <div class=\"search-permissions-summary\">\n Showing {{ FilteredPermissionsRows.length }} of {{ PermissionsRows.length }} rows\n </div>\n\n @if (FilteredPermissionsRows.length === 0) {\n <div class=\"search-permissions-empty\">\n No permission rows match your filters.\n </div>\n } @else {\n <table class=\"search-permissions-table\">\n <thead>\n <tr>\n <th>Scope</th>\n <th>Principal</th>\n <th>Type</th>\n <th>Permission Level</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredPermissionsRows; track row.ID) {\n <tr>\n <td>{{ row.SearchScopeName }}</td>\n <td>\n @if (row.UserID) {\n {{ row.UserName }} <span class=\"search-permissions-secondary\">({{ row.UserEmail }})</span>\n } @else {\n {{ row.RoleName }}\n }\n </td>\n <td>\n @if (row.UserID) { <span class=\"search-permissions-tag\">User</span> }\n @if (row.RoleID) { <span class=\"search-permissions-tag\">Role</span> }\n </td>\n <td>\n <span class=\"search-permissions-level search-permissions-level-{{ row.PermissionLevel | lowercase }}\">{{ row.PermissionLevel }}</span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n }\n </div>\n }\n\n <!-- Scheduling Section -->\n @if (ActiveSection === 'scheduling') {\n <div class=\"config-section-content\">\n <div style=\"margin-top: 16px;\">\n <app-scheduling-resource [HideToolbar]=\"true\"></app-scheduling-resource>\n </div>\n </div>\n }\n\n <!-- Save Bar -->\n @if (HasUnsavedChanges) {\n <div class=\"config-save-bar\">\n <span class=\"config-save-text\">You have unsaved changes</span>\n <button class=\"config-save-btn\" (click)=\"SaveConfiguration()\" [disabled]=\"IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-save\"></i> Save Changes\n }\n </button>\n <button class=\"config-reset-btn\" (click)=\"ResetConfiguration()\" [disabled]=\"IsSaving\">\n Reset\n </button>\n </div>\n }\n </mj-page-body-interior>\n </mj-left-nav-content>\n </div>\n}\n </mj-page-body>\n</mj-page-layout>\n", styles: ["/* Knowledge Configuration - Settings Page with Left Nav */\n\n\n.config-loading {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 400px;\n}\n\n/*\n Layout \u2014 <mj-left-nav> rail + <mj-left-nav-content> pane. The shared\n primitives own the rail width, nav item styling, and content sizing; we just\n need a flex-row wrapper so they sit side-by-side.\n*/\n.config-layout {\n display: flex;\n height: 100%;\n min-height: 500px;\n}\n\n/* Section title + description are now rendered by <mj-page-header-interior>\n (one shared instance bound to currentSection at the top of the content area).\n The legacy .config-section-title / .config-section-desc rules and the\n .config-content wrapper were retired with that migration; .config-section\n remains as a thin readability constraint on the form bodies. */\n.config-section {\n max-width: 700px;\n}\n\n/* Config Groups */\n.config-group {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.config-toggle-row,\n.config-field-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n border-radius: 8px;\n transition: background 0.1s ease;\n gap: 1rem;\n}\n\n.config-toggle-row:hover,\n.config-field-row:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.config-toggle-info,\n.config-field-info {\n display: flex;\n flex-direction: column;\n gap: 0.15rem;\n flex: 1;\n}\n\n.config-label {\n font-weight: 500;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n}\n\n.config-hint {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.config-checkbox {\n width: 1.1rem;\n height: 1.1rem;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n}\n\n.config-input {\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n font-family: inherit;\n}\n\n.config-input-number {\n width: 80px;\n text-align: center;\n}\n\n.config-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.config-slider {\n width: 200px;\n accent-color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.config-value-display {\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n padding: 0.3rem 0.6rem;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-family: monospace;\n}\n\n/* Placeholder */\n.config-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 1.5rem;\n text-align: center;\n gap: 1rem;\n color: var(--mj-text-muted);\n}\n\n.config-placeholder-icon {\n font-size: 2.5rem;\n}\n\n/* ---- Setup Progress Bar ---- */\n\n.setup-progress {\n margin-bottom: 1.5rem;\n padding: 1rem 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n}\n\n.setup-progress-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.5rem;\n}\n\n.setup-progress-label {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.setup-progress-count {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.setup-progress-bar {\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.setup-progress-fill {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n transition: width 0.4s ease;\n}\n\n/* ---- Setup Steps ---- */\n\n.setup-step {\n padding: 1rem 1.25rem;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n margin-bottom: 0.75rem;\n transition: border-color 0.2s;\n}\n\n.setup-step-complete {\n border-color: var(--mj-status-success-border);\n background: color-mix(in srgb, var(--mj-status-success) 3%, var(--mj-bg-surface));\n}\n\n.setup-step-pending {\n border-color: var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.setup-step-header {\n display: flex;\n align-items: flex-start;\n gap: 0.85rem;\n}\n\n.setup-step-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex-shrink: 0;\n margin-top: 1px;\n}\n\n.setup-step-complete .setup-step-indicator i {\n font-size: 1.25rem;\n color: var(--mj-status-success);\n}\n\n.setup-step-number {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n font-weight: 700;\n}\n\n.setup-step-info {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n flex: 1;\n}\n\n.setup-step-title {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.setup-step-status {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.setup-step-complete .setup-step-status {\n color: var(--mj-status-success-text);\n}\n\n/* ---- Config Group Title ---- */\n\n.config-group-title {\n margin: 0 0 0.75rem 0;\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n/* ---- Status Badge ---- */\n\n.config-status-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 0.75rem;\n font-weight: 600;\n}\n\n.config-status-active {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n/* ---- Step Detail Area ---- */\n\n.setup-step-detail {\n margin-top: 0.75rem;\n padding-left: 2.85rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.setup-step-action {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s;\n flex-shrink: 0;\n}\n\n.setup-step-action:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n/* ---- Provider Cards ---- */\n\n.provider-card {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n}\n\n.provider-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.provider-info {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.provider-name {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.provider-class {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n font-family: monospace;\n}\n\n/* ---- Provider Credential Row ---- */\n\n.provider-credential-row {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 1rem 0.75rem;\n margin-top: -0.25rem;\n}\n\n.provider-credential-label {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.provider-credential-label i {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.provider-credential-picker {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex: 1;\n min-width: 0;\n}\n\n.provider-credential-select {\n flex: 1;\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.8rem;\n}\n\n.provider-credential-select:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.provider-credential-spinner {\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n}\n\n/* ---- Index Cards ---- */\n\n.index-card {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n transition: border-color 0.15s;\n}\n\n.index-card:hover {\n border-color: var(--mj-border-default);\n}\n\n.index-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.index-info {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.index-name {\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.index-meta {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 3px;\n}\n\n.index-meta i {\n font-size: 0.65rem;\n}\n\n.index-actions {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex-shrink: 0;\n}\n\n.index-delete-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.index-delete-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error);\n}\n\n/* ---- Create Index Form ---- */\n\n.create-index-form {\n margin-top: 0.75rem;\n padding: 1.25rem;\n background: var(--mj-bg-surface-card);\n border: 2px solid var(--mj-brand-primary);\n border-radius: 10px;\n margin-left: 2.85rem;\n}\n\n.create-index-title {\n margin: 0 0 1rem 0;\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.create-index-title i {\n color: var(--mj-brand-primary);\n}\n\n.create-index-fields {\n display: flex;\n flex-direction: column;\n gap: 0.85rem;\n}\n\n.create-index-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.create-index-label {\n font-size: 0.78rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.config-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n}\n\n.config-select:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.create-index-actions {\n display: flex;\n gap: 8px;\n margin-top: 1rem;\n}\n\n.create-index-submit {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 18px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s;\n}\n\n.create-index-submit:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.create-index-submit:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.create-index-cancel {\n padding: 8px 18px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.create-index-cancel:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* Empty State for unconfigured sections */\n.config-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 2rem;\n text-align: center;\n gap: 0.75rem;\n border: 2px dashed var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface-sunken);\n}\n\n.config-empty-icon {\n font-size: 2.5rem;\n color: var(--mj-text-disabled);\n}\n\n.config-empty-title {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.config-empty-text {\n margin: 0;\n font-size: 0.85rem;\n color: var(--mj-text-muted);\n max-width: 480px;\n line-height: 1.5;\n}\n\n/* Tag list for showing multiple models */\n.config-tag-list {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.config-tag {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 500;\n}\n\n/* Section note */\n.config-section-note {\n margin-top: 1rem;\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.config-section-note i {\n color: var(--mj-status-info);\n}\n\n/* Save Bar */\n.config-save-bar {\n position: sticky;\n bottom: 0;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n margin-top: 2rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n}\n\n.config-save-text {\n flex: 1;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n}\n\n.config-save-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.5rem 1rem;\n border-radius: 6px;\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.85rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.config-save-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.config-save-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.config-reset-btn {\n padding: 0.5rem 0.75rem;\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n cursor: pointer;\n}\n\n.config-reset-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n}\n\n/* Mobile responsive */\n@media (max-width: 768px) {\n .config-layout {\n flex-direction: column;\n }\n\n .config-nav {\n width: 100%;\n flex-direction: row;\n overflow-x: auto;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 0;\n }\n\n .config-nav-header {\n display: none;\n }\n\n .config-nav-item {\n white-space: nowrap;\n padding: 0.6rem 1rem;\n }\n\n .config-nav-item-active {\n border-left: none;\n border-bottom: 3px solid var(--mj-brand-primary);\n }\n\n .config-content {\n padding: 1rem;\n }\n}\n\n/* Full-Text Search Entity Management */\n.fts-entity-controls {\n margin-bottom: 16px;\n}\n\n.fts-summary {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n}\n\n.fts-summary-count {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.fts-filter-input {\n max-width: 240px;\n}\n\n.fts-entity-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.fts-entity-card {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: border-color 0.15s, background 0.15s;\n}\n\n.fts-entity-card:hover {\n border-color: var(--mj-border-strong);\n}\n\n.fts-entity-card.fts-entity-enabled {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-brand-primary) 3%, var(--mj-bg-surface));\n}\n\n.fts-entity-toggle {\n flex-shrink: 0;\n}\n\n.fts-entity-info {\n flex: 1;\n min-width: 0;\n}\n\n.fts-entity-name {\n display: block;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.fts-entity-fields {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.fts-field-tag {\n display: inline-block;\n padding: 1px 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n}\n\n.fts-entity-meta {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 2px;\n flex-shrink: 0;\n}\n\n.fts-entity-title-field,\n.fts-entity-snippet-field {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.fts-entity-title-field i,\n.fts-entity-snippet-field i {\n margin-right: 4px;\n font-size: 10px;\n}\n\n/* ===== Search Scopes Manager ===== */\n\n.scope-manager {\n display: grid;\n grid-template-columns: 260px 1fr;\n gap: 16px;\n min-height: 420px;\n}\n\n.scope-manager-list {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.scope-manager-list-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 4px 6px 8px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.scope-manager-new-btn {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-link);\n padding: 3px 8px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.7rem;\n font-weight: 500;\n text-transform: none;\n letter-spacing: normal;\n}\n\n.scope-manager-new-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-brand-primary);\n}\n\n.scope-manager-loading,\n.scope-manager-empty,\n.scope-manager-empty-detail {\n padding: 16px;\n color: var(--mj-text-muted);\n text-align: center;\n font-size: 0.85rem;\n}\n\n.scope-manager-empty-detail {\n padding: 40px 24px;\n background: var(--mj-bg-surface-card);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n}\n\n.scope-manager-list-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 6px;\n text-align: left;\n transition: background 120ms ease;\n}\n\n.scope-manager-list-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.scope-manager-list-item.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n.scope-manager-list-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.scope-manager-badge {\n font-size: 0.625rem;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.scope-manager-detail {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-width: 0;\n}\n\n.scope-manager-tabs {\n display: flex;\n align-items: center;\n gap: 4px;\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 8px;\n flex-wrap: wrap;\n}\n\n.scope-manager-tab {\n background: transparent;\n border: none;\n padding: 6px 12px;\n color: var(--mj-text-secondary);\n font-size: 0.875rem;\n cursor: pointer;\n border-radius: 4px;\n transition: background 120ms ease, color 120ms ease;\n}\n\n.scope-manager-tab:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.scope-manager-tab.active {\n color: var(--mj-brand-primary);\n border-bottom: 2px solid var(--mj-brand-primary);\n border-radius: 0;\n font-weight: 500;\n}\n\n.scope-manager-tab-spacer {\n flex: 1;\n}\n\n.scope-manager-save-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 6px 14px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-save-btn:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.scope-manager-delete-btn {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-status-error-text);\n padding: 6px 10px;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.scope-manager-delete-btn:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error-border);\n}\n\n.scope-manager-open-btn {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-primary);\n padding: 6px 12px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.scope-manager-open-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.scope-definition-grid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px 16px;\n}\n\n.scope-definition-grid label {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n}\n\n.scope-definition-grid label > span {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.scope-definition-full {\n grid-column: 1 / -1;\n}\n\n.scope-definition-toggle {\n flex-direction: row;\n align-items: center;\n gap: 8px;\n}\n\n.scope-definition-toggle input[type=\"checkbox\"] {\n accent-color: var(--mj-brand-primary);\n}\n\n.scope-code-block {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n padding: 8px;\n}\n\n/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n Search Analytics section (P3.3)\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.search-analytics-kpi-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 12px;\n margin: 16px 0;\n}\n\n.search-analytics-kpi {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 14px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n}\n\n.search-analytics-kpi-label {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.search-analytics-kpi-value {\n font-size: 1.6rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-kpi-hint {\n color: var(--mj-text-muted);\n font-size: 0.72rem;\n}\n\n.search-analytics-h3 {\n margin: 22px 0 8px;\n font-size: 1rem;\n color: var(--mj-text-primary);\n}\n\n.search-analytics-empty {\n color: var(--mj-text-muted);\n font-size: 0.85rem;\n margin: 4px 0 14px;\n}\n\n.search-analytics-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.86rem;\n}\n\n.search-analytics-table thead th {\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 6px 10px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n.search-analytics-table tbody td {\n padding: 6px 10px;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-variant-numeric: tabular-nums;\n}\n\n.search-analytics-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.search-analytics-refresh {\n margin-top: 16px;\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.9rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.82rem;\n}\n\n.search-analytics-refresh:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* \u2500\u2500\u2500 Permissions Audit (P2A.7) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.search-permissions-loading {\n padding: 1.2rem;\n color: var(--mj-text-secondary);\n font-style: italic;\n}\n\n.search-permissions-filters {\n display: grid;\n grid-template-columns: 1fr 1fr 180px 130px;\n gap: 0.5rem;\n margin-bottom: 0.8rem;\n}\n\n.search-permissions-filters .mj-input {\n padding: 0.4rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: 4px;\n font-size: 0.85rem;\n}\n\n.search-permissions-summary {\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n margin-bottom: 0.6rem;\n}\n\n.search-permissions-empty {\n padding: 1.2rem;\n color: var(--mj-text-muted);\n text-align: center;\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n}\n\n.search-permissions-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.85rem;\n}\n\n.search-permissions-table th,\n.search-permissions-table td {\n padding: 0.5rem 0.7rem;\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n}\n\n.search-permissions-table th {\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n}\n\n.search-permissions-secondary {\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n}\n\n.search-permissions-tag {\n display: inline-block;\n padding: 0.1rem 0.5rem;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border-radius: 3px;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.search-permissions-level {\n display: inline-block;\n padding: 0.15rem 0.55rem;\n border-radius: 3px;\n font-size: 0.78rem;\n font-weight: 500;\n}\n\n.search-permissions-level-none {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n}\n\n.search-permissions-level-read {\n background: color-mix(in srgb, var(--mj-status-info) 12%, var(--mj-bg-surface));\n color: var(--mj-status-info-text);\n}\n\n.search-permissions-level-search {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n.search-permissions-level-manage {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n"] }]
2430
2375
  }], null, null); })();
2431
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KnowledgeConfigResourceComponent, { className: "KnowledgeConfigResourceComponent", filePath: "src/KnowledgeHub/components/config/knowledge-config-resource.component.ts", lineNumber: 99 }); })();
2376
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KnowledgeConfigResourceComponent, { className: "KnowledgeConfigResourceComponent", filePath: "src/KnowledgeHub/components/config/knowledge-config-resource.component.ts", lineNumber: 100 }); })();
2432
2377
  /** Tree-shaking prevention */
2433
2378
  export function LoadKnowledgeConfigResource() {
2434
2379
  // Prevents tree-shaking