@memberjunction/ng-dashboards 5.37.0 → 5.39.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 (328) hide show
  1. package/README.md +46 -7
  2. package/dist/AI/components/agents/agent-configuration.component.js +199 -198
  3. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -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 +20 -17
  6. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  7. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +15 -0
  8. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
  9. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +166 -58
  10. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
  11. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
  12. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +2 -1
  13. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
  14. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +1 -0
  15. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
  16. package/dist/AI/components/analytics/model-performance/model-performance.component.js +55 -36
  17. package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
  18. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +9 -1
  19. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  20. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +158 -117
  21. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  22. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +1 -0
  23. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
  24. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +22 -8
  25. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
  26. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +89 -842
  27. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  28. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1353 -7683
  29. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  30. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts +87 -0
  31. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts.map +1 -0
  32. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js +475 -0
  33. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js.map +1 -0
  34. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts +29 -0
  35. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts.map +1 -0
  36. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js +208 -0
  37. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js.map +1 -0
  38. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts +21 -0
  39. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts.map +1 -0
  40. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js +70 -0
  41. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js.map +1 -0
  42. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +235 -0
  43. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -0
  44. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +1735 -0
  45. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -0
  46. package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts +61 -0
  47. package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts.map +1 -0
  48. package/dist/AI/components/autotagging/shared/classify.dryrun.js +78 -0
  49. package/dist/AI/components/autotagging/shared/classify.dryrun.js.map +1 -0
  50. package/dist/AI/components/autotagging/shared/classify.format.d.ts +43 -0
  51. package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -0
  52. package/dist/AI/components/autotagging/shared/classify.format.js +209 -0
  53. package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -0
  54. package/dist/AI/components/autotagging/shared/classify.types.d.ts +276 -0
  55. package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -0
  56. package/dist/AI/components/autotagging/shared/classify.types.js +6 -0
  57. package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -0
  58. package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts +103 -0
  59. package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts.map +1 -0
  60. package/dist/AI/components/autotagging/tabs/health-tab.component.js +571 -0
  61. package/dist/AI/components/autotagging/tabs/health-tab.component.js.map +1 -0
  62. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +40 -0
  63. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -0
  64. package/dist/AI/components/autotagging/tabs/history-tab.component.js +402 -0
  65. package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -0
  66. package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts +107 -0
  67. package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts.map +1 -0
  68. package/dist/AI/components/autotagging/tabs/inbox-tab.component.js +719 -0
  69. package/dist/AI/components/autotagging/tabs/inbox-tab.component.js.map +1 -0
  70. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +122 -0
  71. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -0
  72. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +752 -0
  73. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -0
  74. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +166 -0
  75. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -0
  76. package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1384 -0
  77. package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -0
  78. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +70 -0
  79. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -0
  80. package/dist/AI/components/autotagging/tabs/tags-tab.component.js +448 -0
  81. package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -0
  82. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts +397 -0
  83. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts.map +1 -0
  84. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js +3490 -0
  85. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js.map +1 -0
  86. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +47 -0
  87. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -0
  88. package/dist/AI/components/autotagging/tabs/types-tab.component.js +220 -0
  89. package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -0
  90. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +293 -289
  91. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  92. package/dist/AI/components/models/model-management.component.js +209 -208
  93. package/dist/AI/components/models/model-management.component.js.map +1 -1
  94. package/dist/AI/components/prompts/prompt-management.component.js +130 -128
  95. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  96. package/dist/AI/components/requests/agent-requests-resource.component.js +61 -61
  97. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  98. package/dist/AI/components/system/system-configuration.component.js +17 -17
  99. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  100. package/dist/AI/components/tags/tags-resource.component.js +550 -532
  101. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  102. package/dist/AI/components/vectors/vector-management-resource.component.js +1 -1
  103. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  104. package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
  105. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  106. package/dist/AI/services/ai-instrumentation.service.js +14 -2
  107. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  108. package/dist/AI/services/cache-metrics.d.ts +50 -0
  109. package/dist/AI/services/cache-metrics.d.ts.map +1 -0
  110. package/dist/AI/services/cache-metrics.js +43 -0
  111. package/dist/AI/services/cache-metrics.js.map +1 -0
  112. package/dist/APIKeys/api-key-edit-panel.component.js +2 -2
  113. package/dist/APIKeys/api-keys-resource.component.js +132 -131
  114. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  115. package/dist/Actions/components/actions-overview.component.js +141 -141
  116. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  117. package/dist/Actions/components/execution-monitoring.component.js +15 -15
  118. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  119. package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -5
  120. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  121. package/dist/Actions/components/explorer/action-explorer.component.js +139 -212
  122. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  123. package/dist/Admin/admin-data-schema.component.js +2 -2
  124. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  125. package/dist/Admin/admin-dev-tools-resource.component.js +2 -2
  126. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  127. package/dist/Admin/admin-identity-access.component.js +2 -2
  128. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  129. package/dist/Admin/admin-monitoring.component.js +2 -2
  130. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  131. package/dist/ApplicationRoles/application-roles-resource.component.js +54 -49
  132. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  133. package/dist/Communication/communication-logs-resource.component.d.ts +6 -0
  134. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  135. package/dist/Communication/communication-logs-resource.component.js +72 -50
  136. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  137. package/dist/Communication/communication-monitor-resource.component.js +103 -102
  138. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  139. package/dist/Communication/communication-providers-resource.component.js +52 -51
  140. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  141. package/dist/Communication/communication-runs-resource.component.js +39 -38
  142. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  143. package/dist/Communication/communication-templates-resource.component.d.ts +6 -0
  144. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  145. package/dist/Communication/communication-templates-resource.component.js +92 -89
  146. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  147. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +73 -1
  148. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  149. package/dist/ComponentStudio/component-studio-dashboard.component.js +512 -127
  150. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  151. package/dist/ComponentStudio/component-studio-resource.component.d.ts +22 -0
  152. package/dist/ComponentStudio/component-studio-resource.component.d.ts.map +1 -0
  153. package/dist/ComponentStudio/component-studio-resource.component.js +55 -0
  154. package/dist/ComponentStudio/component-studio-resource.component.js.map +1 -0
  155. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +104 -45
  156. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
  157. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +234 -331
  158. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
  159. package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.d.ts +54 -0
  160. package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.d.ts.map +1 -0
  161. package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.js +339 -0
  162. package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.js.map +1 -0
  163. package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.d.ts +65 -0
  164. package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.d.ts.map +1 -0
  165. package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.js +492 -0
  166. package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.js.map +1 -0
  167. package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.d.ts +88 -0
  168. package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.d.ts.map +1 -0
  169. package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.js +457 -0
  170. package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.js.map +1 -0
  171. package/dist/ComponentStudio/components/form-override-dialog.component.d.ts +106 -0
  172. package/dist/ComponentStudio/components/form-override-dialog.component.d.ts.map +1 -0
  173. package/dist/ComponentStudio/components/form-override-dialog.component.js +478 -0
  174. package/dist/ComponentStudio/components/form-override-dialog.component.js.map +1 -0
  175. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +54 -0
  176. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -1
  177. package/dist/ComponentStudio/components/workspace/component-preview.component.js +361 -50
  178. package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
  179. package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts +10 -0
  180. package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts.map +1 -1
  181. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +114 -45
  182. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
  183. package/dist/ComponentStudio/services/canvas-to-code.d.ts +32 -0
  184. package/dist/ComponentStudio/services/canvas-to-code.d.ts.map +1 -0
  185. package/dist/ComponentStudio/services/canvas-to-code.js +347 -0
  186. package/dist/ComponentStudio/services/canvas-to-code.js.map +1 -0
  187. package/dist/ComponentStudio/services/code-to-canvas.d.ts +32 -0
  188. package/dist/ComponentStudio/services/code-to-canvas.d.ts.map +1 -0
  189. package/dist/ComponentStudio/services/code-to-canvas.js +92 -0
  190. package/dist/ComponentStudio/services/code-to-canvas.js.map +1 -0
  191. package/dist/ComponentStudio/services/component-studio-state.service.d.ts +29 -0
  192. package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -1
  193. package/dist/ComponentStudio/services/component-studio-state.service.js +76 -0
  194. package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
  195. package/dist/ComponentStudio/services/entity-form-override.service.d.ts +86 -0
  196. package/dist/ComponentStudio/services/entity-form-override.service.d.ts.map +1 -0
  197. package/dist/ComponentStudio/services/entity-form-override.service.js +246 -0
  198. package/dist/ComponentStudio/services/entity-form-override.service.js.map +1 -0
  199. package/dist/ComponentStudio/services/field-binding-scanner.d.ts +29 -0
  200. package/dist/ComponentStudio/services/field-binding-scanner.d.ts.map +1 -0
  201. package/dist/ComponentStudio/services/field-binding-scanner.js +110 -0
  202. package/dist/ComponentStudio/services/field-binding-scanner.js.map +1 -0
  203. package/dist/ComponentStudio/services/form-canvas-model.d.ts +56 -0
  204. package/dist/ComponentStudio/services/form-canvas-model.d.ts.map +1 -0
  205. package/dist/ComponentStudio/services/form-canvas-model.js +35 -0
  206. package/dist/ComponentStudio/services/form-canvas-model.js.map +1 -0
  207. package/dist/ComponentStudio/services/form-host-props-fixture.d.ts +10 -0
  208. package/dist/ComponentStudio/services/form-host-props-fixture.d.ts.map +1 -0
  209. package/dist/ComponentStudio/services/form-host-props-fixture.js +10 -0
  210. package/dist/ComponentStudio/services/form-host-props-fixture.js.map +1 -0
  211. package/dist/Credentials/components/credentials-audit-resource.component.js +136 -135
  212. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  213. package/dist/Credentials/components/credentials-categories-resource.component.js +155 -152
  214. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  215. package/dist/Credentials/components/credentials-list-resource.component.js +119 -118
  216. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  217. package/dist/Credentials/components/credentials-overview-resource.component.js +129 -128
  218. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  219. package/dist/Credentials/components/credentials-types-resource.component.js +107 -106
  220. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  221. package/dist/DataExplorer/data-explorer-dashboard.component.js +2 -2
  222. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  223. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +1 -1
  224. package/dist/DatabaseDesigner/components/entity-list.component.js +115 -114
  225. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  226. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +5 -6
  227. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  228. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +4 -5
  229. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  230. package/dist/DevTools/app-state-inspector.component.js +18 -17
  231. package/dist/DevTools/app-state-inspector.component.js.map +1 -1
  232. package/dist/DevTools/class-registry.component.js +88 -85
  233. package/dist/DevTools/class-registry.component.js.map +1 -1
  234. package/dist/DevTools/event-monitor.component.js +155 -150
  235. package/dist/DevTools/event-monitor.component.js.map +1 -1
  236. package/dist/DevTools/graphql-console.component.js +245 -243
  237. package/dist/DevTools/graphql-console.component.js.map +1 -1
  238. package/dist/DevTools/layout-inspector.component.js +18 -17
  239. package/dist/DevTools/layout-inspector.component.js.map +1 -1
  240. package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -19
  241. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  242. package/dist/FormBuilder/form-builder-resource.component.d.ts +964 -0
  243. package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -0
  244. package/dist/FormBuilder/form-builder-resource.component.js +4487 -0
  245. package/dist/FormBuilder/form-builder-resource.component.js.map +1 -0
  246. package/dist/FormBuilder/form-builder-version-rail.helpers.d.ts +55 -0
  247. package/dist/FormBuilder/form-builder-version-rail.helpers.d.ts.map +1 -0
  248. package/dist/FormBuilder/form-builder-version-rail.helpers.js +73 -0
  249. package/dist/FormBuilder/form-builder-version-rail.helpers.js.map +1 -0
  250. package/dist/Home/home-application.d.ts +21 -1
  251. package/dist/Home/home-application.d.ts.map +1 -1
  252. package/dist/Home/home-application.js +60 -8
  253. package/dist/Home/home-application.js.map +1 -1
  254. package/dist/Home/home-dashboard.component.js +2 -2
  255. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  256. package/dist/Integration/components/activity/activity.component.js +236 -229
  257. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  258. package/dist/Integration/components/connections/connections.component.js +390 -389
  259. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  260. package/dist/Integration/components/overview/overview.component.js +2 -2
  261. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +2 -2
  262. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  263. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +45 -44
  264. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  265. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +293 -291
  266. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  267. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +62 -61
  268. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  269. package/dist/Lists/components/lists-browse-resource.component.d.ts +6 -2
  270. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  271. package/dist/Lists/components/lists-browse-resource.component.js +525 -566
  272. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  273. package/dist/Lists/components/lists-categories-resource.component.js +135 -134
  274. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  275. package/dist/Lists/components/lists-my-lists-resource.component.js +199 -198
  276. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  277. package/dist/MCP/mcp-dashboard.component.js +443 -438
  278. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  279. package/dist/QueryBrowser/query-browser-resource.component.d.ts +14 -14
  280. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  281. package/dist/QueryBrowser/query-browser-resource.component.js +11 -10
  282. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  283. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
  284. package/dist/Scheduling/components/scheduling-activity.component.js +146 -147
  285. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  286. package/dist/Scheduling/components/scheduling-jobs.component.js +76 -75
  287. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  288. package/dist/Scheduling/components/scheduling-overview.component.js +97 -96
  289. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  290. package/dist/Scheduling/scheduling-dashboard.component.js +24 -22
  291. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  292. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +2 -0
  293. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  294. package/dist/Scheduling/services/scheduling-instrumentation.service.js +1 -0
  295. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  296. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
  297. package/dist/Testing/components/testing-explorer.component.d.ts +14 -4
  298. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  299. package/dist/Testing/components/testing-explorer.component.js +436 -427
  300. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  301. package/dist/Testing/components/testing-runs-resource.component.js +1 -1
  302. package/dist/Testing/components/testing-runs.component.js +116 -115
  303. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  304. package/dist/Testing/testing-dashboard.component.js +6 -7
  305. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  306. package/dist/VersionHistory/components/labels-resource.component.js +173 -172
  307. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  308. package/dist/VersionHistory/components/restore-resource.component.d.ts +6 -0
  309. package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
  310. package/dist/VersionHistory/components/restore-resource.component.js +116 -92
  311. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  312. package/dist/ai-dashboards.module.d.ts +47 -35
  313. package/dist/ai-dashboards.module.d.ts.map +1 -1
  314. package/dist/ai-dashboards.module.js +40 -1
  315. package/dist/ai-dashboards.module.js.map +1 -1
  316. package/dist/communication-dashboards.module.d.ts +1 -1
  317. package/dist/communication-dashboards.module.d.ts.map +1 -1
  318. package/dist/communication-dashboards.module.js +7 -1
  319. package/dist/communication-dashboards.module.js.map +1 -1
  320. package/dist/component-studio-dashboards.module.d.ts +34 -22
  321. package/dist/component-studio-dashboards.module.d.ts.map +1 -1
  322. package/dist/component-studio-dashboards.module.js +65 -9
  323. package/dist/component-studio-dashboards.module.js.map +1 -1
  324. package/dist/testing-dashboards.module.d.ts +4 -5
  325. package/dist/testing-dashboards.module.d.ts.map +1 -1
  326. package/dist/testing-dashboards.module.js +7 -5
  327. package/dist/testing-dashboards.module.js.map +1 -1
  328. package/package.json +55 -53
@@ -39,65 +39,67 @@ function KnowledgeConfigResourceComponent_Conditional_5_Template(rf, ctx) { if (
39
39
  i0.ɵɵelementStart(0, "button", 7);
40
40
  i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ResetConfiguration()); });
41
41
  i0.ɵɵelement(1, "i", 8);
42
- i0.ɵɵtext(2, " Reset ");
43
- i0.ɵɵelementEnd();
44
- i0.ɵɵelementStart(3, "button", 9);
45
- i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_5_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SaveConfiguration()); });
46
- i0.ɵɵelement(4, "i", 10);
47
- i0.ɵɵtext(5);
48
- i0.ɵɵelementEnd();
42
+ i0.ɵɵelementStart(2, "span", 9);
43
+ i0.ɵɵtext(3, "Reset");
44
+ i0.ɵɵelementEnd()();
45
+ i0.ɵɵelementStart(4, "button", 10);
46
+ i0.ɵɵlistener("click", function KnowledgeConfigResourceComponent_Conditional_5_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SaveConfiguration()); });
47
+ i0.ɵɵelement(5, "i", 11);
48
+ i0.ɵɵelementStart(6, "span", 9);
49
+ i0.ɵɵtext(7);
50
+ i0.ɵɵelementEnd()();
49
51
  } if (rf & 2) {
50
52
  const ctx_r1 = i0.ɵɵnextContext();
51
53
  i0.ɵɵproperty("disabled", ctx_r1.IsSaving);
52
- i0.ɵɵadvance(3);
54
+ i0.ɵɵadvance(4);
53
55
  i0.ɵɵproperty("disabled", ctx_r1.IsSaving);
54
- i0.ɵɵadvance(2);
55
- i0.ɵɵtextInterpolate1(" ", ctx_r1.IsSaving ? "Saving\u2026" : "Save", " ");
56
+ i0.ɵɵadvance(3);
57
+ i0.ɵɵtextInterpolate(ctx_r1.IsSaving ? "Saving\u2026" : "Save");
56
58
  } }
57
59
  function KnowledgeConfigResourceComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
58
60
  i0.ɵɵelementStart(0, "div", 5);
59
- i0.ɵɵelement(1, "mj-loading", 11);
61
+ i0.ɵɵelement(1, "mj-loading", 12);
60
62
  i0.ɵɵelementEnd();
61
63
  } }
62
64
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template(rf, ctx) { if (rf & 1) {
63
65
  const _r4 = i0.ɵɵgetCurrentView();
64
- i0.ɵɵelementStart(0, "div", 14)(1, "div", 17)(2, "label", 18)(3, "div", 19)(4, "span", 20);
66
+ i0.ɵɵelementStart(0, "div", 15)(1, "div", 18)(2, "label", 19)(3, "div", 20)(4, "span", 21);
65
67
  i0.ɵɵtext(5, "Auto-tag on Ingest");
66
68
  i0.ɵɵelementEnd();
67
- i0.ɵɵelementStart(6, "span", 21);
69
+ i0.ɵɵelementStart(6, "span", 22);
68
70
  i0.ɵɵtext(7, "Automatically run autotagging when new content is ingested");
69
71
  i0.ɵɵelementEnd()();
70
- i0.ɵɵelementStart(8, "input", 22);
72
+ i0.ɵɵelementStart(8, "input", 23);
71
73
  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
74
  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()); });
73
75
  i0.ɵɵelementEnd()();
74
- i0.ɵɵelementStart(9, "label", 18)(10, "div", 19)(11, "span", 20);
76
+ i0.ɵɵelementStart(9, "label", 19)(10, "div", 20)(11, "span", 21);
75
77
  i0.ɵɵtext(12, "Vectorize on Ingest");
76
78
  i0.ɵɵelementEnd();
77
- i0.ɵɵelementStart(13, "span", 21);
79
+ i0.ɵɵelementStart(13, "span", 22);
78
80
  i0.ɵɵtext(14, "Automatically create embeddings for new content");
79
81
  i0.ɵɵelementEnd()();
80
- i0.ɵɵelementStart(15, "input", 22);
82
+ i0.ɵɵelementStart(15, "input", 23);
81
83
  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
84
  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()); });
83
85
  i0.ɵɵelementEnd()();
84
- i0.ɵɵelementStart(16, "div", 23)(17, "div", 24)(18, "span", 20);
86
+ i0.ɵɵelementStart(16, "div", 24)(17, "div", 25)(18, "span", 21);
85
87
  i0.ɵɵtext(19, "Default Batch Size");
86
88
  i0.ɵɵelementEnd();
87
- i0.ɵɵelementStart(20, "span", 21);
89
+ i0.ɵɵelementStart(20, "span", 22);
88
90
  i0.ɵɵtext(21, "Number of items processed per batch");
89
91
  i0.ɵɵelementEnd()();
90
- i0.ɵɵelementStart(22, "input", 25);
92
+ i0.ɵɵelementStart(22, "input", 26);
91
93
  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
94
  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()); });
93
95
  i0.ɵɵelementEnd()();
94
- i0.ɵɵelementStart(23, "div", 23)(24, "div", 24)(25, "span", 20);
96
+ i0.ɵɵelementStart(23, "div", 24)(24, "div", 25)(25, "span", 21);
95
97
  i0.ɵɵtext(26, "Max Concurrent Jobs");
96
98
  i0.ɵɵelementEnd();
97
- i0.ɵɵelementStart(27, "span", 21);
99
+ i0.ɵɵelementStart(27, "span", 22);
98
100
  i0.ɵɵtext(28, "Maximum number of pipeline jobs running at once");
99
101
  i0.ɵɵelementEnd()();
100
- i0.ɵɵelementStart(29, "input", 26);
102
+ i0.ɵɵelementStart(29, "input", 27);
101
103
  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
104
  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()); });
103
105
  i0.ɵɵelementEnd()()()();
@@ -113,15 +115,15 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template(r
113
115
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.PipelineSettings.MaxConcurrentJobs);
114
116
  } }
115
117
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_12_Template(rf, ctx) { if (rf & 1) {
116
- i0.ɵɵelement(0, "i", 36);
118
+ i0.ɵɵelement(0, "i", 37);
117
119
  } }
118
120
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_13_Template(rf, ctx) { if (rf & 1) {
119
- i0.ɵɵelementStart(0, "span", 37);
121
+ i0.ɵɵelementStart(0, "span", 38);
120
122
  i0.ɵɵtext(1, "1");
121
123
  i0.ɵɵelementEnd();
122
124
  } }
123
125
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_17_Template(rf, ctx) { if (rf & 1) {
124
- i0.ɵɵelementStart(0, "span", 40);
126
+ i0.ɵɵelementStart(0, "span", 41);
125
127
  i0.ɵɵtext(1);
126
128
  i0.ɵɵelementEnd();
127
129
  } if (rf & 2) {
@@ -130,12 +132,12 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
130
132
  i0.ɵɵtextInterpolate1("", ctx_r1.VectorDBProviders.length, " provider(s) registered");
131
133
  } }
132
134
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_18_Template(rf, ctx) { if (rf & 1) {
133
- i0.ɵɵelementStart(0, "span", 40);
135
+ i0.ɵɵelementStart(0, "span", 41);
134
136
  i0.ɵɵtext(1, "No providers registered. Add a vector database provider (e.g., Pinecone, Weaviate) via the admin console.");
135
137
  i0.ɵɵelementEnd();
136
138
  } }
137
139
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_For_20_Template(rf, ctx) { if (rf & 1) {
138
- i0.ɵɵelementStart(0, "option", 56);
140
+ i0.ɵɵelementStart(0, "option", 57);
139
141
  i0.ɵɵtext(1);
140
142
  i0.ɵɵelementEnd();
141
143
  } if (rf & 2) {
@@ -145,36 +147,36 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
145
147
  i0.ɵɵtextInterpolate(cred_r7.Name);
146
148
  } }
147
149
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
148
- i0.ɵɵelement(0, "i", 57);
150
+ i0.ɵɵelement(0, "i", 58);
149
151
  } }
150
152
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Template(rf, ctx) { if (rf & 1) {
151
153
  const _r5 = i0.ɵɵgetCurrentView();
152
- i0.ɵɵelementStart(0, "div", 44)(1, "div", 45);
153
- i0.ɵɵelement(2, "i", 46);
154
+ i0.ɵɵelementStart(0, "div", 45)(1, "div", 46);
155
+ i0.ɵɵelement(2, "i", 47);
154
156
  i0.ɵɵelementEnd();
155
- i0.ɵɵelementStart(3, "div", 47)(4, "span", 48);
157
+ i0.ɵɵelementStart(3, "div", 48)(4, "span", 49);
156
158
  i0.ɵɵtext(5);
157
159
  i0.ɵɵelementEnd();
158
- i0.ɵɵelementStart(6, "span", 49);
160
+ i0.ɵɵelementStart(6, "span", 50);
159
161
  i0.ɵɵtext(7);
160
162
  i0.ɵɵelementEnd()();
161
- i0.ɵɵelementStart(8, "span", 50);
162
- i0.ɵɵelement(9, "i", 36);
163
+ i0.ɵɵelementStart(8, "span", 51);
164
+ i0.ɵɵelement(9, "i", 37);
163
165
  i0.ɵɵtext(10, " Active ");
164
166
  i0.ɵɵelementEnd()();
165
- i0.ɵɵelementStart(11, "div", 51)(12, "label", 52);
166
- i0.ɵɵelement(13, "i", 53);
167
+ i0.ɵɵelementStart(11, "div", 52)(12, "label", 53);
168
+ i0.ɵɵelement(13, "i", 54);
167
169
  i0.ɵɵtext(14, " API Credential ");
168
170
  i0.ɵɵelementEnd();
169
- i0.ɵɵelementStart(15, "div", 54)(16, "select", 55);
171
+ i0.ɵɵelementStart(15, "div", 55)(16, "select", 56);
170
172
  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
173
  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);
174
+ i0.ɵɵelementStart(17, "option", 57);
173
175
  i0.ɵɵtext(18, "None (use environment variable)");
174
176
  i0.ɵɵelementEnd();
175
- i0.ɵɵrepeaterCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_For_20_Template, 2, 2, "option", 56, _forTrack0);
177
+ i0.ɵɵrepeaterCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_For_20_Template, 2, 2, "option", 57, _forTrack0);
176
178
  i0.ɵɵelementEnd();
177
- i0.ɵɵconditionalCreate(21, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Conditional_21_Template, 1, 0, "i", 57);
179
+ i0.ɵɵconditionalCreate(21, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Conditional_21_Template, 1, 0, "i", 58);
178
180
  i0.ɵɵelementEnd()();
179
181
  } if (rf & 2) {
180
182
  const provider_r6 = ctx.$implicit;
@@ -194,7 +196,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
194
196
  i0.ɵɵconditional(ctx_r1.IsSavingCredential ? 21 : -1);
195
197
  } }
196
198
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_Template(rf, ctx) { if (rf & 1) {
197
- i0.ɵɵelementStart(0, "div", 41);
199
+ i0.ɵɵelementStart(0, "div", 42);
198
200
  i0.ɵɵrepeaterCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_For_2_Template, 22, 6, null, null, _forTrack0);
199
201
  i0.ɵɵelementEnd();
200
202
  } if (rf & 2) {
@@ -203,15 +205,15 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
203
205
  i0.ɵɵrepeater(ctx_r1.VectorDBProviders);
204
206
  } }
205
207
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_23_Template(rf, ctx) { if (rf & 1) {
206
- i0.ɵɵelement(0, "i", 36);
208
+ i0.ɵɵelement(0, "i", 37);
207
209
  } }
208
210
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_24_Template(rf, ctx) { if (rf & 1) {
209
- i0.ɵɵelementStart(0, "span", 37);
211
+ i0.ɵɵelementStart(0, "span", 38);
210
212
  i0.ɵɵtext(1, "2");
211
213
  i0.ɵɵelementEnd();
212
214
  } }
213
215
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_28_Template(rf, ctx) { if (rf & 1) {
214
- i0.ɵɵelementStart(0, "span", 40);
216
+ i0.ɵɵelementStart(0, "span", 41);
215
217
  i0.ɵɵtext(1);
216
218
  i0.ɵɵelementEnd();
217
219
  } if (rf & 2) {
@@ -220,12 +222,12 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
220
222
  i0.ɵɵtextInterpolate1("", ctx_r1.EmbeddingModels.length, " model(s) available");
221
223
  } }
222
224
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_29_Template(rf, ctx) { if (rf & 1) {
223
- i0.ɵɵelementStart(0, "span", 40);
225
+ i0.ɵɵelementStart(0, "span", 41);
224
226
  i0.ɵɵtext(1, "No embedding models found. Configure at least one in the AI app > Models tab.");
225
227
  i0.ɵɵelementEnd();
226
228
  } }
227
229
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_30_For_3_Template(rf, ctx) { if (rf & 1) {
228
- i0.ɵɵelementStart(0, "span", 59);
230
+ i0.ɵɵelementStart(0, "span", 60);
229
231
  i0.ɵɵtext(1);
230
232
  i0.ɵɵelementEnd();
231
233
  } if (rf & 2) {
@@ -234,8 +236,8 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
234
236
  i0.ɵɵtextInterpolate(model_r8.Name);
235
237
  } }
236
238
  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);
239
+ i0.ɵɵelementStart(0, "div", 42)(1, "div", 59);
240
+ i0.ɵɵrepeaterCreate(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_30_For_3_Template, 2, 1, "span", 60, _forTrack0);
239
241
  i0.ɵɵelementEnd()();
240
242
  } if (rf & 2) {
241
243
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -243,15 +245,15 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
243
245
  i0.ɵɵrepeater(ctx_r1.EmbeddingModels);
244
246
  } }
245
247
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_34_Template(rf, ctx) { if (rf & 1) {
246
- i0.ɵɵelement(0, "i", 36);
248
+ i0.ɵɵelement(0, "i", 37);
247
249
  } }
248
250
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_35_Template(rf, ctx) { if (rf & 1) {
249
- i0.ɵɵelementStart(0, "span", 37);
251
+ i0.ɵɵelementStart(0, "span", 38);
250
252
  i0.ɵɵtext(1, "3");
251
253
  i0.ɵɵelementEnd();
252
254
  } }
253
255
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_39_Template(rf, ctx) { if (rf & 1) {
254
- i0.ɵɵelementStart(0, "span", 40);
256
+ i0.ɵɵelementStart(0, "span", 41);
255
257
  i0.ɵɵtext(1);
256
258
  i0.ɵɵelementEnd();
257
259
  } if (rf & 2) {
@@ -260,44 +262,44 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
260
262
  i0.ɵɵtextInterpolate1("", ctx_r1.VectorIndexes.length, " index(es) configured");
261
263
  } }
262
264
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_40_Template(rf, ctx) { if (rf & 1) {
263
- i0.ɵɵelementStart(0, "span", 40);
265
+ i0.ɵɵelementStart(0, "span", 41);
264
266
  i0.ɵɵtext(1, "No indexes yet \u2014 create one below.");
265
267
  i0.ɵɵelementEnd();
266
268
  } }
267
269
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_41_Template(rf, ctx) { if (rf & 1) {
268
- i0.ɵɵelementStart(0, "span", 40);
270
+ i0.ɵɵelementStart(0, "span", 41);
269
271
  i0.ɵɵtext(1, "Complete steps 1 and 2 first.");
270
272
  i0.ɵɵelementEnd();
271
273
  } }
272
274
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_42_Template(rf, ctx) { if (rf & 1) {
273
275
  const _r9 = i0.ɵɵgetCurrentView();
274
- i0.ɵɵelementStart(0, "button", 60);
276
+ i0.ɵɵelementStart(0, "button", 61);
275
277
  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);
278
+ i0.ɵɵelement(1, "i", 62);
277
279
  i0.ɵɵtext(2, " Create Index ");
278
280
  i0.ɵɵelementEnd();
279
281
  } }
280
282
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_43_For_2_Template(rf, ctx) { if (rf & 1) {
281
283
  const _r10 = i0.ɵɵgetCurrentView();
282
- i0.ɵɵelementStart(0, "div", 62)(1, "div", 63);
283
- i0.ɵɵelement(2, "i", 64);
284
+ i0.ɵɵelementStart(0, "div", 63)(1, "div", 64);
285
+ i0.ɵɵelement(2, "i", 65);
284
286
  i0.ɵɵelementEnd();
285
- i0.ɵɵelementStart(3, "div", 65)(4, "span", 66);
287
+ i0.ɵɵelementStart(3, "div", 66)(4, "span", 67);
286
288
  i0.ɵɵtext(5);
287
289
  i0.ɵɵelementEnd();
288
- i0.ɵɵelementStart(6, "span", 67);
289
- i0.ɵɵelement(7, "i", 46);
290
+ i0.ɵɵelementStart(6, "span", 68);
291
+ i0.ɵɵelement(7, "i", 47);
290
292
  i0.ɵɵtext(8);
291
- i0.ɵɵelement(9, "i", 68);
293
+ i0.ɵɵelement(9, "i", 69);
292
294
  i0.ɵɵtext(10);
293
295
  i0.ɵɵelementEnd()();
294
- i0.ɵɵelementStart(11, "div", 69)(12, "span", 50);
295
- i0.ɵɵelement(13, "i", 36);
296
+ i0.ɵɵelementStart(11, "div", 70)(12, "span", 51);
297
+ i0.ɵɵelement(13, "i", 37);
296
298
  i0.ɵɵtext(14, " Active ");
297
299
  i0.ɵɵelementEnd();
298
- i0.ɵɵelementStart(15, "button", 70);
300
+ i0.ɵɵelementStart(15, "button", 71);
299
301
  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);
302
+ i0.ɵɵelement(16, "i", 72);
301
303
  i0.ɵɵelementEnd()()();
302
304
  } if (rf & 2) {
303
305
  const idx_r11 = ctx.$implicit;
@@ -309,8 +311,8 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
309
311
  i0.ɵɵtextInterpolate1(" ", idx_r11.EmbeddingModel, " ");
310
312
  } }
311
313
  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);
314
+ i0.ɵɵelementStart(0, "div", 42);
315
+ i0.ɵɵrepeaterCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_43_For_2_Template, 17, 3, "div", 63, _forTrack0);
314
316
  i0.ɵɵelementEnd();
315
317
  } if (rf & 2) {
316
318
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -318,7 +320,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
318
320
  i0.ɵɵrepeater(ctx_r1.VectorIndexes);
319
321
  } }
320
322
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_For_14_Template(rf, ctx) { if (rf & 1) {
321
- i0.ɵɵelementStart(0, "option", 79);
323
+ i0.ɵɵelementStart(0, "option", 80);
322
324
  i0.ɵɵtext(1);
323
325
  i0.ɵɵelementEnd();
324
326
  } if (rf & 2) {
@@ -328,7 +330,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
328
330
  i0.ɵɵtextInterpolate(db_r13.Name);
329
331
  } }
330
332
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_For_20_Template(rf, ctx) { if (rf & 1) {
331
- i0.ɵɵelementStart(0, "option", 79);
333
+ i0.ɵɵelementStart(0, "option", 80);
332
334
  i0.ɵɵtext(1);
333
335
  i0.ɵɵelementEnd();
334
336
  } if (rf & 2) {
@@ -338,44 +340,44 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
338
340
  i0.ɵɵtextInterpolate(model_r14.Name);
339
341
  } }
340
342
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Conditional_23_Template(rf, ctx) { if (rf & 1) {
341
- i0.ɵɵelement(0, "i", 83);
343
+ i0.ɵɵelement(0, "i", 84);
342
344
  i0.ɵɵtext(1, " Creating... ");
343
345
  } }
344
346
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Conditional_24_Template(rf, ctx) { if (rf & 1) {
345
- i0.ɵɵelement(0, "i", 61);
347
+ i0.ɵɵelement(0, "i", 62);
346
348
  i0.ɵɵtext(1, " Create Index ");
347
349
  } }
348
350
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template(rf, ctx) { if (rf & 1) {
349
351
  const _r12 = i0.ɵɵgetCurrentView();
350
- i0.ɵɵelementStart(0, "div", 43)(1, "h4", 72);
351
- i0.ɵɵelement(2, "i", 73);
352
+ i0.ɵɵelementStart(0, "div", 44)(1, "h4", 73);
353
+ i0.ɵɵelement(2, "i", 74);
352
354
  i0.ɵɵtext(3, " Create New Vector Index ");
353
355
  i0.ɵɵelementEnd();
354
- i0.ɵɵelementStart(4, "div", 74)(5, "div", 75)(6, "label", 76);
356
+ i0.ɵɵelementStart(4, "div", 75)(5, "div", 76)(6, "label", 77);
355
357
  i0.ɵɵtext(7, "Index Name");
356
358
  i0.ɵɵelementEnd();
357
- i0.ɵɵelementStart(8, "input", 77);
359
+ i0.ɵɵelementStart(8, "input", 78);
358
360
  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); });
359
361
  i0.ɵɵelementEnd()();
360
- i0.ɵɵelementStart(9, "div", 75)(10, "label", 76);
362
+ i0.ɵɵelementStart(9, "div", 76)(10, "label", 77);
361
363
  i0.ɵɵtext(11, "Vector Database");
362
364
  i0.ɵɵelementEnd();
363
- i0.ɵɵelementStart(12, "select", 78);
365
+ i0.ɵɵelementStart(12, "select", 79);
364
366
  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);
367
+ i0.ɵɵrepeaterCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_For_14_Template, 2, 2, "option", 80, _forTrack0);
366
368
  i0.ɵɵelementEnd()();
367
- i0.ɵɵelementStart(15, "div", 75)(16, "label", 76);
369
+ i0.ɵɵelementStart(15, "div", 76)(16, "label", 77);
368
370
  i0.ɵɵtext(17, "Embedding Model");
369
371
  i0.ɵɵelementEnd();
370
- i0.ɵɵelementStart(18, "select", 78);
372
+ i0.ɵɵelementStart(18, "select", 79);
371
373
  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);
374
+ i0.ɵɵrepeaterCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_For_20_Template, 2, 2, "option", 80, _forTrack0);
373
375
  i0.ɵɵelementEnd()()();
374
- i0.ɵɵelementStart(21, "div", 80)(22, "button", 81);
376
+ i0.ɵɵelementStart(21, "div", 81)(22, "button", 82);
375
377
  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
378
  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);
377
379
  i0.ɵɵelementEnd();
378
- i0.ɵɵelementStart(25, "button", 82);
380
+ i0.ɵɵelementStart(25, "button", 83);
379
381
  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()); });
380
382
  i0.ɵɵtext(26, " Cancel ");
381
383
  i0.ɵɵelementEnd()()();
@@ -399,47 +401,47 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditiona
399
401
  i0.ɵɵproperty("disabled", ctx_r1.IsCreatingIndex);
400
402
  } }
401
403
  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);
404
+ i0.ɵɵelementStart(0, "div", 15)(1, "div", 28)(2, "div", 29)(3, "span", 30);
403
405
  i0.ɵɵtext(4, "Setup Progress");
404
406
  i0.ɵɵelementEnd();
405
- i0.ɵɵelementStart(5, "span", 30);
407
+ i0.ɵɵelementStart(5, "span", 31);
406
408
  i0.ɵɵtext(6);
407
409
  i0.ɵɵelementEnd()();
408
- i0.ɵɵelementStart(7, "div", 31);
409
- i0.ɵɵelement(8, "div", 32);
410
+ i0.ɵɵelementStart(7, "div", 32);
411
+ i0.ɵɵelement(8, "div", 33);
410
412
  i0.ɵɵelementEnd()();
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);
413
+ i0.ɵɵelementStart(9, "div", 34)(10, "div", 35)(11, "div", 36);
414
+ i0.ɵɵconditionalCreate(12, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_12_Template, 1, 0, "i", 37)(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_13_Template, 2, 0, "span", 38);
413
415
  i0.ɵɵelementEnd();
414
- i0.ɵɵelementStart(14, "div", 38)(15, "span", 39);
416
+ i0.ɵɵelementStart(14, "div", 39)(15, "span", 40);
415
417
  i0.ɵɵtext(16, "Vector Database Providers");
416
418
  i0.ɵɵelementEnd();
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);
419
+ i0.ɵɵconditionalCreate(17, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_17_Template, 2, 1, "span", 41)(18, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_18_Template, 2, 0, "span", 41);
418
420
  i0.ɵɵelementEnd()();
419
- i0.ɵɵconditionalCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_Template, 3, 0, "div", 41);
421
+ i0.ɵɵconditionalCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_19_Template, 3, 0, "div", 42);
420
422
  i0.ɵɵelementEnd();
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);
423
+ i0.ɵɵelementStart(20, "div", 34)(21, "div", 35)(22, "div", 36);
424
+ i0.ɵɵconditionalCreate(23, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_23_Template, 1, 0, "i", 37)(24, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_24_Template, 2, 0, "span", 38);
423
425
  i0.ɵɵelementEnd();
424
- i0.ɵɵelementStart(25, "div", 38)(26, "span", 39);
426
+ i0.ɵɵelementStart(25, "div", 39)(26, "span", 40);
425
427
  i0.ɵɵtext(27, "Embedding Models");
426
428
  i0.ɵɵelementEnd();
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);
429
+ i0.ɵɵconditionalCreate(28, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_28_Template, 2, 1, "span", 41)(29, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_29_Template, 2, 0, "span", 41);
428
430
  i0.ɵɵelementEnd()();
429
- i0.ɵɵconditionalCreate(30, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_30_Template, 4, 0, "div", 41);
431
+ i0.ɵɵconditionalCreate(30, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_30_Template, 4, 0, "div", 42);
430
432
  i0.ɵɵelementEnd();
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);
433
+ i0.ɵɵelementStart(31, "div", 34)(32, "div", 35)(33, "div", 36);
434
+ i0.ɵɵconditionalCreate(34, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_34_Template, 1, 0, "i", 37)(35, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_35_Template, 2, 0, "span", 38);
433
435
  i0.ɵɵelementEnd();
434
- i0.ɵɵelementStart(36, "div", 38)(37, "span", 39);
436
+ i0.ɵɵelementStart(36, "div", 39)(37, "span", 40);
435
437
  i0.ɵɵtext(38, "Vector Indexes");
436
438
  i0.ɵɵelementEnd();
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);
439
+ i0.ɵɵconditionalCreate(39, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_39_Template, 2, 1, "span", 41)(40, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_40_Template, 2, 0, "span", 41)(41, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_41_Template, 2, 0, "span", 41);
438
440
  i0.ɵɵelementEnd();
439
- i0.ɵɵconditionalCreate(42, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_42_Template, 3, 0, "button", 42);
441
+ i0.ɵɵconditionalCreate(42, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_42_Template, 3, 0, "button", 43);
440
442
  i0.ɵɵelementEnd();
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);
443
+ i0.ɵɵconditionalCreate(43, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_43_Template, 3, 0, "div", 42);
444
+ i0.ɵɵconditionalCreate(44, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Conditional_44_Template, 27, 6, "div", 44);
443
445
  i0.ɵɵelementEnd()();
444
446
  } if (rf & 2) {
445
447
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -477,20 +479,20 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Template(r
477
479
  i0.ɵɵconditional(ctx_r1.ShowCreateIndexForm ? 44 : -1);
478
480
  } }
479
481
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_1_Template(rf, ctx) { if (rf & 1) {
480
- i0.ɵɵelement(0, "mj-loading", 84);
482
+ i0.ɵɵelement(0, "mj-loading", 85);
481
483
  } }
482
484
  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);
485
+ i0.ɵɵelementStart(0, "div", 86);
486
+ i0.ɵɵelement(1, "i", 87);
487
+ i0.ɵɵelementStart(2, "h3", 88);
486
488
  i0.ɵɵtext(3, "No Searchable Entities Found");
487
489
  i0.ɵɵelementEnd();
488
- i0.ɵɵelementStart(4, "p", 88);
490
+ i0.ɵɵelementStart(4, "p", 89);
489
491
  i0.ɵɵtext(5, "No entities with text fields were discovered. Ensure your database schema includes entities with varchar/nvarchar columns.");
490
492
  i0.ɵɵelementEnd()();
491
493
  } }
492
494
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_For_8_Template(rf, ctx) { if (rf & 1) {
493
- i0.ɵɵelementStart(0, "span", 100);
495
+ i0.ɵɵelementStart(0, "span", 101);
494
496
  i0.ɵɵtext(1);
495
497
  i0.ɵɵelementEnd();
496
498
  } if (rf & 2) {
@@ -499,8 +501,8 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditiona
499
501
  i0.ɵɵtextInterpolate(field_r18);
500
502
  } }
501
503
  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);
504
+ i0.ɵɵelementStart(0, "span", 105);
505
+ i0.ɵɵelement(1, "i", 106);
504
506
  i0.ɵɵtext(2);
505
507
  i0.ɵɵelementEnd();
506
508
  } if (rf & 2) {
@@ -510,21 +512,21 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditiona
510
512
  } }
511
513
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Template(rf, ctx) { if (rf & 1) {
512
514
  const _r16 = i0.ɵɵgetCurrentView();
513
- i0.ɵɵelementStart(0, "div", 95)(1, "div", 96)(2, "input", 22);
515
+ i0.ɵɵelementStart(0, "div", 96)(1, "div", 97)(2, "input", 23);
514
516
  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
517
  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)); });
516
518
  i0.ɵɵelementEnd()();
517
- i0.ɵɵelementStart(3, "div", 97)(4, "span", 98);
519
+ i0.ɵɵelementStart(3, "div", 98)(4, "span", 99);
518
520
  i0.ɵɵtext(5);
519
521
  i0.ɵɵelementEnd();
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);
522
+ i0.ɵɵelementStart(6, "div", 100);
523
+ i0.ɵɵrepeaterCreate(7, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_For_8_Template, 2, 1, "span", 101, i0.ɵɵrepeaterTrackByIdentity);
522
524
  i0.ɵɵelementEnd()();
523
- i0.ɵɵelementStart(9, "div", 101)(10, "span", 102);
524
- i0.ɵɵelement(11, "i", 103);
525
+ i0.ɵɵelementStart(9, "div", 102)(10, "span", 103);
526
+ i0.ɵɵelement(11, "i", 104);
525
527
  i0.ɵɵtext(12);
526
528
  i0.ɵɵelementEnd();
527
- i0.ɵɵconditionalCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Conditional_13_Template, 3, 1, "span", 104);
529
+ i0.ɵɵconditionalCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Conditional_13_Template, 3, 1, "span", 105);
528
530
  i0.ɵɵelementEnd()();
529
531
  } if (rf & 2) {
530
532
  const entity_r17 = ctx.$implicit;
@@ -542,14 +544,14 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditiona
542
544
  } }
543
545
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_Template(rf, ctx) { if (rf & 1) {
544
546
  const _r15 = i0.ɵɵgetCurrentView();
545
- i0.ɵɵelementStart(0, "div", 89)(1, "div", 90)(2, "span", 91);
547
+ i0.ɵɵelementStart(0, "div", 90)(1, "div", 91)(2, "span", 92);
546
548
  i0.ɵɵtext(3);
547
549
  i0.ɵɵelementEnd();
548
- i0.ɵɵelementStart(4, "input", 92);
550
+ i0.ɵɵelementStart(4, "input", 93);
549
551
  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); });
550
552
  i0.ɵɵelementEnd()()();
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);
553
+ i0.ɵɵelementStart(5, "div", 94);
554
+ i0.ɵɵrepeaterCreate(6, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_For_7_Template, 14, 6, "div", 95, _forTrack1);
553
555
  i0.ɵɵelementEnd();
554
556
  } if (rf & 2) {
555
557
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -561,8 +563,8 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditiona
561
563
  i0.ɵɵrepeater(ctx_r1.FilteredFTSEntities);
562
564
  } }
563
565
  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);
566
+ i0.ɵɵelementStart(0, "div", 15);
567
+ i0.ɵɵconditionalCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_1_Template, 1, 0, "mj-loading", 85)(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_2_Template, 6, 0, "div", 86)(3, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Conditional_3_Template, 8, 3);
566
568
  i0.ɵɵelementEnd();
567
569
  } if (rf & 2) {
568
570
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -570,7 +572,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Template(r
570
572
  i0.ɵɵconditional(ctx_r1.IsLoadingFTSEntities ? 1 : ctx_r1.FTSEntities.length === 0 ? 2 : 3);
571
573
  } }
572
574
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_1_For_17_Template(rf, ctx) { if (rf & 1) {
573
- i0.ɵɵelementStart(0, "span", 59);
575
+ i0.ɵɵelementStart(0, "span", 60);
574
576
  i0.ɵɵtext(1);
575
577
  i0.ɵɵelementEnd();
576
578
  } if (rf & 2) {
@@ -579,26 +581,26 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditiona
579
581
  i0.ɵɵtextInterpolate(model_r19.Name);
580
582
  } }
581
583
  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);
584
+ i0.ɵɵelementStart(0, "div", 18)(1, "div", 24)(2, "div", 25)(3, "span", 21);
583
585
  i0.ɵɵtext(4, "Active Model");
584
586
  i0.ɵɵelementEnd();
585
- i0.ɵɵelementStart(5, "span", 21);
587
+ i0.ɵɵelementStart(5, "span", 22);
586
588
  i0.ɵɵtext(6, "Currently selected embedding model");
587
589
  i0.ɵɵelementEnd()();
588
- i0.ɵɵelementStart(7, "span", 106);
590
+ i0.ɵɵelementStart(7, "span", 107);
589
591
  i0.ɵɵtext(8);
590
592
  i0.ɵɵelementEnd()();
591
- i0.ɵɵelementStart(9, "div", 23)(10, "div", 24)(11, "span", 20);
593
+ i0.ɵɵelementStart(9, "div", 24)(10, "div", 25)(11, "span", 21);
592
594
  i0.ɵɵtext(12, "Available Models");
593
595
  i0.ɵɵelementEnd();
594
- i0.ɵɵelementStart(13, "span", 21);
596
+ i0.ɵɵelementStart(13, "span", 22);
595
597
  i0.ɵɵtext(14);
596
598
  i0.ɵɵelementEnd()();
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);
599
+ i0.ɵɵelementStart(15, "div", 59);
600
+ i0.ɵɵrepeaterCreate(16, KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditional_1_For_17_Template, 2, 1, "span", 60, _forTrack0);
599
601
  i0.ɵɵelementEnd()()();
600
- i0.ɵɵelementStart(18, "p", 107);
601
- i0.ɵɵelement(19, "i", 108);
602
+ i0.ɵɵelementStart(18, "p", 108);
603
+ i0.ɵɵelement(19, "i", 109);
602
604
  i0.ɵɵtext(20, " Manage embedding models in the AI Dashboard > Models tab. ");
603
605
  i0.ɵɵelementEnd();
604
606
  } if (rf & 2) {
@@ -611,18 +613,18 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Conditiona
611
613
  i0.ɵɵrepeater(ctx_r1.EmbeddingModels);
612
614
  } }
613
615
  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);
616
+ i0.ɵɵelementStart(0, "div", 86);
617
+ i0.ɵɵelement(1, "i", 110);
618
+ i0.ɵɵelementStart(2, "h3", 88);
617
619
  i0.ɵɵtext(3, "No Embedding Models Found");
618
620
  i0.ɵɵelementEnd();
619
- i0.ɵɵelementStart(4, "p", 88);
621
+ i0.ɵɵelementStart(4, "p", 89);
620
622
  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. ");
621
623
  i0.ɵɵelementEnd()();
622
624
  } }
623
625
  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);
626
+ i0.ɵɵelementStart(0, "div", 15);
627
+ 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", 86);
626
628
  i0.ɵɵelementEnd();
627
629
  } if (rf & 2) {
628
630
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -631,43 +633,43 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Template(r
631
633
  } }
632
634
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template(rf, ctx) { if (rf & 1) {
633
635
  const _r20 = i0.ɵɵgetCurrentView();
634
- i0.ɵɵelementStart(0, "div", 14)(1, "div", 17)(2, "div", 23)(3, "div", 24)(4, "span", 20);
636
+ i0.ɵɵelementStart(0, "div", 15)(1, "div", 18)(2, "div", 24)(3, "div", 25)(4, "span", 21);
635
637
  i0.ɵɵtext(5, "Duplicate Absolute Match");
636
638
  i0.ɵɵelementEnd();
637
- i0.ɵɵelementStart(6, "span", 21);
639
+ i0.ɵɵelementStart(6, "span", 22);
638
640
  i0.ɵɵtext(7);
639
641
  i0.ɵɵelementEnd()();
640
- i0.ɵɵelementStart(8, "input", 110);
642
+ i0.ɵɵelementStart(8, "input", 111);
641
643
  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
644
  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()); });
643
645
  i0.ɵɵelementEnd()();
644
- i0.ɵɵelementStart(9, "div", 23)(10, "div", 24)(11, "span", 20);
646
+ i0.ɵɵelementStart(9, "div", 24)(10, "div", 25)(11, "span", 21);
645
647
  i0.ɵɵtext(12, "Duplicate Potential Match");
646
648
  i0.ɵɵelementEnd();
647
- i0.ɵɵelementStart(13, "span", 21);
649
+ i0.ɵɵelementStart(13, "span", 22);
648
650
  i0.ɵɵtext(14);
649
651
  i0.ɵɵelementEnd()();
650
- i0.ɵɵelementStart(15, "input", 111);
652
+ i0.ɵɵelementStart(15, "input", 112);
651
653
  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
654
  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()); });
653
655
  i0.ɵɵelementEnd()();
654
- i0.ɵɵelementStart(16, "div", 23)(17, "div", 24)(18, "span", 20);
656
+ i0.ɵɵelementStart(16, "div", 24)(17, "div", 25)(18, "span", 21);
655
657
  i0.ɵɵtext(19, "Search Relevance");
656
658
  i0.ɵɵelementEnd();
657
- i0.ɵɵelementStart(20, "span", 21);
659
+ i0.ɵɵelementStart(20, "span", 22);
658
660
  i0.ɵɵtext(21);
659
661
  i0.ɵɵelementEnd()();
660
- i0.ɵɵelementStart(22, "input", 112);
662
+ i0.ɵɵelementStart(22, "input", 113);
661
663
  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
664
  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()); });
663
665
  i0.ɵɵelementEnd()();
664
- i0.ɵɵelementStart(23, "div", 23)(24, "div", 24)(25, "span", 20);
666
+ i0.ɵɵelementStart(23, "div", 24)(24, "div", 25)(25, "span", 21);
665
667
  i0.ɵɵtext(26, "Autotag Confidence");
666
668
  i0.ɵɵelementEnd();
667
- i0.ɵɵelementStart(27, "span", 21);
669
+ i0.ɵɵelementStart(27, "span", 22);
668
670
  i0.ɵɵtext(28);
669
671
  i0.ɵɵelementEnd()();
670
- i0.ɵɵelementStart(29, "input", 111);
672
+ i0.ɵɵelementStart(29, "input", 112);
671
673
  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
674
  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()); });
673
675
  i0.ɵɵelementEnd()()()();
@@ -691,12 +693,12 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template(r
691
693
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ThresholdSettings.AutotagConfidence);
692
694
  } }
693
695
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_9_Template(rf, ctx) { if (rf & 1) {
694
- i0.ɵɵelementStart(0, "div", 117);
696
+ i0.ɵɵelementStart(0, "div", 118);
695
697
  i0.ɵɵtext(1, "Loading\u2026");
696
698
  i0.ɵɵelementEnd();
697
699
  } }
698
700
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_10_Template(rf, ctx) { if (rf & 1) {
699
- i0.ɵɵelementStart(0, "div", 118);
701
+ i0.ɵɵelementStart(0, "div", 119);
700
702
  i0.ɵɵtext(1, " No scopes defined yet. Click ");
701
703
  i0.ɵɵelementStart(2, "strong");
702
704
  i0.ɵɵtext(3, "New");
@@ -705,24 +707,24 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Condition
705
707
  i0.ɵɵelementEnd();
706
708
  } }
707
709
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
708
- i0.ɵɵelementStart(0, "span", 125);
710
+ i0.ɵɵelementStart(0, "span", 126);
709
711
  i0.ɵɵtext(1, "Global");
710
712
  i0.ɵɵelementEnd();
711
713
  } }
712
714
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
713
- i0.ɵɵelementStart(0, "span", 125);
715
+ i0.ɵɵelementStart(0, "span", 126);
714
716
  i0.ɵɵtext(1, "Default");
715
717
  i0.ɵɵelementEnd();
716
718
  } }
717
719
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Template(rf, ctx) { if (rf & 1) {
718
720
  const _r22 = i0.ɵɵgetCurrentView();
719
- i0.ɵɵelementStart(0, "button", 122);
721
+ i0.ɵɵelementStart(0, "button", 123);
720
722
  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);
723
+ i0.ɵɵelement(1, "i", 124);
724
+ i0.ɵɵelementStart(2, "span", 125);
723
725
  i0.ɵɵtext(3);
724
726
  i0.ɵɵelementEnd();
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);
727
+ i0.ɵɵconditionalCreate(4, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Conditional_4_Template, 2, 0, "span", 126)(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Conditional_5_Template, 2, 0, "span", 126);
726
728
  i0.ɵɵelementEnd();
727
729
  } if (rf & 2) {
728
730
  const s_r23 = ctx.$implicit;
@@ -736,90 +738,90 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Condition
736
738
  i0.ɵɵconditional(s_r23.IsGlobal ? 4 : s_r23.IsDefault ? 5 : -1);
737
739
  } }
738
740
  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);
741
+ i0.ɵɵrepeaterCreate(0, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_For_1_Template, 6, 6, "button", 122, _forTrack0);
740
742
  } if (rf & 2) {
741
743
  const ctx_r1 = i0.ɵɵnextContext(3);
742
744
  i0.ɵɵrepeater(ctx_r1.SearchScopes);
743
745
  } }
744
746
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_14_Template(rf, ctx) { if (rf & 1) {
745
747
  const _r25 = i0.ɵɵgetCurrentView();
746
- i0.ɵɵelementStart(0, "button", 138);
748
+ i0.ɵɵelementStart(0, "button", 139);
747
749
  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);
750
+ i0.ɵɵelement(1, "i", 140);
749
751
  i0.ɵɵtext(2, " Open Full Form ");
750
752
  i0.ɵɵelementEnd();
751
753
  } }
752
754
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_18_Template(rf, ctx) { if (rf & 1) {
753
755
  const _r26 = i0.ɵɵgetCurrentView();
754
- i0.ɵɵelementStart(0, "button", 140);
756
+ i0.ɵɵelementStart(0, "button", 141);
755
757
  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);
758
+ i0.ɵɵelement(1, "i", 142);
757
759
  i0.ɵɵelementEnd();
758
760
  } }
759
761
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template(rf, ctx) { if (rf & 1) {
760
762
  const _r27 = i0.ɵɵgetCurrentView();
761
- i0.ɵɵelementStart(0, "div", 133)(1, "label")(2, "span");
763
+ i0.ɵɵelementStart(0, "div", 134)(1, "label")(2, "span");
762
764
  i0.ɵɵtext(3, "Name");
763
765
  i0.ɵɵelementEnd();
764
- i0.ɵɵelementStart(4, "input", 142);
766
+ i0.ɵɵelementStart(4, "input", 143);
765
767
  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); });
766
768
  i0.ɵɵelementEnd()();
767
769
  i0.ɵɵelementStart(5, "label")(6, "span");
768
770
  i0.ɵɵtext(7, "Icon (Font Awesome class)");
769
771
  i0.ɵɵelementEnd();
770
- i0.ɵɵelementStart(8, "input", 142);
772
+ i0.ɵɵelementStart(8, "input", 143);
771
773
  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); });
772
774
  i0.ɵɵelementEnd()();
773
- i0.ɵɵelementStart(9, "label", 143)(10, "span");
775
+ i0.ɵɵelementStart(9, "label", 144)(10, "span");
774
776
  i0.ɵɵtext(11, "Description");
775
777
  i0.ɵɵelementEnd();
776
- i0.ɵɵelementStart(12, "textarea", 144);
778
+ i0.ɵɵelementStart(12, "textarea", 145);
777
779
  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); });
778
780
  i0.ɵɵelementEnd()();
779
781
  i0.ɵɵelementStart(13, "label")(14, "span");
780
782
  i0.ɵɵtext(15, "Status");
781
783
  i0.ɵɵelementEnd();
782
- i0.ɵɵelementStart(16, "select", 145);
784
+ i0.ɵɵelementStart(16, "select", 146);
783
785
  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);
786
+ i0.ɵɵelementStart(17, "option", 147);
785
787
  i0.ɵɵtext(18, "Active");
786
788
  i0.ɵɵelementEnd();
787
- i0.ɵɵelementStart(19, "option", 147);
789
+ i0.ɵɵelementStart(19, "option", 148);
788
790
  i0.ɵɵtext(20, "Inactive");
789
791
  i0.ɵɵelementEnd()()();
790
792
  i0.ɵɵelementStart(21, "label")(22, "span");
791
793
  i0.ɵɵtext(23, "Start at");
792
794
  i0.ɵɵelementEnd();
793
- i0.ɵɵelementStart(24, "input", 148);
795
+ i0.ɵɵelementStart(24, "input", 149);
794
796
  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)); });
795
797
  i0.ɵɵelementEnd()();
796
798
  i0.ɵɵelementStart(25, "label")(26, "span");
797
799
  i0.ɵɵtext(27, "End at");
798
800
  i0.ɵɵelementEnd();
799
- i0.ɵɵelementStart(28, "input", 148);
801
+ i0.ɵɵelementStart(28, "input", 149);
800
802
  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)); });
801
803
  i0.ɵɵelementEnd()();
802
- i0.ɵɵelementStart(29, "label", 149)(30, "input", 150);
804
+ i0.ɵɵelementStart(29, "label", 150)(30, "input", 151);
803
805
  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); });
804
806
  i0.ɵɵelementEnd();
805
807
  i0.ɵɵelementStart(31, "span");
806
808
  i0.ɵɵtext(32, "Default scope \u2014 picked when users/agents don't specify one");
807
809
  i0.ɵɵelementEnd()();
808
- i0.ɵɵelementStart(33, "label", 149);
809
- i0.ɵɵelement(34, "input", 151);
810
+ i0.ɵɵelementStart(33, "label", 150);
811
+ i0.ɵɵelement(34, "input", 152);
810
812
  i0.ɵɵelementStart(35, "span");
811
813
  i0.ɵɵtext(36, "Global \u2014 reserved for the built-in Global scope (read-only)");
812
814
  i0.ɵɵelementEnd()();
813
- i0.ɵɵelementStart(37, "label", 143)(38, "span");
815
+ i0.ɵɵelementStart(37, "label", 144)(38, "span");
814
816
  i0.ɵɵtext(39, "Scope Config (JSON)");
815
817
  i0.ɵɵelementEnd();
816
- i0.ɵɵelementStart(40, "textarea", 152);
818
+ i0.ɵɵelementStart(40, "textarea", 153);
817
819
  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); });
818
820
  i0.ɵɵelementEnd()();
819
- i0.ɵɵelementStart(41, "label", 143)(42, "span");
821
+ i0.ɵɵelementStart(41, "label", 144)(42, "span");
820
822
  i0.ɵɵtext(43, "Search Context Config (JSON)");
821
823
  i0.ɵɵelementEnd();
822
- i0.ɵɵelementStart(44, "textarea", 152);
824
+ i0.ɵɵelementStart(44, "textarea", 153);
823
825
  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); });
824
826
  i0.ɵɵelementEnd()()();
825
827
  } if (rf & 2) {
@@ -846,32 +848,32 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Condition
846
848
  i0.ɵɵproperty("value", ctx_r1.ActiveScope.SearchContextConfig || "");
847
849
  } }
848
850
  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);
851
+ i0.ɵɵelement(0, "mj-search-scope-child-grid", 135);
850
852
  } if (rf & 2) {
851
853
  const ctx_r1 = i0.ɵɵnextContext(4);
852
854
  i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopeProviderColumns);
853
855
  } }
854
856
  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);
857
+ i0.ɵɵelement(0, "mj-search-scope-child-grid", 136);
856
858
  } if (rf & 2) {
857
859
  const ctx_r1 = i0.ɵɵnextContext(4);
858
860
  i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopeExternalIndexColumns);
859
861
  } }
860
862
  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);
863
+ i0.ɵɵelement(0, "mj-search-scope-child-grid", 137);
862
864
  } if (rf & 2) {
863
865
  const ctx_r1 = i0.ɵɵnextContext(4);
864
866
  i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopeEntityColumns);
865
867
  } }
866
868
  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);
869
+ i0.ɵɵelement(0, "mj-search-scope-child-grid", 138);
868
870
  } if (rf & 2) {
869
871
  const ctx_r1 = i0.ɵɵnextContext(4);
870
872
  i0.ɵɵproperty("ParentID", ctx_r1.ActiveScopeID)("Columns", ctx_r1.ScopeStorageColumns);
871
873
  } }
872
874
  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);
875
+ i0.ɵɵelementStart(0, "div", 154)(1, "p", 155);
876
+ i0.ɵɵelement(2, "i", 156);
875
877
  i0.ɵɵelementStart(3, "strong");
876
878
  i0.ɵɵtext(4, "Per-user / per-role grants on this scope.");
877
879
  i0.ɵɵelementEnd();
@@ -905,7 +907,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Condition
905
907
  i0.ɵɵelementEnd();
906
908
  i0.ɵɵtext(26, " via the resolver \u2014 see the spec for the full resolution order. ");
907
909
  i0.ɵɵelementEnd()();
908
- i0.ɵɵelement(27, "mj-search-scope-child-grid", 156);
910
+ i0.ɵɵelement(27, "mj-search-scope-child-grid", 157);
909
911
  } if (rf & 2) {
910
912
  const ctx_r1 = i0.ɵɵnextContext(4);
911
913
  i0.ɵɵadvance(27);
@@ -913,44 +915,44 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Condition
913
915
  } }
914
916
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Template(rf, ctx) { if (rf & 1) {
915
917
  const _r24 = i0.ɵɵgetCurrentView();
916
- i0.ɵɵelementStart(0, "div", 126)(1, "button", 127);
918
+ i0.ɵɵelementStart(0, "div", 127)(1, "button", 128);
917
919
  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")); });
918
920
  i0.ɵɵtext(2, "Definition");
919
921
  i0.ɵɵelementEnd();
920
- i0.ɵɵelementStart(3, "button", 127);
922
+ i0.ɵɵelementStart(3, "button", 128);
921
923
  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")); });
922
924
  i0.ɵɵtext(4, "Providers");
923
925
  i0.ɵɵelementEnd();
924
- i0.ɵɵelementStart(5, "button", 127);
926
+ i0.ɵɵelementStart(5, "button", 128);
925
927
  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")); });
926
928
  i0.ɵɵtext(6, "External Indexes");
927
929
  i0.ɵɵelementEnd();
928
- i0.ɵɵelementStart(7, "button", 127);
930
+ i0.ɵɵelementStart(7, "button", 128);
929
931
  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")); });
930
932
  i0.ɵɵtext(8, "Entities");
931
933
  i0.ɵɵelementEnd();
932
- i0.ɵɵelementStart(9, "button", 127);
934
+ i0.ɵɵelementStart(9, "button", 128);
933
935
  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")); });
934
936
  i0.ɵɵtext(10, "Storage");
935
937
  i0.ɵɵelementEnd();
936
- i0.ɵɵelementStart(11, "button", 127);
938
+ i0.ɵɵelementStart(11, "button", 128);
937
939
  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")); });
938
940
  i0.ɵɵtext(12, "Permissions");
939
941
  i0.ɵɵelementEnd();
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);
942
+ i0.ɵɵelement(13, "div", 129);
943
+ i0.ɵɵconditionalCreate(14, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_14_Template, 3, 0, "button", 130);
944
+ i0.ɵɵelementStart(15, "button", 131);
943
945
  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);
946
+ i0.ɵɵelement(16, "i", 132);
945
947
  i0.ɵɵtext(17, " Save ");
946
948
  i0.ɵɵelementEnd();
947
- i0.ɵɵconditionalCreate(18, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_18_Template, 2, 0, "button", 132);
949
+ i0.ɵɵconditionalCreate(18, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_18_Template, 2, 0, "button", 133);
948
950
  i0.ɵɵelementEnd();
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);
951
+ i0.ɵɵconditionalCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_19_Template, 45, 11, "div", 134);
952
+ i0.ɵɵconditionalCreate(20, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_20_Template, 1, 2, "mj-search-scope-child-grid", 135);
953
+ i0.ɵɵconditionalCreate(21, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_21_Template, 1, 2, "mj-search-scope-child-grid", 136);
954
+ i0.ɵɵconditionalCreate(22, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_22_Template, 1, 2, "mj-search-scope-child-grid", 137);
955
+ i0.ɵɵconditionalCreate(23, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_23_Template, 1, 2, "mj-search-scope-child-grid", 138);
954
956
  i0.ɵɵconditionalCreate(24, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_13_Conditional_24_Template, 28, 2);
955
957
  } if (rf & 2) {
956
958
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -984,7 +986,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Condition
984
986
  i0.ɵɵconditional(ctx_r1.ActiveScopeTab === "permissions" ? 24 : -1);
985
987
  } }
986
988
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_14_Template(rf, ctx) { if (rf & 1) {
987
- i0.ɵɵelementStart(0, "div", 120);
989
+ i0.ɵɵelementStart(0, "div", 121);
988
990
  i0.ɵɵtext(1, " Select a scope on the left, or click ");
989
991
  i0.ɵɵelementStart(2, "strong");
990
992
  i0.ɵɵtext(3, "New");
@@ -994,18 +996,18 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Condition
994
996
  } }
995
997
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Template(rf, ctx) { if (rf & 1) {
996
998
  const _r21 = i0.ɵɵgetCurrentView();
997
- i0.ɵɵelementStart(0, "div", 14)(1, "div", 113)(2, "aside", 114)(3, "div", 115)(4, "span");
999
+ i0.ɵɵelementStart(0, "div", 15)(1, "div", 114)(2, "aside", 115)(3, "div", 116)(4, "span");
998
1000
  i0.ɵɵtext(5);
999
1001
  i0.ɵɵelementEnd();
1000
- i0.ɵɵelementStart(6, "button", 116);
1002
+ i0.ɵɵelementStart(6, "button", 117);
1001
1003
  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);
1004
+ i0.ɵɵelement(7, "i", 62);
1003
1005
  i0.ɵɵtext(8, " New ");
1004
1006
  i0.ɵɵelementEnd()();
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);
1007
+ i0.ɵɵconditionalCreate(9, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_9_Template, 2, 0, "div", 118)(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_10_Template, 5, 0, "div", 119)(11, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Conditional_11_Template, 2, 0);
1006
1008
  i0.ɵɵelementEnd();
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);
1009
+ i0.ɵɵelementStart(12, "section", 120);
1010
+ 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", 121);
1009
1011
  i0.ɵɵelementEnd()()();
1010
1012
  } if (rf & 2) {
1011
1013
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -1017,18 +1019,18 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Template(
1017
1019
  i0.ɵɵconditional(ctx_r1.ActiveScope ? 13 : 14);
1018
1020
  } }
1019
1021
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_1_Template(rf, ctx) { if (rf & 1) {
1020
- i0.ɵɵelement(0, "mj-loading", 157);
1022
+ i0.ɵɵelement(0, "mj-loading", 158);
1021
1023
  } }
1022
1024
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_2_Template(rf, ctx) { if (rf & 1) {
1023
1025
  const _r28 = i0.ɵɵgetCurrentView();
1024
- i0.ɵɵelementStart(0, "button", 159);
1026
+ i0.ɵɵelementStart(0, "button", 160);
1025
1027
  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);
1028
+ i0.ɵɵelement(1, "i", 161);
1027
1029
  i0.ɵɵtext(2, " Load analytics ");
1028
1030
  i0.ɵɵelementEnd();
1029
1031
  } }
1030
1032
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_37_Template(rf, ctx) { if (rf & 1) {
1031
- i0.ɵɵelementStart(0, "p", 167);
1033
+ i0.ɵɵelementStart(0, "p", 168);
1032
1034
  i0.ɵɵtext(1, "No runs in the window.");
1033
1035
  i0.ɵɵelementEnd();
1034
1036
  } }
@@ -1053,7 +1055,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Condition
1053
1055
  i0.ɵɵtextInterpolate1("", s_r30.AvgLatencyMs, "ms");
1054
1056
  } }
1055
1057
  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");
1058
+ i0.ɵɵelementStart(0, "table", 169)(1, "thead")(2, "tr")(3, "th");
1057
1059
  i0.ɵɵtext(4, "Scope");
1058
1060
  i0.ɵɵelementEnd();
1059
1061
  i0.ɵɵelementStart(5, "th");
@@ -1071,7 +1073,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Condition
1071
1073
  i0.ɵɵrepeater(ctx_r1.AnalyticsTopScopes);
1072
1074
  } }
1073
1075
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_41_Template(rf, ctx) { if (rf & 1) {
1074
- i0.ɵɵelementStart(0, "p", 167);
1076
+ i0.ɵɵelementStart(0, "p", 168);
1075
1077
  i0.ɵɵtext(1, "No rerank invocations in the window.");
1076
1078
  i0.ɵɵelementEnd();
1077
1079
  } }
@@ -1097,7 +1099,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Condition
1097
1099
  i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(8, 5, r_r31.TotalCents, "1.0-2"), "\u00A2");
1098
1100
  } }
1099
1101
  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");
1102
+ i0.ɵɵelementStart(0, "table", 169)(1, "thead")(2, "tr")(3, "th");
1101
1103
  i0.ɵɵtext(4, "Reranker");
1102
1104
  i0.ɵɵelementEnd();
1103
1105
  i0.ɵɵelementStart(5, "th");
@@ -1115,7 +1117,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Condition
1115
1117
  i0.ɵɵrepeater(ctx_r1.AnalyticsRerankerSpend);
1116
1118
  } }
1117
1119
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_45_Template(rf, ctx) { if (rf & 1) {
1118
- i0.ɵɵelementStart(0, "p", 167);
1120
+ i0.ɵɵelementStart(0, "p", 168);
1119
1121
  i0.ɵɵtext(1, "No failures in the window.");
1120
1122
  i0.ɵɵelementEnd();
1121
1123
  } }
@@ -1135,7 +1137,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Condition
1135
1137
  i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 2, f_r32.Count));
1136
1138
  } }
1137
1139
  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");
1140
+ i0.ɵɵelementStart(0, "table", 169)(1, "thead")(2, "tr")(3, "th");
1139
1141
  i0.ɵɵtext(4, "Reason");
1140
1142
  i0.ɵɵelementEnd();
1141
1143
  i0.ɵɵelementStart(5, "th");
@@ -1151,62 +1153,62 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Condition
1151
1153
  } }
1152
1154
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1153
1155
  const _r29 = i0.ɵɵgetCurrentView();
1154
- i0.ɵɵelementStart(0, "div", 161)(1, "div", 162)(2, "span", 163);
1156
+ i0.ɵɵelementStart(0, "div", 162)(1, "div", 163)(2, "span", 164);
1155
1157
  i0.ɵɵtext(3, "Total runs");
1156
1158
  i0.ɵɵelementEnd();
1157
- i0.ɵɵelementStart(4, "span", 164);
1159
+ i0.ɵɵelementStart(4, "span", 165);
1158
1160
  i0.ɵɵtext(5);
1159
1161
  i0.ɵɵpipe(6, "number");
1160
1162
  i0.ɵɵelementEnd()();
1161
- i0.ɵɵelementStart(7, "div", 162)(8, "span", 163);
1163
+ i0.ɵɵelementStart(7, "div", 163)(8, "span", 164);
1162
1164
  i0.ɵɵtext(9, "Success rate");
1163
1165
  i0.ɵɵelementEnd();
1164
- i0.ɵɵelementStart(10, "span", 164);
1166
+ i0.ɵɵelementStart(10, "span", 165);
1165
1167
  i0.ɵɵtext(11);
1166
1168
  i0.ɵɵelementEnd()();
1167
- i0.ɵɵelementStart(12, "div", 162)(13, "span", 163);
1169
+ i0.ɵɵelementStart(12, "div", 163)(13, "span", 164);
1168
1170
  i0.ɵɵtext(14, "Hit rate");
1169
1171
  i0.ɵɵelementEnd();
1170
- i0.ɵɵelementStart(15, "span", 164);
1172
+ i0.ɵɵelementStart(15, "span", 165);
1171
1173
  i0.ɵɵtext(16);
1172
1174
  i0.ɵɵelementEnd();
1173
- i0.ɵɵelementStart(17, "span", 165);
1175
+ i0.ɵɵelementStart(17, "span", 166);
1174
1176
  i0.ɵɵtext(18, "% of successful runs that returned \u22651 result");
1175
1177
  i0.ɵɵelementEnd()();
1176
- i0.ɵɵelementStart(19, "div", 162)(20, "span", 163);
1178
+ i0.ɵɵelementStart(19, "div", 163)(20, "span", 164);
1177
1179
  i0.ɵɵtext(21, "Avg latency");
1178
1180
  i0.ɵɵelementEnd();
1179
- i0.ɵɵelementStart(22, "span", 164);
1181
+ i0.ɵɵelementStart(22, "span", 165);
1180
1182
  i0.ɵɵtext(23);
1181
1183
  i0.ɵɵelementEnd()();
1182
- i0.ɵɵelementStart(24, "div", 162)(25, "span", 163);
1184
+ i0.ɵɵelementStart(24, "div", 163)(25, "span", 164);
1183
1185
  i0.ɵɵtext(26, "P95 latency");
1184
1186
  i0.ɵɵelementEnd();
1185
- i0.ɵɵelementStart(27, "span", 164);
1187
+ i0.ɵɵelementStart(27, "span", 165);
1186
1188
  i0.ɵɵtext(28);
1187
1189
  i0.ɵɵelementEnd()();
1188
- i0.ɵɵelementStart(29, "div", 162)(30, "span", 163);
1190
+ i0.ɵɵelementStart(29, "div", 163)(30, "span", 164);
1189
1191
  i0.ɵɵtext(31, "Reranker spend");
1190
1192
  i0.ɵɵelementEnd();
1191
- i0.ɵɵelementStart(32, "span", 164);
1193
+ i0.ɵɵelementStart(32, "span", 165);
1192
1194
  i0.ɵɵtext(33);
1193
1195
  i0.ɵɵpipe(34, "number");
1194
1196
  i0.ɵɵelementEnd()()();
1195
- i0.ɵɵelementStart(35, "h3", 166);
1197
+ i0.ɵɵelementStart(35, "h3", 167);
1196
1198
  i0.ɵɵtext(36, "Top scopes by volume");
1197
1199
  i0.ɵɵelementEnd();
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);
1200
+ i0.ɵɵconditionalCreate(37, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_37_Template, 2, 0, "p", 168)(38, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_38_Template, 12, 0, "table", 169);
1201
+ i0.ɵɵelementStart(39, "h3", 167);
1200
1202
  i0.ɵɵtext(40, "Reranker spend by driver");
1201
1203
  i0.ɵɵelementEnd();
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);
1204
+ i0.ɵɵconditionalCreate(41, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_41_Template, 2, 0, "p", 168)(42, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_42_Template, 12, 0, "table", 169);
1205
+ i0.ɵɵelementStart(43, "h3", 167);
1204
1206
  i0.ɵɵtext(44, "Top failure reasons");
1205
1207
  i0.ɵɵelementEnd();
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.ɵɵconditionalCreate(45, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_45_Template, 2, 0, "p", 168)(46, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Conditional_46_Template, 10, 0, "table", 169);
1209
+ i0.ɵɵelementStart(47, "button", 170);
1208
1210
  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);
1211
+ i0.ɵɵelement(48, "i", 161);
1210
1212
  i0.ɵɵtext(49, " Refresh ");
1211
1213
  i0.ɵɵelementEnd();
1212
1214
  } if (rf & 2) {
@@ -1231,8 +1233,8 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Condition
1231
1233
  i0.ɵɵconditional(ctx_r1.AnalyticsTopFailures.length === 0 ? 45 : 46);
1232
1234
  } }
1233
1235
  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);
1236
+ i0.ɵɵelementStart(0, "div", 16);
1237
+ i0.ɵɵconditionalCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_1_Template, 1, 0, "mj-loading", 158)(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_2_Template, 3, 0, "button", 159)(3, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Conditional_3_Template, 50, 14);
1236
1238
  i0.ɵɵelementEnd();
1237
1239
  } if (rf & 2) {
1238
1240
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -1240,19 +1242,19 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Template(
1240
1242
  i0.ɵɵconditional(ctx_r1.AnalyticsLoading ? 1 : !ctx_r1.AnalyticsLoaded ? 2 : 3);
1241
1243
  } }
1242
1244
  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);
1245
+ i0.ɵɵelementStart(0, "div", 171);
1246
+ i0.ɵɵelement(1, "i", 84);
1245
1247
  i0.ɵɵtext(2, " Loading permission rows... ");
1246
1248
  i0.ɵɵelementEnd();
1247
1249
  } }
1248
1250
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_19_Template(rf, ctx) { if (rf & 1) {
1249
- i0.ɵɵelementStart(0, "div", 181);
1251
+ i0.ɵɵelementStart(0, "div", 182);
1250
1252
  i0.ɵɵtext(1, " No permission rows match your filters. ");
1251
1253
  i0.ɵɵelementEnd();
1252
1254
  } }
1253
1255
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_4_Template(rf, ctx) { if (rf & 1) {
1254
1256
  i0.ɵɵtext(0);
1255
- i0.ɵɵelementStart(1, "span", 184);
1257
+ i0.ɵɵelementStart(1, "span", 185);
1256
1258
  i0.ɵɵtext(2);
1257
1259
  i0.ɵɵelementEnd();
1258
1260
  } if (rf & 2) {
@@ -1268,12 +1270,12 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Condition
1268
1270
  i0.ɵɵtextInterpolate1(" ", row_r34.RoleName, " ");
1269
1271
  } }
1270
1272
  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);
1273
+ i0.ɵɵelementStart(0, "span", 184);
1272
1274
  i0.ɵɵtext(1, "User");
1273
1275
  i0.ɵɵelementEnd();
1274
1276
  } }
1275
1277
  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);
1278
+ i0.ɵɵelementStart(0, "span", 184);
1277
1279
  i0.ɵɵtext(1, "Role");
1278
1280
  i0.ɵɵelementEnd();
1279
1281
  } }
@@ -1285,8 +1287,8 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Condition
1285
1287
  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);
1286
1288
  i0.ɵɵelementEnd();
1287
1289
  i0.ɵɵelementStart(6, "td");
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);
1290
+ i0.ɵɵconditionalCreate(7, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_7_Template, 2, 0, "span", 184);
1291
+ i0.ɵɵconditionalCreate(8, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_For_13_Conditional_8_Template, 2, 0, "span", 184);
1290
1292
  i0.ɵɵelementEnd();
1291
1293
  i0.ɵɵelementStart(9, "td")(10, "span");
1292
1294
  i0.ɵɵpipe(11, "lowercase");
@@ -1308,7 +1310,7 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Condition
1308
1310
  i0.ɵɵtextInterpolate(row_r34.PermissionLevel);
1309
1311
  } }
1310
1312
  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");
1313
+ i0.ɵɵelementStart(0, "table", 183)(1, "thead")(2, "tr")(3, "th");
1312
1314
  i0.ɵɵtext(4, "Scope");
1313
1315
  i0.ɵɵelementEnd();
1314
1316
  i0.ɵɵelementStart(5, "th");
@@ -1330,38 +1332,38 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Condition
1330
1332
  } }
1331
1333
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Template(rf, ctx) { if (rf & 1) {
1332
1334
  const _r33 = i0.ɵɵgetCurrentView();
1333
- i0.ɵɵelementStart(0, "div", 171)(1, "input", 172);
1335
+ i0.ɵɵelementStart(0, "div", 172)(1, "input", 173);
1334
1336
  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); });
1335
1337
  i0.ɵɵelementEnd();
1336
- i0.ɵɵelementStart(2, "input", 173);
1338
+ i0.ɵɵelementStart(2, "input", 174);
1337
1339
  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); });
1338
1340
  i0.ɵɵelementEnd();
1339
- i0.ɵɵelementStart(3, "select", 174);
1341
+ i0.ɵɵelementStart(3, "select", 175);
1340
1342
  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);
1343
+ i0.ɵɵelementStart(4, "option", 176);
1342
1344
  i0.ɵɵtext(5, "All levels");
1343
1345
  i0.ɵɵelementEnd();
1344
- i0.ɵɵelementStart(6, "option", 176);
1346
+ i0.ɵɵelementStart(6, "option", 177);
1345
1347
  i0.ɵɵtext(7, "None");
1346
1348
  i0.ɵɵelementEnd();
1347
- i0.ɵɵelementStart(8, "option", 177);
1349
+ i0.ɵɵelementStart(8, "option", 178);
1348
1350
  i0.ɵɵtext(9, "Read");
1349
1351
  i0.ɵɵelementEnd();
1350
- i0.ɵɵelementStart(10, "option", 178);
1352
+ i0.ɵɵelementStart(10, "option", 179);
1351
1353
  i0.ɵɵtext(11, "Search");
1352
1354
  i0.ɵɵelementEnd();
1353
- i0.ɵɵelementStart(12, "option", 179);
1355
+ i0.ɵɵelementStart(12, "option", 180);
1354
1356
  i0.ɵɵtext(13, "Manage");
1355
1357
  i0.ɵɵelementEnd()();
1356
- i0.ɵɵelementStart(14, "button", 159);
1358
+ i0.ɵɵelementStart(14, "button", 160);
1357
1359
  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);
1360
+ i0.ɵɵelement(15, "i", 161);
1359
1361
  i0.ɵɵtext(16, " Refresh ");
1360
1362
  i0.ɵɵelementEnd()();
1361
- i0.ɵɵelementStart(17, "div", 180);
1363
+ i0.ɵɵelementStart(17, "div", 181);
1362
1364
  i0.ɵɵtext(18);
1363
1365
  i0.ɵɵelementEnd();
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);
1366
+ i0.ɵɵconditionalCreate(19, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_19_Template, 2, 0, "div", 182)(20, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Conditional_20_Template, 14, 0, "table", 183);
1365
1367
  } if (rf & 2) {
1366
1368
  const ctx_r1 = i0.ɵɵnextContext(3);
1367
1369
  i0.ɵɵadvance();
@@ -1376,8 +1378,8 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Condition
1376
1378
  i0.ɵɵconditional(ctx_r1.FilteredPermissionsRows.length === 0 ? 19 : 20);
1377
1379
  } }
1378
1380
  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.ɵɵelementStart(0, "div", 16);
1382
+ i0.ɵɵconditionalCreate(1, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_1_Template, 3, 0, "div", 171);
1381
1383
  i0.ɵɵconditionalCreate(2, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Conditional_2_Template, 21, 6);
1382
1384
  i0.ɵɵelementEnd();
1383
1385
  } if (rf & 2) {
@@ -1388,31 +1390,31 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Template(
1388
1390
  i0.ɵɵconditional(ctx_r1.PermissionsLoaded && !ctx_r1.PermissionsLoading ? 2 : -1);
1389
1391
  } }
1390
1392
  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);
1393
+ i0.ɵɵelementStart(0, "div", 16)(1, "div", 186);
1394
+ i0.ɵɵelement(2, "app-scheduling-resource", 187);
1393
1395
  i0.ɵɵelementEnd()();
1394
1396
  } if (rf & 2) {
1395
1397
  i0.ɵɵadvance(2);
1396
1398
  i0.ɵɵproperty("HideToolbar", true);
1397
1399
  } }
1398
1400
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_4_Template(rf, ctx) { if (rf & 1) {
1399
- i0.ɵɵelement(0, "i", 83);
1401
+ i0.ɵɵelement(0, "i", 84);
1400
1402
  i0.ɵɵtext(1, " Saving... ");
1401
1403
  } }
1402
1404
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_5_Template(rf, ctx) { if (rf & 1) {
1403
- i0.ɵɵelement(0, "i", 131);
1405
+ i0.ɵɵelement(0, "i", 132);
1404
1406
  i0.ɵɵtext(1, " Save Changes ");
1405
1407
  } }
1406
1408
  function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template(rf, ctx) { if (rf & 1) {
1407
1409
  const _r35 = i0.ɵɵgetCurrentView();
1408
- i0.ɵɵelementStart(0, "div", 16)(1, "span", 187);
1410
+ i0.ɵɵelementStart(0, "div", 17)(1, "span", 188);
1409
1411
  i0.ɵɵtext(2, "You have unsaved changes");
1410
1412
  i0.ɵɵelementEnd();
1411
- i0.ɵɵelementStart(3, "button", 188);
1413
+ i0.ɵɵelementStart(3, "button", 189);
1412
1414
  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
1415
  i0.ɵɵconditionalCreate(4, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_4_Template, 2, 0)(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Conditional_5_Template, 2, 0);
1414
1416
  i0.ɵɵelementEnd();
1415
- i0.ɵɵelementStart(6, "button", 189);
1417
+ i0.ɵɵelementStart(6, "button", 190);
1416
1418
  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()); });
1417
1419
  i0.ɵɵtext(7, " Reset ");
1418
1420
  i0.ɵɵelementEnd()();
@@ -1427,22 +1429,22 @@ function KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template(
1427
1429
  } }
1428
1430
  function KnowledgeConfigResourceComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
1429
1431
  const _r3 = i0.ɵɵgetCurrentView();
1430
- i0.ɵɵelementStart(0, "div", 6)(1, "mj-left-nav", 12);
1432
+ i0.ɵɵelementStart(0, "div", 6)(1, "mj-left-nav", 13);
1431
1433
  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
1434
  i0.ɵɵelementEnd();
1433
1435
  i0.ɵɵelementStart(2, "mj-left-nav-content");
1434
- i0.ɵɵelement(3, "mj-page-header-interior", 13);
1436
+ i0.ɵɵelement(3, "mj-page-header-interior", 14);
1435
1437
  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);
1438
+ i0.ɵɵconditionalCreate(5, KnowledgeConfigResourceComponent_Conditional_8_Conditional_5_Template, 30, 4, "div", 15);
1439
+ i0.ɵɵconditionalCreate(6, KnowledgeConfigResourceComponent_Conditional_8_Conditional_6_Template, 45, 26, "div", 15);
1440
+ i0.ɵɵconditionalCreate(7, KnowledgeConfigResourceComponent_Conditional_8_Conditional_7_Template, 4, 1, "div", 15);
1441
+ i0.ɵɵconditionalCreate(8, KnowledgeConfigResourceComponent_Conditional_8_Conditional_8_Template, 3, 1, "div", 15);
1442
+ i0.ɵɵconditionalCreate(9, KnowledgeConfigResourceComponent_Conditional_8_Conditional_9_Template, 30, 8, "div", 15);
1443
+ i0.ɵɵconditionalCreate(10, KnowledgeConfigResourceComponent_Conditional_8_Conditional_10_Template, 15, 3, "div", 15);
1444
+ i0.ɵɵconditionalCreate(11, KnowledgeConfigResourceComponent_Conditional_8_Conditional_11_Template, 4, 1, "div", 16);
1445
+ i0.ɵɵconditionalCreate(12, KnowledgeConfigResourceComponent_Conditional_8_Conditional_12_Template, 3, 2, "div", 16);
1446
+ i0.ɵɵconditionalCreate(13, KnowledgeConfigResourceComponent_Conditional_8_Conditional_13_Template, 3, 1, "div", 16);
1447
+ i0.ɵɵconditionalCreate(14, KnowledgeConfigResourceComponent_Conditional_8_Conditional_14_Template, 8, 3, "div", 17);
1446
1448
  i0.ɵɵelementEnd()()();
1447
1449
  } if (rf & 2) {
1448
1450
  const ctx_r1 = i0.ɵɵnextContext();
@@ -2344,12 +2346,12 @@ let KnowledgeConfigResourceComponent = class KnowledgeConfigResourceComponent ex
2344
2346
  }));
2345
2347
  }
2346
2348
  static ɵfac = /*@__PURE__*/ (() => { let ɵKnowledgeConfigResourceComponent_BaseFactory; return function KnowledgeConfigResourceComponent_Factory(__ngFactoryType__) { return (ɵKnowledgeConfigResourceComponent_BaseFactory || (ɵKnowledgeConfigResourceComponent_BaseFactory = i0.ɵɵgetInheritedFactory(KnowledgeConfigResourceComponent)))(__ngFactoryType__ || KnowledgeConfigResourceComponent); }; })();
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) {
2349
+ 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"], [1, "action-btn-label"], ["mjButton", "", "variant", "primary", "size", "sm", "title", "Save all settings", 3, "click", "disabled"], [1, "fa-solid", "fa-floppy-disk"], ["text", "Loading configuration...", "size", "medium"], ["MobileTitle", "Settings", 3, "ItemClicked", "Sections", "ActiveId"], [3, "Title", "Subtitle"], [1, "config-section"], [1, "config-section-content"], [1, "config-save-bar"], [1, "config-group"], [1, "config-toggle-row"], [1, "config-toggle-info"], [1, "config-label"], [1, "config-hint"], ["type", "checkbox", 1, "config-checkbox", 3, "ngModelChange", "change", "ngModel"], [1, "config-field-row"], [1, "config-field-info"], ["type", "number", "min", "10", "max", "1000", 1, "config-input", "config-input-number", 3, "ngModelChange", "input", "ngModel"], ["type", "number", "min", "1", "max", "10", 1, "config-input", "config-input-number", 3, "ngModelChange", "input", "ngModel"], [1, "setup-progress"], [1, "setup-progress-header"], [1, "setup-progress-label"], [1, "setup-progress-count"], [1, "setup-progress-bar"], [1, "setup-progress-fill"], [1, "setup-step"], [1, "setup-step-header"], [1, "setup-step-indicator"], [1, "fa-solid", "fa-circle-check"], [1, "setup-step-number"], [1, "setup-step-info"], [1, "setup-step-title"], [1, "setup-step-status"], [1, "setup-step-detail"], [1, "setup-step-action"], [1, "create-index-form"], [1, "provider-card"], [1, "provider-icon"], [1, "fa-solid", "fa-database"], [1, "provider-info"], [1, "provider-name"], [1, "provider-class"], [1, "config-status-badge", "config-status-active"], [1, "provider-credential-row"], [1, "provider-credential-label"], [1, "fa-solid", "fa-key"], [1, "provider-credential-picker"], [1, "provider-credential-select", 3, "ngModelChange", "change", "ngModel", "disabled"], [3, "ngValue"], [1, "fa-solid", "fa-spinner", "fa-spin", "provider-credential-spinner"], [1, "config-tag-list"], [1, "config-tag"], [1, "setup-step-action", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "index-card"], [1, "index-icon"], [1, "fa-solid", "fa-cubes"], [1, "index-info"], [1, "index-name"], [1, "index-meta"], [1, "fa-solid", "fa-microchip"], [1, "index-actions"], ["title", "Delete index", 1, "index-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "create-index-title"], [1, "fa-solid", "fa-plus-circle"], [1, "create-index-fields"], [1, "create-index-field"], [1, "create-index-label"], ["type", "text", "placeholder", "e.g., mj-knowledge-index", 1, "config-input", 3, "ngModelChange", "ngModel"], [1, "config-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "create-index-actions"], [1, "create-index-submit", 3, "click", "disabled"], [1, "create-index-cancel", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], ["text", "Discovering searchable entities...", "size", "medium"], [1, "config-empty-state"], [1, "fa-solid", "fa-text-width", "config-empty-icon"], [1, "config-empty-title"], [1, "config-empty-text"], [1, "fts-entity-controls"], [1, "fts-summary"], [1, "fts-summary-count"], ["type", "text", "placeholder", "Filter entities...", 1, "config-input", "fts-filter-input", 3, "ngModelChange", "ngModel"], [1, "fts-entity-list"], [1, "fts-entity-card", 3, "fts-entity-enabled"], [1, "fts-entity-card"], [1, "fts-entity-toggle"], [1, "fts-entity-info"], [1, "fts-entity-name"], [1, "fts-entity-fields"], [1, "fts-field-tag"], [1, "fts-entity-meta"], ["title", "Title field", 1, "fts-entity-title-field"], [1, "fa-solid", "fa-heading"], ["title", "Snippet field", 1, "fts-entity-snippet-field"], [1, "fa-solid", "fa-align-left"], [1, "config-value-display"], [1, "config-section-note"], [1, "fa-solid", "fa-info-circle"], [1, "fa-solid", "fa-microchip", "config-empty-icon"], ["type", "range", "min", "0.5", "max", "1", "step", "0.01", 1, "config-slider", 3, "ngModelChange", "input", "ngModel"], ["type", "range", "min", "0.3", "max", "1", "step", "0.01", 1, "config-slider", 3, "ngModelChange", "input", "ngModel"], ["type", "range", "min", "0", "max", "1", "step", "0.01", 1, "config-slider", 3, "ngModelChange", "input", "ngModel"], [1, "scope-manager"], [1, "scope-manager-list"], [1, "scope-manager-list-header"], ["type", "button", 1, "scope-manager-new-btn", 3, "click"], [1, "scope-manager-loading"], [1, "scope-manager-empty"], [1, "scope-manager-detail"], [1, "scope-manager-empty-detail"], ["type", "button", 1, "scope-manager-list-item", 3, "active"], ["type", "button", 1, "scope-manager-list-item", 3, "click"], ["aria-hidden", "true"], [1, "scope-manager-list-name"], [1, "scope-manager-badge"], [1, "scope-manager-tabs"], ["type", "button", 1, "scope-manager-tab", 3, "click"], [1, "scope-manager-tab-spacer"], ["type", "button", "title", "Open the full custom form for this scope (Live Preview, Fusion Weights, Reranker, Test Queries, Execution Logs)", 1, "scope-manager-open-btn"], ["type", "button", 1, "scope-manager-save-btn", 3, "click"], [1, "fa-solid", "fa-save"], ["type", "button", "title", "Delete scope", 1, "scope-manager-delete-btn"], [1, "scope-definition-grid"], ["ChildEntityName", "MJ: Search Scope Providers", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Add provider", "EmptyMessage", "No providers assigned. Without any providers, this scope searches nothing.", 3, "ParentID", "Columns"], ["ChildEntityName", "MJ: Search Scope External Indexes", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Add external index", "EmptyMessage", "No external indexes configured for this scope.", 3, "ParentID", "Columns"], ["ChildEntityName", "MJ: Search Scope Entities", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Add entity", "EmptyMessage", "No entities configured. Scoped entity search will return no rows.", 3, "ParentID", "Columns"], ["ChildEntityName", "MJ: Search Scope Storage Accounts", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Add storage folder", "EmptyMessage", "No storage accounts linked to this scope.", 3, "ParentID", "Columns"], ["type", "button", "title", "Open the full custom form for this scope (Live Preview, Fusion Weights, Reranker, Test Queries, Execution Logs)", 1, "scope-manager-open-btn", 3, "click"], [1, "fa-solid", "fa-up-right-from-square"], ["type", "button", "title", "Delete scope", 1, "scope-manager-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash"], ["type", "text", 1, "mj-input", 3, "change", "value"], [1, "scope-definition-full"], ["rows", "2", 1, "mj-textarea", 3, "change", "value"], [1, "mj-input", 3, "change", "value"], ["value", "Active"], ["value", "Inactive"], ["type", "datetime-local", 1, "mj-input", 3, "change", "value"], [1, "scope-definition-toggle"], ["type", "checkbox", 3, "change", "checked", "disabled"], ["type", "checkbox", "disabled", "", 3, "checked"], ["rows", "4", "spellcheck", "false", 1, "mj-textarea", "scope-code-block", 3, "change", "value"], [1, "scope-permissions-help", 2, "margin-bottom", "12px", "padding", "8px 12px", "background", "var(--mj-bg-surface-card)", "border-left", "3px solid var(--mj-brand-primary)", "border-radius", "4px"], [2, "margin", "0", "font-size", "0.95em"], [1, "fa-solid", "fa-shield-halved", 2, "color", "var(--mj-brand-primary)"], ["ChildEntityName", "MJ: Search Scope Permissions", "ParentFieldName", "SearchScopeID", "AddButtonLabel", "+ Grant access", "EmptyMessage", "No explicit grants. Access falls back to agent SearchScopeAccess only.", 3, "ParentID", "Columns"], ["text", "Loading analytics\u2026", "size", "medium"], ["type", "button", 1, "mj-input"], ["type", "button", 1, "mj-input", 3, "click"], [1, "fa-solid", "fa-arrows-rotate"], [1, "search-analytics-kpi-grid"], [1, "search-analytics-kpi"], [1, "search-analytics-kpi-label"], [1, "search-analytics-kpi-value"], [1, "search-analytics-kpi-hint"], [1, "search-analytics-h3"], [1, "search-analytics-empty"], [1, "search-analytics-table"], ["type", "button", 1, "mj-input", "search-analytics-refresh", 3, "click"], [1, "search-permissions-loading"], [1, "search-permissions-filters"], ["type", "text", "placeholder", "Filter by scope name...", 1, "mj-input", 3, "ngModelChange", "ngModel"], ["type", "text", "placeholder", "Filter by user/role (name or email)...", 1, "mj-input", 3, "ngModelChange", "ngModel"], [1, "mj-input", 3, "ngModelChange", "ngModel"], ["value", ""], ["value", "None"], ["value", "Read"], ["value", "Search"], ["value", "Manage"], [1, "search-permissions-summary"], [1, "search-permissions-empty"], [1, "search-permissions-table"], [1, "search-permissions-tag"], [1, "search-permissions-secondary"], [2, "margin-top", "16px"], [3, "HideToolbar"], [1, "config-save-text"], [1, "config-save-btn", 3, "click", "disabled"], [1, "config-reset-btn", 3, "click", "disabled"]], template: function KnowledgeConfigResourceComponent_Template(rf, ctx) { if (rf & 1) {
2348
2350
  i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 0)(2, "div", 1);
2349
2351
  i0.ɵɵconditionalCreate(3, KnowledgeConfigResourceComponent_Conditional_3_Template, 1, 0, "mj-stat-badge", 2);
2350
2352
  i0.ɵɵelementEnd();
2351
2353
  i0.ɵɵelementStart(4, "div", 3);
2352
- i0.ɵɵconditionalCreate(5, KnowledgeConfigResourceComponent_Conditional_5_Template, 6, 3);
2354
+ i0.ɵɵconditionalCreate(5, KnowledgeConfigResourceComponent_Conditional_5_Template, 8, 3);
2353
2355
  i0.ɵɵelementEnd()();
2354
2356
  i0.ɵɵelementStart(6, "mj-page-body", 4);
2355
2357
  i0.ɵɵconditionalCreate(7, KnowledgeConfigResourceComponent_Conditional_7_Template, 2, 0, "div", 5)(8, KnowledgeConfigResourceComponent_Conditional_8_Template, 15, 14, "div", 6);
@@ -2371,7 +2373,7 @@ KnowledgeConfigResourceComponent = __decorate([
2371
2373
  export { KnowledgeConfigResourceComponent };
2372
2374
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(KnowledgeConfigResourceComponent, [{
2373
2375
  type: Component,
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"] }]
2376
+ 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> <span class=\"action-btn-label\">Reset</span>\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> <span class=\"action-btn-label\">{{IsSaving ? 'Saving\u2026' : 'Save'}}</span>\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 MobileTitle=\"Settings\"\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"] }]
2375
2377
  }], null, null); })();
2376
2378
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KnowledgeConfigResourceComponent, { className: "KnowledgeConfigResourceComponent", filePath: "src/KnowledgeHub/components/config/knowledge-config-resource.component.ts", lineNumber: 100 }); })();
2377
2379
  /** Tree-shaking prevention */