@memberjunction/ng-dashboards 5.34.0 → 5.35.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 (348) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +51 -0
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +399 -292
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +8 -2
  6. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
  7. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +87 -85
  8. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
  9. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +75 -0
  10. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  11. package/dist/AI/components/analytics/ai-analytics-resource.component.js +400 -89
  12. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  13. package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +5 -0
  14. package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -1
  15. package/dist/AI/components/analytics/analytics-filter-bar.component.js +184 -135
  16. package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -1
  17. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +8 -2
  18. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
  19. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +104 -103
  20. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
  21. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +8 -2
  22. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
  23. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +76 -74
  24. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
  25. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
  26. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +67 -87
  27. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
  28. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +12 -19
  29. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
  30. package/dist/AI/components/analytics/model-performance/model-performance.component.js +96 -203
  31. package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
  32. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  33. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +110 -126
  34. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  35. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
  36. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +61 -77
  37. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
  38. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +990 -992
  39. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  40. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +6 -3
  41. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  42. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +493 -490
  43. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  44. package/dist/AI/components/models/model-management.component.d.ts +17 -0
  45. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  46. package/dist/AI/components/models/model-management.component.js +370 -425
  47. package/dist/AI/components/models/model-management.component.js.map +1 -1
  48. package/dist/AI/components/prompts/prompt-management.component.d.ts +17 -0
  49. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  50. package/dist/AI/components/prompts/prompt-management.component.js +317 -357
  51. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  52. package/dist/AI/components/requests/agent-requests-resource.component.d.ts +11 -0
  53. package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
  54. package/dist/AI/components/requests/agent-requests-resource.component.js +170 -175
  55. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  56. package/dist/AI/components/system/system-configuration.component.d.ts +19 -0
  57. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  58. package/dist/AI/components/system/system-configuration.component.js +403 -362
  59. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  60. package/dist/AI/components/tags/tags-resource.component.js +781 -783
  61. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  62. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +8 -3
  63. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  64. package/dist/AI/components/vectors/vector-management-resource.component.js +547 -521
  65. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  66. package/dist/Actions/components/actions-overview.component.d.ts +6 -0
  67. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  68. package/dist/Actions/components/actions-overview.component.js +79 -30
  69. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  70. package/dist/Actions/components/execution-monitoring.component.d.ts +9 -3
  71. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
  72. package/dist/Actions/components/execution-monitoring.component.js +196 -142
  73. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  74. package/dist/Actions/components/explorer/action-explorer.component.d.ts +41 -1
  75. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  76. package/dist/Actions/components/explorer/action-explorer.component.js +388 -94
  77. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  78. package/dist/Actions/components/explorer/index.d.ts +0 -1
  79. package/dist/Actions/components/explorer/index.d.ts.map +1 -1
  80. package/dist/Actions/components/explorer/index.js +0 -1
  81. package/dist/Actions/components/explorer/index.js.map +1 -1
  82. package/dist/Admin/admin-data-schema.component.js +32 -40
  83. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  84. package/dist/Admin/admin-dev-tools-resource.component.js +32 -40
  85. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  86. package/dist/Admin/admin-identity-access.component.js +32 -40
  87. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  88. package/dist/Admin/admin-monitoring.component.js +32 -40
  89. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  90. package/dist/ApplicationRoles/application-roles-resource.component.js +76 -82
  91. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  92. package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -1
  93. package/dist/Archiving/components/archive-config-resource.component.js +24 -5
  94. package/dist/Archiving/components/archive-config-resource.component.js.map +1 -1
  95. package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -1
  96. package/dist/Archiving/components/archive-runs-resource.component.js +24 -5
  97. package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -1
  98. package/dist/Communication/communication-logs-resource.component.d.ts +1 -1
  99. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  100. package/dist/Communication/communication-logs-resource.component.js +80 -99
  101. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  102. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  103. package/dist/Communication/communication-monitor-resource.component.js +127 -106
  104. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  105. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  106. package/dist/Communication/communication-providers-resource.component.js +44 -45
  107. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  108. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  109. package/dist/Communication/communication-runs-resource.component.js +60 -58
  110. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  111. package/dist/Communication/communication-templates-resource.component.d.ts +1 -1
  112. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  113. package/dist/Communication/communication-templates-resource.component.js +139 -162
  114. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  115. package/dist/Credentials/components/credentials-audit-resource.component.d.ts +7 -0
  116. package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
  117. package/dist/Credentials/components/credentials-audit-resource.component.js +310 -297
  118. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  119. package/dist/Credentials/components/credentials-categories-resource.component.js +245 -266
  120. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  121. package/dist/Credentials/components/credentials-list-resource.component.d.ts +7 -0
  122. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  123. package/dist/Credentials/components/credentials-list-resource.component.js +381 -399
  124. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  125. package/dist/Credentials/components/credentials-overview-resource.component.js +222 -228
  126. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  127. package/dist/Credentials/components/credentials-types-resource.component.d.ts +6 -0
  128. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  129. package/dist/Credentials/components/credentials-types-resource.component.js +294 -305
  130. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  131. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +8 -0
  132. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -1
  133. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +21 -0
  134. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
  135. package/dist/DatabaseDesigner/components/entity-list.component.js +147 -160
  136. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  137. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
  138. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  139. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +19 -1
  140. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  141. package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -16
  142. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  143. package/dist/Home/home-dashboard.component.d.ts +6 -0
  144. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  145. package/dist/Home/home-dashboard.component.js +521 -485
  146. package/dist/Home/home-dashboard.component.js.map +1 -1
  147. package/dist/Integration/components/activity/activity.component.d.ts +8 -0
  148. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  149. package/dist/Integration/components/activity/activity.component.js +309 -318
  150. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  151. package/dist/Integration/components/connections/connections.component.js +866 -847
  152. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  153. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +234 -233
  154. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  155. package/dist/Integration/components/overview/overview.component.js +182 -163
  156. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  157. package/dist/Integration/components/pipelines/pipelines.component.d.ts +2 -0
  158. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
  159. package/dist/Integration/components/pipelines/pipelines.component.js +610 -606
  160. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  161. package/dist/Integration/components/schedules/schedules.component.js +241 -241
  162. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  163. package/dist/Integration/integration.module.d.ts +1 -1
  164. package/dist/Integration/integration.module.d.ts.map +1 -1
  165. package/dist/Integration/integration.module.js +28 -1
  166. package/dist/Integration/integration.module.js.map +1 -1
  167. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +673 -674
  168. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  169. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +54 -51
  170. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  171. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +745 -703
  172. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  173. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +12 -1
  174. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
  175. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +191 -120
  176. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  177. package/dist/Lists/components/lists-browse-resource.component.d.ts +18 -1
  178. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  179. package/dist/Lists/components/lists-browse-resource.component.js +486 -532
  180. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  181. package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
  182. package/dist/Lists/components/lists-categories-resource.component.js +152 -160
  183. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  184. package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
  185. package/dist/Lists/components/lists-my-lists-resource.component.js +302 -319
  186. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  187. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  188. package/dist/Lists/components/lists-operations-resource.component.js +234 -246
  189. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  190. package/dist/MCP/mcp-dashboard.component.d.ts +20 -0
  191. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  192. package/dist/MCP/mcp-dashboard.component.js +1248 -1338
  193. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  194. package/dist/MCP/mcp.module.d.ts +1 -1
  195. package/dist/MCP/mcp.module.d.ts.map +1 -1
  196. package/dist/MCP/mcp.module.js +34 -1
  197. package/dist/MCP/mcp.module.js.map +1 -1
  198. package/dist/Permissions/audit-log-resource.component.js +76 -85
  199. package/dist/Permissions/audit-log-resource.component.js.map +1 -1
  200. package/dist/Permissions/resource-access-resource.component.js +64 -69
  201. package/dist/Permissions/resource-access-resource.component.js.map +1 -1
  202. package/dist/Permissions/user-access-resource.component.js +63 -74
  203. package/dist/Permissions/user-access-resource.component.js.map +1 -1
  204. package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
  205. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  206. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +2 -1
  207. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
  208. package/dist/Scheduling/components/scheduling-activity-resource.component.js +11 -12
  209. package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
  210. package/dist/Scheduling/components/scheduling-activity.component.d.ts +9 -1
  211. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
  212. package/dist/Scheduling/components/scheduling-activity.component.js +250 -197
  213. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  214. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +2 -1
  215. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
  216. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +11 -12
  217. package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
  218. package/dist/Scheduling/components/scheduling-jobs.component.d.ts +9 -1
  219. package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
  220. package/dist/Scheduling/components/scheduling-jobs.component.js +203 -147
  221. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  222. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +2 -1
  223. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
  224. package/dist/Scheduling/components/scheduling-overview-resource.component.js +11 -12
  225. package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
  226. package/dist/Scheduling/components/scheduling-overview.component.d.ts +3 -1
  227. package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
  228. package/dist/Scheduling/components/scheduling-overview.component.js +224 -190
  229. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  230. package/dist/Scheduling/scheduling-dashboard.component.d.ts +19 -6
  231. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  232. package/dist/Scheduling/scheduling-dashboard.component.js +262 -104
  233. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  234. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +4 -0
  235. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  236. package/dist/SystemDiagnostics/system-diagnostics.component.js +812 -784
  237. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  238. package/dist/Testing/components/testing-analytics-resource.component.d.ts +2 -1
  239. package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
  240. package/dist/Testing/components/testing-analytics-resource.component.js +7 -14
  241. package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
  242. package/dist/Testing/components/testing-analytics.component.d.ts +3 -1
  243. package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
  244. package/dist/Testing/components/testing-analytics.component.js +420 -393
  245. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  246. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
  247. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
  248. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +16 -19
  249. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
  250. package/dist/Testing/components/testing-dashboard-tab.component.d.ts +3 -1
  251. package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
  252. package/dist/Testing/components/testing-dashboard-tab.component.js +157 -122
  253. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  254. package/dist/Testing/components/testing-explorer-resource.component.d.ts +2 -1
  255. package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
  256. package/dist/Testing/components/testing-explorer-resource.component.js +7 -12
  257. package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
  258. package/dist/Testing/components/testing-explorer.component.d.ts +8 -1
  259. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  260. package/dist/Testing/components/testing-explorer.component.js +587 -608
  261. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  262. package/dist/Testing/components/testing-review-resource.component.d.ts +4 -1
  263. package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
  264. package/dist/Testing/components/testing-review-resource.component.js +9 -12
  265. package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
  266. package/dist/Testing/components/testing-review.component.d.ts +3 -1
  267. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  268. package/dist/Testing/components/testing-review.component.js +310 -274
  269. package/dist/Testing/components/testing-review.component.js.map +1 -1
  270. package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
  271. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
  272. package/dist/Testing/components/testing-runs-resource.component.js +16 -19
  273. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
  274. package/dist/Testing/components/testing-runs.component.d.ts +3 -1
  275. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
  276. package/dist/Testing/components/testing-runs.component.js +307 -273
  277. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  278. package/dist/Testing/testing-dashboard.component.d.ts +2 -0
  279. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  280. package/dist/Testing/testing-dashboard.component.js +107 -93
  281. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  282. package/dist/VersionHistory/components/diff-resource.component.js +185 -188
  283. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  284. package/dist/VersionHistory/components/graph-resource.component.js +154 -184
  285. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  286. package/dist/VersionHistory/components/labels-resource.component.d.ts +7 -0
  287. package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
  288. package/dist/VersionHistory/components/labels-resource.component.js +350 -354
  289. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  290. package/dist/VersionHistory/components/restore-resource.component.js +163 -169
  291. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  292. package/dist/actions-dashboards.module.d.ts +15 -16
  293. package/dist/actions-dashboards.module.d.ts.map +1 -1
  294. package/dist/actions-dashboards.module.js +34 -11
  295. package/dist/actions-dashboards.module.js.map +1 -1
  296. package/dist/ai-dashboards.module.d.ts +45 -48
  297. package/dist/ai-dashboards.module.d.ts.map +1 -1
  298. package/dist/ai-dashboards.module.js +36 -10
  299. package/dist/ai-dashboards.module.js.map +1 -1
  300. package/dist/archiving-dashboards.module.d.ts +2 -1
  301. package/dist/archiving-dashboards.module.d.ts.map +1 -1
  302. package/dist/archiving-dashboards.module.js +12 -2
  303. package/dist/archiving-dashboards.module.js.map +1 -1
  304. package/dist/communication-dashboards.module.d.ts +2 -1
  305. package/dist/communication-dashboards.module.d.ts.map +1 -1
  306. package/dist/communication-dashboards.module.js +24 -3
  307. package/dist/communication-dashboards.module.js.map +1 -1
  308. package/dist/core-dashboards.module.d.ts +1 -1
  309. package/dist/core-dashboards.module.d.ts.map +1 -1
  310. package/dist/core-dashboards.module.js +31 -1
  311. package/dist/core-dashboards.module.js.map +1 -1
  312. package/dist/credentials-dashboards.module.d.ts +1 -1
  313. package/dist/credentials-dashboards.module.d.ts.map +1 -1
  314. package/dist/credentials-dashboards.module.js +28 -1
  315. package/dist/credentials-dashboards.module.js.map +1 -1
  316. package/dist/lists-dashboards.module.d.ts +1 -1
  317. package/dist/lists-dashboards.module.d.ts.map +1 -1
  318. package/dist/lists-dashboards.module.js +28 -1
  319. package/dist/lists-dashboards.module.js.map +1 -1
  320. package/dist/public-api.d.ts +2 -2
  321. package/dist/public-api.d.ts.map +1 -1
  322. package/dist/public-api.js +3 -3
  323. package/dist/public-api.js.map +1 -1
  324. package/dist/scheduling-dashboards.module.d.ts +1 -1
  325. package/dist/scheduling-dashboards.module.d.ts.map +1 -1
  326. package/dist/scheduling-dashboards.module.js +31 -1
  327. package/dist/scheduling-dashboards.module.js.map +1 -1
  328. package/dist/testing-dashboards.module.d.ts +8 -7
  329. package/dist/testing-dashboards.module.d.ts.map +1 -1
  330. package/dist/testing-dashboards.module.js +30 -0
  331. package/dist/testing-dashboards.module.js.map +1 -1
  332. package/package.json +52 -52
  333. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +0 -56
  334. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +0 -1
  335. package/dist/AI/components/agents/agent-filter-panel.component.js +0 -285
  336. package/dist/AI/components/agents/agent-filter-panel.component.js.map +0 -1
  337. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +0 -49
  338. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +0 -1
  339. package/dist/AI/components/prompts/prompt-filter-panel.component.js +0 -184
  340. package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +0 -1
  341. package/dist/AI/components/system/system-config-filter-panel.component.d.ts +0 -33
  342. package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +0 -1
  343. package/dist/AI/components/system/system-config-filter-panel.component.js +0 -144
  344. package/dist/AI/components/system/system-config-filter-panel.component.js.map +0 -1
  345. package/dist/Actions/components/explorer/action-toolbar.component.d.ts +0 -63
  346. package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +0 -1
  347. package/dist/Actions/components/explorer/action-toolbar.component.js +0 -463
  348. package/dist/Actions/components/explorer/action-toolbar.component.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge-config-resource.component.js","sourceRoot":"","sources":["../../../../src/KnowledgeHub/components/config/knowledge-config-resource.component.ts","../../../../src/KnowledgeHub/components/config/knowledge-config-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Knowledge Hub Configuration Resource Component\n *\n * Full configuration dashboard for Knowledge Hub infrastructure:\n * Vector DB provider management, vector index CRUD, embedding model selection,\n * pipeline settings, full-text index config, and scoring thresholds.\n */\n\nimport { Component, ChangeDetectorRef, OnDestroy, AfterViewInit, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { CompositeKey, Metadata, RunView, LogError } from '@memberjunction/core';\nimport { ResourceData, MJVectorDatabaseEntity, MJVectorIndexEntity, MJEntityDocumentEntity, MJCredentialEntity, KnowledgeHubMetadataEngine, MJSearchScopeEntity } from '@memberjunction/core-entities';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { SearchScopeChildGridColumn } from '@memberjunction/ng-search';\n\n/** Configuration section definition */\ninterface ConfigSection {\n ID: string;\n Label: string;\n Icon: string;\n Description: string;\n}\n\n/** Pipeline configuration settings */\ninterface PipelineConfig {\n AutotagOnIngest: boolean;\n VectorizeOnIngest: boolean;\n DefaultBatchSize: number;\n MaxConcurrentJobs: number;\n}\n\n/** Threshold settings */\ninterface ThresholdConfig {\n DuplicateAbsolute: number;\n DuplicatePotential: number;\n SearchRelevance: number;\n AutotagConfidence: number;\n}\n\n/** Vector DB provider display record */\ninterface VectorDBRecord {\n ID: string;\n Name: string;\n ClassKey: string;\n Description: string;\n CredentialID: string | null;\n CredentialName: string | null;\n}\n\n/** Vector index display record */\ninterface VectorIndexRecord {\n ID: string;\n Name: string;\n EmbeddingModel: string;\n EmbeddingModelID: string;\n VectorDatabase: string;\n VectorDatabaseID: string;\n}\n\n/** Embedding model display record */\ninterface EmbeddingModelRecord {\n ID: string;\n Name: string;\n}\n\n/** Full-text searchable entity */\ninterface FTSEntityRecord {\n EntityName: string;\n IndexedFields: string[];\n TitleField: string;\n SnippetField: string;\n Enabled: boolean;\n}\n\n/** Row shape for the Search Analytics rollup. Mirrors the columns\n * `LoadSearchAnalytics` requests via the `Fields:` constraint. */\ninterface AnalyticsRow {\n ID: string;\n SearchScopeID: string | null;\n Status: string;\n Query: string;\n ResultCount: number;\n TotalDurationMs: number;\n RerankerName: string | null;\n RerankerCostCents: number | null;\n FailureReason: string | null;\n}\n\n@RegisterClass(BaseResourceComponent, 'KnowledgeConfigResource')\n@Component({\n standalone: false,\n selector: 'app-knowledge-config-resource',\n templateUrl: './knowledge-config-resource.component.html',\n styleUrls: ['./knowledge-config-resource.component.css']\n})\nexport class KnowledgeConfigResourceComponent extends BaseResourceComponent implements AfterViewInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n protected override navigationService = inject(NavigationService);\n protected override destroy$ = new Subject<void>();\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Configuration';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-gear';\n }\n\n // --- Navigation ---\n public Sections: ConfigSection[] = [\n { ID: 'pipeline', Label: 'Pipeline', Icon: 'fa-solid fa-diagram-project', Description: 'Configure the knowledge ingestion pipeline stages' },\n { ID: 'vectordb', Label: 'Vector Database', Icon: 'fa-solid fa-database', Description: 'Manage vector database connections and indexes' },\n { ID: 'fulltext', Label: 'Full-Text Indexes', Icon: 'fa-solid fa-text-width', Description: 'Configure SQL full-text search indexes' },\n { ID: 'embedding', Label: 'Embedding Models', Icon: 'fa-solid fa-microchip', Description: 'Select and configure embedding models' },\n { ID: 'thresholds', Label: 'Thresholds', Icon: 'fa-solid fa-sliders', Description: 'Set scoring thresholds for search and deduplication' },\n { ID: 'search-scopes', Label: 'Search Scopes', Icon: 'fa-solid fa-compass-drafting', Description: 'Define reusable search scopes — which providers, entities, external indexes, and storage accounts participate in scoped search' },\n { ID: 'search-analytics', Label: 'Search Analytics', Icon: 'fa-solid fa-chart-line', Description: 'Per-scope query volume, p50/p95 latency, hit rate, top failures, and reranker spend (driven by SearchExecutionLog)' },\n { ID: 'search-permissions', Label: 'Permissions', Icon: 'fa-solid fa-shield-halved', Description: 'Cross-scope view of every SearchScopePermission row, filterable by scope, user, or role (P2A.7)' },\n { ID: 'scheduling', Label: 'Scheduling', Icon: 'fa-solid fa-clock', Description: 'Manage automated pipeline schedules' },\n ];\n\n public ActiveSection = 'pipeline';\n public IsLoading = true;\n public IsSaving = false;\n public HasUnsavedChanges = false;\n\n // --- Pipeline ---\n public PipelineSettings: PipelineConfig = {\n AutotagOnIngest: true,\n VectorizeOnIngest: true,\n DefaultBatchSize: 100,\n MaxConcurrentJobs: 3\n };\n\n // --- Thresholds ---\n public ThresholdSettings: ThresholdConfig = {\n DuplicateAbsolute: 0.95,\n DuplicatePotential: 0.75,\n SearchRelevance: 0.3,\n AutotagConfidence: 0.7\n };\n\n // --- Vector DB Providers ---\n public VectorDBProviders: VectorDBRecord[] = [];\n public get HasVectorDBProvider(): boolean { return this.VectorDBProviders.length > 0; }\n\n // --- Vector Indexes ---\n public VectorIndexes: VectorIndexRecord[] = [];\n public get HasVectorIndex(): boolean { return this.VectorIndexes.length > 0; }\n\n // --- Embedding Models ---\n public EmbeddingModels: EmbeddingModelRecord[] = [];\n public get HasEmbeddingModel(): boolean { return this.EmbeddingModels.length > 0; }\n public get EmbeddingModelName(): string { return this.EmbeddingModels.length > 0 ? this.EmbeddingModels[0].Name : ''; }\n\n // --- Credentials (for vector DB provider binding) ---\n public AvailableCredentials: { ID: string; Name: string }[] = [];\n public IsSavingCredential = false;\n\n // --- Entity Documents (for persisting thresholds) ---\n private entityDocuments: MJEntityDocumentEntity[] = [];\n\n // --- Setup Progress ---\n public get SetupStepsCompleted(): number {\n let count = 0;\n if (this.HasVectorDBProvider) count++;\n if (this.HasEmbeddingModel) count++;\n if (this.HasVectorIndex) count++;\n return count;\n }\n public get VectorSetupComplete(): boolean {\n return this.HasVectorDBProvider && this.HasVectorIndex && this.HasEmbeddingModel;\n }\n\n // --- Full-Text Search Entities ---\n public FTSEntities: FTSEntityRecord[] = [];\n public IsLoadingFTSEntities = false;\n public FTSFilterText = '';\n\n public get EnabledFTSCount(): number {\n return this.FTSEntities.filter(e => e.Enabled).length;\n }\n\n public get FilteredFTSEntities(): FTSEntityRecord[] {\n if (!this.FTSFilterText.trim()) return this.FTSEntities;\n const filter = this.FTSFilterText.toLowerCase();\n return this.FTSEntities.filter(e => e.EntityName.toLowerCase().includes(filter));\n }\n\n // --- Create Index Form ---\n public ShowCreateIndexForm = false;\n public IsCreatingIndex = false;\n public NewIndexName = '';\n public NewIndexVectorDBID = '';\n public NewIndexEmbeddingModelID = '';\n\n // --- Search Scopes ---\n /** All SearchScope rows the current user can manage. */\n public SearchScopes: MJSearchScopeEntity[] = [];\n /** Currently-selected scope ID — drives child-grid loading. */\n public ActiveScopeID: string | null = null;\n public IsLoadingScopes = false;\n /** Which sub-tab of the selected scope is open. */\n public ActiveScopeTab: 'definition' | 'providers' | 'indexes' | 'entities' | 'storage' | 'permissions' = 'definition';\n\n /** Column spec for the Providers child grid. */\n public readonly ScopeProviderColumns: SearchScopeChildGridColumn[] = [\n { Field: 'SearchProviderID', Label: 'Provider', Type: 'lookup', LookupEntityName: 'MJ: Search Providers', LookupFilter: \"Status='Active'\", Width: '200px' },\n { Field: 'Enabled', Label: 'Enabled', Type: 'checkbox', Width: '80px' },\n { Field: 'MaxResults', Label: 'Max Results', Type: 'number', Placeholder: 'e.g. 20', Width: '110px' },\n { Field: 'QueryTransformTemplateID', Label: 'Query Transform', Type: 'lookup', LookupEntityName: 'Templates', Width: '180px' },\n { Field: 'ProviderConfigOverride', Label: 'Config Override', Type: 'code', Placeholder: 'JSON override (optional)' },\n ];\n\n /** Column spec for the External Indexes child grid. */\n public readonly ScopeExternalIndexColumns: SearchScopeChildGridColumn[] = [\n { Field: 'IndexType', Label: 'Type', Type: 'select', Options: [\n { Label: 'Vector', Value: 'Vector' },\n { Label: 'Elasticsearch', Value: 'Elasticsearch' },\n { Label: 'OpenSearch', Value: 'OpenSearch' },\n { Label: 'Typesense', Value: 'Typesense' },\n { Label: 'Azure AI Search', Value: 'AzureAISearch' },\n ], Width: '140px' },\n { Field: 'IndexName', Label: 'Index Name', Type: 'text', Placeholder: 'hr-policies-v2', Width: '200px' },\n { Field: 'MetadataFilterTemplate', Label: 'Metadata Filter (Nunjucks)', Type: 'code', Placeholder: '{ \"tenantId\": \"{{ context.PrimaryScopeRecordID }}\" }' },\n { Field: 'ExternalIndexConfig', Label: 'Config Override', Type: 'code', Placeholder: 'JSON override (optional)' },\n ];\n\n /** Column spec for the Entities child grid. */\n public readonly ScopeEntityColumns: SearchScopeChildGridColumn[] = [\n { Field: 'EntityID', Label: 'Entity', Type: 'lookup', LookupEntityName: 'Entities', Width: '220px' },\n { Field: 'ExtraFilter', Label: 'Extra Filter (SQL + Nunjucks)', Type: 'code', Placeholder: \"CategoryID = '<uuid>' AND OrganizationID = '{{ context.PrimaryScopeRecordID }}'\" },\n { Field: 'UserSearchStringOverride', Label: 'Query Rewrite', Type: 'text', Placeholder: '— use raw query —' },\n ];\n\n /** Column spec for the Storage Accounts child grid. */\n public readonly ScopeStorageColumns: SearchScopeChildGridColumn[] = [\n { Field: 'StorageAccountID', Label: 'Storage Account', Type: 'lookup', LookupEntityName: 'Storage Providers', Width: '220px' },\n { Field: 'FolderPath', Label: 'Folder Path (Nunjucks)', Type: 'code', Placeholder: '/tenants/{{ context.PrimaryScopeRecordID }}/hr/policies/' },\n ];\n\n /**\n * Column spec for the SearchScopePermission child grid (Phase 2A).\n * Editable surface — admins author per-user / per-role grants here.\n * Each row binds either a User or a Role (XOR enforced by the DB CHECK\n * constraint, surfaced as a save-time error for now). Resolution order\n * lives in SearchScopePermissionResolver.\n */\n public readonly ScopePermissionColumns: SearchScopeChildGridColumn[] = [\n { Field: 'UserID', Label: 'User', Type: 'lookup', LookupEntityName: 'Users', LookupFilter: \"IsActive=1\", Width: '240px' },\n { Field: 'RoleID', Label: 'Role', Type: 'lookup', LookupEntityName: 'Roles', Width: '200px' },\n { Field: 'PermissionLevel', Label: 'Level', Type: 'select', Options: [\n { Label: 'None (explicit deny)', Value: 'None' },\n { Label: 'Read (view only)', Value: 'Read' },\n { Label: 'Search (invoke)', Value: 'Search' },\n { Label: 'Manage (edit + grant)', Value: 'Manage' },\n ], Width: '200px' },\n ];\n\n ngAfterViewInit(): void {\n this.loadConfiguration();\n this.navigationService.SetAgentContext(this, {\n ActiveSection: this.ActiveSection,\n });\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ================================================================\n // Public Methods\n // ================================================================\n\n public SelectSection(sectionId: string): void {\n this.ActiveSection = sectionId;\n if (sectionId === 'search-scopes' && this.SearchScopes.length === 0) {\n void this.LoadSearchScopes();\n }\n if (sectionId === 'search-analytics' && !this.AnalyticsLoaded && !this.AnalyticsLoading) {\n void this.LoadSearchAnalytics();\n }\n if (sectionId === 'search-permissions' && !this.PermissionsLoaded && !this.PermissionsLoading) {\n void this.LoadPermissionsAudit();\n }\n this.cdr.detectChanges();\n }\n\n // ─── Search Analytics (P3.3) ──────────────────────────────────────────────\n\n public AnalyticsLoaded = false;\n public AnalyticsLoading = false;\n public AnalyticsTotalRuns = 0;\n public AnalyticsSuccessRate = 0;\n public AnalyticsAvgLatencyMs = 0;\n public AnalyticsP95LatencyMs = 0;\n public AnalyticsTotalRerankerCostCents = 0;\n public AnalyticsHitRate = 0;\n public AnalyticsTopScopes: Array<{ ScopeID: string; Name: string; Count: number; AvgLatencyMs: number }> = [];\n public AnalyticsTopFailures: Array<{ Reason: string; Count: number }> = [];\n public AnalyticsRerankerSpend: Array<{ Reranker: string; Count: number; TotalCents: number }> = [];\n\n public async LoadSearchAnalytics(): Promise<void> {\n this.AnalyticsLoading = true;\n this.cdr.detectChanges();\n try {\n const rows = await this.fetchSearchExecutionRows();\n if (rows === null) return;\n this.computeAnalyticsKpis(rows);\n await this.computeAnalyticsTopScopes(rows);\n this.computeAnalyticsTopFailures(rows);\n this.computeAnalyticsRerankerSpend(rows);\n this.AnalyticsLoaded = true;\n } catch (err) {\n LogError(`KnowledgeConfig: LoadSearchAnalytics threw: ${err instanceof Error ? err.message : String(err)}`);\n } finally {\n this.AnalyticsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Fetch the raw SearchExecutionLog rows. Returns null on RunView failure (already logged). */\n private async fetchSearchExecutionRows(): Promise<AnalyticsRow[] | null> {\n const rv = new RunView();\n const result = await rv.RunView<AnalyticsRow>({\n EntityName: 'MJ: Search Execution Logs',\n Fields: ['ID', 'SearchScopeID', 'Status', 'ResultCount', 'TotalDurationMs', 'RerankerName', 'RerankerCostCents', 'FailureReason'],\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 5000,\n ResultType: 'simple',\n });\n if (!result.Success) {\n LogError(`KnowledgeConfig: LoadSearchAnalytics failed: ${result.ErrorMessage}`);\n return null;\n }\n return result.Results ?? [];\n }\n\n /** Total runs, success rate, hit rate, avg + p95 latency, total reranker spend. */\n private computeAnalyticsKpis(rows: AnalyticsRow[]): void {\n this.AnalyticsTotalRuns = rows.length;\n const successRows = rows.filter(r => r.Status === 'Success');\n this.AnalyticsSuccessRate = rows.length > 0 ? Math.round((successRows.length / rows.length) * 100) : 0;\n this.AnalyticsHitRate = successRows.length > 0\n ? Math.round((successRows.filter(r => (r.ResultCount ?? 0) > 0).length / successRows.length) * 100)\n : 0;\n const latencies = successRows.map(r => r.TotalDurationMs ?? 0).sort((a, b) => a - b);\n this.AnalyticsAvgLatencyMs = latencies.length > 0\n ? Math.round(latencies.reduce((s, x) => s + x, 0) / latencies.length)\n : 0;\n this.AnalyticsP95LatencyMs = latencies.length > 0\n ? latencies[Math.min(latencies.length - 1, Math.floor(latencies.length * 0.95))]\n : 0;\n this.AnalyticsTotalRerankerCostCents = rows.reduce((s, r) => s + (r.RerankerCostCents ?? 0), 0);\n }\n\n /**\n * Per-scope volume rollup → top 10 by Count. Fetches scope names from\n * `this.SearchScopes` when already loaded, otherwise loads them on demand\n * so the unscoped audit-only path still gets human-readable labels.\n */\n private async computeAnalyticsTopScopes(rows: AnalyticsRow[]): Promise<void> {\n const byScope = new Map<string, { Count: number; LatencySum: number; ScopeID: string }>();\n for (const r of rows) {\n const id = r.SearchScopeID ?? '__unscoped__';\n const cur = byScope.get(id) ?? { Count: 0, LatencySum: 0, ScopeID: id };\n cur.Count++;\n cur.LatencySum += r.TotalDurationMs ?? 0;\n byScope.set(id, cur);\n }\n const scopeNameMap = new Map(this.SearchScopes.map(s => [s.ID, s.Name]));\n if (this.SearchScopes.length === 0 && byScope.size > 0) {\n await this.LoadSearchScopes();\n this.SearchScopes.forEach(s => scopeNameMap.set(s.ID, s.Name));\n }\n this.AnalyticsTopScopes = Array.from(byScope.values())\n .map(g => ({\n ScopeID: g.ScopeID,\n Name: scopeNameMap.get(g.ScopeID) ?? (g.ScopeID === '__unscoped__' ? '— unscoped —' : `(${g.ScopeID.slice(0, 8)}…)`),\n Count: g.Count,\n AvgLatencyMs: Math.round(g.LatencySum / g.Count),\n }))\n .sort((a, b) => b.Count - a.Count)\n .slice(0, 10);\n }\n\n /** Top 5 failure reasons across non-Success rows. */\n private computeAnalyticsTopFailures(rows: AnalyticsRow[]): void {\n const byFailure = new Map<string, number>();\n for (const r of rows) {\n if (r.Status !== 'Success' && r.FailureReason) {\n byFailure.set(r.FailureReason, (byFailure.get(r.FailureReason) ?? 0) + 1);\n }\n }\n this.AnalyticsTopFailures = Array.from(byFailure.entries())\n .map(([Reason, Count]) => ({ Reason, Count }))\n .sort((a, b) => b.Count - a.Count)\n .slice(0, 5);\n }\n\n /** Per-reranker spend rollup, sorted descending by total cost. */\n private computeAnalyticsRerankerSpend(rows: AnalyticsRow[]): void {\n const byReranker = new Map<string, { Count: number; TotalCents: number }>();\n for (const r of rows) {\n if (!r.RerankerName) continue;\n const cur = byReranker.get(r.RerankerName) ?? { Count: 0, TotalCents: 0 };\n cur.Count++;\n cur.TotalCents += r.RerankerCostCents ?? 0;\n byReranker.set(r.RerankerName, cur);\n }\n this.AnalyticsRerankerSpend = Array.from(byReranker.entries())\n .map(([Reranker, v]) => ({ Reranker, Count: v.Count, TotalCents: +v.TotalCents.toFixed(4) }))\n .sort((a, b) => b.TotalCents - a.TotalCents);\n }\n\n // ─── Permissions Audit (P2A.7) ────────────────────────────────────────────\n //\n // Cross-scope view of every SearchScopePermission row. Renders a flat,\n // filterable list so an admin can answer \"who has access to which scopes\"\n // in one place. Editing happens on the SearchScope full form's\n // Permissions panel — this dashboard is read-only.\n\n public PermissionsLoaded = false;\n public PermissionsLoading = false;\n public PermissionsRows: Array<{\n ID: string;\n SearchScopeID: string;\n SearchScopeName: string;\n UserID: string | null;\n UserName: string | null;\n UserEmail: string | null;\n RoleID: string | null;\n RoleName: string | null;\n PermissionLevel: string;\n }> = [];\n public PermissionsFilterScope: string = '';\n public PermissionsFilterPrincipal: string = '';\n public PermissionsFilterLevel: string = '';\n\n public async LoadPermissionsAudit(): Promise<void> {\n this.PermissionsLoading = true;\n this.cdr.detectChanges();\n try {\n const fetched = await this.fetchPermissionsAuditData();\n if (!fetched) {\n this.PermissionsRows = [];\n return;\n }\n this.PermissionsRows = this.shapePermissionsAuditRows(fetched);\n this.PermissionsLoaded = true;\n } catch (err) {\n LogError(`KnowledgeConfig: LoadPermissionsAudit threw: ${err instanceof Error ? err.message : String(err)}`);\n } finally {\n this.PermissionsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n public get FilteredPermissionsRows(): typeof this.PermissionsRows {\n const scope = (this.PermissionsFilterScope || '').toLowerCase();\n const principal = (this.PermissionsFilterPrincipal || '').toLowerCase();\n const level = this.PermissionsFilterLevel;\n return this.PermissionsRows.filter(r => {\n if (scope && !r.SearchScopeName.toLowerCase().includes(scope)) return false;\n if (principal) {\n const candidates = [r.UserName, r.UserEmail, r.RoleName].filter(Boolean) as string[];\n if (!candidates.some(c => c.toLowerCase().includes(principal))) return false;\n }\n if (level && r.PermissionLevel !== level) return false;\n return true;\n });\n }\n\n public RefreshPermissionsAudit(): void {\n this.PermissionsLoaded = false;\n void this.LoadPermissionsAudit();\n }\n\n /**\n * Pull permissions, scopes, users, roles in one batched call.\n * `BypassCache: true` on every view — this is an audit dashboard, so we\n * want SQL-truth even when permission/scope rows have been written\n * outside the normal `BaseEntity.Save()` path (test harnesses,\n * direct-SQL maintenance, recovery scripts). Without this, scope names\n * can render as \"(unknown)\" if the cache was populated before the\n * underlying row was inserted.\n *\n * Returns null on RunView failure (already logged).\n */\n private async fetchPermissionsAuditData(): Promise<{\n perms: Array<{ ID: string; SearchScopeID: string; UserID: string | null; RoleID: string | null; PermissionLevel: string }>;\n scopes: Array<{ ID: string; Name: string }>;\n users: Array<{ ID: string; Name: string; Email: string }>;\n roles: Array<{ ID: string; Name: string }>;\n } | null> {\n const rv = new RunView();\n const result = await rv.RunViews([\n { EntityName: 'MJ: Search Scope Permissions', Fields: ['ID', 'SearchScopeID', 'UserID', 'RoleID', 'PermissionLevel'], OrderBy: '__mj_CreatedAt DESC', MaxRows: 5000, ResultType: 'simple', BypassCache: true },\n { EntityName: 'MJ: Search Scopes', Fields: ['ID', 'Name'], ResultType: 'simple', BypassCache: true },\n { EntityName: 'MJ: Users', Fields: ['ID', 'Name', 'Email'], ResultType: 'simple', BypassCache: true },\n { EntityName: 'MJ: Roles', Fields: ['ID', 'Name'], ResultType: 'simple', BypassCache: true },\n ]);\n if (!result?.[0]?.Success) {\n LogError(`KnowledgeConfig: LoadPermissionsAudit failed: ${result?.[0]?.ErrorMessage}`);\n return null;\n }\n return {\n perms: (result[0].Results ?? []) as Array<{ ID: string; SearchScopeID: string; UserID: string | null; RoleID: string | null; PermissionLevel: string }>,\n scopes: (result[1].Results ?? []) as Array<{ ID: string; Name: string }>,\n users: (result[2].Results ?? []) as Array<{ ID: string; Name: string; Email: string }>,\n roles: (result[3].Results ?? []) as Array<{ ID: string; Name: string }>,\n };\n }\n\n /**\n * Shape the raw fetched data into the audit-table rows. Drops\n * permission rows whose SearchScope is not visible to the current user\n * (MJ's row-level filtering hides scopes from non-Owner callers).\n * Surfacing the permission row with \"(unknown)\" leaks the row's\n * existence without giving the auditor anything useful — the underlying\n * API already enforces visibility, so this is a UX call, not a security\n * one.\n */\n private shapePermissionsAuditRows(data: {\n perms: Array<{ ID: string; SearchScopeID: string; UserID: string | null; RoleID: string | null; PermissionLevel: string }>;\n scopes: Array<{ ID: string; Name: string }>;\n users: Array<{ ID: string; Name: string; Email: string }>;\n roles: Array<{ ID: string; Name: string }>;\n }): typeof this.PermissionsRows {\n const scopeName = new Map(data.scopes.map(s => [s.ID, s.Name]));\n const userByID = new Map(data.users.map(u => [u.ID, u]));\n const roleName = new Map(data.roles.map(r => [r.ID, r.Name]));\n return data.perms\n .filter(p => scopeName.has(p.SearchScopeID))\n .map(p => {\n const u = p.UserID ? userByID.get(p.UserID) : null;\n return {\n ID: p.ID,\n SearchScopeID: p.SearchScopeID,\n SearchScopeName: scopeName.get(p.SearchScopeID) ?? '(unknown)',\n UserID: p.UserID,\n UserName: u?.Name ?? null,\n UserEmail: u?.Email ?? null,\n RoleID: p.RoleID,\n RoleName: p.RoleID ? (roleName.get(p.RoleID) ?? '(unknown)') : null,\n PermissionLevel: p.PermissionLevel,\n };\n });\n }\n\n // ─── Search Scopes ────────────────────────────────────────────────────────\n\n public async LoadSearchScopes(): Promise<void> {\n this.IsLoadingScopes = true;\n this.cdr.detectChanges();\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJSearchScopeEntity>({\n EntityName: 'MJ: Search Scopes',\n OrderBy: 'IsGlobal DESC, IsDefault DESC, Name ASC',\n ResultType: 'entity_object'\n });\n if (!result.Success) {\n LogError(`KnowledgeConfig: LoadSearchScopes failed: ${result.ErrorMessage}`);\n this.SearchScopes = [];\n } else {\n // Collapse by ID — defensive against any caller (or interleaved\n // reactive cycle) that could ever put the same scope in twice.\n const byID = new Map<string, MJSearchScopeEntity>();\n for (const s of result.Results ?? []) {\n byID.set(s.ID, s);\n }\n this.SearchScopes = Array.from(byID.values());\n if (!this.ActiveScopeID && this.SearchScopes.length > 0) {\n this.ActiveScopeID = this.SearchScopes[0].ID;\n }\n }\n } finally {\n this.IsLoadingScopes = false;\n this.cdr.detectChanges();\n }\n }\n\n public SelectScope(scopeID: string): void {\n this.ActiveScopeID = scopeID;\n this.ActiveScopeTab = 'definition';\n this.cdr.detectChanges();\n }\n\n public SelectScopeTab(tab: 'definition' | 'providers' | 'indexes' | 'entities' | 'storage' | 'permissions'): void {\n this.ActiveScopeTab = tab;\n this.cdr.detectChanges();\n }\n\n public get ActiveScope(): MJSearchScopeEntity | null {\n return this.SearchScopes.find(s => UUIDsEqual(s.ID, this.ActiveScopeID ?? '')) ?? null;\n }\n\n public async CreateNewScope(): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const scope = await md.GetEntityObject<MJSearchScopeEntity>('MJ: Search Scopes');\n scope.Name = this.pickUniqueNewScopeName();\n scope.Description = 'New scope — configure providers, entities, or storage below.';\n scope.Icon = 'fa-solid fa-filter';\n scope.Status = 'Active';\n scope.IsGlobal = false;\n scope.IsDefault = false;\n const ok = await scope.Save();\n if (!ok) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Create scope failed: ${scope.LatestResult?.CompleteMessage ?? 'unknown error'}`,\n 'error', 5000\n );\n return;\n }\n // Append synchronously so a rapid second + New click picks a fresh\n // unique-suffix Name. An async refetch here would leave a window\n // where pickUniqueNewScopeName() sees a stale list and re-picks\n // the same suffix, producing UQ_SearchScope_Name violations.\n this.SearchScopes = [...this.SearchScopes, scope];\n this.ActiveScopeID = scope.ID;\n this.ActiveScopeTab = 'definition';\n this.cdr.detectChanges();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n MJNotificationService.Instance.CreateSimpleNotification(`Error creating scope: ${msg}`, 'error', 5000);\n }\n }\n\n /**\n * Pick a placeholder Name that doesn't collide with an existing scope.\n * `__mj.SearchScope.Name` is UNIQUE, so reusing the literal string\n * \"New Search Scope\" twice in a row throws SQL Server's UQ violation.\n * Walk an incrementing suffix until we find one the in-memory list\n * doesn't already use (\"New Search Scope\", \"New Search Scope 2\",\n * \"New Search Scope 3\", ...). Existing scopes table is small and\n * already loaded, so the linear scan is trivially cheap.\n */\n private pickUniqueNewScopeName(): string {\n const base = 'New Search Scope';\n const existing = new Set(this.SearchScopes.map(s => (s.Name ?? '').toLowerCase()));\n if (!existing.has(base.toLowerCase())) return base;\n for (let i = 2; i < 1000; i++) {\n const candidate = `${base} ${i}`;\n if (!existing.has(candidate.toLowerCase())) return candidate;\n }\n // Fallback: degrade to a timestamp suffix so we never throw.\n return `${base} ${Date.now()}`;\n }\n\n /**\n * Open the active scope in its full custom form (a new MJExplorer tab).\n * The dashboard view exposes a quick-edit subset; the full form has the\n * Phase 2D / Phase 4 surfaces (Fusion Weights sliders, Reranker dropdown,\n * Reranker Budget Cents, Live Preview, Search Scope Test Queries panel,\n * Search Execution Logs panel, etc.). No-ops for the built-in Global\n * scope (no detail to author) and any scope without an ID yet.\n */\n public OpenActiveScopeFullForm(): void {\n const scope = this.ActiveScope;\n if (!scope?.ID) return;\n const pkey = new CompositeKey([{ FieldName: 'ID', Value: scope.ID }]);\n this.navigationService.OpenEntityRecord('MJ: Search Scopes', pkey);\n }\n\n public async SaveActiveScope(): Promise<void> {\n const scope = this.ActiveScope;\n if (!scope) return;\n const ok = await scope.Save();\n if (ok) {\n MJNotificationService.Instance.CreateSimpleNotification('Scope saved', 'success', 2000);\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Save failed: ${scope.LatestResult?.CompleteMessage ?? 'unknown error'}`,\n 'error', 5000\n );\n }\n this.cdr.detectChanges();\n }\n\n /** Format a scope Date field as the string expected by <input type=\"datetime-local\">. */\n public FormatScopeDate(value: Date | string | null | undefined): string {\n if (!value) return '';\n const d = value instanceof Date ? value : new Date(value);\n if (isNaN(d.getTime())) return '';\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`;\n }\n\n /** Write a datetime-local input value back to the scope entity. Empty clears to null. */\n public SetScopeDate(scope: MJSearchScopeEntity, field: 'StartAt' | 'EndAt', value: string): void {\n if (!value) {\n scope[field] = null;\n return;\n }\n const parsed = new Date(value);\n scope[field] = isNaN(parsed.getTime()) ? null : parsed;\n }\n\n public async DeleteActiveScope(): Promise<void> {\n const scope = this.ActiveScope;\n if (!scope) return;\n if (scope.IsGlobal) {\n MJNotificationService.Instance.CreateSimpleNotification('The built-in Global scope cannot be deleted.', 'warning', 3000);\n return;\n }\n const ok = await scope.Delete();\n if (!ok) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Delete failed: ${scope.LatestResult?.CompleteMessage ?? 'unknown error'}`,\n 'error', 5000\n );\n return;\n }\n this.SearchScopes = this.SearchScopes.filter(s => !UUIDsEqual(s.ID, scope.ID));\n this.ActiveScopeID = this.SearchScopes.length > 0 ? this.SearchScopes[0].ID : null;\n this.cdr.detectChanges();\n }\n\n public OnSettingChanged(): void {\n this.HasUnsavedChanges = true;\n this.cdr.detectChanges();\n }\n\n public async SaveConfiguration(): Promise<void> {\n this.IsSaving = true;\n this.cdr.detectChanges();\n try {\n await this.persistThresholdsToEntityDocuments();\n this.HasUnsavedChanges = false;\n MJNotificationService.Instance.CreateSimpleNotification('Configuration saved', 'success', 2000);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[KnowledgeConfig] Save failed:', msg);\n MJNotificationService.Instance.CreateSimpleNotification(`Save failed: ${msg}`, 'error', 5000);\n } finally {\n this.IsSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n public ResetConfiguration(): void {\n this.loadConfiguration();\n this.HasUnsavedChanges = false;\n this.cdr.detectChanges();\n }\n\n /** Handle toggling an FTS entity */\n public OnFTSEntityToggled(entity: FTSEntityRecord): void {\n this.HasUnsavedChanges = true;\n this.cdr.detectChanges();\n }\n\n public FormatThreshold(value: number): string {\n return `${Math.round(value * 100)}%`;\n }\n\n /** Open the create index inline form */\n public OpenCreateIndexForm(): void {\n this.ShowCreateIndexForm = true;\n this.NewIndexName = 'mj-knowledge-index';\n this.NewIndexVectorDBID = this.VectorDBProviders.length > 0 ? this.VectorDBProviders[0].ID : '';\n this.NewIndexEmbeddingModelID = this.EmbeddingModels.length > 0 ? this.EmbeddingModels[0].ID : '';\n this.cdr.detectChanges();\n }\n\n /** Cancel creating an index */\n public CancelCreateIndex(): void {\n this.ShowCreateIndexForm = false;\n this.cdr.detectChanges();\n }\n\n /** Create a new vector index */\n public async CreateIndex(): Promise<void> {\n if (!this.NewIndexName.trim() || !this.NewIndexVectorDBID || !this.NewIndexEmbeddingModelID) {\n MJNotificationService.Instance.CreateSimpleNotification('Please fill in all fields', 'warning', 3000);\n return;\n }\n\n this.IsCreatingIndex = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const index = await md.GetEntityObject<MJVectorIndexEntity>('MJ: Vector Indexes');\n index.NewRecord();\n index.Name = this.NewIndexName.trim();\n index.VectorDatabaseID = this.NewIndexVectorDBID;\n index.EmbeddingModelID = this.NewIndexEmbeddingModelID;\n index.Description = `Knowledge Hub vector index created ${new Date().toLocaleDateString()}`;\n\n const saved = await index.Save();\n if (saved) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Vector index \"${this.NewIndexName}\" created successfully`,\n 'success', 3000\n );\n this.ShowCreateIndexForm = false;\n await this.loadConfiguration();\n } else {\n const msg = index.LatestResult?.CompleteMessage || 'Unknown error';\n console.error('[KnowledgeConfig] Failed to create index:', msg);\n MJNotificationService.Instance.CreateSimpleNotification(`Failed to create index: ${msg}`, 'error', 5000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[KnowledgeConfig] Error creating index:', msg);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);\n } finally {\n this.IsCreatingIndex = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Delete a vector index */\n public async DeleteIndex(indexId: string): Promise<void> {\n const idx = this.VectorIndexes.find(i => UUIDsEqual(i.ID, indexId));\n if (!idx) return;\n\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<MJVectorIndexEntity>('MJ: Vector Indexes');\n const loaded = await entity.Load(indexId);\n if (!loaded) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Could not load vector index \"${idx.Name}\"`, 'error', 3000\n );\n return;\n }\n const deleted = await entity.Delete();\n if (deleted) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Index \"${idx.Name}\" deleted`, 'success', 2000\n );\n await this.loadConfiguration();\n } else {\n const msg = entity.LatestResult?.CompleteMessage || 'Unknown error';\n console.error('[KnowledgeConfig] Delete failed:', msg);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Delete failed: ${msg}`, 'error', 5000\n );\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[KnowledgeConfig] Error deleting index:', msg);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);\n }\n }\n\n /** Update the credential linked to a vector database provider */\n public async SaveProviderCredential(provider: VectorDBRecord): Promise<void> {\n this.IsSavingCredential = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<MJVectorDatabaseEntity>('MJ: Vector Databases');\n const loaded = await entity.Load(provider.ID);\n if (!loaded) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Could not load vector database \"${provider.Name}\"`, 'error', 3000\n );\n return;\n }\n\n entity.CredentialID = provider.CredentialID || null;\n const saved = await entity.Save();\n if (saved) {\n provider.CredentialName = this.AvailableCredentials.find(c => UUIDsEqual(c.ID, provider.CredentialID))?.Name ?? null;\n MJNotificationService.Instance.CreateSimpleNotification(\n provider.CredentialID\n ? `Credential linked to \"${provider.Name}\"`\n : `Credential removed from \"${provider.Name}\"`,\n 'success', 2000\n );\n } else {\n const msg = entity.LatestResult?.CompleteMessage ?? 'Unknown error';\n console.error('[KnowledgeConfig] Save credential failed:', msg);\n MJNotificationService.Instance.CreateSimpleNotification(`Save failed: ${msg}`, 'error', 5000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[KnowledgeConfig] Error saving credential:', msg);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);\n } finally {\n this.IsSavingCredential = false;\n this.cdr.detectChanges();\n }\n }\n\n // ================================================================\n // Private Methods\n // ================================================================\n\n private async loadConfiguration(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n // Use KnowledgeHubMetadataEngine for cached vector DBs, indexes, and entity docs\n const engine = KnowledgeHubMetadataEngine.Instance;\n await engine.Config(false);\n\n this.loadVectorDBProvidersFromEngine(AIEngineBase.Instance.VectorDatabases);\n this.loadVectorIndexesFromEngine(engine.VectorIndexes);\n this.loadEntityDocumentsAndThresholds(engine.GetActiveEntityDocuments());\n\n // AI Models and Credentials come from different domains — fetch via RunView\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [modelsResult, credentialsResult] = await rv.RunViews([\n { EntityName: 'MJ: AI Models', ResultType: 'simple' },\n { EntityName: 'MJ: Credentials', ExtraFilter: 'IsActive = 1', Fields: ['ID', 'Name'], ResultType: 'simple' }\n ]);\n this.loadEmbeddingModels(modelsResult.Success ? modelsResult.Results : []);\n this.AvailableCredentials = (credentialsResult.Success ? credentialsResult.Results : [])\n .map((c: Record<string, unknown>) => ({ ID: String(c['ID']), Name: String(c['Name']) }));\n } catch (error) {\n console.error('[KnowledgeConfig] Error loading configuration:', error);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n\n // Load FTS entities in background (doesn't block main config)\n this.loadFTSEntities();\n }\n\n private async loadFTSEntities(): Promise<void> {\n this.IsLoadingFTSEntities = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const allEntities = md.Entities;\n const ftsEntities: FTSEntityRecord[] = [];\n\n for (const entity of allEntities) {\n const textFields = entity.Fields.filter(\n (f: { Name: string; Type: string; MaxLength: number; IsPrimaryKey: boolean }) =>\n !f.IsPrimaryKey &&\n !f.Name.startsWith('__mj') &&\n (f.Type.toLowerCase().includes('varchar') ||\n f.Type.toLowerCase().includes('text') ||\n f.Type.toLowerCase() === 'ntext') &&\n f.MaxLength !== 1\n );\n\n if (textFields.length === 0) continue;\n\n const preferredTitleNames = ['Name', 'Title', 'Subject', 'Label'];\n const preferredSnippetNames = ['Description', 'Summary', 'Body', 'Content', 'Text', 'Notes'];\n\n const titleField = textFields.find((f: { Name: string }) => preferredTitleNames.includes(f.Name))?.Name\n || textFields[0]?.Name || 'Name';\n const snippetField = textFields.find((f: { Name: string }) =>\n preferredSnippetNames.includes(f.Name) && f.Name !== titleField\n )?.Name || titleField;\n\n ftsEntities.push({\n EntityName: entity.Name,\n IndexedFields: textFields.slice(0, 4).map((f: { Name: string }) => f.Name),\n TitleField: titleField,\n SnippetField: snippetField,\n Enabled: true,\n });\n }\n\n ftsEntities.sort((a, b) => a.EntityName.localeCompare(b.EntityName));\n this.FTSEntities = ftsEntities;\n } catch (error) {\n console.error('[KnowledgeConfig] Error loading FTS entities:', error);\n } finally {\n this.IsLoadingFTSEntities = false;\n this.cdr.detectChanges();\n }\n }\n\n private loadVectorDBProvidersFromEngine(dbs: MJVectorDatabaseEntity[]): void {\n this.VectorDBProviders = dbs.map(db => ({\n ID: db.ID,\n Name: db.Name,\n ClassKey: db.ClassKey || '',\n Description: db.Description || '',\n CredentialID: db.CredentialID,\n CredentialName: db.Credential ?? null\n }));\n }\n\n private loadVectorIndexesFromEngine(indexes: MJVectorIndexEntity[]): void {\n this.VectorIndexes = indexes.map(vi => ({\n ID: vi.ID,\n Name: vi.Name || 'Unnamed Index',\n EmbeddingModel: vi.EmbeddingModel || '',\n EmbeddingModelID: vi.EmbeddingModelID || '',\n VectorDatabase: vi.VectorDatabase || '',\n VectorDatabaseID: vi.VectorDatabaseID || ''\n }));\n }\n\n /** Load entity documents and seed threshold settings from the first document's values */\n private loadEntityDocumentsAndThresholds(docs: MJEntityDocumentEntity[]): void {\n this.entityDocuments = docs;\n if (docs.length > 0) {\n // Use the first entity document's thresholds as the canonical values\n const doc = docs[0];\n this.ThresholdSettings.DuplicatePotential = doc.PotentialMatchThreshold;\n this.ThresholdSettings.DuplicateAbsolute = doc.AbsoluteMatchThreshold;\n }\n }\n\n /** Persist threshold settings back to all active entity documents */\n private async persistThresholdsToEntityDocuments(): Promise<void> {\n if (this.entityDocuments.length === 0) {\n return; // No entity documents to update\n }\n\n for (const doc of this.entityDocuments) {\n doc.PotentialMatchThreshold = this.ThresholdSettings.DuplicatePotential;\n doc.AbsoluteMatchThreshold = this.ThresholdSettings.DuplicateAbsolute;\n const saved = await doc.Save();\n if (!saved) {\n const msg = doc.LatestResult?.CompleteMessage || 'Unknown error';\n throw new Error(`Failed to save entity document \"${doc.Name}\": ${msg}`);\n }\n }\n }\n\n private loadEmbeddingModels(records: Record<string, unknown>[]): void {\n this.EmbeddingModels = records\n .filter(m =>\n String(m['AIModelType'] || '').toLowerCase().includes('embedding') ||\n String(m['Name'] || '').toLowerCase().includes('embedding') ||\n String(m['Name'] || '').toLowerCase().includes('embed')\n )\n .map(m => ({\n ID: String(m['ID']),\n Name: String(m['Name'])\n }));\n }\n}\n\n/** Tree-shaking prevention */\nexport function LoadKnowledgeConfigResource(): void {\n // Prevents tree-shaking\n}\n","@if (IsLoading) {\n <div class=\"config-loading\">\n <mj-loading text=\"Loading configuration...\" size=\"medium\"></mj-loading>\n </div>\n} @else {\n <div class=\"config-layout\">\n <!-- Left Navigation -->\n <nav class=\"config-nav\">\n <div class=\"config-nav-header\">\n <i class=\"fa-solid fa-cogs\"></i>\n <span>Configuration</span>\n </div>\n @for (section of Sections; track section.ID) {\n <button\n class=\"config-nav-item\"\n [class.config-nav-item-active]=\"ActiveSection === section.ID\"\n (click)=\"SelectSection(section.ID)\"\n >\n <i [class]=\"section.Icon\"></i>\n <span>{{ section.Label }}</span>\n </button>\n }\n </nav>\n\n <!-- Content Area -->\n <div class=\"config-content\">\n <!-- Pipeline Settings -->\n @if (ActiveSection === 'pipeline') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Pipeline Settings</h2>\n <p class=\"config-section-desc\">Configure how the Knowledge Pipeline processes incoming content.</p>\n\n <div class=\"config-group\">\n <label class=\"config-toggle-row\">\n <div class=\"config-toggle-info\">\n <span class=\"config-label\">Auto-tag on Ingest</span>\n <span class=\"config-hint\">Automatically run autotagging when new content is ingested</span>\n </div>\n <input type=\"checkbox\" [(ngModel)]=\"PipelineSettings.AutotagOnIngest\" (change)=\"OnSettingChanged()\" class=\"config-checkbox\" />\n </label>\n\n <label class=\"config-toggle-row\">\n <div class=\"config-toggle-info\">\n <span class=\"config-label\">Vectorize on Ingest</span>\n <span class=\"config-hint\">Automatically create embeddings for new content</span>\n </div>\n <input type=\"checkbox\" [(ngModel)]=\"PipelineSettings.VectorizeOnIngest\" (change)=\"OnSettingChanged()\" class=\"config-checkbox\" />\n </label>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Default Batch Size</span>\n <span class=\"config-hint\">Number of items processed per batch</span>\n </div>\n <input type=\"number\" [(ngModel)]=\"PipelineSettings.DefaultBatchSize\" (input)=\"OnSettingChanged()\" class=\"config-input config-input-number\" min=\"10\" max=\"1000\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Max Concurrent Jobs</span>\n <span class=\"config-hint\">Maximum number of pipeline jobs running at once</span>\n </div>\n <input type=\"number\" [(ngModel)]=\"PipelineSettings.MaxConcurrentJobs\" (input)=\"OnSettingChanged()\" class=\"config-input config-input-number\" min=\"1\" max=\"10\" />\n </div>\n </div>\n </div>\n }\n\n <!-- Vector Database Settings -->\n @if (ActiveSection === 'vectordb') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Vector Database</h2>\n <p class=\"config-section-desc\">Manage the shared vector index and database connection.</p>\n\n <!-- Setup Progress -->\n <div class=\"setup-progress\">\n <div class=\"setup-progress-header\">\n <span class=\"setup-progress-label\">Setup Progress</span>\n <span class=\"setup-progress-count\">{{ SetupStepsCompleted }} of 3 complete</span>\n </div>\n <div class=\"setup-progress-bar\">\n <div class=\"setup-progress-fill\" [style.width.%]=\"(SetupStepsCompleted / 3) * 100\"></div>\n </div>\n </div>\n\n <!-- Step 1: Providers -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasVectorDBProvider\" [class.setup-step-pending]=\"!HasVectorDBProvider\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasVectorDBProvider) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">1</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Vector Database Providers</span>\n @if (HasVectorDBProvider) {\n <span class=\"setup-step-status\">{{ VectorDBProviders.length }} provider(s) registered</span>\n } @else {\n <span class=\"setup-step-status\">No providers registered. Add a vector database provider (e.g., Pinecone, Weaviate) via the admin console.</span>\n }\n </div>\n </div>\n @if (HasVectorDBProvider) {\n <div class=\"setup-step-detail\">\n @for (provider of VectorDBProviders; track provider.ID) {\n <div class=\"provider-card\">\n <div class=\"provider-icon\">\n <i class=\"fa-solid fa-database\"></i>\n </div>\n <div class=\"provider-info\">\n <span class=\"provider-name\">{{ provider.Name }}</span>\n <span class=\"provider-class\">{{ provider.ClassKey }}</span>\n </div>\n <span class=\"config-status-badge config-status-active\">\n <i class=\"fa-solid fa-circle-check\"></i> Active\n </span>\n </div>\n <div class=\"provider-credential-row\">\n <label class=\"provider-credential-label\">\n <i class=\"fa-solid fa-key\"></i> API Credential\n </label>\n <div class=\"provider-credential-picker\">\n <select class=\"provider-credential-select\"\n [(ngModel)]=\"provider.CredentialID\"\n (change)=\"SaveProviderCredential(provider)\"\n [disabled]=\"IsSavingCredential\">\n <option [ngValue]=\"null\">None (use environment variable)</option>\n @for (cred of AvailableCredentials; track cred.ID) {\n <option [ngValue]=\"cred.ID\">{{ cred.Name }}</option>\n }\n </select>\n @if (IsSavingCredential) {\n <i class=\"fa-solid fa-spinner fa-spin provider-credential-spinner\"></i>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Step 2: Embedding Model -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasEmbeddingModel\" [class.setup-step-pending]=\"!HasEmbeddingModel\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasEmbeddingModel) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">2</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Embedding Models</span>\n @if (HasEmbeddingModel) {\n <span class=\"setup-step-status\">{{ EmbeddingModels.length }} model(s) available</span>\n } @else {\n <span class=\"setup-step-status\">No embedding models found. Configure at least one in the AI app > Models tab.</span>\n }\n </div>\n </div>\n @if (HasEmbeddingModel) {\n <div class=\"setup-step-detail\">\n <div class=\"config-tag-list\">\n @for (model of EmbeddingModels; track model.ID) {\n <span class=\"config-tag\">{{ model.Name }}</span>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Step 3: Vector Indexes -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasVectorIndex\" [class.setup-step-pending]=\"!HasVectorIndex\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasVectorIndex) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">3</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Vector Indexes</span>\n @if (HasVectorIndex) {\n <span class=\"setup-step-status\">{{ VectorIndexes.length }} index(es) configured</span>\n } @else if (HasVectorDBProvider && HasEmbeddingModel) {\n <span class=\"setup-step-status\">No indexes yet — 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;·&nbsp;\n <i class=\"fa-solid fa-microchip\"></i> {{ idx.EmbeddingModel }}\n </span>\n </div>\n <div class=\"index-actions\">\n <span class=\"config-status-badge config-status-active\">\n <i class=\"fa-solid fa-circle-check\"></i> Active\n </span>\n <button class=\"index-delete-btn\" (click)=\"DeleteIndex(idx.ID)\" title=\"Delete index\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Create Index Form -->\n @if (ShowCreateIndexForm) {\n <div class=\"create-index-form\">\n <h4 class=\"create-index-title\">\n <i class=\"fa-solid fa-plus-circle\"></i> Create New Vector Index\n </h4>\n <div class=\"create-index-fields\">\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Index Name</label>\n <input type=\"text\"\n class=\"config-input\"\n [(ngModel)]=\"NewIndexName\"\n placeholder=\"e.g., mj-knowledge-index\" />\n </div>\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Vector Database</label>\n <select class=\"config-select\" [(ngModel)]=\"NewIndexVectorDBID\">\n @for (db of VectorDBProviders; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Embedding Model</label>\n <select class=\"config-select\" [(ngModel)]=\"NewIndexEmbeddingModelID\">\n @for (model of EmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"create-index-actions\">\n <button class=\"create-index-submit\" (click)=\"CreateIndex()\" [disabled]=\"IsCreatingIndex\">\n @if (IsCreatingIndex) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Creating...\n } @else {\n <i class=\"fa-solid fa-plus\"></i> Create Index\n }\n </button>\n <button class=\"create-index-cancel\" (click)=\"CancelCreateIndex()\" [disabled]=\"IsCreatingIndex\">\n Cancel\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Full-Text Indexes -->\n @if (ActiveSection === 'fulltext') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Full-Text Search Entities</h2>\n <p class=\"config-section-desc\">Configure which entities are included in full-text search. Entities with text fields (Name, Description, etc.) are automatically discovered.</p>\n\n @if (IsLoadingFTSEntities) {\n <mj-loading text=\"Discovering searchable entities...\" size=\"medium\"></mj-loading>\n } @else if (FTSEntities.length === 0) {\n <div class=\"config-empty-state\">\n <i class=\"fa-solid fa-text-width config-empty-icon\"></i>\n <h3 class=\"config-empty-title\">No Searchable Entities Found</h3>\n <p class=\"config-empty-text\">No entities with text fields were discovered. Ensure your database schema includes entities with varchar/nvarchar columns.</p>\n </div>\n } @else {\n <div class=\"fts-entity-controls\">\n <div class=\"fts-summary\">\n <span class=\"fts-summary-count\">{{ EnabledFTSCount }} of {{ FTSEntities.length }} entities enabled for search</span>\n <input type=\"text\" class=\"config-input fts-filter-input\" placeholder=\"Filter entities...\" [(ngModel)]=\"FTSFilterText\" />\n </div>\n </div>\n\n <div class=\"fts-entity-list\">\n @for (entity of FilteredFTSEntities; track entity.EntityName) {\n <div class=\"fts-entity-card\" [class.fts-entity-enabled]=\"entity.Enabled\">\n <div class=\"fts-entity-toggle\">\n <input type=\"checkbox\" [(ngModel)]=\"entity.Enabled\" (change)=\"OnFTSEntityToggled(entity)\" class=\"config-checkbox\" />\n </div>\n <div class=\"fts-entity-info\">\n <span class=\"fts-entity-name\">{{ entity.EntityName }}</span>\n <div class=\"fts-entity-fields\">\n @for (field of entity.IndexedFields; track field) {\n <span class=\"fts-field-tag\">{{ field }}</span>\n }\n </div>\n </div>\n <div class=\"fts-entity-meta\">\n <span class=\"fts-entity-title-field\" title=\"Title field\">\n <i class=\"fa-solid fa-heading\"></i> {{ entity.TitleField }}\n </span>\n @if (entity.SnippetField !== entity.TitleField) {\n <span class=\"fts-entity-snippet-field\" title=\"Snippet field\">\n <i class=\"fa-solid fa-align-left\"></i> {{ entity.SnippetField }}\n </span>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Embedding Models -->\n @if (ActiveSection === 'embedding') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Embedding Models</h2>\n <p class=\"config-section-desc\">AI models used for generating vector embeddings from text.</p>\n\n @if (HasEmbeddingModel) {\n <div class=\"config-group\">\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Active Model</span>\n <span class=\"config-hint\">Currently selected embedding model</span>\n </div>\n <span class=\"config-value-display\">{{ EmbeddingModelName }}</span>\n </div>\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Available Models</span>\n <span class=\"config-hint\">{{ EmbeddingModels.length }} embedding model(s) configured</span>\n </div>\n <div class=\"config-tag-list\">\n @for (model of EmbeddingModels; track model.ID) {\n <span class=\"config-tag\">{{ model.Name }}</span>\n }\n </div>\n </div>\n </div>\n <p class=\"config-section-note\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Manage embedding models in the AI Dashboard > Models tab.\n </p>\n } @else {\n <div class=\"config-empty-state\">\n <i class=\"fa-solid fa-microchip config-empty-icon\"></i>\n <h3 class=\"config-empty-title\">No Embedding Models Found</h3>\n <p class=\"config-empty-text\">\n Embedding models are required to convert text into vectors for semantic search and duplicate detection.\n Configure at least one embedding model (e.g., text-embedding-3-small) in the AI Dashboard > Models tab.\n </p>\n </div>\n }\n </div>\n }\n\n <!-- Thresholds -->\n @if (ActiveSection === 'thresholds') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Scoring Thresholds</h2>\n <p class=\"config-section-desc\">Set the scoring thresholds used by search, duplicate detection, and autotagging.</p>\n\n <div class=\"config-group\">\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Duplicate Absolute Match</span>\n <span class=\"config-hint\">Score above which duplicates are auto-confirmed ({{ FormatThreshold(ThresholdSettings.DuplicateAbsolute) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.DuplicateAbsolute\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.5\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Duplicate Potential Match</span>\n <span class=\"config-hint\">Score above which duplicates are flagged for review ({{ FormatThreshold(ThresholdSettings.DuplicatePotential) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.DuplicatePotential\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.3\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Search Relevance</span>\n <span class=\"config-hint\">Minimum score for search results ({{ FormatThreshold(ThresholdSettings.SearchRelevance) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.SearchRelevance\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Autotag Confidence</span>\n <span class=\"config-hint\">Minimum confidence for accepting auto-generated tags ({{ FormatThreshold(ThresholdSettings.AutotagConfidence) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.AutotagConfidence\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.3\" max=\"1\" step=\"0.01\" />\n </div>\n </div>\n </div>\n }\n\n <!-- Search Scopes Section -->\n @if (ActiveSection === 'search-scopes') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-compass-drafting\"></i> Search Scopes</h2>\n <p class=\"config-section-desc\">\n Define reusable search scopes that filter which providers, entities, external indexes, and storage accounts participate in a scoped search.\n Scopes can be assigned to AI agents for pre-execution RAG or agent-invoked search.\n </p>\n\n <div class=\"scope-manager\">\n <!-- Scope list -->\n <aside class=\"scope-manager-list\">\n <div class=\"scope-manager-list-header\">\n <span>Scopes ({{ SearchScopes.length }})</span>\n <button type=\"button\" class=\"scope-manager-new-btn\" (click)=\"CreateNewScope()\">\n <i class=\"fa-solid fa-plus\"></i> New\n </button>\n </div>\n @if (IsLoadingScopes) {\n <div class=\"scope-manager-loading\">Loading&hellip;</div>\n } @else if (SearchScopes.length === 0) {\n <div class=\"scope-manager-empty\">\n No scopes defined yet. Click <strong>New</strong> to create one.\n </div>\n } @else {\n @for (s of SearchScopes; track s.ID) {\n <button\n type=\"button\"\n class=\"scope-manager-list-item\"\n [class.active]=\"ActiveScopeID === s.ID\"\n (click)=\"SelectScope(s.ID)\">\n <i [class]=\"s.Icon || 'fa-solid fa-filter'\" aria-hidden=\"true\"></i>\n <span class=\"scope-manager-list-name\">{{ s.Name }}</span>\n @if (s.IsGlobal) {\n <span class=\"scope-manager-badge\">Global</span>\n } @else if (s.IsDefault) {\n <span class=\"scope-manager-badge\">Default</span>\n }\n </button>\n }\n }\n </aside>\n\n <!-- Scope detail -->\n <section class=\"scope-manager-detail\">\n @if (ActiveScope) {\n <!-- Tab strip -->\n <div class=\"scope-manager-tabs\">\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'definition'\" (click)=\"SelectScopeTab('definition')\">Definition</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'providers'\" (click)=\"SelectScopeTab('providers')\">Providers</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'indexes'\" (click)=\"SelectScopeTab('indexes')\">External Indexes</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'entities'\" (click)=\"SelectScopeTab('entities')\">Entities</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'storage'\" (click)=\"SelectScopeTab('storage')\">Storage</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'permissions'\" (click)=\"SelectScopeTab('permissions')\">Permissions</button>\n <div class=\"scope-manager-tab-spacer\"></div>\n @if (ActiveScope.ID) {\n <button type=\"button\" class=\"scope-manager-open-btn\"\n (click)=\"OpenActiveScopeFullForm()\"\n title=\"Open the full custom form for this scope (Live Preview, Fusion Weights, Reranker, Test Queries, Execution Logs)\">\n <i class=\"fa-solid fa-up-right-from-square\"></i> Open Full Form\n </button>\n }\n <button type=\"button\" class=\"scope-manager-save-btn\" (click)=\"SaveActiveScope()\">\n <i class=\"fa-solid fa-save\"></i> Save\n </button>\n @if (!ActiveScope.IsGlobal) {\n <button type=\"button\" class=\"scope-manager-delete-btn\" (click)=\"DeleteActiveScope()\" title=\"Delete scope\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n\n <!-- Definition tab -->\n @if (ActiveScopeTab === 'definition') {\n <div class=\"scope-definition-grid\">\n <label>\n <span>Name</span>\n <input type=\"text\" class=\"mj-input\" [value]=\"ActiveScope.Name\" (change)=\"ActiveScope.Name = $any($event.target).value\">\n </label>\n <label>\n <span>Icon (Font Awesome class)</span>\n <input type=\"text\" class=\"mj-input\" [value]=\"ActiveScope.Icon || ''\" (change)=\"ActiveScope.Icon = $any($event.target).value\">\n </label>\n <label class=\"scope-definition-full\">\n <span>Description</span>\n <textarea rows=\"2\" class=\"mj-textarea\" [value]=\"ActiveScope.Description || ''\" (change)=\"ActiveScope.Description = $any($event.target).value\"></textarea>\n </label>\n <label>\n <span>Status</span>\n <select class=\"mj-input\" [value]=\"ActiveScope.Status\" (change)=\"ActiveScope.Status = $any($event.target).value\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </label>\n <label>\n <span>Start at</span>\n <input type=\"datetime-local\" class=\"mj-input\" [value]=\"FormatScopeDate(ActiveScope.StartAt)\" (change)=\"SetScopeDate(ActiveScope, 'StartAt', $any($event.target).value)\">\n </label>\n <label>\n <span>End at</span>\n <input type=\"datetime-local\" class=\"mj-input\" [value]=\"FormatScopeDate(ActiveScope.EndAt)\" (change)=\"SetScopeDate(ActiveScope, 'EndAt', $any($event.target).value)\">\n </label>\n <label class=\"scope-definition-toggle\">\n <input type=\"checkbox\" [checked]=\"ActiveScope.IsDefault\" (change)=\"ActiveScope.IsDefault = $any($event.target).checked\" [disabled]=\"ActiveScope.IsGlobal\">\n <span>Default scope — 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 — 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 — 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) — driven by SearchExecutionLog -->\n @if (ActiveSection === 'search-analytics') {\n <div class=\"config-section-content\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-chart-line\"></i> Search Analytics</h2>\n <p class=\"config-section-desc\">Aggregated metrics over the last 5,000 search invocations from <code>MJ: Search Execution Logs</code>. Use this to spot slow scopes, high-failure queries, or runaway reranker spend.</p>\n\n @if (AnalyticsLoading) {\n <mj-loading text=\"Loading analytics…\" 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 ≥1 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' }}¢</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' }}¢</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <h3 class=\"search-analytics-h3\">Top failure reasons</h3>\n @if (AnalyticsTopFailures.length === 0) {\n <p class=\"search-analytics-empty\">No failures in the window.</p>\n } @else {\n <table class=\"search-analytics-table\">\n <thead>\n <tr><th>Reason</th><th>Count</th></tr>\n </thead>\n <tbody>\n @for (f of AnalyticsTopFailures; track f.Reason) {\n <tr>\n <td>{{ f.Reason }}</td>\n <td>{{ f.Count | number }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <button class=\"mj-input search-analytics-refresh\" type=\"button\" (click)=\"LoadSearchAnalytics()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n }\n </div>\n }\n\n <!-- Permissions Audit Section (P2A.7) -->\n @if (ActiveSection === 'search-permissions') {\n <div class=\"config-section-content\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-shield-halved\"></i> Permissions</h2>\n <p class=\"config-section-desc\">\n Cross-scope view of every <code>SearchScopePermission</code> row. Filter by scope, by user/role, or by permission level to answer \"who has access to what\". Read-only — to add or edit a grant, open the SearchScope's full form and use its Permissions panel.\n </p>\n\n @if (PermissionsLoading) {\n <div class=\"search-permissions-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading permission rows...\n </div>\n }\n\n @if (PermissionsLoaded && !PermissionsLoading) {\n <div class=\"search-permissions-filters\">\n <input class=\"mj-input\" type=\"text\" placeholder=\"Filter by scope name...\" [(ngModel)]=\"PermissionsFilterScope\" />\n <input class=\"mj-input\" type=\"text\" placeholder=\"Filter by user/role (name or email)...\" [(ngModel)]=\"PermissionsFilterPrincipal\" />\n <select class=\"mj-input\" [(ngModel)]=\"PermissionsFilterLevel\">\n <option value=\"\">All levels</option>\n <option value=\"None\">None</option>\n <option value=\"Read\">Read</option>\n <option value=\"Search\">Search</option>\n <option value=\"Manage\">Manage</option>\n </select>\n <button class=\"mj-input\" type=\"button\" (click)=\"RefreshPermissionsAudit()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n </div>\n\n <div class=\"search-permissions-summary\">\n Showing {{ FilteredPermissionsRows.length }} of {{ PermissionsRows.length }} rows\n </div>\n\n @if (FilteredPermissionsRows.length === 0) {\n <div class=\"search-permissions-empty\">\n No permission rows match your filters.\n </div>\n } @else {\n <table class=\"search-permissions-table\">\n <thead>\n <tr>\n <th>Scope</th>\n <th>Principal</th>\n <th>Type</th>\n <th>Permission Level</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredPermissionsRows; track row.ID) {\n <tr>\n <td>{{ row.SearchScopeName }}</td>\n <td>\n @if (row.UserID) {\n {{ row.UserName }} <span class=\"search-permissions-secondary\">({{ row.UserEmail }})</span>\n } @else {\n {{ row.RoleName }}\n }\n </td>\n <td>\n @if (row.UserID) { <span class=\"search-permissions-tag\">User</span> }\n @if (row.RoleID) { <span class=\"search-permissions-tag\">Role</span> }\n </td>\n <td>\n <span class=\"search-permissions-level search-permissions-level-{{ row.PermissionLevel | lowercase }}\">{{ row.PermissionLevel }}</span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n }\n </div>\n }\n\n <!-- Scheduling Section -->\n @if (ActiveSection === 'scheduling') {\n <div class=\"config-section-content\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-clock\"></i> Scheduling</h2>\n <p class=\"config-section-desc\">Manage automated pipeline schedules for content classification and vector sync. Create schedules here or manage all schedules in the dedicated Scheduling app.</p>\n <div style=\"margin-top: 16px;\">\n <app-scheduling-resource></app-scheduling-resource>\n </div>\n </div>\n }\n\n <!-- Save Bar -->\n @if (HasUnsavedChanges) {\n <div class=\"config-save-bar\">\n <span class=\"config-save-text\">You have unsaved changes</span>\n <button class=\"config-save-btn\" (click)=\"SaveConfiguration()\" [disabled]=\"IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-save\"></i> Save Changes\n }\n </button>\n <button class=\"config-reset-btn\" (click)=\"ResetConfiguration()\" [disabled]=\"IsSaving\">\n Reset\n </button>\n </div>\n }\n </div>\n </div>\n}\n"]}
1
+ {"version":3,"file":"knowledge-config-resource.component.js","sourceRoot":"","sources":["../../../../src/KnowledgeHub/components/config/knowledge-config-resource.component.ts","../../../../src/KnowledgeHub/components/config/knowledge-config-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Knowledge Hub Configuration Resource Component\n *\n * Full configuration dashboard for Knowledge Hub infrastructure:\n * Vector DB provider management, vector index CRUD, embedding model selection,\n * pipeline settings, full-text index config, and scoring thresholds.\n */\n\nimport { Component, ChangeDetectorRef, OnDestroy, AfterViewInit, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { CompositeKey, Metadata, RunView, LogError } from '@memberjunction/core';\nimport { ResourceData, MJVectorDatabaseEntity, MJVectorIndexEntity, MJEntityDocumentEntity, MJCredentialEntity, KnowledgeHubMetadataEngine, MJSearchScopeEntity } from '@memberjunction/core-entities';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { SearchScopeChildGridColumn } from '@memberjunction/ng-search';\n\n/** Configuration section definition */\ninterface ConfigSection {\n ID: string;\n Label: string;\n Icon: string;\n Description: string;\n}\n\n/** Pipeline configuration settings */\ninterface PipelineConfig {\n AutotagOnIngest: boolean;\n VectorizeOnIngest: boolean;\n DefaultBatchSize: number;\n MaxConcurrentJobs: number;\n}\n\n/** Threshold settings */\ninterface ThresholdConfig {\n DuplicateAbsolute: number;\n DuplicatePotential: number;\n SearchRelevance: number;\n AutotagConfidence: number;\n}\n\n/** Vector DB provider display record */\ninterface VectorDBRecord {\n ID: string;\n Name: string;\n ClassKey: string;\n Description: string;\n CredentialID: string | null;\n CredentialName: string | null;\n}\n\n/** Vector index display record */\ninterface VectorIndexRecord {\n ID: string;\n Name: string;\n EmbeddingModel: string;\n EmbeddingModelID: string;\n VectorDatabase: string;\n VectorDatabaseID: string;\n}\n\n/** Embedding model display record */\ninterface EmbeddingModelRecord {\n ID: string;\n Name: string;\n}\n\n/** Full-text searchable entity */\ninterface FTSEntityRecord {\n EntityName: string;\n IndexedFields: string[];\n TitleField: string;\n SnippetField: string;\n Enabled: boolean;\n}\n\n/** Row shape for the Search Analytics rollup. Mirrors the columns\n * `LoadSearchAnalytics` requests via the `Fields:` constraint. */\ninterface AnalyticsRow {\n ID: string;\n SearchScopeID: string | null;\n Status: string;\n Query: string;\n ResultCount: number;\n TotalDurationMs: number;\n RerankerName: string | null;\n RerankerCostCents: number | null;\n FailureReason: string | null;\n}\n\n@RegisterClass(BaseResourceComponent, 'KnowledgeConfigResource')\n@Component({\n standalone: false,\n selector: 'app-knowledge-config-resource',\n templateUrl: './knowledge-config-resource.component.html',\n styleUrls: ['./knowledge-config-resource.component.css']\n})\nexport class KnowledgeConfigResourceComponent extends BaseResourceComponent implements AfterViewInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n protected override navigationService = inject(NavigationService);\n protected override destroy$ = new Subject<void>();\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Configuration';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-gear';\n }\n\n // --- Navigation ---\n public Sections: ConfigSection[] = [\n { ID: 'pipeline', Label: 'Pipeline', Icon: 'fa-solid fa-diagram-project', Description: 'Configure the knowledge ingestion pipeline stages' },\n { ID: 'vectordb', Label: 'Vector Database', Icon: 'fa-solid fa-database', Description: 'Manage vector database connections and indexes' },\n { ID: 'fulltext', Label: 'Full-Text Indexes', Icon: 'fa-solid fa-text-width', Description: 'Configure SQL full-text search indexes' },\n { ID: 'embedding', Label: 'Embedding Models', Icon: 'fa-solid fa-microchip', Description: 'Select and configure embedding models' },\n { ID: 'thresholds', Label: 'Thresholds', Icon: 'fa-solid fa-sliders', Description: 'Set scoring thresholds for search and deduplication' },\n { ID: 'search-scopes', Label: 'Search Scopes', Icon: 'fa-solid fa-compass-drafting', Description: 'Define reusable search scopes — which providers, entities, external indexes, and storage accounts participate in scoped search' },\n { ID: 'search-analytics', Label: 'Search Analytics', Icon: 'fa-solid fa-chart-line', Description: 'Per-scope query volume, p50/p95 latency, hit rate, top failures, and reranker spend (driven by SearchExecutionLog)' },\n { ID: 'search-permissions', Label: 'Permissions', Icon: 'fa-solid fa-shield-halved', Description: 'Cross-scope view of every SearchScopePermission row, filterable by scope, user, or role (P2A.7)' },\n { ID: 'scheduling', Label: 'Scheduling', Icon: 'fa-solid fa-clock', Description: 'Manage automated pipeline schedules' },\n ];\n\n public ActiveSection = 'pipeline';\n public IsLoading = true;\n public IsSaving = false;\n public HasUnsavedChanges = false;\n\n // --- Pipeline ---\n public PipelineSettings: PipelineConfig = {\n AutotagOnIngest: true,\n VectorizeOnIngest: true,\n DefaultBatchSize: 100,\n MaxConcurrentJobs: 3\n };\n\n // --- Thresholds ---\n public ThresholdSettings: ThresholdConfig = {\n DuplicateAbsolute: 0.95,\n DuplicatePotential: 0.75,\n SearchRelevance: 0.3,\n AutotagConfidence: 0.7\n };\n\n // --- Vector DB Providers ---\n public VectorDBProviders: VectorDBRecord[] = [];\n public get HasVectorDBProvider(): boolean { return this.VectorDBProviders.length > 0; }\n\n // --- Vector Indexes ---\n public VectorIndexes: VectorIndexRecord[] = [];\n public get HasVectorIndex(): boolean { return this.VectorIndexes.length > 0; }\n\n // --- Embedding Models ---\n public EmbeddingModels: EmbeddingModelRecord[] = [];\n public get HasEmbeddingModel(): boolean { return this.EmbeddingModels.length > 0; }\n public get EmbeddingModelName(): string { return this.EmbeddingModels.length > 0 ? this.EmbeddingModels[0].Name : ''; }\n\n // --- Credentials (for vector DB provider binding) ---\n public AvailableCredentials: { ID: string; Name: string }[] = [];\n public IsSavingCredential = false;\n\n // --- Entity Documents (for persisting thresholds) ---\n private entityDocuments: MJEntityDocumentEntity[] = [];\n\n // --- Setup Progress ---\n public get SetupStepsCompleted(): number {\n let count = 0;\n if (this.HasVectorDBProvider) count++;\n if (this.HasEmbeddingModel) count++;\n if (this.HasVectorIndex) count++;\n return count;\n }\n public get VectorSetupComplete(): boolean {\n return this.HasVectorDBProvider && this.HasVectorIndex && this.HasEmbeddingModel;\n }\n\n // --- Full-Text Search Entities ---\n public FTSEntities: FTSEntityRecord[] = [];\n public IsLoadingFTSEntities = false;\n public FTSFilterText = '';\n\n public get EnabledFTSCount(): number {\n return this.FTSEntities.filter(e => e.Enabled).length;\n }\n\n public get FilteredFTSEntities(): FTSEntityRecord[] {\n if (!this.FTSFilterText.trim()) return this.FTSEntities;\n const filter = this.FTSFilterText.toLowerCase();\n return this.FTSEntities.filter(e => e.EntityName.toLowerCase().includes(filter));\n }\n\n // --- Create Index Form ---\n public ShowCreateIndexForm = false;\n public IsCreatingIndex = false;\n public NewIndexName = '';\n public NewIndexVectorDBID = '';\n public NewIndexEmbeddingModelID = '';\n\n // --- Search Scopes ---\n /** All SearchScope rows the current user can manage. */\n public SearchScopes: MJSearchScopeEntity[] = [];\n /** Currently-selected scope ID — drives child-grid loading. */\n public ActiveScopeID: string | null = null;\n public IsLoadingScopes = false;\n /** Which sub-tab of the selected scope is open. */\n public ActiveScopeTab: 'definition' | 'providers' | 'indexes' | 'entities' | 'storage' | 'permissions' = 'definition';\n\n /** Column spec for the Providers child grid. */\n public readonly ScopeProviderColumns: SearchScopeChildGridColumn[] = [\n { Field: 'SearchProviderID', Label: 'Provider', Type: 'lookup', LookupEntityName: 'MJ: Search Providers', LookupFilter: \"Status='Active'\", Width: '200px' },\n { Field: 'Enabled', Label: 'Enabled', Type: 'checkbox', Width: '80px' },\n { Field: 'MaxResults', Label: 'Max Results', Type: 'number', Placeholder: 'e.g. 20', Width: '110px' },\n { Field: 'QueryTransformTemplateID', Label: 'Query Transform', Type: 'lookup', LookupEntityName: 'Templates', Width: '180px' },\n { Field: 'ProviderConfigOverride', Label: 'Config Override', Type: 'code', Placeholder: 'JSON override (optional)' },\n ];\n\n /** Column spec for the External Indexes child grid. */\n public readonly ScopeExternalIndexColumns: SearchScopeChildGridColumn[] = [\n { Field: 'IndexType', Label: 'Type', Type: 'select', Options: [\n { Label: 'Vector', Value: 'Vector' },\n { Label: 'Elasticsearch', Value: 'Elasticsearch' },\n { Label: 'OpenSearch', Value: 'OpenSearch' },\n { Label: 'Typesense', Value: 'Typesense' },\n { Label: 'Azure AI Search', Value: 'AzureAISearch' },\n ], Width: '140px' },\n { Field: 'IndexName', Label: 'Index Name', Type: 'text', Placeholder: 'hr-policies-v2', Width: '200px' },\n { Field: 'MetadataFilterTemplate', Label: 'Metadata Filter (Nunjucks)', Type: 'code', Placeholder: '{ \"tenantId\": \"{{ context.PrimaryScopeRecordID }}\" }' },\n { Field: 'ExternalIndexConfig', Label: 'Config Override', Type: 'code', Placeholder: 'JSON override (optional)' },\n ];\n\n /** Column spec for the Entities child grid. */\n public readonly ScopeEntityColumns: SearchScopeChildGridColumn[] = [\n { Field: 'EntityID', Label: 'Entity', Type: 'lookup', LookupEntityName: 'Entities', Width: '220px' },\n { Field: 'ExtraFilter', Label: 'Extra Filter (SQL + Nunjucks)', Type: 'code', Placeholder: \"CategoryID = '<uuid>' AND OrganizationID = '{{ context.PrimaryScopeRecordID }}'\" },\n { Field: 'UserSearchStringOverride', Label: 'Query Rewrite', Type: 'text', Placeholder: '— use raw query —' },\n ];\n\n /** Column spec for the Storage Accounts child grid. */\n public readonly ScopeStorageColumns: SearchScopeChildGridColumn[] = [\n { Field: 'StorageAccountID', Label: 'Storage Account', Type: 'lookup', LookupEntityName: 'Storage Providers', Width: '220px' },\n { Field: 'FolderPath', Label: 'Folder Path (Nunjucks)', Type: 'code', Placeholder: '/tenants/{{ context.PrimaryScopeRecordID }}/hr/policies/' },\n ];\n\n /**\n * Column spec for the SearchScopePermission child grid (Phase 2A).\n * Editable surface — admins author per-user / per-role grants here.\n * Each row binds either a User or a Role (XOR enforced by the DB CHECK\n * constraint, surfaced as a save-time error for now). Resolution order\n * lives in SearchScopePermissionResolver.\n */\n public readonly ScopePermissionColumns: SearchScopeChildGridColumn[] = [\n { Field: 'UserID', Label: 'User', Type: 'lookup', LookupEntityName: 'Users', LookupFilter: \"IsActive=1\", Width: '240px' },\n { Field: 'RoleID', Label: 'Role', Type: 'lookup', LookupEntityName: 'Roles', Width: '200px' },\n { Field: 'PermissionLevel', Label: 'Level', Type: 'select', Options: [\n { Label: 'None (explicit deny)', Value: 'None' },\n { Label: 'Read (view only)', Value: 'Read' },\n { Label: 'Search (invoke)', Value: 'Search' },\n { Label: 'Manage (edit + grant)', Value: 'Manage' },\n ], Width: '200px' },\n ];\n\n ngAfterViewInit(): void {\n this.loadConfiguration();\n this.navigationService.SetAgentContext(this, {\n ActiveSection: this.ActiveSection,\n });\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ================================================================\n // Public Methods\n // ================================================================\n\n public SelectSection(sectionId: string): void {\n this.ActiveSection = sectionId;\n if (sectionId === 'search-scopes' && this.SearchScopes.length === 0) {\n void this.LoadSearchScopes();\n }\n if (sectionId === 'search-analytics' && !this.AnalyticsLoaded && !this.AnalyticsLoading) {\n void this.LoadSearchAnalytics();\n }\n if (sectionId === 'search-permissions' && !this.PermissionsLoaded && !this.PermissionsLoading) {\n void this.LoadPermissionsAudit();\n }\n this.cdr.detectChanges();\n }\n\n // ─── Search Analytics (P3.3) ──────────────────────────────────────────────\n\n public AnalyticsLoaded = false;\n public AnalyticsLoading = false;\n public AnalyticsTotalRuns = 0;\n public AnalyticsSuccessRate = 0;\n public AnalyticsAvgLatencyMs = 0;\n public AnalyticsP95LatencyMs = 0;\n public AnalyticsTotalRerankerCostCents = 0;\n public AnalyticsHitRate = 0;\n public AnalyticsTopScopes: Array<{ ScopeID: string; Name: string; Count: number; AvgLatencyMs: number }> = [];\n public AnalyticsTopFailures: Array<{ Reason: string; Count: number }> = [];\n public AnalyticsRerankerSpend: Array<{ Reranker: string; Count: number; TotalCents: number }> = [];\n\n public async LoadSearchAnalytics(): Promise<void> {\n this.AnalyticsLoading = true;\n this.cdr.detectChanges();\n try {\n const rows = await this.fetchSearchExecutionRows();\n if (rows === null) return;\n this.computeAnalyticsKpis(rows);\n await this.computeAnalyticsTopScopes(rows);\n this.computeAnalyticsTopFailures(rows);\n this.computeAnalyticsRerankerSpend(rows);\n this.AnalyticsLoaded = true;\n } catch (err) {\n LogError(`KnowledgeConfig: LoadSearchAnalytics threw: ${err instanceof Error ? err.message : String(err)}`);\n } finally {\n this.AnalyticsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Fetch the raw SearchExecutionLog rows. Returns null on RunView failure (already logged). */\n private async fetchSearchExecutionRows(): Promise<AnalyticsRow[] | null> {\n const rv = new RunView();\n const result = await rv.RunView<AnalyticsRow>({\n EntityName: 'MJ: Search Execution Logs',\n Fields: ['ID', 'SearchScopeID', 'Status', 'ResultCount', 'TotalDurationMs', 'RerankerName', 'RerankerCostCents', 'FailureReason'],\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 5000,\n ResultType: 'simple',\n });\n if (!result.Success) {\n LogError(`KnowledgeConfig: LoadSearchAnalytics failed: ${result.ErrorMessage}`);\n return null;\n }\n return result.Results ?? [];\n }\n\n /** Total runs, success rate, hit rate, avg + p95 latency, total reranker spend. */\n private computeAnalyticsKpis(rows: AnalyticsRow[]): void {\n this.AnalyticsTotalRuns = rows.length;\n const successRows = rows.filter(r => r.Status === 'Success');\n this.AnalyticsSuccessRate = rows.length > 0 ? Math.round((successRows.length / rows.length) * 100) : 0;\n this.AnalyticsHitRate = successRows.length > 0\n ? Math.round((successRows.filter(r => (r.ResultCount ?? 0) > 0).length / successRows.length) * 100)\n : 0;\n const latencies = successRows.map(r => r.TotalDurationMs ?? 0).sort((a, b) => a - b);\n this.AnalyticsAvgLatencyMs = latencies.length > 0\n ? Math.round(latencies.reduce((s, x) => s + x, 0) / latencies.length)\n : 0;\n this.AnalyticsP95LatencyMs = latencies.length > 0\n ? latencies[Math.min(latencies.length - 1, Math.floor(latencies.length * 0.95))]\n : 0;\n this.AnalyticsTotalRerankerCostCents = rows.reduce((s, r) => s + (r.RerankerCostCents ?? 0), 0);\n }\n\n /**\n * Per-scope volume rollup → top 10 by Count. Fetches scope names from\n * `this.SearchScopes` when already loaded, otherwise loads them on demand\n * so the unscoped audit-only path still gets human-readable labels.\n */\n private async computeAnalyticsTopScopes(rows: AnalyticsRow[]): Promise<void> {\n const byScope = new Map<string, { Count: number; LatencySum: number; ScopeID: string }>();\n for (const r of rows) {\n const id = r.SearchScopeID ?? '__unscoped__';\n const cur = byScope.get(id) ?? { Count: 0, LatencySum: 0, ScopeID: id };\n cur.Count++;\n cur.LatencySum += r.TotalDurationMs ?? 0;\n byScope.set(id, cur);\n }\n const scopeNameMap = new Map(this.SearchScopes.map(s => [s.ID, s.Name]));\n if (this.SearchScopes.length === 0 && byScope.size > 0) {\n await this.LoadSearchScopes();\n this.SearchScopes.forEach(s => scopeNameMap.set(s.ID, s.Name));\n }\n this.AnalyticsTopScopes = Array.from(byScope.values())\n .map(g => ({\n ScopeID: g.ScopeID,\n Name: scopeNameMap.get(g.ScopeID) ?? (g.ScopeID === '__unscoped__' ? '— unscoped —' : `(${g.ScopeID.slice(0, 8)}…)`),\n Count: g.Count,\n AvgLatencyMs: Math.round(g.LatencySum / g.Count),\n }))\n .sort((a, b) => b.Count - a.Count)\n .slice(0, 10);\n }\n\n /** Top 5 failure reasons across non-Success rows. */\n private computeAnalyticsTopFailures(rows: AnalyticsRow[]): void {\n const byFailure = new Map<string, number>();\n for (const r of rows) {\n if (r.Status !== 'Success' && r.FailureReason) {\n byFailure.set(r.FailureReason, (byFailure.get(r.FailureReason) ?? 0) + 1);\n }\n }\n this.AnalyticsTopFailures = Array.from(byFailure.entries())\n .map(([Reason, Count]) => ({ Reason, Count }))\n .sort((a, b) => b.Count - a.Count)\n .slice(0, 5);\n }\n\n /** Per-reranker spend rollup, sorted descending by total cost. */\n private computeAnalyticsRerankerSpend(rows: AnalyticsRow[]): void {\n const byReranker = new Map<string, { Count: number; TotalCents: number }>();\n for (const r of rows) {\n if (!r.RerankerName) continue;\n const cur = byReranker.get(r.RerankerName) ?? { Count: 0, TotalCents: 0 };\n cur.Count++;\n cur.TotalCents += r.RerankerCostCents ?? 0;\n byReranker.set(r.RerankerName, cur);\n }\n this.AnalyticsRerankerSpend = Array.from(byReranker.entries())\n .map(([Reranker, v]) => ({ Reranker, Count: v.Count, TotalCents: +v.TotalCents.toFixed(4) }))\n .sort((a, b) => b.TotalCents - a.TotalCents);\n }\n\n // ─── Permissions Audit (P2A.7) ────────────────────────────────────────────\n //\n // Cross-scope view of every SearchScopePermission row. Renders a flat,\n // filterable list so an admin can answer \"who has access to which scopes\"\n // in one place. Editing happens on the SearchScope full form's\n // Permissions panel — this dashboard is read-only.\n\n public PermissionsLoaded = false;\n public PermissionsLoading = false;\n public PermissionsRows: Array<{\n ID: string;\n SearchScopeID: string;\n SearchScopeName: string;\n UserID: string | null;\n UserName: string | null;\n UserEmail: string | null;\n RoleID: string | null;\n RoleName: string | null;\n PermissionLevel: string;\n }> = [];\n public PermissionsFilterScope: string = '';\n public PermissionsFilterPrincipal: string = '';\n public PermissionsFilterLevel: string = '';\n\n public async LoadPermissionsAudit(): Promise<void> {\n this.PermissionsLoading = true;\n this.cdr.detectChanges();\n try {\n const fetched = await this.fetchPermissionsAuditData();\n if (!fetched) {\n this.PermissionsRows = [];\n return;\n }\n this.PermissionsRows = this.shapePermissionsAuditRows(fetched);\n this.PermissionsLoaded = true;\n } catch (err) {\n LogError(`KnowledgeConfig: LoadPermissionsAudit threw: ${err instanceof Error ? err.message : String(err)}`);\n } finally {\n this.PermissionsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n public get FilteredPermissionsRows(): typeof this.PermissionsRows {\n const scope = (this.PermissionsFilterScope || '').toLowerCase();\n const principal = (this.PermissionsFilterPrincipal || '').toLowerCase();\n const level = this.PermissionsFilterLevel;\n return this.PermissionsRows.filter(r => {\n if (scope && !r.SearchScopeName.toLowerCase().includes(scope)) return false;\n if (principal) {\n const candidates = [r.UserName, r.UserEmail, r.RoleName].filter(Boolean) as string[];\n if (!candidates.some(c => c.toLowerCase().includes(principal))) return false;\n }\n if (level && r.PermissionLevel !== level) return false;\n return true;\n });\n }\n\n public RefreshPermissionsAudit(): void {\n this.PermissionsLoaded = false;\n void this.LoadPermissionsAudit();\n }\n\n /**\n * Pull permissions, scopes, users, roles in one batched call.\n * `BypassCache: true` on every view — this is an audit dashboard, so we\n * want SQL-truth even when permission/scope rows have been written\n * outside the normal `BaseEntity.Save()` path (test harnesses,\n * direct-SQL maintenance, recovery scripts). Without this, scope names\n * can render as \"(unknown)\" if the cache was populated before the\n * underlying row was inserted.\n *\n * Returns null on RunView failure (already logged).\n */\n private async fetchPermissionsAuditData(): Promise<{\n perms: Array<{ ID: string; SearchScopeID: string; UserID: string | null; RoleID: string | null; PermissionLevel: string }>;\n scopes: Array<{ ID: string; Name: string }>;\n users: Array<{ ID: string; Name: string; Email: string }>;\n roles: Array<{ ID: string; Name: string }>;\n } | null> {\n const rv = new RunView();\n const result = await rv.RunViews([\n { EntityName: 'MJ: Search Scope Permissions', Fields: ['ID', 'SearchScopeID', 'UserID', 'RoleID', 'PermissionLevel'], OrderBy: '__mj_CreatedAt DESC', MaxRows: 5000, ResultType: 'simple', BypassCache: true },\n { EntityName: 'MJ: Search Scopes', Fields: ['ID', 'Name'], ResultType: 'simple', BypassCache: true },\n { EntityName: 'MJ: Users', Fields: ['ID', 'Name', 'Email'], ResultType: 'simple', BypassCache: true },\n { EntityName: 'MJ: Roles', Fields: ['ID', 'Name'], ResultType: 'simple', BypassCache: true },\n ]);\n if (!result?.[0]?.Success) {\n LogError(`KnowledgeConfig: LoadPermissionsAudit failed: ${result?.[0]?.ErrorMessage}`);\n return null;\n }\n return {\n perms: (result[0].Results ?? []) as Array<{ ID: string; SearchScopeID: string; UserID: string | null; RoleID: string | null; PermissionLevel: string }>,\n scopes: (result[1].Results ?? []) as Array<{ ID: string; Name: string }>,\n users: (result[2].Results ?? []) as Array<{ ID: string; Name: string; Email: string }>,\n roles: (result[3].Results ?? []) as Array<{ ID: string; Name: string }>,\n };\n }\n\n /**\n * Shape the raw fetched data into the audit-table rows. Drops\n * permission rows whose SearchScope is not visible to the current user\n * (MJ's row-level filtering hides scopes from non-Owner callers).\n * Surfacing the permission row with \"(unknown)\" leaks the row's\n * existence without giving the auditor anything useful — the underlying\n * API already enforces visibility, so this is a UX call, not a security\n * one.\n */\n private shapePermissionsAuditRows(data: {\n perms: Array<{ ID: string; SearchScopeID: string; UserID: string | null; RoleID: string | null; PermissionLevel: string }>;\n scopes: Array<{ ID: string; Name: string }>;\n users: Array<{ ID: string; Name: string; Email: string }>;\n roles: Array<{ ID: string; Name: string }>;\n }): typeof this.PermissionsRows {\n const scopeName = new Map(data.scopes.map(s => [s.ID, s.Name]));\n const userByID = new Map(data.users.map(u => [u.ID, u]));\n const roleName = new Map(data.roles.map(r => [r.ID, r.Name]));\n return data.perms\n .filter(p => scopeName.has(p.SearchScopeID))\n .map(p => {\n const u = p.UserID ? userByID.get(p.UserID) : null;\n return {\n ID: p.ID,\n SearchScopeID: p.SearchScopeID,\n SearchScopeName: scopeName.get(p.SearchScopeID) ?? '(unknown)',\n UserID: p.UserID,\n UserName: u?.Name ?? null,\n UserEmail: u?.Email ?? null,\n RoleID: p.RoleID,\n RoleName: p.RoleID ? (roleName.get(p.RoleID) ?? '(unknown)') : null,\n PermissionLevel: p.PermissionLevel,\n };\n });\n }\n\n // ─── Search Scopes ────────────────────────────────────────────────────────\n\n public async LoadSearchScopes(): Promise<void> {\n this.IsLoadingScopes = true;\n this.cdr.detectChanges();\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJSearchScopeEntity>({\n EntityName: 'MJ: Search Scopes',\n OrderBy: 'IsGlobal DESC, IsDefault DESC, Name ASC',\n ResultType: 'entity_object'\n });\n if (!result.Success) {\n LogError(`KnowledgeConfig: LoadSearchScopes failed: ${result.ErrorMessage}`);\n this.SearchScopes = [];\n } else {\n // Collapse by ID — defensive against any caller (or interleaved\n // reactive cycle) that could ever put the same scope in twice.\n const byID = new Map<string, MJSearchScopeEntity>();\n for (const s of result.Results ?? []) {\n byID.set(s.ID, s);\n }\n this.SearchScopes = Array.from(byID.values());\n if (!this.ActiveScopeID && this.SearchScopes.length > 0) {\n this.ActiveScopeID = this.SearchScopes[0].ID;\n }\n }\n } finally {\n this.IsLoadingScopes = false;\n this.cdr.detectChanges();\n }\n }\n\n public SelectScope(scopeID: string): void {\n this.ActiveScopeID = scopeID;\n this.ActiveScopeTab = 'definition';\n this.cdr.detectChanges();\n }\n\n public SelectScopeTab(tab: 'definition' | 'providers' | 'indexes' | 'entities' | 'storage' | 'permissions'): void {\n this.ActiveScopeTab = tab;\n this.cdr.detectChanges();\n }\n\n public get ActiveScope(): MJSearchScopeEntity | null {\n return this.SearchScopes.find(s => UUIDsEqual(s.ID, this.ActiveScopeID ?? '')) ?? null;\n }\n\n public async CreateNewScope(): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const scope = await md.GetEntityObject<MJSearchScopeEntity>('MJ: Search Scopes');\n scope.Name = this.pickUniqueNewScopeName();\n scope.Description = 'New scope — configure providers, entities, or storage below.';\n scope.Icon = 'fa-solid fa-filter';\n scope.Status = 'Active';\n scope.IsGlobal = false;\n scope.IsDefault = false;\n const ok = await scope.Save();\n if (!ok) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Create scope failed: ${scope.LatestResult?.CompleteMessage ?? 'unknown error'}`,\n 'error', 5000\n );\n return;\n }\n // Append synchronously so a rapid second + New click picks a fresh\n // unique-suffix Name. An async refetch here would leave a window\n // where pickUniqueNewScopeName() sees a stale list and re-picks\n // the same suffix, producing UQ_SearchScope_Name violations.\n this.SearchScopes = [...this.SearchScopes, scope];\n this.ActiveScopeID = scope.ID;\n this.ActiveScopeTab = 'definition';\n this.cdr.detectChanges();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n MJNotificationService.Instance.CreateSimpleNotification(`Error creating scope: ${msg}`, 'error', 5000);\n }\n }\n\n /**\n * Pick a placeholder Name that doesn't collide with an existing scope.\n * `__mj.SearchScope.Name` is UNIQUE, so reusing the literal string\n * \"New Search Scope\" twice in a row throws SQL Server's UQ violation.\n * Walk an incrementing suffix until we find one the in-memory list\n * doesn't already use (\"New Search Scope\", \"New Search Scope 2\",\n * \"New Search Scope 3\", ...). Existing scopes table is small and\n * already loaded, so the linear scan is trivially cheap.\n */\n private pickUniqueNewScopeName(): string {\n const base = 'New Search Scope';\n const existing = new Set(this.SearchScopes.map(s => (s.Name ?? '').toLowerCase()));\n if (!existing.has(base.toLowerCase())) return base;\n for (let i = 2; i < 1000; i++) {\n const candidate = `${base} ${i}`;\n if (!existing.has(candidate.toLowerCase())) return candidate;\n }\n // Fallback: degrade to a timestamp suffix so we never throw.\n return `${base} ${Date.now()}`;\n }\n\n /**\n * Open the active scope in its full custom form (a new MJExplorer tab).\n * The dashboard view exposes a quick-edit subset; the full form has the\n * Phase 2D / Phase 4 surfaces (Fusion Weights sliders, Reranker dropdown,\n * Reranker Budget Cents, Live Preview, Search Scope Test Queries panel,\n * Search Execution Logs panel, etc.). No-ops for the built-in Global\n * scope (no detail to author) and any scope without an ID yet.\n */\n public OpenActiveScopeFullForm(): void {\n const scope = this.ActiveScope;\n if (!scope?.ID) return;\n const pkey = new CompositeKey([{ FieldName: 'ID', Value: scope.ID }]);\n this.navigationService.OpenEntityRecord('MJ: Search Scopes', pkey);\n }\n\n public async SaveActiveScope(): Promise<void> {\n const scope = this.ActiveScope;\n if (!scope) return;\n const ok = await scope.Save();\n if (ok) {\n MJNotificationService.Instance.CreateSimpleNotification('Scope saved', 'success', 2000);\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Save failed: ${scope.LatestResult?.CompleteMessage ?? 'unknown error'}`,\n 'error', 5000\n );\n }\n this.cdr.detectChanges();\n }\n\n /** Format a scope Date field as the string expected by <input type=\"datetime-local\">. */\n public FormatScopeDate(value: Date | string | null | undefined): string {\n if (!value) return '';\n const d = value instanceof Date ? value : new Date(value);\n if (isNaN(d.getTime())) return '';\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`;\n }\n\n /** Write a datetime-local input value back to the scope entity. Empty clears to null. */\n public SetScopeDate(scope: MJSearchScopeEntity, field: 'StartAt' | 'EndAt', value: string): void {\n if (!value) {\n scope[field] = null;\n return;\n }\n const parsed = new Date(value);\n scope[field] = isNaN(parsed.getTime()) ? null : parsed;\n }\n\n public async DeleteActiveScope(): Promise<void> {\n const scope = this.ActiveScope;\n if (!scope) return;\n if (scope.IsGlobal) {\n MJNotificationService.Instance.CreateSimpleNotification('The built-in Global scope cannot be deleted.', 'warning', 3000);\n return;\n }\n const ok = await scope.Delete();\n if (!ok) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Delete failed: ${scope.LatestResult?.CompleteMessage ?? 'unknown error'}`,\n 'error', 5000\n );\n return;\n }\n this.SearchScopes = this.SearchScopes.filter(s => !UUIDsEqual(s.ID, scope.ID));\n this.ActiveScopeID = this.SearchScopes.length > 0 ? this.SearchScopes[0].ID : null;\n this.cdr.detectChanges();\n }\n\n public OnSettingChanged(): void {\n this.HasUnsavedChanges = true;\n this.cdr.detectChanges();\n }\n\n public async SaveConfiguration(): Promise<void> {\n this.IsSaving = true;\n this.cdr.detectChanges();\n try {\n await this.persistThresholdsToEntityDocuments();\n this.HasUnsavedChanges = false;\n MJNotificationService.Instance.CreateSimpleNotification('Configuration saved', 'success', 2000);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[KnowledgeConfig] Save failed:', msg);\n MJNotificationService.Instance.CreateSimpleNotification(`Save failed: ${msg}`, 'error', 5000);\n } finally {\n this.IsSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n public ResetConfiguration(): void {\n this.loadConfiguration();\n this.HasUnsavedChanges = false;\n this.cdr.detectChanges();\n }\n\n /** Handle toggling an FTS entity */\n public OnFTSEntityToggled(entity: FTSEntityRecord): void {\n this.HasUnsavedChanges = true;\n this.cdr.detectChanges();\n }\n\n public FormatThreshold(value: number): string {\n return `${Math.round(value * 100)}%`;\n }\n\n /** Open the create index inline form */\n public OpenCreateIndexForm(): void {\n this.ShowCreateIndexForm = true;\n this.NewIndexName = 'mj-knowledge-index';\n this.NewIndexVectorDBID = this.VectorDBProviders.length > 0 ? this.VectorDBProviders[0].ID : '';\n this.NewIndexEmbeddingModelID = this.EmbeddingModels.length > 0 ? this.EmbeddingModels[0].ID : '';\n this.cdr.detectChanges();\n }\n\n /** Cancel creating an index */\n public CancelCreateIndex(): void {\n this.ShowCreateIndexForm = false;\n this.cdr.detectChanges();\n }\n\n /** Create a new vector index */\n public async CreateIndex(): Promise<void> {\n if (!this.NewIndexName.trim() || !this.NewIndexVectorDBID || !this.NewIndexEmbeddingModelID) {\n MJNotificationService.Instance.CreateSimpleNotification('Please fill in all fields', 'warning', 3000);\n return;\n }\n\n this.IsCreatingIndex = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const index = await md.GetEntityObject<MJVectorIndexEntity>('MJ: Vector Indexes');\n index.NewRecord();\n index.Name = this.NewIndexName.trim();\n index.VectorDatabaseID = this.NewIndexVectorDBID;\n index.EmbeddingModelID = this.NewIndexEmbeddingModelID;\n index.Description = `Knowledge Hub vector index created ${new Date().toLocaleDateString()}`;\n\n const saved = await index.Save();\n if (saved) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Vector index \"${this.NewIndexName}\" created successfully`,\n 'success', 3000\n );\n this.ShowCreateIndexForm = false;\n await this.loadConfiguration();\n } else {\n const msg = index.LatestResult?.CompleteMessage || 'Unknown error';\n console.error('[KnowledgeConfig] Failed to create index:', msg);\n MJNotificationService.Instance.CreateSimpleNotification(`Failed to create index: ${msg}`, 'error', 5000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[KnowledgeConfig] Error creating index:', msg);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);\n } finally {\n this.IsCreatingIndex = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Delete a vector index */\n public async DeleteIndex(indexId: string): Promise<void> {\n const idx = this.VectorIndexes.find(i => UUIDsEqual(i.ID, indexId));\n if (!idx) return;\n\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<MJVectorIndexEntity>('MJ: Vector Indexes');\n const loaded = await entity.Load(indexId);\n if (!loaded) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Could not load vector index \"${idx.Name}\"`, 'error', 3000\n );\n return;\n }\n const deleted = await entity.Delete();\n if (deleted) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Index \"${idx.Name}\" deleted`, 'success', 2000\n );\n await this.loadConfiguration();\n } else {\n const msg = entity.LatestResult?.CompleteMessage || 'Unknown error';\n console.error('[KnowledgeConfig] Delete failed:', msg);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Delete failed: ${msg}`, 'error', 5000\n );\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[KnowledgeConfig] Error deleting index:', msg);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);\n }\n }\n\n /** Update the credential linked to a vector database provider */\n public async SaveProviderCredential(provider: VectorDBRecord): Promise<void> {\n this.IsSavingCredential = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<MJVectorDatabaseEntity>('MJ: Vector Databases');\n const loaded = await entity.Load(provider.ID);\n if (!loaded) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Could not load vector database \"${provider.Name}\"`, 'error', 3000\n );\n return;\n }\n\n entity.CredentialID = provider.CredentialID || null;\n const saved = await entity.Save();\n if (saved) {\n provider.CredentialName = this.AvailableCredentials.find(c => UUIDsEqual(c.ID, provider.CredentialID))?.Name ?? null;\n MJNotificationService.Instance.CreateSimpleNotification(\n provider.CredentialID\n ? `Credential linked to \"${provider.Name}\"`\n : `Credential removed from \"${provider.Name}\"`,\n 'success', 2000\n );\n } else {\n const msg = entity.LatestResult?.CompleteMessage ?? 'Unknown error';\n console.error('[KnowledgeConfig] Save credential failed:', msg);\n MJNotificationService.Instance.CreateSimpleNotification(`Save failed: ${msg}`, 'error', 5000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error('[KnowledgeConfig] Error saving credential:', msg);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);\n } finally {\n this.IsSavingCredential = false;\n this.cdr.detectChanges();\n }\n }\n\n // ================================================================\n // Private Methods\n // ================================================================\n\n private async loadConfiguration(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n // Use KnowledgeHubMetadataEngine for cached vector DBs, indexes, and entity docs\n const engine = KnowledgeHubMetadataEngine.Instance;\n await engine.Config(false);\n\n this.loadVectorDBProvidersFromEngine(AIEngineBase.Instance.VectorDatabases);\n this.loadVectorIndexesFromEngine(engine.VectorIndexes);\n this.loadEntityDocumentsAndThresholds(engine.GetActiveEntityDocuments());\n\n // AI Models and Credentials come from different domains — fetch via RunView\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [modelsResult, credentialsResult] = await rv.RunViews([\n { EntityName: 'MJ: AI Models', ResultType: 'simple' },\n { EntityName: 'MJ: Credentials', ExtraFilter: 'IsActive = 1', Fields: ['ID', 'Name'], ResultType: 'simple' }\n ]);\n this.loadEmbeddingModels(modelsResult.Success ? modelsResult.Results : []);\n this.AvailableCredentials = (credentialsResult.Success ? credentialsResult.Results : [])\n .map((c: Record<string, unknown>) => ({ ID: String(c['ID']), Name: String(c['Name']) }));\n } catch (error) {\n console.error('[KnowledgeConfig] Error loading configuration:', error);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n\n // Load FTS entities in background (doesn't block main config)\n this.loadFTSEntities();\n }\n\n private async loadFTSEntities(): Promise<void> {\n this.IsLoadingFTSEntities = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const allEntities = md.Entities;\n const ftsEntities: FTSEntityRecord[] = [];\n\n for (const entity of allEntities) {\n const textFields = entity.Fields.filter(\n (f: { Name: string; Type: string; MaxLength: number; IsPrimaryKey: boolean }) =>\n !f.IsPrimaryKey &&\n !f.Name.startsWith('__mj') &&\n (f.Type.toLowerCase().includes('varchar') ||\n f.Type.toLowerCase().includes('text') ||\n f.Type.toLowerCase() === 'ntext') &&\n f.MaxLength !== 1\n );\n\n if (textFields.length === 0) continue;\n\n const preferredTitleNames = ['Name', 'Title', 'Subject', 'Label'];\n const preferredSnippetNames = ['Description', 'Summary', 'Body', 'Content', 'Text', 'Notes'];\n\n const titleField = textFields.find((f: { Name: string }) => preferredTitleNames.includes(f.Name))?.Name\n || textFields[0]?.Name || 'Name';\n const snippetField = textFields.find((f: { Name: string }) =>\n preferredSnippetNames.includes(f.Name) && f.Name !== titleField\n )?.Name || titleField;\n\n ftsEntities.push({\n EntityName: entity.Name,\n IndexedFields: textFields.slice(0, 4).map((f: { Name: string }) => f.Name),\n TitleField: titleField,\n SnippetField: snippetField,\n Enabled: true,\n });\n }\n\n ftsEntities.sort((a, b) => a.EntityName.localeCompare(b.EntityName));\n this.FTSEntities = ftsEntities;\n } catch (error) {\n console.error('[KnowledgeConfig] Error loading FTS entities:', error);\n } finally {\n this.IsLoadingFTSEntities = false;\n this.cdr.detectChanges();\n }\n }\n\n private loadVectorDBProvidersFromEngine(dbs: MJVectorDatabaseEntity[]): void {\n this.VectorDBProviders = dbs.map(db => ({\n ID: db.ID,\n Name: db.Name,\n ClassKey: db.ClassKey || '',\n Description: db.Description || '',\n CredentialID: db.CredentialID,\n CredentialName: db.Credential ?? null\n }));\n }\n\n private loadVectorIndexesFromEngine(indexes: MJVectorIndexEntity[]): void {\n this.VectorIndexes = indexes.map(vi => ({\n ID: vi.ID,\n Name: vi.Name || 'Unnamed Index',\n EmbeddingModel: vi.EmbeddingModel || '',\n EmbeddingModelID: vi.EmbeddingModelID || '',\n VectorDatabase: vi.VectorDatabase || '',\n VectorDatabaseID: vi.VectorDatabaseID || ''\n }));\n }\n\n /** Load entity documents and seed threshold settings from the first document's values */\n private loadEntityDocumentsAndThresholds(docs: MJEntityDocumentEntity[]): void {\n this.entityDocuments = docs;\n if (docs.length > 0) {\n // Use the first entity document's thresholds as the canonical values\n const doc = docs[0];\n this.ThresholdSettings.DuplicatePotential = doc.PotentialMatchThreshold;\n this.ThresholdSettings.DuplicateAbsolute = doc.AbsoluteMatchThreshold;\n }\n }\n\n /** Persist threshold settings back to all active entity documents */\n private async persistThresholdsToEntityDocuments(): Promise<void> {\n if (this.entityDocuments.length === 0) {\n return; // No entity documents to update\n }\n\n for (const doc of this.entityDocuments) {\n doc.PotentialMatchThreshold = this.ThresholdSettings.DuplicatePotential;\n doc.AbsoluteMatchThreshold = this.ThresholdSettings.DuplicateAbsolute;\n const saved = await doc.Save();\n if (!saved) {\n const msg = doc.LatestResult?.CompleteMessage || 'Unknown error';\n throw new Error(`Failed to save entity document \"${doc.Name}\": ${msg}`);\n }\n }\n }\n\n private loadEmbeddingModels(records: Record<string, unknown>[]): void {\n this.EmbeddingModels = records\n .filter(m =>\n String(m['AIModelType'] || '').toLowerCase().includes('embedding') ||\n String(m['Name'] || '').toLowerCase().includes('embedding') ||\n String(m['Name'] || '').toLowerCase().includes('embed')\n )\n .map(m => ({\n ID: String(m['ID']),\n Name: String(m['Name'])\n }));\n }\n}\n\n/** Tree-shaking prevention */\nexport function LoadKnowledgeConfigResource(): void {\n // Prevents tree-shaking\n}\n","<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…' : 'Save'}}\n </button>\n }\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\">\n@if (IsLoading) {\n <div class=\"config-loading\">\n <mj-loading text=\"Loading configuration...\" size=\"medium\"></mj-loading>\n </div>\n} @else {\n <div class=\"config-layout\">\n <!-- Left Navigation -->\n <nav class=\"config-nav\">\n <div class=\"config-nav-header\">\n <i class=\"fa-solid fa-cogs\"></i>\n <span>Configuration</span>\n </div>\n @for (section of Sections; track section.ID) {\n <button\n class=\"config-nav-item\"\n [class.config-nav-item-active]=\"ActiveSection === section.ID\"\n (click)=\"SelectSection(section.ID)\"\n >\n <i [class]=\"section.Icon\"></i>\n <span>{{ section.Label }}</span>\n </button>\n }\n </nav>\n\n <!-- Content Area -->\n <div class=\"config-content\">\n <!-- Pipeline Settings -->\n @if (ActiveSection === 'pipeline') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Pipeline Settings</h2>\n <p class=\"config-section-desc\">Configure how the Knowledge Pipeline processes incoming content.</p>\n\n <div class=\"config-group\">\n <label class=\"config-toggle-row\">\n <div class=\"config-toggle-info\">\n <span class=\"config-label\">Auto-tag on Ingest</span>\n <span class=\"config-hint\">Automatically run autotagging when new content is ingested</span>\n </div>\n <input type=\"checkbox\" [(ngModel)]=\"PipelineSettings.AutotagOnIngest\" (change)=\"OnSettingChanged()\" class=\"config-checkbox\" />\n </label>\n\n <label class=\"config-toggle-row\">\n <div class=\"config-toggle-info\">\n <span class=\"config-label\">Vectorize on Ingest</span>\n <span class=\"config-hint\">Automatically create embeddings for new content</span>\n </div>\n <input type=\"checkbox\" [(ngModel)]=\"PipelineSettings.VectorizeOnIngest\" (change)=\"OnSettingChanged()\" class=\"config-checkbox\" />\n </label>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Default Batch Size</span>\n <span class=\"config-hint\">Number of items processed per batch</span>\n </div>\n <input type=\"number\" [(ngModel)]=\"PipelineSettings.DefaultBatchSize\" (input)=\"OnSettingChanged()\" class=\"config-input config-input-number\" min=\"10\" max=\"1000\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Max Concurrent Jobs</span>\n <span class=\"config-hint\">Maximum number of pipeline jobs running at once</span>\n </div>\n <input type=\"number\" [(ngModel)]=\"PipelineSettings.MaxConcurrentJobs\" (input)=\"OnSettingChanged()\" class=\"config-input config-input-number\" min=\"1\" max=\"10\" />\n </div>\n </div>\n </div>\n }\n\n <!-- Vector Database Settings -->\n @if (ActiveSection === 'vectordb') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Vector Database</h2>\n <p class=\"config-section-desc\">Manage the shared vector index and database connection.</p>\n\n <!-- Setup Progress -->\n <div class=\"setup-progress\">\n <div class=\"setup-progress-header\">\n <span class=\"setup-progress-label\">Setup Progress</span>\n <span class=\"setup-progress-count\">{{ SetupStepsCompleted }} of 3 complete</span>\n </div>\n <div class=\"setup-progress-bar\">\n <div class=\"setup-progress-fill\" [style.width.%]=\"(SetupStepsCompleted / 3) * 100\"></div>\n </div>\n </div>\n\n <!-- Step 1: Providers -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasVectorDBProvider\" [class.setup-step-pending]=\"!HasVectorDBProvider\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasVectorDBProvider) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">1</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Vector Database Providers</span>\n @if (HasVectorDBProvider) {\n <span class=\"setup-step-status\">{{ VectorDBProviders.length }} provider(s) registered</span>\n } @else {\n <span class=\"setup-step-status\">No providers registered. Add a vector database provider (e.g., Pinecone, Weaviate) via the admin console.</span>\n }\n </div>\n </div>\n @if (HasVectorDBProvider) {\n <div class=\"setup-step-detail\">\n @for (provider of VectorDBProviders; track provider.ID) {\n <div class=\"provider-card\">\n <div class=\"provider-icon\">\n <i class=\"fa-solid fa-database\"></i>\n </div>\n <div class=\"provider-info\">\n <span class=\"provider-name\">{{ provider.Name }}</span>\n <span class=\"provider-class\">{{ provider.ClassKey }}</span>\n </div>\n <span class=\"config-status-badge config-status-active\">\n <i class=\"fa-solid fa-circle-check\"></i> Active\n </span>\n </div>\n <div class=\"provider-credential-row\">\n <label class=\"provider-credential-label\">\n <i class=\"fa-solid fa-key\"></i> API Credential\n </label>\n <div class=\"provider-credential-picker\">\n <select class=\"provider-credential-select\"\n [(ngModel)]=\"provider.CredentialID\"\n (change)=\"SaveProviderCredential(provider)\"\n [disabled]=\"IsSavingCredential\">\n <option [ngValue]=\"null\">None (use environment variable)</option>\n @for (cred of AvailableCredentials; track cred.ID) {\n <option [ngValue]=\"cred.ID\">{{ cred.Name }}</option>\n }\n </select>\n @if (IsSavingCredential) {\n <i class=\"fa-solid fa-spinner fa-spin provider-credential-spinner\"></i>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Step 2: Embedding Model -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasEmbeddingModel\" [class.setup-step-pending]=\"!HasEmbeddingModel\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasEmbeddingModel) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">2</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Embedding Models</span>\n @if (HasEmbeddingModel) {\n <span class=\"setup-step-status\">{{ EmbeddingModels.length }} model(s) available</span>\n } @else {\n <span class=\"setup-step-status\">No embedding models found. Configure at least one in the AI app > Models tab.</span>\n }\n </div>\n </div>\n @if (HasEmbeddingModel) {\n <div class=\"setup-step-detail\">\n <div class=\"config-tag-list\">\n @for (model of EmbeddingModels; track model.ID) {\n <span class=\"config-tag\">{{ model.Name }}</span>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Step 3: Vector Indexes -->\n <div class=\"setup-step\" [class.setup-step-complete]=\"HasVectorIndex\" [class.setup-step-pending]=\"!HasVectorIndex\">\n <div class=\"setup-step-header\">\n <div class=\"setup-step-indicator\">\n @if (HasVectorIndex) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <span class=\"setup-step-number\">3</span>\n }\n </div>\n <div class=\"setup-step-info\">\n <span class=\"setup-step-title\">Vector Indexes</span>\n @if (HasVectorIndex) {\n <span class=\"setup-step-status\">{{ VectorIndexes.length }} index(es) configured</span>\n } @else if (HasVectorDBProvider && HasEmbeddingModel) {\n <span class=\"setup-step-status\">No indexes yet — 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;·&nbsp;\n <i class=\"fa-solid fa-microchip\"></i> {{ idx.EmbeddingModel }}\n </span>\n </div>\n <div class=\"index-actions\">\n <span class=\"config-status-badge config-status-active\">\n <i class=\"fa-solid fa-circle-check\"></i> Active\n </span>\n <button class=\"index-delete-btn\" (click)=\"DeleteIndex(idx.ID)\" title=\"Delete index\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Create Index Form -->\n @if (ShowCreateIndexForm) {\n <div class=\"create-index-form\">\n <h4 class=\"create-index-title\">\n <i class=\"fa-solid fa-plus-circle\"></i> Create New Vector Index\n </h4>\n <div class=\"create-index-fields\">\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Index Name</label>\n <input type=\"text\"\n class=\"config-input\"\n [(ngModel)]=\"NewIndexName\"\n placeholder=\"e.g., mj-knowledge-index\" />\n </div>\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Vector Database</label>\n <select class=\"config-select\" [(ngModel)]=\"NewIndexVectorDBID\">\n @for (db of VectorDBProviders; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"create-index-field\">\n <label class=\"create-index-label\">Embedding Model</label>\n <select class=\"config-select\" [(ngModel)]=\"NewIndexEmbeddingModelID\">\n @for (model of EmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"create-index-actions\">\n <button class=\"create-index-submit\" (click)=\"CreateIndex()\" [disabled]=\"IsCreatingIndex\">\n @if (IsCreatingIndex) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Creating...\n } @else {\n <i class=\"fa-solid fa-plus\"></i> Create Index\n }\n </button>\n <button class=\"create-index-cancel\" (click)=\"CancelCreateIndex()\" [disabled]=\"IsCreatingIndex\">\n Cancel\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Full-Text Indexes -->\n @if (ActiveSection === 'fulltext') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Full-Text Search Entities</h2>\n <p class=\"config-section-desc\">Configure which entities are included in full-text search. Entities with text fields (Name, Description, etc.) are automatically discovered.</p>\n\n @if (IsLoadingFTSEntities) {\n <mj-loading text=\"Discovering searchable entities...\" size=\"medium\"></mj-loading>\n } @else if (FTSEntities.length === 0) {\n <div class=\"config-empty-state\">\n <i class=\"fa-solid fa-text-width config-empty-icon\"></i>\n <h3 class=\"config-empty-title\">No Searchable Entities Found</h3>\n <p class=\"config-empty-text\">No entities with text fields were discovered. Ensure your database schema includes entities with varchar/nvarchar columns.</p>\n </div>\n } @else {\n <div class=\"fts-entity-controls\">\n <div class=\"fts-summary\">\n <span class=\"fts-summary-count\">{{ EnabledFTSCount }} of {{ FTSEntities.length }} entities enabled for search</span>\n <input type=\"text\" class=\"config-input fts-filter-input\" placeholder=\"Filter entities...\" [(ngModel)]=\"FTSFilterText\" />\n </div>\n </div>\n\n <div class=\"fts-entity-list\">\n @for (entity of FilteredFTSEntities; track entity.EntityName) {\n <div class=\"fts-entity-card\" [class.fts-entity-enabled]=\"entity.Enabled\">\n <div class=\"fts-entity-toggle\">\n <input type=\"checkbox\" [(ngModel)]=\"entity.Enabled\" (change)=\"OnFTSEntityToggled(entity)\" class=\"config-checkbox\" />\n </div>\n <div class=\"fts-entity-info\">\n <span class=\"fts-entity-name\">{{ entity.EntityName }}</span>\n <div class=\"fts-entity-fields\">\n @for (field of entity.IndexedFields; track field) {\n <span class=\"fts-field-tag\">{{ field }}</span>\n }\n </div>\n </div>\n <div class=\"fts-entity-meta\">\n <span class=\"fts-entity-title-field\" title=\"Title field\">\n <i class=\"fa-solid fa-heading\"></i> {{ entity.TitleField }}\n </span>\n @if (entity.SnippetField !== entity.TitleField) {\n <span class=\"fts-entity-snippet-field\" title=\"Snippet field\">\n <i class=\"fa-solid fa-align-left\"></i> {{ entity.SnippetField }}\n </span>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Embedding Models -->\n @if (ActiveSection === 'embedding') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Embedding Models</h2>\n <p class=\"config-section-desc\">AI models used for generating vector embeddings from text.</p>\n\n @if (HasEmbeddingModel) {\n <div class=\"config-group\">\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Active Model</span>\n <span class=\"config-hint\">Currently selected embedding model</span>\n </div>\n <span class=\"config-value-display\">{{ EmbeddingModelName }}</span>\n </div>\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Available Models</span>\n <span class=\"config-hint\">{{ EmbeddingModels.length }} embedding model(s) configured</span>\n </div>\n <div class=\"config-tag-list\">\n @for (model of EmbeddingModels; track model.ID) {\n <span class=\"config-tag\">{{ model.Name }}</span>\n }\n </div>\n </div>\n </div>\n <p class=\"config-section-note\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Manage embedding models in the AI Dashboard > Models tab.\n </p>\n } @else {\n <div class=\"config-empty-state\">\n <i class=\"fa-solid fa-microchip config-empty-icon\"></i>\n <h3 class=\"config-empty-title\">No Embedding Models Found</h3>\n <p class=\"config-empty-text\">\n Embedding models are required to convert text into vectors for semantic search and duplicate detection.\n Configure at least one embedding model (e.g., text-embedding-3-small) in the AI Dashboard > Models tab.\n </p>\n </div>\n }\n </div>\n }\n\n <!-- Thresholds -->\n @if (ActiveSection === 'thresholds') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\">Scoring Thresholds</h2>\n <p class=\"config-section-desc\">Set the scoring thresholds used by search, duplicate detection, and autotagging.</p>\n\n <div class=\"config-group\">\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Duplicate Absolute Match</span>\n <span class=\"config-hint\">Score above which duplicates are auto-confirmed ({{ FormatThreshold(ThresholdSettings.DuplicateAbsolute) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.DuplicateAbsolute\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.5\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Duplicate Potential Match</span>\n <span class=\"config-hint\">Score above which duplicates are flagged for review ({{ FormatThreshold(ThresholdSettings.DuplicatePotential) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.DuplicatePotential\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.3\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Search Relevance</span>\n <span class=\"config-hint\">Minimum score for search results ({{ FormatThreshold(ThresholdSettings.SearchRelevance) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.SearchRelevance\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0\" max=\"1\" step=\"0.01\" />\n </div>\n\n <div class=\"config-field-row\">\n <div class=\"config-field-info\">\n <span class=\"config-label\">Autotag Confidence</span>\n <span class=\"config-hint\">Minimum confidence for accepting auto-generated tags ({{ FormatThreshold(ThresholdSettings.AutotagConfidence) }})</span>\n </div>\n <input type=\"range\" [(ngModel)]=\"ThresholdSettings.AutotagConfidence\" (input)=\"OnSettingChanged()\" class=\"config-slider\" min=\"0.3\" max=\"1\" step=\"0.01\" />\n </div>\n </div>\n </div>\n }\n\n <!-- Search Scopes Section -->\n @if (ActiveSection === 'search-scopes') {\n <div class=\"config-section\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-compass-drafting\"></i> Search Scopes</h2>\n <p class=\"config-section-desc\">\n Define reusable search scopes that filter which providers, entities, external indexes, and storage accounts participate in a scoped search.\n Scopes can be assigned to AI agents for pre-execution RAG or agent-invoked search.\n </p>\n\n <div class=\"scope-manager\">\n <!-- Scope list -->\n <aside class=\"scope-manager-list\">\n <div class=\"scope-manager-list-header\">\n <span>Scopes ({{ SearchScopes.length }})</span>\n <button type=\"button\" class=\"scope-manager-new-btn\" (click)=\"CreateNewScope()\">\n <i class=\"fa-solid fa-plus\"></i> New\n </button>\n </div>\n @if (IsLoadingScopes) {\n <div class=\"scope-manager-loading\">Loading&hellip;</div>\n } @else if (SearchScopes.length === 0) {\n <div class=\"scope-manager-empty\">\n No scopes defined yet. Click <strong>New</strong> to create one.\n </div>\n } @else {\n @for (s of SearchScopes; track s.ID) {\n <button\n type=\"button\"\n class=\"scope-manager-list-item\"\n [class.active]=\"ActiveScopeID === s.ID\"\n (click)=\"SelectScope(s.ID)\">\n <i [class]=\"s.Icon || 'fa-solid fa-filter'\" aria-hidden=\"true\"></i>\n <span class=\"scope-manager-list-name\">{{ s.Name }}</span>\n @if (s.IsGlobal) {\n <span class=\"scope-manager-badge\">Global</span>\n } @else if (s.IsDefault) {\n <span class=\"scope-manager-badge\">Default</span>\n }\n </button>\n }\n }\n </aside>\n\n <!-- Scope detail -->\n <section class=\"scope-manager-detail\">\n @if (ActiveScope) {\n <!-- Tab strip -->\n <div class=\"scope-manager-tabs\">\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'definition'\" (click)=\"SelectScopeTab('definition')\">Definition</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'providers'\" (click)=\"SelectScopeTab('providers')\">Providers</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'indexes'\" (click)=\"SelectScopeTab('indexes')\">External Indexes</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'entities'\" (click)=\"SelectScopeTab('entities')\">Entities</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'storage'\" (click)=\"SelectScopeTab('storage')\">Storage</button>\n <button type=\"button\" class=\"scope-manager-tab\" [class.active]=\"ActiveScopeTab === 'permissions'\" (click)=\"SelectScopeTab('permissions')\">Permissions</button>\n <div class=\"scope-manager-tab-spacer\"></div>\n @if (ActiveScope.ID) {\n <button type=\"button\" class=\"scope-manager-open-btn\"\n (click)=\"OpenActiveScopeFullForm()\"\n title=\"Open the full custom form for this scope (Live Preview, Fusion Weights, Reranker, Test Queries, Execution Logs)\">\n <i class=\"fa-solid fa-up-right-from-square\"></i> Open Full Form\n </button>\n }\n <button type=\"button\" class=\"scope-manager-save-btn\" (click)=\"SaveActiveScope()\">\n <i class=\"fa-solid fa-save\"></i> Save\n </button>\n @if (!ActiveScope.IsGlobal) {\n <button type=\"button\" class=\"scope-manager-delete-btn\" (click)=\"DeleteActiveScope()\" title=\"Delete scope\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n\n <!-- Definition tab -->\n @if (ActiveScopeTab === 'definition') {\n <div class=\"scope-definition-grid\">\n <label>\n <span>Name</span>\n <input type=\"text\" class=\"mj-input\" [value]=\"ActiveScope.Name\" (change)=\"ActiveScope.Name = $any($event.target).value\">\n </label>\n <label>\n <span>Icon (Font Awesome class)</span>\n <input type=\"text\" class=\"mj-input\" [value]=\"ActiveScope.Icon || ''\" (change)=\"ActiveScope.Icon = $any($event.target).value\">\n </label>\n <label class=\"scope-definition-full\">\n <span>Description</span>\n <textarea rows=\"2\" class=\"mj-textarea\" [value]=\"ActiveScope.Description || ''\" (change)=\"ActiveScope.Description = $any($event.target).value\"></textarea>\n </label>\n <label>\n <span>Status</span>\n <select class=\"mj-input\" [value]=\"ActiveScope.Status\" (change)=\"ActiveScope.Status = $any($event.target).value\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </label>\n <label>\n <span>Start at</span>\n <input type=\"datetime-local\" class=\"mj-input\" [value]=\"FormatScopeDate(ActiveScope.StartAt)\" (change)=\"SetScopeDate(ActiveScope, 'StartAt', $any($event.target).value)\">\n </label>\n <label>\n <span>End at</span>\n <input type=\"datetime-local\" class=\"mj-input\" [value]=\"FormatScopeDate(ActiveScope.EndAt)\" (change)=\"SetScopeDate(ActiveScope, 'EndAt', $any($event.target).value)\">\n </label>\n <label class=\"scope-definition-toggle\">\n <input type=\"checkbox\" [checked]=\"ActiveScope.IsDefault\" (change)=\"ActiveScope.IsDefault = $any($event.target).checked\" [disabled]=\"ActiveScope.IsGlobal\">\n <span>Default scope — 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 — 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 — 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) — driven by SearchExecutionLog -->\n @if (ActiveSection === 'search-analytics') {\n <div class=\"config-section-content\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-chart-line\"></i> Search Analytics</h2>\n <p class=\"config-section-desc\">Aggregated metrics over the last 5,000 search invocations from <code>MJ: Search Execution Logs</code>. Use this to spot slow scopes, high-failure queries, or runaway reranker spend.</p>\n\n @if (AnalyticsLoading) {\n <mj-loading text=\"Loading analytics…\" 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 ≥1 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' }}¢</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' }}¢</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <h3 class=\"search-analytics-h3\">Top failure reasons</h3>\n @if (AnalyticsTopFailures.length === 0) {\n <p class=\"search-analytics-empty\">No failures in the window.</p>\n } @else {\n <table class=\"search-analytics-table\">\n <thead>\n <tr><th>Reason</th><th>Count</th></tr>\n </thead>\n <tbody>\n @for (f of AnalyticsTopFailures; track f.Reason) {\n <tr>\n <td>{{ f.Reason }}</td>\n <td>{{ f.Count | number }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <button class=\"mj-input search-analytics-refresh\" type=\"button\" (click)=\"LoadSearchAnalytics()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n }\n </div>\n }\n\n <!-- Permissions Audit Section (P2A.7) -->\n @if (ActiveSection === 'search-permissions') {\n <div class=\"config-section-content\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-shield-halved\"></i> Permissions</h2>\n <p class=\"config-section-desc\">\n Cross-scope view of every <code>SearchScopePermission</code> row. Filter by scope, by user/role, or by permission level to answer \"who has access to what\". Read-only — to add or edit a grant, open the SearchScope's full form and use its Permissions panel.\n </p>\n\n @if (PermissionsLoading) {\n <div class=\"search-permissions-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading permission rows...\n </div>\n }\n\n @if (PermissionsLoaded && !PermissionsLoading) {\n <div class=\"search-permissions-filters\">\n <input class=\"mj-input\" type=\"text\" placeholder=\"Filter by scope name...\" [(ngModel)]=\"PermissionsFilterScope\" />\n <input class=\"mj-input\" type=\"text\" placeholder=\"Filter by user/role (name or email)...\" [(ngModel)]=\"PermissionsFilterPrincipal\" />\n <select class=\"mj-input\" [(ngModel)]=\"PermissionsFilterLevel\">\n <option value=\"\">All levels</option>\n <option value=\"None\">None</option>\n <option value=\"Read\">Read</option>\n <option value=\"Search\">Search</option>\n <option value=\"Manage\">Manage</option>\n </select>\n <button class=\"mj-input\" type=\"button\" (click)=\"RefreshPermissionsAudit()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n </div>\n\n <div class=\"search-permissions-summary\">\n Showing {{ FilteredPermissionsRows.length }} of {{ PermissionsRows.length }} rows\n </div>\n\n @if (FilteredPermissionsRows.length === 0) {\n <div class=\"search-permissions-empty\">\n No permission rows match your filters.\n </div>\n } @else {\n <table class=\"search-permissions-table\">\n <thead>\n <tr>\n <th>Scope</th>\n <th>Principal</th>\n <th>Type</th>\n <th>Permission Level</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredPermissionsRows; track row.ID) {\n <tr>\n <td>{{ row.SearchScopeName }}</td>\n <td>\n @if (row.UserID) {\n {{ row.UserName }} <span class=\"search-permissions-secondary\">({{ row.UserEmail }})</span>\n } @else {\n {{ row.RoleName }}\n }\n </td>\n <td>\n @if (row.UserID) { <span class=\"search-permissions-tag\">User</span> }\n @if (row.RoleID) { <span class=\"search-permissions-tag\">Role</span> }\n </td>\n <td>\n <span class=\"search-permissions-level search-permissions-level-{{ row.PermissionLevel | lowercase }}\">{{ row.PermissionLevel }}</span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n }\n </div>\n }\n\n <!-- Scheduling Section -->\n @if (ActiveSection === 'scheduling') {\n <div class=\"config-section-content\">\n <h2 class=\"config-section-title\"><i class=\"fa-solid fa-clock\"></i> Scheduling</h2>\n <p class=\"config-section-desc\">Manage automated pipeline schedules for content classification and vector sync. Create schedules here or manage all schedules in the dedicated Scheduling app.</p>\n <div style=\"margin-top: 16px;\">\n <app-scheduling-resource [HideToolbar]=\"true\"></app-scheduling-resource>\n </div>\n </div>\n }\n\n <!-- Save Bar -->\n @if (HasUnsavedChanges) {\n <div class=\"config-save-bar\">\n <span class=\"config-save-text\">You have unsaved changes</span>\n <button class=\"config-save-btn\" (click)=\"SaveConfiguration()\" [disabled]=\"IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-save\"></i> Save Changes\n }\n </button>\n <button class=\"config-reset-btn\" (click)=\"ResetConfiguration()\" [disabled]=\"IsSaving\">\n Reset\n </button>\n </div>\n }\n </div>\n </div>\n}\n </mj-page-body>\n</mj-page-layout>\n"]}