@memberjunction/ng-dashboards 5.23.0 → 5.25.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 (296) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +15 -33
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +233 -493
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.d.ts +2 -2
  6. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  7. package/dist/AI/components/agents/agent-editor.component.js +7 -7
  8. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  9. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +717 -8
  10. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  11. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +7166 -1889
  12. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  13. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +50 -4
  14. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  15. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +759 -491
  16. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  17. package/dist/AI/components/execution-monitoring.component.d.ts +4 -5
  18. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  19. package/dist/AI/components/execution-monitoring.component.js +14 -15
  20. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  21. package/dist/AI/components/models/model-management.component.d.ts +4 -4
  22. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  23. package/dist/AI/components/models/model-management.component.js +5 -5
  24. package/dist/AI/components/models/model-management.component.js.map +1 -1
  25. package/dist/AI/components/prompts/prompt-management.component.d.ts +4 -4
  26. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  27. package/dist/AI/components/prompts/prompt-management.component.js +5 -5
  28. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  29. package/dist/AI/components/requests/agent-requests-resource.component.d.ts +2 -1
  30. package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
  31. package/dist/AI/components/requests/agent-requests-resource.component.js +1 -0
  32. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  33. package/dist/AI/components/system/system-configuration.component.d.ts +2 -3
  34. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  35. package/dist/AI/components/system/system-configuration.component.js +9 -11
  36. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  37. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +62 -7
  38. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  39. package/dist/AI/components/vectors/vector-management-resource.component.js +825 -359
  40. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  41. package/dist/APIKeys/api-keys-resource.component.d.ts +2 -1
  42. package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
  43. package/dist/APIKeys/api-keys-resource.component.js +2 -0
  44. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  45. package/dist/Actions/components/actions-overview.component.d.ts +4 -5
  46. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  47. package/dist/Actions/components/actions-overview.component.js +11 -12
  48. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  49. package/dist/Actions/components/code-management.component.d.ts +2 -3
  50. package/dist/Actions/components/code-management.component.d.ts.map +1 -1
  51. package/dist/Actions/components/code-management.component.js +4 -6
  52. package/dist/Actions/components/code-management.component.js.map +1 -1
  53. package/dist/Actions/components/entity-integration.component.d.ts +2 -3
  54. package/dist/Actions/components/entity-integration.component.d.ts.map +1 -1
  55. package/dist/Actions/components/entity-integration.component.js +4 -6
  56. package/dist/Actions/components/entity-integration.component.js.map +1 -1
  57. package/dist/Actions/components/execution-monitoring.component.d.ts +4 -5
  58. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
  59. package/dist/Actions/components/execution-monitoring.component.js +10 -11
  60. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  61. package/dist/Actions/components/explorer/action-explorer.component.d.ts +13 -12
  62. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  63. package/dist/Actions/components/explorer/action-explorer.component.js +39 -66
  64. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  65. package/dist/Actions/components/scheduled-actions.component.d.ts +2 -3
  66. package/dist/Actions/components/scheduled-actions.component.d.ts.map +1 -1
  67. package/dist/Actions/components/scheduled-actions.component.js +4 -6
  68. package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
  69. package/dist/Actions/components/security-permissions.component.d.ts +2 -3
  70. package/dist/Actions/components/security-permissions.component.d.ts.map +1 -1
  71. package/dist/Actions/components/security-permissions.component.js +4 -6
  72. package/dist/Actions/components/security-permissions.component.js.map +1 -1
  73. package/dist/ApplicationRoles/application-roles-resource.component.d.ts +112 -0
  74. package/dist/ApplicationRoles/application-roles-resource.component.d.ts.map +1 -0
  75. package/dist/ApplicationRoles/application-roles-resource.component.js +532 -0
  76. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -0
  77. package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
  78. package/dist/Communication/communication-dashboard.component.js +1 -0
  79. package/dist/Communication/communication-dashboard.component.js.map +1 -1
  80. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  81. package/dist/Communication/communication-logs-resource.component.js +4 -1
  82. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  83. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  84. package/dist/Communication/communication-monitor-resource.component.js +4 -1
  85. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  86. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  87. package/dist/Communication/communication-providers-resource.component.js +4 -1
  88. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  89. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  90. package/dist/Communication/communication-runs-resource.component.js +4 -1
  91. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  92. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  93. package/dist/Communication/communication-templates-resource.component.js +4 -1
  94. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  95. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +2 -1
  96. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  97. package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
  98. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  99. package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
  100. package/dist/Credentials/components/credentials-audit-resource.component.js +2 -0
  101. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  102. package/dist/Credentials/components/credentials-categories-resource.component.d.ts +2 -3
  103. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  104. package/dist/Credentials/components/credentials-categories-resource.component.js +10 -11
  105. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  106. package/dist/Credentials/components/credentials-list-resource.component.d.ts +2 -1
  107. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  108. package/dist/Credentials/components/credentials-list-resource.component.js +2 -0
  109. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  110. package/dist/Credentials/components/credentials-overview-resource.component.d.ts +4 -4
  111. package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
  112. package/dist/Credentials/components/credentials-overview-resource.component.js +8 -9
  113. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  114. package/dist/Credentials/components/credentials-types-resource.component.d.ts +2 -3
  115. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  116. package/dist/Credentials/components/credentials-types-resource.component.js +11 -12
  117. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  118. package/dist/Credentials/credentials-dashboard.component.d.ts.map +1 -1
  119. package/dist/Credentials/credentials-dashboard.component.js +1 -0
  120. package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
  121. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +2 -3
  122. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  123. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +9 -10
  124. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  125. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +2 -2
  126. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +23 -15
  127. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
  128. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +167 -213
  129. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
  130. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +68 -32
  131. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  132. package/dist/DataExplorer/data-explorer-dashboard.component.js +470 -437
  133. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  134. package/dist/DataExplorer/data-explorer-resource.component.d.ts +10 -3
  135. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  136. package/dist/DataExplorer/data-explorer-resource.component.js +35 -11
  137. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  138. package/dist/DataExplorer/models/explorer-state.interface.d.ts +12 -3
  139. package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
  140. package/dist/DataExplorer/models/explorer-state.interface.js +5 -1
  141. package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
  142. package/dist/Home/home-dashboard.component.d.ts +4 -4
  143. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  144. package/dist/Home/home-dashboard.component.js +4 -5
  145. package/dist/Home/home-dashboard.component.js.map +1 -1
  146. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  147. package/dist/Integration/components/activity/activity.component.js +2 -0
  148. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  149. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  150. package/dist/Integration/components/connections/connections.component.js +3 -0
  151. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  152. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
  153. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +2 -0
  154. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  155. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
  156. package/dist/Integration/components/overview/overview.component.js +3 -0
  157. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  158. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
  159. package/dist/Integration/components/pipelines/pipelines.component.js +3 -0
  160. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  161. package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
  162. package/dist/Integration/components/schedules/schedules.component.js +3 -0
  163. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  164. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +412 -0
  165. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -0
  166. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +4267 -0
  167. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -0
  168. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +39 -4
  169. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
  170. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +187 -13
  171. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  172. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +13 -2
  173. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
  174. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +329 -224
  175. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  176. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +76 -0
  177. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -0
  178. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +602 -0
  179. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -0
  180. package/dist/KnowledgeHub/index.d.ts +2 -1
  181. package/dist/KnowledgeHub/index.d.ts.map +1 -1
  182. package/dist/KnowledgeHub/index.js +2 -1
  183. package/dist/KnowledgeHub/index.js.map +1 -1
  184. package/dist/Lists/components/lists-browse-resource.component.d.ts +2 -1
  185. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  186. package/dist/Lists/components/lists-browse-resource.component.js +2 -0
  187. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  188. package/dist/Lists/components/lists-categories-resource.component.d.ts +2 -1
  189. package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
  190. package/dist/Lists/components/lists-categories-resource.component.js +2 -0
  191. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  192. package/dist/Lists/components/lists-my-lists-resource.component.d.ts +2 -1
  193. package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
  194. package/dist/Lists/components/lists-my-lists-resource.component.js +2 -0
  195. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  196. package/dist/Lists/components/lists-operations-resource.component.d.ts +2 -1
  197. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  198. package/dist/Lists/components/lists-operations-resource.component.js +2 -0
  199. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  200. package/dist/MCP/mcp-dashboard.component.d.ts +7 -28
  201. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  202. package/dist/MCP/mcp-dashboard.component.js +25 -107
  203. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  204. package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
  205. package/dist/MCP/mcp-resource.component.js +1 -0
  206. package/dist/MCP/mcp-resource.component.js.map +1 -1
  207. package/dist/QueryBrowser/query-browser-resource.component.d.ts +10 -23
  208. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  209. package/dist/QueryBrowser/query-browser-resource.component.js +41 -103
  210. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  211. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
  212. package/dist/Scheduling/components/scheduling-activity-resource.component.js +1 -0
  213. package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
  214. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
  215. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +1 -0
  216. package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
  217. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
  218. package/dist/Scheduling/components/scheduling-overview-resource.component.js +1 -0
  219. package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
  220. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  221. package/dist/Scheduling/scheduling-dashboard.component.js +1 -0
  222. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  223. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +4 -4
  224. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  225. package/dist/SystemDiagnostics/system-diagnostics.component.js +9 -10
  226. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  227. package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
  228. package/dist/Testing/components/testing-analytics-resource.component.js +2 -0
  229. package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
  230. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
  231. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
  232. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +2 -0
  233. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
  234. package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
  235. package/dist/Testing/components/testing-explorer-resource.component.js +2 -0
  236. package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
  237. package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
  238. package/dist/Testing/components/testing-review-resource.component.js +2 -0
  239. package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
  240. package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
  241. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
  242. package/dist/Testing/components/testing-runs-resource.component.js +2 -0
  243. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
  244. package/dist/Testing/testing-dashboard.component.d.ts +2 -1
  245. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  246. package/dist/Testing/testing-dashboard.component.js +1 -0
  247. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  248. package/dist/VersionHistory/components/diff-resource.component.d.ts +4 -4
  249. package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
  250. package/dist/VersionHistory/components/diff-resource.component.js +9 -10
  251. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  252. package/dist/VersionHistory/components/graph-resource.component.d.ts +2 -1
  253. package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -1
  254. package/dist/VersionHistory/components/graph-resource.component.js +2 -0
  255. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  256. package/dist/VersionHistory/components/labels-resource.component.d.ts +4 -4
  257. package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
  258. package/dist/VersionHistory/components/labels-resource.component.js +10 -11
  259. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  260. package/dist/VersionHistory/components/restore-resource.component.d.ts +2 -1
  261. package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
  262. package/dist/VersionHistory/components/restore-resource.component.js +2 -0
  263. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  264. package/dist/__tests__/analytics-resource.test.d.ts +2 -0
  265. package/dist/__tests__/analytics-resource.test.d.ts.map +1 -0
  266. package/dist/__tests__/analytics-resource.test.js +181 -0
  267. package/dist/__tests__/analytics-resource.test.js.map +1 -0
  268. package/dist/__tests__/scheduling.test.d.ts +2 -0
  269. package/dist/__tests__/scheduling.test.d.ts.map +1 -0
  270. package/dist/__tests__/scheduling.test.js +205 -0
  271. package/dist/__tests__/scheduling.test.js.map +1 -0
  272. package/dist/ai-dashboards.module.d.ts +22 -18
  273. package/dist/ai-dashboards.module.d.ts.map +1 -1
  274. package/dist/ai-dashboards.module.js +29 -10
  275. package/dist/ai-dashboards.module.js.map +1 -1
  276. package/dist/core-dashboards.module.d.ts +19 -18
  277. package/dist/core-dashboards.module.d.ts.map +1 -1
  278. package/dist/core-dashboards.module.js +8 -0
  279. package/dist/core-dashboards.module.js.map +1 -1
  280. package/dist/data-explorer-dashboards.module.d.ts +2 -1
  281. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  282. package/dist/data-explorer-dashboards.module.js +7 -3
  283. package/dist/data-explorer-dashboards.module.js.map +1 -1
  284. package/dist/public-api.d.ts +2 -1
  285. package/dist/public-api.d.ts.map +1 -1
  286. package/dist/public-api.js +3 -1
  287. package/dist/public-api.js.map +1 -1
  288. package/dist/shared/entity-field-display.d.ts +44 -0
  289. package/dist/shared/entity-field-display.d.ts.map +1 -0
  290. package/dist/shared/entity-field-display.js +118 -0
  291. package/dist/shared/entity-field-display.js.map +1 -0
  292. package/package.json +47 -46
  293. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +0 -85
  294. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +0 -1
  295. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +0 -461
  296. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +0 -1
@@ -12,42 +12,44 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
12
12
  * an entity sync table, and sidebar panels for DB health, embedding model info,
13
13
  * and storage usage.
14
14
  */
15
- import { Component, ChangeDetectorRef, Input, inject } from '@angular/core';
15
+ import { Component, ChangeDetectorRef, Input, ViewChild, inject } from '@angular/core';
16
16
  import { Subject } from 'rxjs';
17
17
  import { takeUntil } from 'rxjs/operators';
18
18
  import { Metadata, RunView } from '@memberjunction/core';
19
19
  import { KnowledgeHubMetadataEngine } from '@memberjunction/core-entities';
20
20
  import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
21
- import { BaseResourceComponent } from '@memberjunction/ng-shared';
21
+ import { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';
22
22
  import { GraphQLAIClient } from '@memberjunction/graphql-dataprovider';
23
23
  import { AIEngineBase } from '@memberjunction/ai-engine-base';
24
24
  import { MJNotificationService } from '@memberjunction/ng-notifications';
25
+ import { CronToHumanReadable } from '../autotagging/autotagging-pipeline-resource.component';
25
26
  import * as i0 from "@angular/core";
26
27
  import * as i1 from "@angular/forms";
27
28
  import * as i2 from "@memberjunction/ng-code-editor";
28
29
  import * as i3 from "@memberjunction/ng-shared-generic";
29
30
  import * as i4 from "../widgets/kpi-card.component";
30
31
  import * as i5 from "@angular/common";
32
+ const _c0 = ["entitySearchInput"];
31
33
  const _forTrack0 = ($index, $item) => $item.title;
32
34
  const _forTrack1 = ($index, $item) => $item.EntityDocumentID;
33
35
  const _forTrack2 = ($index, $item) => $item.ID;
34
36
  const _forTrack3 = ($index, $item) => $item.SchemaName;
35
37
  const _forTrack4 = ($index, $item) => $item.name;
36
38
  function VectorManagementResourceComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
37
- i0.ɵɵelementStart(0, "div", 0);
38
- i0.ɵɵelement(1, "mj-loading", 1);
39
+ i0.ɵɵelementStart(0, "div", 1);
40
+ i0.ɵɵelement(1, "mj-loading", 2);
39
41
  i0.ɵɵelementEnd();
40
42
  } }
41
43
  function VectorManagementResourceComponent_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
42
44
  const _r2 = i0.ɵɵgetCurrentView();
43
- i0.ɵɵelementStart(0, "div", 3)(1, "button", 39);
45
+ i0.ɵɵelementStart(0, "div", 4)(1, "button", 40);
44
46
  i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_1_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.ViewMode = "index"); });
45
- i0.ɵɵelement(2, "i", 40);
47
+ i0.ɵɵelement(2, "i", 41);
46
48
  i0.ɵɵtext(3, " Index View ");
47
49
  i0.ɵɵelementEnd();
48
- i0.ɵɵelementStart(4, "button", 39);
50
+ i0.ɵɵelementStart(4, "button", 40);
49
51
  i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_1_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.ViewMode = "operations"); });
50
- i0.ɵɵelement(5, "i", 41);
52
+ i0.ɵɵelement(5, "i", 42);
51
53
  i0.ɵɵtext(6, " Operations ");
52
54
  i0.ɵɵelementEnd()();
53
55
  } if (rf & 2) {
@@ -58,14 +60,14 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_1_Template(
58
60
  i0.ɵɵclassProp("view-mode-btn-active", ctx_r2.ViewMode === "operations");
59
61
  } }
60
62
  function VectorManagementResourceComponent_Conditional_1_For_4_Template(rf, ctx) { if (rf & 1) {
61
- i0.ɵɵelement(0, "app-kpi-card", 5);
63
+ i0.ɵɵelement(0, "app-kpi-card", 6);
62
64
  } if (rf & 2) {
63
65
  const card_r4 = ctx.$implicit;
64
66
  i0.ɵɵproperty("data", card_r4);
65
67
  } }
66
68
  function VectorManagementResourceComponent_Conditional_1_Conditional_19_Template(rf, ctx) { if (rf & 1) {
67
- i0.ɵɵelementStart(0, "div", 17);
68
- i0.ɵɵelement(1, "i", 42);
69
+ i0.ɵɵelementStart(0, "div", 18);
70
+ i0.ɵɵelement(1, "i", 43);
69
71
  i0.ɵɵelementStart(2, "p");
70
72
  i0.ɵɵtext(3, "No entity documents configured for vectorization.");
71
73
  i0.ɵɵelementEnd()();
@@ -83,7 +85,7 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_C
83
85
  i0.ɵɵtextInterpolate1(" ", row_r6.Status, " ");
84
86
  } }
85
87
  function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_17_Template(rf, ctx) { if (rf & 1) {
86
- i0.ɵɵelement(0, "i", 55);
88
+ i0.ɵɵelement(0, "i", 58);
87
89
  i0.ɵɵtext(1);
88
90
  } if (rf & 2) {
89
91
  const row_r6 = i0.ɵɵnextContext().$implicit;
@@ -91,35 +93,39 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_C
91
93
  i0.ɵɵtextInterpolate1(" ", row_r6.PercentComplete > 0 ? row_r6.PercentComplete + "%" : "Sync", " ");
92
94
  } }
93
95
  function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_18_Template(rf, ctx) { if (rf & 1) {
94
- i0.ɵɵelement(0, "i", 56);
96
+ i0.ɵɵelement(0, "i", 59);
95
97
  i0.ɵɵtext(1, " Sync ");
96
98
  } }
97
99
  function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template(rf, ctx) { if (rf & 1) {
98
100
  const _r5 = i0.ɵɵgetCurrentView();
99
- i0.ɵɵelementStart(0, "tr")(1, "td", 46);
101
+ i0.ɵɵelementStart(0, "tr")(1, "td", 47);
100
102
  i0.ɵɵtext(2);
101
103
  i0.ɵɵelementEnd();
102
- i0.ɵɵelementStart(3, "td", 47);
104
+ i0.ɵɵelementStart(3, "td", 48);
103
105
  i0.ɵɵtext(4);
104
106
  i0.ɵɵelementEnd();
105
- i0.ɵɵelementStart(5, "td", 48);
107
+ i0.ɵɵelementStart(5, "td", 49);
106
108
  i0.ɵɵtext(6);
107
109
  i0.ɵɵpipe(7, "number");
108
110
  i0.ɵɵelementEnd();
109
- i0.ɵɵelementStart(8, "td", 49);
111
+ i0.ɵɵelementStart(8, "td", 50);
110
112
  i0.ɵɵtext(9);
111
113
  i0.ɵɵelementEnd();
112
- i0.ɵɵelementStart(10, "td")(11, "span", 50);
114
+ i0.ɵɵelementStart(10, "td")(11, "span", 51);
113
115
  i0.ɵɵelement(12, "i");
114
116
  i0.ɵɵconditionalCreate(13, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_13_Template, 1, 1)(14, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_14_Template, 1, 1);
115
117
  i0.ɵɵelementEnd()();
116
- i0.ɵɵelementStart(15, "td", 51)(16, "button", 52);
118
+ i0.ɵɵelementStart(15, "td", 52)(16, "button", 53);
117
119
  i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template_button_click_16_listener() { const row_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SyncEntity(row_r6.EntityDocumentID)); });
118
120
  i0.ɵɵconditionalCreate(17, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_17_Template, 2, 1)(18, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_18_Template, 2, 0);
119
121
  i0.ɵɵelementEnd();
120
- i0.ɵɵelementStart(19, "button", 53);
121
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template_button_click_19_listener() { const row_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OpenEditPanel(row_r6.EntityDocumentID)); });
122
- i0.ɵɵelement(20, "i", 54);
122
+ i0.ɵɵelementStart(19, "button", 54);
123
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template_button_click_19_listener() { const row_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OpenScheduleSyncDialog(row_r6.EntityDocumentID)); });
124
+ i0.ɵɵelement(20, "i", 55);
125
+ i0.ɵɵelementEnd();
126
+ i0.ɵɵelementStart(21, "button", 56);
127
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template_button_click_21_listener() { const row_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OpenEditPanel(row_r6.EntityDocumentID)); });
128
+ i0.ɵɵelement(22, "i", 57);
123
129
  i0.ɵɵelementEnd()()();
124
130
  } if (rf & 2) {
125
131
  const row_r6 = ctx.$implicit;
@@ -144,13 +150,13 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_T
144
150
  i0.ɵɵconditional(ctx_r2.SyncingIds.has(row_r6.EntityDocumentID) ? 17 : 18);
145
151
  } }
146
152
  function VectorManagementResourceComponent_Conditional_1_Conditional_20_Template(rf, ctx) { if (rf & 1) {
147
- i0.ɵɵelementStart(0, "div", 18)(1, "table", 43)(2, "thead")(3, "tr")(4, "th");
153
+ i0.ɵɵelementStart(0, "div", 19)(1, "table", 44)(2, "thead")(3, "tr")(4, "th");
148
154
  i0.ɵɵtext(5, "Entity");
149
155
  i0.ɵɵelementEnd();
150
156
  i0.ɵɵelementStart(6, "th");
151
157
  i0.ɵɵtext(7, "Document");
152
158
  i0.ɵɵelementEnd();
153
- i0.ɵɵelementStart(8, "th", 44);
159
+ i0.ɵɵelementStart(8, "th", 45);
154
160
  i0.ɵɵtext(9, "Vectors");
155
161
  i0.ɵɵelementEnd();
156
162
  i0.ɵɵelementStart(10, "th");
@@ -159,11 +165,11 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_Template
159
165
  i0.ɵɵelementStart(12, "th");
160
166
  i0.ɵɵtext(13, "Status");
161
167
  i0.ɵɵelementEnd();
162
- i0.ɵɵelementStart(14, "th", 45);
168
+ i0.ɵɵelementStart(14, "th", 46);
163
169
  i0.ɵɵtext(15, "Actions");
164
170
  i0.ɵɵelementEnd()()();
165
171
  i0.ɵɵelementStart(16, "tbody");
166
- i0.ɵɵrepeaterCreate(17, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template, 21, 13, "tr", null, _forTrack1);
172
+ i0.ɵɵrepeaterCreate(17, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template, 23, 13, "tr", null, _forTrack1);
167
173
  i0.ɵɵelementEnd()()();
168
174
  } if (rf & 2) {
169
175
  const ctx_r2 = i0.ɵɵnextContext(2);
@@ -171,10 +177,10 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_Template
171
177
  i0.ɵɵrepeater(ctx_r2.SyncRows);
172
178
  } }
173
179
  function VectorManagementResourceComponent_Conditional_1_Conditional_42_Template(rf, ctx) { if (rf & 1) {
174
- i0.ɵɵelementStart(0, "div", 29)(1, "span", 30);
180
+ i0.ɵɵelementStart(0, "div", 30)(1, "span", 31);
175
181
  i0.ɵɵtext(2, "Dimensions");
176
182
  i0.ɵɵelementEnd();
177
- i0.ɵɵelementStart(3, "span", 31);
183
+ i0.ɵɵelementStart(3, "span", 32);
178
184
  i0.ɵɵtext(4);
179
185
  i0.ɵɵpipe(5, "number");
180
186
  i0.ɵɵelementEnd()();
@@ -183,44 +189,73 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_42_Template
183
189
  i0.ɵɵadvance(4);
184
190
  i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 1, ctx_r2.EmbeddingModel.Dimensions));
185
191
  } }
186
- function VectorManagementResourceComponent_Conditional_1_Conditional_55_For_24_Template(rf, ctx) { if (rf & 1) {
187
- i0.ɵɵelementStart(0, "option", 70);
192
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_20_Template(rf, ctx) { if (rf & 1) {
193
+ i0.ɵɵelement(0, "i", 58);
194
+ i0.ɵɵtext(1, " Regenerating... ");
195
+ } }
196
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_21_Template(rf, ctx) { if (rf & 1) {
197
+ i0.ɵɵelement(0, "i", 14);
198
+ i0.ɵɵtext(1, " Regenerate with AI ");
199
+ } }
200
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_24_For_5_Template(rf, ctx) { if (rf & 1) {
201
+ i0.ɵɵelementStart(0, "span", 85);
188
202
  i0.ɵɵtext(1);
189
203
  i0.ɵɵelementEnd();
190
204
  } if (rf & 2) {
191
- const model_r8 = ctx.$implicit;
192
- i0.ɵɵproperty("value", model_r8.ID);
205
+ const field_r8 = ctx.$implicit;
193
206
  i0.ɵɵadvance();
194
- i0.ɵɵtextInterpolate(model_r8.Name);
207
+ i0.ɵɵtextInterpolate(field_r8);
208
+ } }
209
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_24_Template(rf, ctx) { if (rf & 1) {
210
+ i0.ɵɵelementStart(0, "div", 68)(1, "label", 69);
211
+ i0.ɵɵtext(2, "Selected Fields");
212
+ i0.ɵɵelementEnd();
213
+ i0.ɵɵelementStart(3, "div", 84);
214
+ i0.ɵɵrepeaterCreate(4, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_24_For_5_Template, 2, 1, "span", 85, i0.ɵɵrepeaterTrackByIdentity);
215
+ i0.ɵɵelementEnd()();
216
+ } if (rf & 2) {
217
+ const ctx_r2 = i0.ɵɵnextContext(3);
218
+ i0.ɵɵadvance(4);
219
+ i0.ɵɵrepeater(ctx_r2.EditDocSelectedFields);
195
220
  } }
196
- function VectorManagementResourceComponent_Conditional_1_Conditional_55_For_30_Template(rf, ctx) { if (rf & 1) {
197
- i0.ɵɵelementStart(0, "option", 70);
221
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_For_34_Template(rf, ctx) { if (rf & 1) {
222
+ i0.ɵɵelementStart(0, "option", 77);
198
223
  i0.ɵɵtext(1);
199
224
  i0.ɵɵelementEnd();
200
225
  } if (rf & 2) {
201
- const db_r9 = ctx.$implicit;
202
- i0.ɵɵproperty("value", db_r9.ID);
226
+ const model_r9 = ctx.$implicit;
227
+ i0.ɵɵproperty("value", model_r9.ID);
203
228
  i0.ɵɵadvance();
204
- i0.ɵɵtextInterpolate(db_r9.Name);
229
+ i0.ɵɵtextInterpolate(model_r9.Name);
205
230
  } }
206
- function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_For_4_Template(rf, ctx) { if (rf & 1) {
207
- i0.ɵɵelementStart(0, "option", 70);
231
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_For_40_Template(rf, ctx) { if (rf & 1) {
232
+ i0.ɵɵelementStart(0, "option", 77);
208
233
  i0.ɵɵtext(1);
209
234
  i0.ɵɵelementEnd();
210
235
  } if (rf & 2) {
211
- const idx_r11 = ctx.$implicit;
212
- i0.ɵɵproperty("value", idx_r11.ID);
236
+ const db_r10 = ctx.$implicit;
237
+ i0.ɵɵproperty("value", db_r10.ID);
213
238
  i0.ɵɵadvance();
214
- i0.ɵɵtextInterpolate(idx_r11.Name);
239
+ i0.ɵɵtextInterpolate(db_r10.Name);
215
240
  } }
216
- function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_Template(rf, ctx) { if (rf & 1) {
217
- const _r10 = i0.ɵɵgetCurrentView();
218
- i0.ɵɵelementStart(0, "select", 69);
219
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocVectorIndexID, $event) || (ctx_r2.EditDocVectorIndexID = $event); return i0.ɵɵresetView($event); });
220
- i0.ɵɵelementStart(1, "option", 77);
241
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_44_For_4_Template(rf, ctx) { if (rf & 1) {
242
+ i0.ɵɵelementStart(0, "option", 77);
243
+ i0.ɵɵtext(1);
244
+ i0.ɵɵelementEnd();
245
+ } if (rf & 2) {
246
+ const idx_r12 = ctx.$implicit;
247
+ i0.ɵɵproperty("value", idx_r12.ID);
248
+ i0.ɵɵadvance();
249
+ i0.ɵɵtextInterpolate(idx_r12.Name);
250
+ } }
251
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_44_Template(rf, ctx) { if (rf & 1) {
252
+ const _r11 = i0.ɵɵgetCurrentView();
253
+ i0.ɵɵelementStart(0, "select", 76);
254
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_44_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocVectorIndexID, $event) || (ctx_r2.EditDocVectorIndexID = $event); return i0.ɵɵresetView($event); });
255
+ i0.ɵɵelementStart(1, "option", 86);
221
256
  i0.ɵɵtext(2, "Auto (create/find matching index)");
222
257
  i0.ɵɵelementEnd();
223
- i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_For_4_Template, 2, 2, "option", 70, _forTrack2);
258
+ i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_44_For_4_Template, 2, 2, "option", 77, _forTrack2);
224
259
  i0.ɵɵelementEnd();
225
260
  } if (rf & 2) {
226
261
  const ctx_r2 = i0.ɵɵnextContext(3);
@@ -228,94 +263,113 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditio
228
263
  i0.ɵɵadvance(3);
229
264
  i0.ɵɵrepeater(ctx_r2.EditFilteredIndexes);
230
265
  } }
231
- function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_35_Template(rf, ctx) { if (rf & 1) {
232
- i0.ɵɵelementStart(0, "span", 72);
266
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_45_Template(rf, ctx) { if (rf & 1) {
267
+ i0.ɵɵelementStart(0, "span", 79);
233
268
  i0.ɵɵtext(1, " No indexes for this database \u2014 one will be created automatically on sync ");
234
269
  i0.ɵɵelementEnd();
235
270
  } }
236
- function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_45_Template(rf, ctx) { if (rf & 1) {
237
- i0.ɵɵelement(0, "mj-loading", 76);
271
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_55_Template(rf, ctx) { if (rf & 1) {
272
+ i0.ɵɵelement(0, "mj-loading", 83);
238
273
  } }
239
- function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_46_Template(rf, ctx) { if (rf & 1) {
240
- const _r12 = i0.ɵɵgetCurrentView();
241
- i0.ɵɵelementStart(0, "button", 78);
242
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_46_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SaveEditedDocument()); });
243
- i0.ɵɵelement(1, "i", 79);
274
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_56_Template(rf, ctx) { if (rf & 1) {
275
+ const _r13 = i0.ɵɵgetCurrentView();
276
+ i0.ɵɵelementStart(0, "button", 87);
277
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_56_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SaveEditedDocument()); });
278
+ i0.ɵɵelement(1, "i", 88);
244
279
  i0.ɵɵtext(2, " Save Changes ");
245
280
  i0.ɵɵelementEnd();
246
- i0.ɵɵelementStart(3, "button", 80);
247
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_46_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.DeleteEntityDocument()); });
248
- i0.ɵɵelement(4, "i", 81);
281
+ i0.ɵɵelementStart(3, "button", 89);
282
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_56_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.DeleteEntityDocument()); });
283
+ i0.ɵɵelement(4, "i", 90);
249
284
  i0.ɵɵtext(5, " Delete ");
250
285
  i0.ɵɵelementEnd();
251
- i0.ɵɵelementStart(6, "button", 82);
252
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_46_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.CloseEditPanel()); });
286
+ i0.ɵɵelementStart(6, "button", 91);
287
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_56_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.CloseEditPanel()); });
253
288
  i0.ɵɵtext(7, " Cancel ");
254
289
  i0.ɵɵelementEnd();
255
290
  } }
256
291
  function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template(rf, ctx) { if (rf & 1) {
257
292
  const _r7 = i0.ɵɵgetCurrentView();
258
- i0.ɵɵelementStart(0, "div", 57);
293
+ i0.ɵɵelementStart(0, "div", 60);
259
294
  i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseEditPanel()); });
260
- i0.ɵɵelementStart(1, "div", 58);
295
+ i0.ɵɵelementStart(1, "div", 61);
261
296
  i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r7); return i0.ɵɵresetView($event.stopPropagation()); });
262
- i0.ɵɵelementStart(2, "div", 59)(3, "h3", 60);
263
- i0.ɵɵelement(4, "i", 54);
297
+ i0.ɵɵelementStart(2, "div", 62)(3, "h3", 63);
298
+ i0.ɵɵelement(4, "i", 57);
264
299
  i0.ɵɵtext(5, " Edit Entity Document ");
265
300
  i0.ɵɵelementEnd();
266
- i0.ɵɵelementStart(6, "button", 61);
301
+ i0.ɵɵelementStart(6, "button", 64);
267
302
  i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseEditPanel()); });
268
- i0.ɵɵelement(7, "i", 62);
303
+ i0.ɵɵelement(7, "i", 65);
269
304
  i0.ɵɵelementEnd()();
270
- i0.ɵɵelementStart(8, "div", 63)(9, "div", 64)(10, "div", 65)(11, "label", 66);
305
+ i0.ɵɵelementStart(8, "div", 66)(9, "div", 67)(10, "div", 68)(11, "label", 69);
271
306
  i0.ɵɵtext(12, "Entity");
272
307
  i0.ɵɵelementEnd();
273
- i0.ɵɵelementStart(13, "span", 67);
308
+ i0.ɵɵelementStart(13, "span", 70);
274
309
  i0.ɵɵtext(14);
275
310
  i0.ɵɵelementEnd()();
276
- i0.ɵɵelementStart(15, "div", 65)(16, "label", 66);
277
- i0.ɵɵtext(17, "Document Name");
311
+ i0.ɵɵelementStart(15, "div", 68)(16, "div", 71)(17, "label", 69);
312
+ i0.ɵɵtext(18, "Template");
278
313
  i0.ɵɵelementEnd();
279
- i0.ɵɵelementStart(18, "input", 68);
280
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_input_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocName, $event) || (ctx_r2.EditDocName = $event); return i0.ɵɵresetView($event); });
314
+ i0.ɵɵelementStart(19, "button", 72);
315
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_button_click_19_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.RegenerateTemplate()); });
316
+ i0.ɵɵconditionalCreate(20, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_20_Template, 2, 0)(21, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_21_Template, 2, 0);
281
317
  i0.ɵɵelementEnd()();
282
- i0.ɵɵelementStart(19, "div", 65)(20, "label", 66);
283
- i0.ɵɵtext(21, "Embedding Model");
318
+ i0.ɵɵelementStart(22, "div", 73)(23, "mj-code-editor", 74);
319
+ i0.ɵɵlistener("change", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_mj_code_editor_change_23_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnEditTemplateChange($event)); });
320
+ i0.ɵɵelementEnd()()();
321
+ i0.ɵɵconditionalCreate(24, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_24_Template, 6, 0, "div", 68);
322
+ i0.ɵɵelementStart(25, "div", 68)(26, "label", 69);
323
+ i0.ɵɵtext(27, "Document Name");
284
324
  i0.ɵɵelementEnd();
285
- i0.ɵɵelementStart(22, "select", 69);
286
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_select_ngModelChange_22_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocAIModelID, $event) || (ctx_r2.EditDocAIModelID = $event); return i0.ɵɵresetView($event); });
287
- i0.ɵɵrepeaterCreate(23, VectorManagementResourceComponent_Conditional_1_Conditional_55_For_24_Template, 2, 2, "option", 70, _forTrack2);
325
+ i0.ɵɵelementStart(28, "input", 75);
326
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_input_ngModelChange_28_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocName, $event) || (ctx_r2.EditDocName = $event); return i0.ɵɵresetView($event); });
288
327
  i0.ɵɵelementEnd()();
289
- i0.ɵɵelementStart(25, "div", 65)(26, "label", 66);
290
- i0.ɵɵtext(27, "Vector Database");
328
+ i0.ɵɵelementStart(29, "div", 68)(30, "label", 69);
329
+ i0.ɵɵtext(31, "Embedding Model");
291
330
  i0.ɵɵelementEnd();
292
- i0.ɵɵelementStart(28, "select", 69);
293
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_select_ngModelChange_28_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocVectorDBID, $event) || (ctx_r2.EditDocVectorDBID = $event); return i0.ɵɵresetView($event); });
294
- i0.ɵɵrepeaterCreate(29, VectorManagementResourceComponent_Conditional_1_Conditional_55_For_30_Template, 2, 2, "option", 70, _forTrack2);
331
+ i0.ɵɵelementStart(32, "select", 76);
332
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_select_ngModelChange_32_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocAIModelID, $event) || (ctx_r2.EditDocAIModelID = $event); return i0.ɵɵresetView($event); });
333
+ i0.ɵɵrepeaterCreate(33, VectorManagementResourceComponent_Conditional_1_Conditional_55_For_34_Template, 2, 2, "option", 77, _forTrack2);
295
334
  i0.ɵɵelementEnd()();
296
- i0.ɵɵelementStart(31, "div", 65)(32, "label", 66);
297
- i0.ɵɵtext(33, "Vector Index");
335
+ i0.ɵɵelementStart(35, "div", 68)(36, "label", 69);
336
+ i0.ɵɵtext(37, "Vector Database");
298
337
  i0.ɵɵelementEnd();
299
- i0.ɵɵconditionalCreate(34, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_Template, 5, 1, "select", 71)(35, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_35_Template, 2, 0, "span", 72);
338
+ i0.ɵɵelementStart(38, "select", 76);
339
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_select_ngModelChange_38_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocVectorDBID, $event) || (ctx_r2.EditDocVectorDBID = $event); return i0.ɵɵresetView($event); });
340
+ i0.ɵɵrepeaterCreate(39, VectorManagementResourceComponent_Conditional_1_Conditional_55_For_40_Template, 2, 2, "option", 77, _forTrack2);
341
+ i0.ɵɵelementEnd()();
342
+ i0.ɵɵelementStart(41, "div", 68)(42, "label", 69);
343
+ i0.ɵɵtext(43, "Vector Index");
344
+ i0.ɵɵelementEnd();
345
+ i0.ɵɵconditionalCreate(44, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_44_Template, 5, 1, "select", 78)(45, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_45_Template, 2, 0, "span", 79);
300
346
  i0.ɵɵelementEnd();
301
- i0.ɵɵelementStart(36, "div", 65)(37, "label", 66);
302
- i0.ɵɵtext(38, "Status");
347
+ i0.ɵɵelementStart(46, "div", 68)(47, "label", 69);
348
+ i0.ɵɵtext(48, "Status");
303
349
  i0.ɵɵelementEnd();
304
- i0.ɵɵelementStart(39, "select", 69);
305
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_select_ngModelChange_39_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocStatus, $event) || (ctx_r2.EditDocStatus = $event); return i0.ɵɵresetView($event); });
306
- i0.ɵɵelementStart(40, "option", 73);
307
- i0.ɵɵtext(41, "Active");
350
+ i0.ɵɵelementStart(49, "select", 76);
351
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_select_ngModelChange_49_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocStatus, $event) || (ctx_r2.EditDocStatus = $event); return i0.ɵɵresetView($event); });
352
+ i0.ɵɵelementStart(50, "option", 80);
353
+ i0.ɵɵtext(51, "Active");
308
354
  i0.ɵɵelementEnd();
309
- i0.ɵɵelementStart(42, "option", 74);
310
- i0.ɵɵtext(43, "Inactive");
355
+ i0.ɵɵelementStart(52, "option", 81);
356
+ i0.ɵɵtext(53, "Inactive");
311
357
  i0.ɵɵelementEnd()()();
312
- i0.ɵɵelementStart(44, "div", 75);
313
- i0.ɵɵconditionalCreate(45, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_45_Template, 1, 0, "mj-loading", 76)(46, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_46_Template, 8, 0);
358
+ i0.ɵɵelementStart(54, "div", 82);
359
+ i0.ɵɵconditionalCreate(55, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_55_Template, 1, 0, "mj-loading", 83)(56, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_56_Template, 8, 0);
314
360
  i0.ɵɵelementEnd()()()()();
315
361
  } if (rf & 2) {
316
362
  const ctx_r2 = i0.ɵɵnextContext(2);
317
363
  i0.ɵɵadvance(14);
318
364
  i0.ɵɵtextInterpolate(ctx_r2.EditDocEntityName);
365
+ i0.ɵɵadvance(5);
366
+ i0.ɵɵproperty("disabled", ctx_r2.IsEditRegenerating);
367
+ i0.ɵɵadvance();
368
+ i0.ɵɵconditional(ctx_r2.IsEditRegenerating ? 20 : 21);
369
+ i0.ɵɵadvance(3);
370
+ i0.ɵɵproperty("value", ctx_r2.EditDocTemplate)("readonly", false)("lineWrapping", true);
371
+ i0.ɵɵadvance();
372
+ i0.ɵɵconditional(ctx_r2.EditDocSelectedFields.length > 0 ? 24 : -1);
319
373
  i0.ɵɵadvance(4);
320
374
  i0.ɵɵtwoWayProperty("ngModel", ctx_r2.EditDocName);
321
375
  i0.ɵɵadvance(4);
@@ -327,15 +381,113 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template
327
381
  i0.ɵɵadvance();
328
382
  i0.ɵɵrepeater(ctx_r2.vectorDatabases);
329
383
  i0.ɵɵadvance(5);
330
- i0.ɵɵconditional(ctx_r2.EditFilteredIndexes.length > 0 ? 34 : 35);
384
+ i0.ɵɵconditional(ctx_r2.EditFilteredIndexes.length > 0 ? 44 : 45);
331
385
  i0.ɵɵadvance(5);
332
386
  i0.ɵɵtwoWayProperty("ngModel", ctx_r2.EditDocStatus);
333
387
  i0.ɵɵadvance(6);
334
- i0.ɵɵconditional(ctx_r2.IsEditSaving || ctx_r2.IsEditDeleting ? 45 : 46);
388
+ i0.ɵɵconditional(ctx_r2.IsEditSaving || ctx_r2.IsEditDeleting ? 55 : 56);
389
+ } }
390
+ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_32_Template(rf, ctx) { if (rf & 1) {
391
+ i0.ɵɵelement(0, "mj-loading", 83);
392
+ } }
393
+ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template(rf, ctx) { if (rf & 1) {
394
+ const _r15 = i0.ɵɵgetCurrentView();
395
+ i0.ɵɵelementStart(0, "button", 87);
396
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SaveScheduleSync()); });
397
+ i0.ɵɵelement(1, "i", 98);
398
+ i0.ɵɵtext(2, " Create Schedule ");
399
+ i0.ɵɵelementEnd();
400
+ i0.ɵɵelementStart(3, "button", 91);
401
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.CloseScheduleSyncDialog()); });
402
+ i0.ɵɵtext(4, " Cancel ");
403
+ i0.ɵɵelementEnd();
335
404
  } }
336
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
337
- i0.ɵɵelement(0, "i", 96);
338
- i0.ɵɵelementStart(1, "span", 97);
405
+ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template(rf, ctx) { if (rf & 1) {
406
+ const _r14 = i0.ɵɵgetCurrentView();
407
+ i0.ɵɵelementStart(0, "div", 60);
408
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseScheduleSyncDialog()); });
409
+ i0.ɵɵelementStart(1, "div", 92);
410
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r14); return i0.ɵɵresetView($event.stopPropagation()); });
411
+ i0.ɵɵelementStart(2, "div", 62)(3, "h3", 63);
412
+ i0.ɵɵelement(4, "i", 55);
413
+ i0.ɵɵtext(5, " Schedule Vector Sync ");
414
+ i0.ɵɵelementEnd();
415
+ i0.ɵɵelementStart(6, "button", 64);
416
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseScheduleSyncDialog()); });
417
+ i0.ɵɵelement(7, "i", 65);
418
+ i0.ɵɵelementEnd()();
419
+ i0.ɵɵelementStart(8, "div", 66)(9, "div", 67)(10, "div", 68)(11, "label", 69);
420
+ i0.ɵɵtext(12, "Entity Document");
421
+ i0.ɵɵelementEnd();
422
+ i0.ɵɵelementStart(13, "span", 70);
423
+ i0.ɵɵtext(14);
424
+ i0.ɵɵelementEnd()();
425
+ i0.ɵɵelementStart(15, "div", 68)(16, "label", 69);
426
+ i0.ɵɵtext(17, "Action");
427
+ i0.ɵɵelementEnd();
428
+ i0.ɵɵelementStart(18, "span", 70);
429
+ i0.ɵɵtext(19, "__VectorizeEntity");
430
+ i0.ɵɵelementEnd()();
431
+ i0.ɵɵelementStart(20, "div", 68)(21, "label", 69);
432
+ i0.ɵɵtext(22, "Cron Expression");
433
+ i0.ɵɵelementEnd();
434
+ i0.ɵɵelementStart(23, "input", 93);
435
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_input_ngModelChange_23_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.ScheduleSyncCron, $event) || (ctx_r2.ScheduleSyncCron = $event); return i0.ɵɵresetView($event); });
436
+ i0.ɵɵelementEnd();
437
+ i0.ɵɵelementStart(24, "div", 94);
438
+ i0.ɵɵelement(25, "i", 95);
439
+ i0.ɵɵtext(26);
440
+ i0.ɵɵelementEnd()();
441
+ i0.ɵɵelementStart(27, "div", 96)(28, "label", 69);
442
+ i0.ɵɵtext(29, "Enabled");
443
+ i0.ɵɵelementEnd();
444
+ i0.ɵɵelementStart(30, "input", 97);
445
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_input_ngModelChange_30_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.ScheduleSyncEnabled, $event) || (ctx_r2.ScheduleSyncEnabled = $event); return i0.ɵɵresetView($event); });
446
+ i0.ɵɵelementEnd()();
447
+ i0.ɵɵelementStart(31, "div", 82);
448
+ i0.ɵɵconditionalCreate(32, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_32_Template, 1, 0, "mj-loading", 83)(33, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template, 5, 0);
449
+ i0.ɵɵelementEnd()()()()();
450
+ } if (rf & 2) {
451
+ const ctx_r2 = i0.ɵɵnextContext(2);
452
+ i0.ɵɵadvance(14);
453
+ i0.ɵɵtextInterpolate(ctx_r2.ScheduleSyncDocName);
454
+ i0.ɵɵadvance(9);
455
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r2.ScheduleSyncCron);
456
+ i0.ɵɵadvance(3);
457
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.GetScheduleCronPreview(ctx_r2.ScheduleSyncCron), " ");
458
+ i0.ɵɵadvance(4);
459
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r2.ScheduleSyncEnabled);
460
+ i0.ɵɵadvance(2);
461
+ i0.ɵɵconditional(ctx_r2.ScheduleSyncSaving ? 32 : 33);
462
+ } }
463
+ function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template(rf, ctx) { if (rf & 1) {
464
+ const _r16 = i0.ɵɵgetCurrentView();
465
+ i0.ɵɵelementStart(0, "div", 60);
466
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseNoIndexWarning()); });
467
+ i0.ɵɵelementStart(1, "div", 99);
468
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r16); return i0.ɵɵresetView($event.stopPropagation()); });
469
+ i0.ɵɵelementStart(2, "div", 100);
470
+ i0.ɵɵelement(3, "i", 101);
471
+ i0.ɵɵelementEnd();
472
+ i0.ɵɵelementStart(4, "h3", 102);
473
+ i0.ɵɵtext(5, "Vector Index Required");
474
+ i0.ɵɵelementEnd();
475
+ i0.ɵɵelementStart(6, "p", 103);
476
+ i0.ɵɵtext(7, " You need to create at least one vector database and index before creating entity documents. Go to the Configuration section to set up a vector database and create an index. ");
477
+ i0.ɵɵelementEnd();
478
+ i0.ɵɵelementStart(8, "div", 104)(9, "button", 87);
479
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.GoToConfiguration()); });
480
+ i0.ɵɵelement(10, "i", 105);
481
+ i0.ɵɵtext(11, " Go to Configuration ");
482
+ i0.ɵɵelementEnd();
483
+ i0.ɵɵelementStart(12, "button", 91);
484
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseNoIndexWarning()); });
485
+ i0.ɵɵtext(13, " Close ");
486
+ i0.ɵɵelementEnd()()()();
487
+ } }
488
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
489
+ i0.ɵɵelement(0, "i", 119);
490
+ i0.ɵɵelementStart(1, "span", 120);
339
491
  i0.ɵɵtext(2);
340
492
  i0.ɵɵelementEnd();
341
493
  } if (rf & 2) {
@@ -343,42 +495,42 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
343
495
  i0.ɵɵadvance(2);
344
496
  i0.ɵɵtextInterpolate(ctx_r2.SuggestEntityName);
345
497
  } }
346
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
347
- i0.ɵɵelement(0, "i", 98);
348
- i0.ɵɵelementStart(1, "span", 99);
498
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
499
+ i0.ɵɵelement(0, "i", 121);
500
+ i0.ɵɵelementStart(1, "span", 122);
349
501
  i0.ɵɵtext(2, "Search and select an entity...");
350
502
  i0.ɵɵelementEnd();
351
503
  } }
352
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Conditional_9_For_6_For_5_Template(rf, ctx) { if (rf & 1) {
353
- const _r16 = i0.ɵɵgetCurrentView();
354
- i0.ɵɵelementStart(0, "button", 108);
355
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Conditional_9_For_6_For_5_Template_button_click_0_listener() { const entity_r17 = i0.ɵɵrestoreView(_r16).$implicit; const ctx_r2 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r2.SelectEntity(entity_r17.Name)); });
356
- i0.ɵɵelement(1, "i", 96);
504
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_For_7_For_5_Template(rf, ctx) { if (rf & 1) {
505
+ const _r20 = i0.ɵɵgetCurrentView();
506
+ i0.ɵɵelementStart(0, "button", 132);
507
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_For_7_For_5_Template_button_click_0_listener() { const entity_r21 = i0.ɵɵrestoreView(_r20).$implicit; const ctx_r2 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r2.SelectEntity(entity_r21.Name)); });
508
+ i0.ɵɵelement(1, "i", 119);
357
509
  i0.ɵɵtext(2);
358
510
  i0.ɵɵelementEnd();
359
511
  } if (rf & 2) {
360
- const entity_r17 = ctx.$implicit;
512
+ const entity_r21 = ctx.$implicit;
361
513
  const ctx_r2 = i0.ɵɵnextContext(6);
362
- i0.ɵɵclassProp("entity-picker-item-selected", entity_r17.Name === ctx_r2.SuggestEntityName);
514
+ i0.ɵɵclassProp("entity-picker-item-selected", entity_r21.Name === ctx_r2.SuggestEntityName)("entity-picker-item-focused", (ctx_r2.FlatFilteredEntities[ctx_r2.SelectedEntityIndex] == null ? null : ctx_r2.FlatFilteredEntities[ctx_r2.SelectedEntityIndex].ID) === entity_r21.ID);
363
515
  i0.ɵɵadvance(2);
364
- i0.ɵɵtextInterpolate1(" ", entity_r17.Name, " ");
516
+ i0.ɵɵtextInterpolate1(" ", entity_r21.Name, " ");
365
517
  } }
366
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Conditional_9_For_6_Template(rf, ctx) { if (rf & 1) {
367
- i0.ɵɵelementStart(0, "div", 103)(1, "div", 105);
368
- i0.ɵɵelement(2, "i", 106);
518
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_For_7_Template(rf, ctx) { if (rf & 1) {
519
+ i0.ɵɵelementStart(0, "div", 127)(1, "div", 129);
520
+ i0.ɵɵelement(2, "i", 130);
369
521
  i0.ɵɵtext(3);
370
522
  i0.ɵɵelementEnd();
371
- i0.ɵɵrepeaterCreate(4, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Conditional_9_For_6_For_5_Template, 3, 3, "button", 107, _forTrack2);
523
+ i0.ɵɵrepeaterCreate(4, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_For_7_For_5_Template, 3, 5, "button", 131, _forTrack2);
372
524
  i0.ɵɵelementEnd();
373
525
  } if (rf & 2) {
374
- const group_r18 = ctx.$implicit;
526
+ const group_r22 = ctx.$implicit;
375
527
  i0.ɵɵadvance(3);
376
- i0.ɵɵtextInterpolate1(" ", group_r18.SchemaName, " ");
528
+ i0.ɵɵtextInterpolate1(" ", group_r22.SchemaName, " ");
377
529
  i0.ɵɵadvance();
378
- i0.ɵɵrepeater(group_r18.Entities);
530
+ i0.ɵɵrepeater(group_r22.Entities);
379
531
  } }
380
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Conditional_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
381
- i0.ɵɵelementStart(0, "div", 104);
532
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Conditional_8_Template(rf, ctx) { if (rf & 1) {
533
+ i0.ɵɵelementStart(0, "div", 128);
382
534
  i0.ɵɵtext(1);
383
535
  i0.ɵɵelementEnd();
384
536
  } if (rf & 2) {
@@ -386,38 +538,40 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
386
538
  i0.ɵɵadvance();
387
539
  i0.ɵɵtextInterpolate1(" No entities matching \"", ctx_r2.EntitySearchText, "\" ");
388
540
  } }
389
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Conditional_9_Template(rf, ctx) { if (rf & 1) {
390
- const _r15 = i0.ɵɵgetCurrentView();
391
- i0.ɵɵelementStart(0, "div", 88)(1, "div", 100);
392
- i0.ɵɵelement(2, "i", 98);
393
- i0.ɵɵelementStart(3, "input", 101);
394
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Conditional_9_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r2.EntitySearchText, $event) || (ctx_r2.EntitySearchText = $event); return i0.ɵɵresetView($event); });
395
- i0.ɵɵlistener("input", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Conditional_9_Template_input_input_3_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.FilterEntities()); });
541
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Template(rf, ctx) { if (rf & 1) {
542
+ const _r19 = i0.ɵɵgetCurrentView();
543
+ i0.ɵɵelementStart(0, "div", 123);
544
+ i0.ɵɵlistener("mousedown", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Template_div_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r19); return i0.ɵɵresetView($event.stopPropagation()); });
545
+ i0.ɵɵelementStart(1, "div", 124);
546
+ i0.ɵɵelement(2, "i", 121);
547
+ i0.ɵɵelementStart(3, "input", 125, 0);
548
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r2.EntitySearchText, $event) || (ctx_r2.EntitySearchText = $event); return i0.ɵɵresetView($event); });
549
+ i0.ɵɵlistener("input", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Template_input_input_3_listener() { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.FilterEntities()); })("keydown", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Template_input_keydown_3_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.OnEntityPickerKeyDown($event)); });
396
550
  i0.ɵɵelementEnd()();
397
- i0.ɵɵelementStart(4, "div", 102);
398
- i0.ɵɵrepeaterCreate(5, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Conditional_9_For_6_Template, 6, 1, "div", 103, _forTrack3);
399
- i0.ɵɵconditionalCreate(7, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Conditional_9_Conditional_7_Template, 2, 1, "div", 104);
551
+ i0.ɵɵelementStart(5, "div", 126);
552
+ i0.ɵɵrepeaterCreate(6, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_For_7_Template, 6, 1, "div", 127, _forTrack3);
553
+ i0.ɵɵconditionalCreate(8, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Conditional_8_Template, 2, 1, "div", 128);
400
554
  i0.ɵɵelementEnd()();
401
555
  } if (rf & 2) {
402
556
  const ctx_r2 = i0.ɵɵnextContext(4);
403
557
  i0.ɵɵadvance(3);
404
558
  i0.ɵɵtwoWayProperty("ngModel", ctx_r2.EntitySearchText);
405
- i0.ɵɵadvance(2);
559
+ i0.ɵɵadvance(3);
406
560
  i0.ɵɵrepeater(ctx_r2.FilteredEntityGroups);
407
561
  i0.ɵɵadvance(2);
408
- i0.ɵɵconditional(ctx_r2.FilteredEntityGroups.length === 0 ? 7 : -1);
562
+ i0.ɵɵconditional(ctx_r2.FilteredEntityGroups.length === 0 ? 8 : -1);
409
563
  } }
410
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Conditional_24_Template(rf, ctx) { if (rf & 1) {
411
- i0.ɵɵelement(0, "i", 55);
564
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_24_Template(rf, ctx) { if (rf & 1) {
565
+ i0.ɵɵelement(0, "i", 58);
412
566
  i0.ɵɵtext(1, " Generating with AI... ");
413
567
  } }
414
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Conditional_25_Template(rf, ctx) { if (rf & 1) {
415
- i0.ɵɵelement(0, "i", 13);
568
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_25_Template(rf, ctx) { if (rf & 1) {
569
+ i0.ɵɵelement(0, "i", 14);
416
570
  i0.ɵɵtext(1, " Generate Template ");
417
571
  } }
418
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Conditional_26_Template(rf, ctx) { if (rf & 1) {
419
- i0.ɵɵelementStart(0, "div", 95);
420
- i0.ɵɵelement(1, "i", 109);
572
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_26_Template(rf, ctx) { if (rf & 1) {
573
+ i0.ɵɵelementStart(0, "div", 118);
574
+ i0.ɵɵelement(1, "i", 133);
421
575
  i0.ɵɵtext(2);
422
576
  i0.ɵɵelementEnd();
423
577
  } if (rf & 2) {
@@ -425,41 +579,41 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
425
579
  i0.ɵɵadvance(2);
426
580
  i0.ɵɵtextInterpolate1(" ", ctx_r2.SuggestionError, " ");
427
581
  } }
428
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Template(rf, ctx) { if (rf & 1) {
429
- const _r14 = i0.ɵɵgetCurrentView();
430
- i0.ɵɵelementStart(0, "div", 64)(1, "div", 65)(2, "label", 66);
582
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Template(rf, ctx) { if (rf & 1) {
583
+ const _r18 = i0.ɵɵgetCurrentView();
584
+ i0.ɵɵelementStart(0, "div", 67)(1, "div", 68)(2, "label", 69);
431
585
  i0.ɵɵtext(3, "Entity");
432
586
  i0.ɵɵelementEnd();
433
- i0.ɵɵelementStart(4, "div", 85)(5, "button", 86);
434
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.ToggleEntityPicker()); });
435
- i0.ɵɵconditionalCreate(6, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Conditional_6_Template, 3, 1)(7, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Conditional_7_Template, 3, 0);
436
- i0.ɵɵelement(8, "i", 87);
587
+ i0.ɵɵelementStart(4, "div", 108)(5, "button", 109);
588
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.ToggleEntityPicker()); });
589
+ i0.ɵɵconditionalCreate(6, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_6_Template, 3, 1)(7, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_7_Template, 3, 0);
590
+ i0.ɵɵelement(8, "i", 110);
437
591
  i0.ɵɵelementEnd();
438
- i0.ɵɵconditionalCreate(9, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Conditional_9_Template, 8, 2, "div", 88);
592
+ i0.ɵɵconditionalCreate(9, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Template, 9, 2, "div", 111);
439
593
  i0.ɵɵelementEnd()();
440
- i0.ɵɵelementStart(10, "div", 65)(11, "label", 66);
594
+ i0.ɵɵelementStart(10, "div", 68)(11, "label", 69);
441
595
  i0.ɵɵtext(12, "Use Case");
442
596
  i0.ɵɵelementEnd();
443
- i0.ɵɵelementStart(13, "div", 89)(14, "button", 90);
444
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SuggestUseCase = "duplicate detection"); });
445
- i0.ɵɵelement(15, "i", 91);
597
+ i0.ɵɵelementStart(13, "div", 112)(14, "button", 113);
598
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SuggestUseCase = "duplicate detection"); });
599
+ i0.ɵɵelement(15, "i", 114);
446
600
  i0.ɵɵtext(16, " Duplicate Detection ");
447
601
  i0.ɵɵelementEnd();
448
- i0.ɵɵelementStart(17, "button", 90);
449
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SuggestUseCase = "search"); });
450
- i0.ɵɵelement(18, "i", 92);
602
+ i0.ɵɵelementStart(17, "button", 113);
603
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SuggestUseCase = "search"); });
604
+ i0.ɵɵelement(18, "i", 115);
451
605
  i0.ɵɵtext(19, " Search ");
452
606
  i0.ɵɵelementEnd();
453
- i0.ɵɵelementStart(20, "button", 90);
454
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Template_button_click_20_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SuggestUseCase = "classification"); });
455
- i0.ɵɵelement(21, "i", 93);
607
+ i0.ɵɵelementStart(20, "button", 113);
608
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Template_button_click_20_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SuggestUseCase = "classification"); });
609
+ i0.ɵɵelement(21, "i", 116);
456
610
  i0.ɵɵtext(22, " Classification ");
457
611
  i0.ɵɵelementEnd()()();
458
- i0.ɵɵelementStart(23, "button", 94);
459
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Template_button_click_23_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.RunSuggestion()); });
460
- i0.ɵɵconditionalCreate(24, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Conditional_24_Template, 2, 0)(25, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Conditional_25_Template, 2, 0);
612
+ i0.ɵɵelementStart(23, "button", 117);
613
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Template_button_click_23_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.RunSuggestion()); });
614
+ i0.ɵɵconditionalCreate(24, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_24_Template, 2, 0)(25, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_25_Template, 2, 0);
461
615
  i0.ɵɵelementEnd();
462
- i0.ɵɵconditionalCreate(26, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Conditional_26_Template, 3, 1, "div", 95);
616
+ i0.ɵɵconditionalCreate(26, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_26_Template, 3, 1, "div", 118);
463
617
  i0.ɵɵelementEnd();
464
618
  } if (rf & 2) {
465
619
  const ctx_r2 = i0.ɵɵnextContext(3);
@@ -480,78 +634,78 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
480
634
  i0.ɵɵadvance(2);
481
635
  i0.ɵɵconditional(ctx_r2.SuggestionError ? 26 : -1);
482
636
  } }
483
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_For_11_Template(rf, ctx) { if (rf & 1) {
484
- i0.ɵɵelementStart(0, "span", 115);
637
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_For_11_Template(rf, ctx) { if (rf & 1) {
638
+ i0.ɵɵelementStart(0, "span", 85);
485
639
  i0.ɵɵtext(1);
486
640
  i0.ɵɵelementEnd();
487
641
  } if (rf & 2) {
488
- const field_r20 = ctx.$implicit;
642
+ const field_r24 = ctx.$implicit;
489
643
  i0.ɵɵadvance();
490
- i0.ɵɵtextInterpolate(field_r20);
644
+ i0.ɵɵtextInterpolate(field_r24);
491
645
  } }
492
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Conditional_12_For_4_Template(rf, ctx) { if (rf & 1) {
493
- i0.ɵɵelementStart(0, "div", 124)(1, "span", 125);
646
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_12_For_4_Template(rf, ctx) { if (rf & 1) {
647
+ i0.ɵɵelementStart(0, "div", 144)(1, "span", 145);
494
648
  i0.ɵɵtext(2);
495
649
  i0.ɵɵelementEnd();
496
- i0.ɵɵelementStart(3, "span", 126);
650
+ i0.ɵɵelementStart(3, "span", 146);
497
651
  i0.ɵɵtext(4);
498
652
  i0.ɵɵelementEnd()();
499
653
  } if (rf & 2) {
500
- const rel_r21 = ctx.$implicit;
654
+ const rel_r25 = ctx.$implicit;
501
655
  i0.ɵɵadvance(2);
502
- i0.ɵɵtextInterpolate(rel_r21.name);
656
+ i0.ɵɵtextInterpolate(rel_r25.name);
503
657
  i0.ɵɵadvance(2);
504
- i0.ɵɵtextInterpolate(rel_r21.fields.join(", "));
658
+ i0.ɵɵtextInterpolate(rel_r25.fields.join(", "));
505
659
  } }
506
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Conditional_12_Template(rf, ctx) { if (rf & 1) {
507
- i0.ɵɵelementStart(0, "div", 110)(1, "h4", 111);
660
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_12_Template(rf, ctx) { if (rf & 1) {
661
+ i0.ɵɵelementStart(0, "div", 134)(1, "h4", 135);
508
662
  i0.ɵɵtext(2, "Related Entities");
509
663
  i0.ɵɵelementEnd();
510
- i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Conditional_12_For_4_Template, 5, 2, "div", 124, _forTrack4);
664
+ i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_12_For_4_Template, 5, 2, "div", 144, _forTrack4);
511
665
  i0.ɵɵelementEnd();
512
666
  } if (rf & 2) {
513
667
  const ctx_r2 = i0.ɵɵnextContext(4);
514
668
  i0.ɵɵadvance(3);
515
669
  i0.ɵɵrepeater(ctx_r2.SuggestionResult.selectedRelationships);
516
670
  } }
517
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_For_39_Template(rf, ctx) { if (rf & 1) {
518
- i0.ɵɵelementStart(0, "option", 70);
671
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_For_39_Template(rf, ctx) { if (rf & 1) {
672
+ i0.ɵɵelementStart(0, "option", 77);
519
673
  i0.ɵɵtext(1);
520
674
  i0.ɵɵelementEnd();
521
675
  } if (rf & 2) {
522
- const model_r22 = ctx.$implicit;
523
- i0.ɵɵproperty("value", model_r22.ID);
676
+ const model_r26 = ctx.$implicit;
677
+ i0.ɵɵproperty("value", model_r26.ID);
524
678
  i0.ɵɵadvance();
525
- i0.ɵɵtextInterpolate(model_r22.Name);
679
+ i0.ɵɵtextInterpolate(model_r26.Name);
526
680
  } }
527
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_For_45_Template(rf, ctx) { if (rf & 1) {
528
- i0.ɵɵelementStart(0, "option", 70);
681
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_For_45_Template(rf, ctx) { if (rf & 1) {
682
+ i0.ɵɵelementStart(0, "option", 77);
529
683
  i0.ɵɵtext(1);
530
684
  i0.ɵɵelementEnd();
531
685
  } if (rf & 2) {
532
- const db_r23 = ctx.$implicit;
533
- i0.ɵɵproperty("value", db_r23.ID);
686
+ const db_r27 = ctx.$implicit;
687
+ i0.ɵɵproperty("value", db_r27.ID);
534
688
  i0.ɵɵadvance();
535
- i0.ɵɵtextInterpolate(db_r23.Name);
689
+ i0.ɵɵtextInterpolate(db_r27.Name);
536
690
  } }
537
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Conditional_49_For_4_Template(rf, ctx) { if (rf & 1) {
538
- i0.ɵɵelementStart(0, "option", 70);
691
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_49_For_4_Template(rf, ctx) { if (rf & 1) {
692
+ i0.ɵɵelementStart(0, "option", 77);
539
693
  i0.ɵɵtext(1);
540
694
  i0.ɵɵelementEnd();
541
695
  } if (rf & 2) {
542
- const idx_r25 = ctx.$implicit;
543
- i0.ɵɵproperty("value", idx_r25.ID);
696
+ const idx_r29 = ctx.$implicit;
697
+ i0.ɵɵproperty("value", idx_r29.ID);
544
698
  i0.ɵɵadvance();
545
- i0.ɵɵtextInterpolate(idx_r25.Name);
699
+ i0.ɵɵtextInterpolate(idx_r29.Name);
546
700
  } }
547
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Conditional_49_Template(rf, ctx) { if (rf & 1) {
548
- const _r24 = i0.ɵɵgetCurrentView();
549
- i0.ɵɵelementStart(0, "select", 69);
550
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Conditional_49_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r24); const ctx_r2 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r2.SelectedVectorIndexID, $event) || (ctx_r2.SelectedVectorIndexID = $event); return i0.ɵɵresetView($event); });
551
- i0.ɵɵelementStart(1, "option", 77);
701
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_49_Template(rf, ctx) { if (rf & 1) {
702
+ const _r28 = i0.ɵɵgetCurrentView();
703
+ i0.ɵɵelementStart(0, "select", 76);
704
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_49_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r2.SelectedVectorIndexID, $event) || (ctx_r2.SelectedVectorIndexID = $event); return i0.ɵɵresetView($event); });
705
+ i0.ɵɵelementStart(1, "option", 86);
552
706
  i0.ɵɵtext(2, "Auto (create/find matching index)");
553
707
  i0.ɵɵelementEnd();
554
- i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Conditional_49_For_4_Template, 2, 2, "option", 70, _forTrack2);
708
+ i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_49_For_4_Template, 2, 2, "option", 77, _forTrack2);
555
709
  i0.ɵɵelementEnd();
556
710
  } if (rf & 2) {
557
711
  const ctx_r2 = i0.ɵɵnextContext(4);
@@ -559,93 +713,93 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
559
713
  i0.ɵɵadvance(3);
560
714
  i0.ɵɵrepeater(ctx_r2.FilteredIndexesForSelectedDB);
561
715
  } }
562
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Conditional_50_Template(rf, ctx) { if (rf & 1) {
563
- i0.ɵɵelementStart(0, "span", 72);
716
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_50_Template(rf, ctx) { if (rf & 1) {
717
+ i0.ɵɵelementStart(0, "span", 79);
564
718
  i0.ɵɵtext(1, " No indexes yet \u2014 create one in Configuration > Vector Database, or one will be created on sync ");
565
719
  i0.ɵɵelementEnd();
566
720
  } }
567
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Conditional_52_Template(rf, ctx) { if (rf & 1) {
568
- i0.ɵɵelementStart(0, "div", 123);
569
- i0.ɵɵelement(1, "mj-loading", 76);
721
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_52_Template(rf, ctx) { if (rf & 1) {
722
+ i0.ɵɵelementStart(0, "div", 143);
723
+ i0.ɵɵelement(1, "mj-loading", 83);
570
724
  i0.ɵɵelementEnd();
571
725
  } }
572
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Conditional_53_Template(rf, ctx) { if (rf & 1) {
573
- const _r26 = i0.ɵɵgetCurrentView();
574
- i0.ɵɵelementStart(0, "button", 78);
575
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Conditional_53_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r26); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.SaveAsEntityDocument()); });
576
- i0.ɵɵelement(1, "i", 127);
726
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_53_Template(rf, ctx) { if (rf & 1) {
727
+ const _r30 = i0.ɵɵgetCurrentView();
728
+ i0.ɵɵelementStart(0, "button", 87);
729
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_53_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r30); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.SaveAsEntityDocument()); });
730
+ i0.ɵɵelement(1, "i", 147);
577
731
  i0.ɵɵtext(2, " Save as Entity Document ");
578
732
  i0.ɵɵelementEnd();
579
- i0.ɵɵelementStart(3, "button", 128);
580
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Conditional_53_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r26); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.ClearSuggestion()); });
581
- i0.ɵɵelement(4, "i", 129);
733
+ i0.ɵɵelementStart(3, "button", 148);
734
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_53_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r30); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.ClearSuggestion()); });
735
+ i0.ɵɵelement(4, "i", 149);
582
736
  i0.ɵɵtext(5, " Try Again ");
583
737
  i0.ɵɵelementEnd();
584
- i0.ɵɵelementStart(6, "button", 82);
585
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Conditional_53_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r26); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.CloseSuggestDialog()); });
738
+ i0.ɵɵelementStart(6, "button", 91);
739
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_53_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r30); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.CloseSuggestDialog()); });
586
740
  i0.ɵɵtext(7, " Close ");
587
741
  i0.ɵɵelementEnd();
588
742
  } }
589
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Template(rf, ctx) { if (rf & 1) {
590
- const _r19 = i0.ɵɵgetCurrentView();
591
- i0.ɵɵelementStart(0, "div", 84)(1, "div", 110)(2, "h4", 111);
743
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Template(rf, ctx) { if (rf & 1) {
744
+ const _r23 = i0.ɵɵgetCurrentView();
745
+ i0.ɵɵelementStart(0, "div", 107)(1, "div", 134)(2, "h4", 135);
592
746
  i0.ɵɵtext(3, "Suggested Template");
593
747
  i0.ɵɵelementEnd();
594
- i0.ɵɵelementStart(4, "div", 112)(5, "mj-code-editor", 113);
595
- i0.ɵɵlistener("change", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Template_mj_code_editor_change_5_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OnTemplateChange($event)); });
748
+ i0.ɵɵelementStart(4, "div", 73)(5, "mj-code-editor", 74);
749
+ i0.ɵɵlistener("change", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Template_mj_code_editor_change_5_listener($event) { i0.ɵɵrestoreView(_r23); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OnTemplateChange($event)); });
596
750
  i0.ɵɵelementEnd()()();
597
- i0.ɵɵelementStart(6, "div", 110)(7, "h4", 111);
751
+ i0.ɵɵelementStart(6, "div", 134)(7, "h4", 135);
598
752
  i0.ɵɵtext(8, "Selected Fields");
599
753
  i0.ɵɵelementEnd();
600
- i0.ɵɵelementStart(9, "div", 114);
601
- i0.ɵɵrepeaterCreate(10, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_For_11_Template, 2, 1, "span", 115, i0.ɵɵrepeaterTrackByIdentity);
754
+ i0.ɵɵelementStart(9, "div", 84);
755
+ i0.ɵɵrepeaterCreate(10, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_For_11_Template, 2, 1, "span", 85, i0.ɵɵrepeaterTrackByIdentity);
602
756
  i0.ɵɵelementEnd()();
603
- i0.ɵɵconditionalCreate(12, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Conditional_12_Template, 5, 0, "div", 110);
604
- i0.ɵɵelementStart(13, "div", 116)(14, "div", 117)(15, "span", 118);
757
+ i0.ɵɵconditionalCreate(12, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_12_Template, 5, 0, "div", 134);
758
+ i0.ɵɵelementStart(13, "div", 136)(14, "div", 137)(15, "span", 138);
605
759
  i0.ɵɵtext(16, "Potential Match");
606
760
  i0.ɵɵelementEnd();
607
- i0.ɵɵelementStart(17, "span", 119);
761
+ i0.ɵɵelementStart(17, "span", 139);
608
762
  i0.ɵɵtext(18);
609
763
  i0.ɵɵelementEnd()();
610
- i0.ɵɵelementStart(19, "div", 117)(20, "span", 118);
764
+ i0.ɵɵelementStart(19, "div", 137)(20, "span", 138);
611
765
  i0.ɵɵtext(21, "Absolute Match");
612
766
  i0.ɵɵelementEnd();
613
- i0.ɵɵelementStart(22, "span", 119);
767
+ i0.ɵɵelementStart(22, "span", 139);
614
768
  i0.ɵɵtext(23);
615
769
  i0.ɵɵelementEnd()()();
616
- i0.ɵɵelementStart(24, "div", 110)(25, "h4", 111);
770
+ i0.ɵɵelementStart(24, "div", 134)(25, "h4", 135);
617
771
  i0.ɵɵtext(26, "Reasoning");
618
772
  i0.ɵɵelementEnd();
619
- i0.ɵɵelementStart(27, "p", 120);
773
+ i0.ɵɵelementStart(27, "p", 140);
620
774
  i0.ɵɵtext(28);
621
775
  i0.ɵɵelementEnd()();
622
- i0.ɵɵelementStart(29, "div", 110)(30, "div", 65)(31, "label", 66);
776
+ i0.ɵɵelementStart(29, "div", 134)(30, "div", 68)(31, "label", 69);
623
777
  i0.ɵɵtext(32, "Document Name");
624
778
  i0.ɵɵelementEnd();
625
- i0.ɵɵelementStart(33, "input", 68);
626
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Template_input_ngModelChange_33_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.SaveDocumentName, $event) || (ctx_r2.SaveDocumentName = $event); return i0.ɵɵresetView($event); });
779
+ i0.ɵɵelementStart(33, "input", 75);
780
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Template_input_ngModelChange_33_listener($event) { i0.ɵɵrestoreView(_r23); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.SaveDocumentName, $event) || (ctx_r2.SaveDocumentName = $event); return i0.ɵɵresetView($event); });
627
781
  i0.ɵɵelementEnd()();
628
- i0.ɵɵelementStart(34, "div", 121)(35, "label", 66);
782
+ i0.ɵɵelementStart(34, "div", 141)(35, "label", 69);
629
783
  i0.ɵɵtext(36, "Embedding Model");
630
784
  i0.ɵɵelementEnd();
631
- i0.ɵɵelementStart(37, "select", 69);
632
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Template_select_ngModelChange_37_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.SelectedEmbeddingModelID, $event) || (ctx_r2.SelectedEmbeddingModelID = $event); return i0.ɵɵresetView($event); });
633
- i0.ɵɵrepeaterCreate(38, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_For_39_Template, 2, 2, "option", 70, _forTrack2);
785
+ i0.ɵɵelementStart(37, "select", 76);
786
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Template_select_ngModelChange_37_listener($event) { i0.ɵɵrestoreView(_r23); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.SelectedEmbeddingModelID, $event) || (ctx_r2.SelectedEmbeddingModelID = $event); return i0.ɵɵresetView($event); });
787
+ i0.ɵɵrepeaterCreate(38, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_For_39_Template, 2, 2, "option", 77, _forTrack2);
634
788
  i0.ɵɵelementEnd()();
635
- i0.ɵɵelementStart(40, "div", 121)(41, "label", 66);
789
+ i0.ɵɵelementStart(40, "div", 141)(41, "label", 69);
636
790
  i0.ɵɵtext(42, "Vector Database");
637
791
  i0.ɵɵelementEnd();
638
- i0.ɵɵelementStart(43, "select", 69);
639
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Template_select_ngModelChange_43_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.SelectedVectorDBID, $event) || (ctx_r2.SelectedVectorDBID = $event); return i0.ɵɵresetView($event); });
640
- i0.ɵɵrepeaterCreate(44, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_For_45_Template, 2, 2, "option", 70, _forTrack2);
792
+ i0.ɵɵelementStart(43, "select", 76);
793
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Template_select_ngModelChange_43_listener($event) { i0.ɵɵrestoreView(_r23); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.SelectedVectorDBID, $event) || (ctx_r2.SelectedVectorDBID = $event); return i0.ɵɵresetView($event); });
794
+ i0.ɵɵrepeaterCreate(44, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_For_45_Template, 2, 2, "option", 77, _forTrack2);
641
795
  i0.ɵɵelementEnd()();
642
- i0.ɵɵelementStart(46, "div", 121)(47, "label", 66);
796
+ i0.ɵɵelementStart(46, "div", 141)(47, "label", 69);
643
797
  i0.ɵɵtext(48, "Vector Index");
644
798
  i0.ɵɵelementEnd();
645
- i0.ɵɵconditionalCreate(49, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Conditional_49_Template, 5, 1, "select", 71)(50, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Conditional_50_Template, 2, 0, "span", 72);
799
+ i0.ɵɵconditionalCreate(49, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_49_Template, 5, 1, "select", 78)(50, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_50_Template, 2, 0, "span", 79);
646
800
  i0.ɵɵelementEnd()();
647
- i0.ɵɵelementStart(51, "div", 122);
648
- i0.ɵɵconditionalCreate(52, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Conditional_52_Template, 2, 0, "div", 123)(53, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Conditional_53_Template, 8, 0);
801
+ i0.ɵɵelementStart(51, "div", 142);
802
+ i0.ɵɵconditionalCreate(52, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_52_Template, 2, 0, "div", 143)(53, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_53_Template, 8, 0);
649
803
  i0.ɵɵelementEnd()();
650
804
  } if (rf & 2) {
651
805
  const ctx_r2 = i0.ɵɵnextContext(3);
@@ -676,22 +830,22 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
676
830
  i0.ɵɵadvance(3);
677
831
  i0.ɵɵconditional(ctx_r2.IsSavingDocument ? 52 : 53);
678
832
  } }
679
- function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template(rf, ctx) { if (rf & 1) {
680
- const _r13 = i0.ɵɵgetCurrentView();
681
- i0.ɵɵelementStart(0, "div", 57);
682
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseSuggestDialog()); });
683
- i0.ɵɵelementStart(1, "div", 83);
684
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r13); return i0.ɵɵresetView($event.stopPropagation()); });
685
- i0.ɵɵelementStart(2, "div", 59)(3, "h3", 60);
686
- i0.ɵɵelement(4, "i", 13);
833
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Template(rf, ctx) { if (rf & 1) {
834
+ const _r17 = i0.ɵɵgetCurrentView();
835
+ i0.ɵɵelementStart(0, "div", 60);
836
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseSuggestDialog()); });
837
+ i0.ɵɵelementStart(1, "div", 106);
838
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r17); return i0.ɵɵresetView($event.stopPropagation()); });
839
+ i0.ɵɵelementStart(2, "div", 62)(3, "h3", 63);
840
+ i0.ɵɵelement(4, "i", 14);
687
841
  i0.ɵɵtext(5, " AI Document Suggestion ");
688
842
  i0.ɵɵelementEnd();
689
- i0.ɵɵelementStart(6, "button", 61);
690
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseSuggestDialog()); });
691
- i0.ɵɵelement(7, "i", 62);
843
+ i0.ɵɵelementStart(6, "button", 64);
844
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseSuggestDialog()); });
845
+ i0.ɵɵelement(7, "i", 65);
692
846
  i0.ɵɵelementEnd()();
693
- i0.ɵɵelementStart(8, "div", 63);
694
- i0.ɵɵconditionalCreate(9, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_9_Template, 27, 11, "div", 64)(10, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_10_Template, 54, 12, "div", 84);
847
+ i0.ɵɵelementStart(8, "div", 66);
848
+ i0.ɵɵconditionalCreate(9, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Template, 27, 11, "div", 67)(10, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Template, 54, 12, "div", 107);
695
849
  i0.ɵɵelementEnd()()();
696
850
  } if (rf & 2) {
697
851
  const ctx_r2 = i0.ɵɵnextContext(2);
@@ -702,68 +856,70 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template
702
856
  } }
703
857
  function VectorManagementResourceComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
704
858
  const _r1 = i0.ɵɵgetCurrentView();
705
- i0.ɵɵelementStart(0, "div", 2);
706
- i0.ɵɵconditionalCreate(1, VectorManagementResourceComponent_Conditional_1_Conditional_1_Template, 7, 4, "div", 3);
707
- i0.ɵɵelementStart(2, "div", 4);
708
- i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_For_4_Template, 1, 1, "app-kpi-card", 5, _forTrack0);
859
+ i0.ɵɵelementStart(0, "div", 3);
860
+ i0.ɵɵconditionalCreate(1, VectorManagementResourceComponent_Conditional_1_Conditional_1_Template, 7, 4, "div", 4);
861
+ i0.ɵɵelementStart(2, "div", 5);
862
+ i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_For_4_Template, 1, 1, "app-kpi-card", 6, _forTrack0);
709
863
  i0.ɵɵelementEnd();
710
- i0.ɵɵelementStart(5, "div", 6)(6, "div", 7)(7, "div", 8)(8, "h3", 9);
711
- i0.ɵɵelement(9, "i", 10);
864
+ i0.ɵɵelementStart(5, "div", 7)(6, "div", 8)(7, "div", 9)(8, "h3", 10);
865
+ i0.ɵɵelement(9, "i", 11);
712
866
  i0.ɵɵtext(10, " Entity Sync Status ");
713
867
  i0.ɵɵelementEnd();
714
- i0.ɵɵelementStart(11, "div", 11)(12, "button", 12);
868
+ i0.ɵɵelementStart(11, "div", 12)(12, "button", 13);
715
869
  i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OpenSuggestDialog()); });
716
- i0.ɵɵelement(13, "i", 13);
717
- i0.ɵɵelementStart(14, "span", 14);
870
+ i0.ɵɵelement(13, "i", 14);
871
+ i0.ɵɵelementStart(14, "span", 15);
718
872
  i0.ɵɵtext(15, "Suggest Document");
719
873
  i0.ɵɵelementEnd()();
720
- i0.ɵɵelementStart(16, "button", 15);
874
+ i0.ɵɵelementStart(16, "button", 16);
721
875
  i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Template_button_click_16_listener() { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.LoadData()); });
722
- i0.ɵɵelement(17, "i", 16);
876
+ i0.ɵɵelement(17, "i", 17);
723
877
  i0.ɵɵtext(18, " Refresh ");
724
878
  i0.ɵɵelementEnd()()();
725
- i0.ɵɵconditionalCreate(19, VectorManagementResourceComponent_Conditional_1_Conditional_19_Template, 4, 0, "div", 17)(20, VectorManagementResourceComponent_Conditional_1_Conditional_20_Template, 19, 0, "div", 18);
879
+ i0.ɵɵconditionalCreate(19, VectorManagementResourceComponent_Conditional_1_Conditional_19_Template, 4, 0, "div", 18)(20, VectorManagementResourceComponent_Conditional_1_Conditional_20_Template, 19, 0, "div", 19);
726
880
  i0.ɵɵelementEnd();
727
- i0.ɵɵelementStart(21, "div", 19)(22, "div", 20)(23, "h4", 21);
728
- i0.ɵɵelement(24, "i", 22);
881
+ i0.ɵɵelementStart(21, "div", 20)(22, "div", 21)(23, "h4", 22);
882
+ i0.ɵɵelement(24, "i", 23);
729
883
  i0.ɵɵtext(25, " Vector DB Health ");
730
884
  i0.ɵɵelementEnd();
731
- i0.ɵɵelementStart(26, "div", 23);
732
- i0.ɵɵelement(27, "span", 24);
733
- i0.ɵɵelementStart(28, "span", 25);
885
+ i0.ɵɵelementStart(26, "div", 24);
886
+ i0.ɵɵelement(27, "span", 25);
887
+ i0.ɵɵelementStart(28, "span", 26);
734
888
  i0.ɵɵtext(29);
735
889
  i0.ɵɵelementEnd()();
736
- i0.ɵɵelementStart(30, "div", 26);
890
+ i0.ɵɵelementStart(30, "div", 27);
737
891
  i0.ɵɵtext(31);
738
892
  i0.ɵɵelementEnd()();
739
- i0.ɵɵelementStart(32, "div", 20)(33, "h4", 21);
740
- i0.ɵɵelement(34, "i", 27);
893
+ i0.ɵɵelementStart(32, "div", 21)(33, "h4", 22);
894
+ i0.ɵɵelement(34, "i", 28);
741
895
  i0.ɵɵtext(35, " Embedding Model ");
742
896
  i0.ɵɵelementEnd();
743
- i0.ɵɵelementStart(36, "div", 28)(37, "div", 29)(38, "span", 30);
897
+ i0.ɵɵelementStart(36, "div", 29)(37, "div", 30)(38, "span", 31);
744
898
  i0.ɵɵtext(39, "Model");
745
899
  i0.ɵɵelementEnd();
746
- i0.ɵɵelementStart(40, "span", 31);
900
+ i0.ɵɵelementStart(40, "span", 32);
747
901
  i0.ɵɵtext(41);
748
902
  i0.ɵɵelementEnd()();
749
- i0.ɵɵconditionalCreate(42, VectorManagementResourceComponent_Conditional_1_Conditional_42_Template, 6, 3, "div", 29);
903
+ i0.ɵɵconditionalCreate(42, VectorManagementResourceComponent_Conditional_1_Conditional_42_Template, 6, 3, "div", 30);
750
904
  i0.ɵɵelementEnd()();
751
- i0.ɵɵelementStart(43, "div", 20)(44, "h4", 21);
752
- i0.ɵɵelement(45, "i", 32);
905
+ i0.ɵɵelementStart(43, "div", 21)(44, "h4", 22);
906
+ i0.ɵɵelement(45, "i", 33);
753
907
  i0.ɵɵtext(46, " Vectorization Coverage ");
754
908
  i0.ɵɵelementEnd();
755
- i0.ɵɵelementStart(47, "div", 33)(48, "div", 34);
756
- i0.ɵɵelement(49, "div", 35);
909
+ i0.ɵɵelementStart(47, "div", 34)(48, "div", 35);
910
+ i0.ɵɵelement(49, "div", 36);
757
911
  i0.ɵɵelementEnd();
758
- i0.ɵɵelementStart(50, "div", 36);
912
+ i0.ɵɵelementStart(50, "div", 37);
759
913
  i0.ɵɵtext(51);
760
914
  i0.ɵɵelementEnd()();
761
- i0.ɵɵelementStart(52, "div", 37);
915
+ i0.ɵɵelementStart(52, "div", 38);
762
916
  i0.ɵɵtext(53);
763
917
  i0.ɵɵpipe(54, "number");
764
918
  i0.ɵɵelementEnd()()()()();
765
- i0.ɵɵconditionalCreate(55, VectorManagementResourceComponent_Conditional_1_Conditional_55_Template, 47, 7, "div", 38);
766
- i0.ɵɵconditionalCreate(56, VectorManagementResourceComponent_Conditional_1_Conditional_56_Template, 11, 3, "div", 38);
919
+ i0.ɵɵconditionalCreate(55, VectorManagementResourceComponent_Conditional_1_Conditional_55_Template, 57, 13, "div", 39);
920
+ i0.ɵɵconditionalCreate(56, VectorManagementResourceComponent_Conditional_1_Conditional_56_Template, 34, 5, "div", 39);
921
+ i0.ɵɵconditionalCreate(57, VectorManagementResourceComponent_Conditional_1_Conditional_57_Template, 14, 0, "div", 39);
922
+ i0.ɵɵconditionalCreate(58, VectorManagementResourceComponent_Conditional_1_Conditional_58_Template, 11, 3, "div", 39);
767
923
  } if (rf & 2) {
768
924
  const ctx_r2 = i0.ɵɵnextContext();
769
925
  i0.ɵɵadvance();
@@ -787,14 +943,19 @@ function VectorManagementResourceComponent_Conditional_1_Template(rf, ctx) { if
787
943
  i0.ɵɵadvance(2);
788
944
  i0.ɵɵtextInterpolate1("", ctx_r2.StorageLabel, " of records vectorized");
789
945
  i0.ɵɵadvance(2);
790
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(54, 14, ctx_r2.TotalVectors), " vectors stored ");
946
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(54, 16, ctx_r2.TotalVectors), " vectors stored ");
791
947
  i0.ɵɵadvance(2);
792
948
  i0.ɵɵconditional(ctx_r2.ShowEditPanel ? 55 : -1);
793
949
  i0.ɵɵadvance();
794
- i0.ɵɵconditional(ctx_r2.ShowSuggestDialog ? 56 : -1);
950
+ i0.ɵɵconditional(ctx_r2.ShowScheduleSyncDialog ? 56 : -1);
951
+ i0.ɵɵadvance();
952
+ i0.ɵɵconditional(ctx_r2.ShowNoIndexWarning ? 57 : -1);
953
+ i0.ɵɵadvance();
954
+ i0.ɵɵconditional(ctx_r2.ShowSuggestDialog ? 58 : -1);
795
955
  } }
796
956
  let VectorManagementResourceComponent = class VectorManagementResourceComponent extends BaseResourceComponent {
797
957
  cdr = inject(ChangeDetectorRef);
958
+ navigationService = inject(NavigationService);
798
959
  destroy$ = new Subject();
799
960
  /** View mode: 'index' = Option A (shared index as hero, entity docs as children),
800
961
  * 'operations' = Option C (operations monitoring with real-time sync status) */
@@ -830,8 +991,21 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
830
991
  EditDocAIModelID = '';
831
992
  EditDocVectorIndexID = '';
832
993
  EditDocStatus = '';
994
+ EditDocTemplate = '';
995
+ IsEditRegenerating = false;
996
+ /** Parse {{ FieldName }} patterns from the edit panel's template */
997
+ get EditDocSelectedFields() {
998
+ if (!this.EditDocTemplate)
999
+ return [];
1000
+ const matches = this.EditDocTemplate.match(/\{\{\s*(\w+(?:\.\w+)*)\s*\}\}/g);
1001
+ if (!matches)
1002
+ return [];
1003
+ return [...new Set(matches.map(m => m.replace(/\{\{\s*/, '').replace(/\s*\}\}/, '')))];
1004
+ }
1005
+ // --- Zero Vector Indexes Warning ---
1006
+ ShowNoIndexWarning = false;
833
1007
  /** Open the edit panel for an entity document */
834
- OpenEditPanel(entityDocumentId) {
1008
+ async OpenEditPanel(entityDocumentId) {
835
1009
  const doc = this.entityDocuments.find(d => UUIDsEqual(d.ID, entityDocumentId));
836
1010
  if (!doc)
837
1011
  return;
@@ -842,8 +1016,35 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
842
1016
  this.EditDocAIModelID = doc.AIModelID;
843
1017
  this.EditDocVectorIndexID = doc.VectorIndexID || '';
844
1018
  this.EditDocStatus = doc.Status;
1019
+ this.EditDocTemplate = '';
1020
+ this.IsEditRegenerating = false;
845
1021
  this.ShowEditPanel = true;
846
1022
  this.cdr.detectChanges();
1023
+ // Load the template text from Template Contents
1024
+ await this.loadEditDocTemplate(doc.TemplateID);
1025
+ }
1026
+ /** Load the template text for the edit panel from the associated Template Contents record */
1027
+ async loadEditDocTemplate(templateId) {
1028
+ if (!templateId)
1029
+ return;
1030
+ try {
1031
+ const rv = new RunView();
1032
+ const result = await rv.RunView({
1033
+ EntityName: 'MJ: Template Contents',
1034
+ ExtraFilter: `TemplateID='${templateId}'`,
1035
+ Fields: ['TemplateText'],
1036
+ ResultType: 'simple',
1037
+ OrderBy: 'Priority ASC',
1038
+ MaxRows: 1,
1039
+ });
1040
+ if (result.Success && result.Results.length > 0 && result.Results[0].TemplateText) {
1041
+ this.EditDocTemplate = result.Results[0].TemplateText;
1042
+ this.cdr.detectChanges();
1043
+ }
1044
+ }
1045
+ catch (error) {
1046
+ console.warn('[VectorManagement] Could not load template text:', error);
1047
+ }
847
1048
  }
848
1049
  CloseEditPanel() {
849
1050
  this.ShowEditPanel = false;
@@ -865,6 +1066,8 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
865
1066
  doc.Status = this.EditDocStatus;
866
1067
  const saved = await doc.Save();
867
1068
  if (saved) {
1069
+ // Also save updated template text if changed
1070
+ await this.saveEditDocTemplate(doc.TemplateID);
868
1071
  MJNotificationService.Instance.CreateSimpleNotification('Entity document updated', 'success', 2500);
869
1072
  this.ShowEditPanel = false;
870
1073
  await this.LoadData();
@@ -883,6 +1086,55 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
883
1086
  this.cdr.detectChanges();
884
1087
  }
885
1088
  }
1089
+ /** Save the edited template text back to the Template Contents record */
1090
+ async saveEditDocTemplate(templateId) {
1091
+ if (!templateId || !this.EditDocTemplate)
1092
+ return;
1093
+ try {
1094
+ const rv = new RunView();
1095
+ const result = await rv.RunView({
1096
+ EntityName: 'MJ: Template Contents',
1097
+ ExtraFilter: `TemplateID='${templateId}'`,
1098
+ ResultType: 'entity_object',
1099
+ OrderBy: 'Priority ASC',
1100
+ MaxRows: 1,
1101
+ });
1102
+ if (result.Success && result.Results.length > 0) {
1103
+ const content = result.Results[0];
1104
+ content.TemplateText = this.EditDocTemplate;
1105
+ await content.Save();
1106
+ }
1107
+ }
1108
+ catch (error) {
1109
+ console.warn('[VectorManagement] Could not save template text:', error);
1110
+ }
1111
+ }
1112
+ /** Regenerate the template using AI for the current edit panel entity */
1113
+ async RegenerateTemplate() {
1114
+ if (!this.EditDocEntityName || this.IsEditRegenerating)
1115
+ return;
1116
+ this.IsEditRegenerating = true;
1117
+ this.cdr.detectChanges();
1118
+ try {
1119
+ const result = await this.callSuggestionPrompt(this.EditDocEntityName, 'duplicate detection');
1120
+ if (result) {
1121
+ this.EditDocTemplate = result.template;
1122
+ MJNotificationService.Instance.CreateSimpleNotification('Template regenerated with AI. Review and save to apply.', 'info', 3000);
1123
+ }
1124
+ }
1125
+ catch (error) {
1126
+ const msg = error instanceof Error ? error.message : String(error);
1127
+ MJNotificationService.Instance.CreateSimpleNotification(`Regeneration failed: ${msg}`, 'error', 5000);
1128
+ }
1129
+ finally {
1130
+ this.IsEditRegenerating = false;
1131
+ this.cdr.detectChanges();
1132
+ }
1133
+ }
1134
+ /** Handle template edits from the edit panel's code editor */
1135
+ OnEditTemplateChange(newValue) {
1136
+ this.EditDocTemplate = newValue;
1137
+ }
886
1138
  async DeleteEntityDocument() {
887
1139
  this.IsEditDeleting = true;
888
1140
  this.cdr.detectChanges();
@@ -911,6 +1163,119 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
911
1163
  this.cdr.detectChanges();
912
1164
  }
913
1165
  }
1166
+ // --- Schedule Sync Dialog ---
1167
+ ShowScheduleSyncDialog = false;
1168
+ ScheduleSyncSaving = false;
1169
+ ScheduleSyncDocID = '';
1170
+ ScheduleSyncDocName = '';
1171
+ ScheduleSyncCron = '0 2 * * *';
1172
+ ScheduleSyncEnabled = true;
1173
+ /** Opens the schedule sync dialog for a specific entity document */
1174
+ OpenScheduleSyncDialog(entityDocumentId) {
1175
+ const doc = this.entityDocuments.find(d => UUIDsEqual(d.ID, entityDocumentId));
1176
+ if (!doc)
1177
+ return;
1178
+ this.ScheduleSyncDocID = doc.ID;
1179
+ this.ScheduleSyncDocName = doc.Entity || doc.Name;
1180
+ this.ScheduleSyncCron = '0 2 * * *';
1181
+ this.ScheduleSyncEnabled = true;
1182
+ this.ShowScheduleSyncDialog = true;
1183
+ this.cdr.detectChanges();
1184
+ }
1185
+ /** Closes the schedule sync dialog */
1186
+ CloseScheduleSyncDialog() {
1187
+ this.ShowScheduleSyncDialog = false;
1188
+ this.ScheduleSyncDocID = '';
1189
+ this.cdr.detectChanges();
1190
+ }
1191
+ /** Returns a human-readable description of a cron expression */
1192
+ GetScheduleCronPreview(cron) {
1193
+ return CronToHumanReadable(cron);
1194
+ }
1195
+ /** Saves a new ScheduledAction for vectorizing the selected entity document */
1196
+ async SaveScheduleSync() {
1197
+ if (this.ScheduleSyncSaving || !this.ScheduleSyncDocID)
1198
+ return;
1199
+ this.ScheduleSyncSaving = true;
1200
+ this.cdr.detectChanges();
1201
+ try {
1202
+ const actionID = await this.findVectorizeActionID();
1203
+ if (!actionID) {
1204
+ MJNotificationService.Instance.CreateSimpleNotification('Could not find the "__VectorizeEntity" action. Please check action configuration.', 'error', 5000);
1205
+ return;
1206
+ }
1207
+ const md = new Metadata();
1208
+ // Create ScheduledAction
1209
+ const scheduledAction = await md.GetEntityObject('MJ: Scheduled Actions');
1210
+ scheduledAction.NewRecord();
1211
+ scheduledAction.Name = `Vectorize: ${this.ScheduleSyncDocName}`;
1212
+ scheduledAction.Description = `Automated vectorization for entity document "${this.ScheduleSyncDocName}"`;
1213
+ scheduledAction.ActionID = actionID;
1214
+ scheduledAction.Type = 'Custom';
1215
+ scheduledAction.CronExpression = this.ScheduleSyncCron;
1216
+ scheduledAction.CustomCronExpression = this.ScheduleSyncCron;
1217
+ scheduledAction.Status = this.ScheduleSyncEnabled ? 'Active' : 'Disabled';
1218
+ scheduledAction.Timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
1219
+ const saved = await scheduledAction.Save();
1220
+ if (!saved) {
1221
+ MJNotificationService.Instance.CreateSimpleNotification(`Failed to create schedule: ${scheduledAction.LatestResult?.Message ?? 'Unknown error'}`, 'error', 5000);
1222
+ return;
1223
+ }
1224
+ // Create param linking the entityDocumentID
1225
+ await this.createVectorizeScheduleParam(scheduledAction.ID, actionID, this.ScheduleSyncDocID);
1226
+ MJNotificationService.Instance.CreateSimpleNotification(`Schedule created: ${CronToHumanReadable(this.ScheduleSyncCron)}`, 'success', 3000);
1227
+ this.CloseScheduleSyncDialog();
1228
+ }
1229
+ catch (error) {
1230
+ const msg = error instanceof Error ? error.message : String(error);
1231
+ MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);
1232
+ }
1233
+ finally {
1234
+ this.ScheduleSyncSaving = false;
1235
+ this.cdr.detectChanges();
1236
+ }
1237
+ }
1238
+ /** Find the __VectorizeEntity action ID */
1239
+ async findVectorizeActionID() {
1240
+ const rv = new RunView();
1241
+ const result = await rv.RunView({
1242
+ EntityName: 'Actions',
1243
+ ExtraFilter: `Name = '__VectorizeEntity'`,
1244
+ Fields: ['ID'],
1245
+ ResultType: 'simple',
1246
+ MaxRows: 1,
1247
+ });
1248
+ if (result.Success && result.Results.length > 0) {
1249
+ return result.Results[0].ID;
1250
+ }
1251
+ return null;
1252
+ }
1253
+ /** Create a ScheduledActionParam linking the entity document ID */
1254
+ async createVectorizeScheduleParam(scheduledActionID, actionID, entityDocumentID) {
1255
+ const rv = new RunView();
1256
+ const paramResult = await rv.RunView({
1257
+ EntityName: 'Action Params',
1258
+ ExtraFilter: `ActionID = '${actionID}' AND Name = 'entityDocumentID'`,
1259
+ Fields: ['ID', 'Name'],
1260
+ ResultType: 'simple',
1261
+ MaxRows: 1,
1262
+ });
1263
+ if (!paramResult.Success || paramResult.Results.length === 0) {
1264
+ console.warn('[VectorManagement] Could not find entityDocumentID action param');
1265
+ return;
1266
+ }
1267
+ const md = new Metadata();
1268
+ const param = await md.GetEntityObject('MJ: Scheduled Action Params');
1269
+ param.NewRecord();
1270
+ param.ScheduledActionID = scheduledActionID;
1271
+ param.ActionParamID = paramResult.Results[0].ID;
1272
+ param.ValueType = 'Static';
1273
+ param.Value = entityDocumentID;
1274
+ const saved = await param.Save();
1275
+ if (!saved) {
1276
+ console.warn('[VectorManagement] Failed to save schedule param:', param.LatestResult?.Message);
1277
+ }
1278
+ }
914
1279
  // --- Suggest Document Dialog ---
915
1280
  ShowSuggestDialog = false;
916
1281
  IsSuggesting = false;
@@ -958,20 +1323,29 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
958
1323
  EntitySearchText = '';
959
1324
  /** Whether the entity picker dropdown is open */
960
1325
  ShowEntityPicker = false;
1326
+ SelectedEntityIndex = -1;
1327
+ /** Reference to the entity search input for programmatic focus */
1328
+ entitySearchInput;
961
1329
  // --- Raw entity data (private) ---
962
1330
  entityDocuments = [];
963
1331
  vectorDatabases = [];
964
1332
  vectorIndexes = [];
965
- recordDocuments = [];
966
1333
  aiModels = [];
1334
+ /** Lightweight aggregate stats per EntityDocumentID — avoids loading all record documents */
1335
+ erdStats = new Map();
967
1336
  // ================================================================
968
1337
  // Lifecycle
969
1338
  // ================================================================
970
1339
  async ngAfterViewInit() {
971
1340
  await this.LoadData();
1341
+ this.navigationService.SetAgentContext(this, {
1342
+ TotalVectors: this.TotalVectors,
1343
+ KPICount: this.KPICards.length,
1344
+ });
972
1345
  this.NotifyLoadComplete();
973
1346
  }
974
1347
  ngOnDestroy() {
1348
+ super.ngOnDestroy();
975
1349
  this.destroy$.next();
976
1350
  this.destroy$.complete();
977
1351
  }
@@ -1075,9 +1449,11 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1075
1449
  if (idleTimer)
1076
1450
  clearTimeout(idleTimer);
1077
1451
  rxSub?.unsubscribe();
1078
- // Use Promise.resolve().then() to defer state changes to the next
1079
- // microtask, avoiding ExpressionChangedAfterItHasBeenCheckedError
1080
- Promise.resolve().then(async () => {
1452
+ // Use setTimeout to defer state changes to the next macrotask,
1453
+ // avoiding ExpressionChangedAfterItHasBeenCheckedError.
1454
+ // (Promise.resolve microtasks run between Angular's check passes
1455
+ // and still trigger NG0100.)
1456
+ setTimeout(async () => {
1081
1457
  this.removeSyncingId(entityDocumentId);
1082
1458
  if (success) {
1083
1459
  MJNotificationService.Instance.CreateSimpleNotification(`Vectorization complete for ${entityName}`, 'success', 3000);
@@ -1086,8 +1462,8 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1086
1462
  else {
1087
1463
  this.updateRowStatus(entityDocumentId, 'Error');
1088
1464
  MJNotificationService.Instance.CreateSimpleNotification(`Vectorization failed for ${entityName}`, 'error', 5000);
1089
- this.cdr.detectChanges();
1090
1465
  }
1466
+ this.cdr.detectChanges();
1091
1467
  });
1092
1468
  };
1093
1469
  // Reset idle timer on every event. When no events arrive for 5s,
@@ -1148,8 +1524,13 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1148
1524
  this.SyncingIds = next;
1149
1525
  }
1150
1526
  }
1151
- /** Opens the AI suggestion dialog */
1527
+ /** Opens the AI suggestion dialog, or shows a warning if no vector indexes exist */
1152
1528
  OpenSuggestDialog() {
1529
+ if (this.vectorIndexes.length === 0 && this.vectorDatabases.length === 0) {
1530
+ this.ShowNoIndexWarning = true;
1531
+ this.cdr.detectChanges();
1532
+ return;
1533
+ }
1153
1534
  this.SuggestionResult = null;
1154
1535
  this.SuggestEntityName = '';
1155
1536
  this.SuggestUseCase = 'duplicate detection';
@@ -1161,6 +1542,18 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1161
1542
  this.ShowSuggestDialog = true;
1162
1543
  this.cdr.detectChanges();
1163
1544
  }
1545
+ /** Close the no-index warning dialog */
1546
+ CloseNoIndexWarning() {
1547
+ this.ShowNoIndexWarning = false;
1548
+ this.cdr.detectChanges();
1549
+ }
1550
+ /** Navigate to the Configuration section from the no-index warning */
1551
+ async GoToConfiguration() {
1552
+ this.ShowNoIndexWarning = false;
1553
+ this.cdr.detectChanges();
1554
+ // Attempt to open the Config nav item in the current app
1555
+ await this.navigationService.OpenNavItemByName('Config');
1556
+ }
1164
1557
  /** Select an entity from the grouped picker */
1165
1558
  SelectEntity(entityName) {
1166
1559
  this.SuggestEntityName = entityName;
@@ -1181,16 +1574,77 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1181
1574
  }))
1182
1575
  .filter(group => group.Entities.length > 0);
1183
1576
  }
1577
+ // Reset selection to first item when filter changes
1578
+ this.SelectedEntityIndex = this.FlatFilteredEntities.length > 0 ? 0 : -1;
1184
1579
  this.cdr.detectChanges();
1185
1580
  }
1581
+ /**
1582
+ * Get a flat list of all entities across groups (for keyboard navigation indexing)
1583
+ */
1584
+ get FlatFilteredEntities() {
1585
+ return this.FilteredEntityGroups.flatMap(g => g.Entities);
1586
+ }
1587
+ /**
1588
+ * Handle keyboard events in the entity picker search input
1589
+ */
1590
+ OnEntityPickerKeyDown(event) {
1591
+ const entities = this.FlatFilteredEntities;
1592
+ if (entities.length === 0)
1593
+ return;
1594
+ switch (event.key) {
1595
+ case 'ArrowDown':
1596
+ event.preventDefault();
1597
+ this.SelectedEntityIndex = Math.min(this.SelectedEntityIndex + 1, entities.length - 1);
1598
+ this.scrollSelectedEntityIntoView();
1599
+ this.cdr.detectChanges();
1600
+ break;
1601
+ case 'ArrowUp':
1602
+ event.preventDefault();
1603
+ this.SelectedEntityIndex = Math.max(this.SelectedEntityIndex - 1, 0);
1604
+ this.scrollSelectedEntityIntoView();
1605
+ this.cdr.detectChanges();
1606
+ break;
1607
+ case 'Enter':
1608
+ event.preventDefault();
1609
+ if (this.SelectedEntityIndex >= 0 && this.SelectedEntityIndex < entities.length) {
1610
+ this.SelectEntity(entities[this.SelectedEntityIndex].Name);
1611
+ }
1612
+ break;
1613
+ case 'Escape':
1614
+ event.preventDefault();
1615
+ this.ShowEntityPicker = false;
1616
+ this.cdr.detectChanges();
1617
+ break;
1618
+ }
1619
+ }
1620
+ /**
1621
+ * Scroll the currently selected entity picker item into view
1622
+ */
1623
+ scrollSelectedEntityIntoView() {
1624
+ setTimeout(() => {
1625
+ const selected = document.querySelector('.entity-picker-item-focused');
1626
+ if (selected) {
1627
+ selected.scrollIntoView({ block: 'nearest', behavior: 'smooth' });
1628
+ }
1629
+ }, 0);
1630
+ }
1186
1631
  /** Toggle entity picker visibility */
1187
1632
  ToggleEntityPicker() {
1188
1633
  this.ShowEntityPicker = !this.ShowEntityPicker;
1189
1634
  if (this.ShowEntityPicker) {
1190
1635
  this.FilteredEntityGroups = this.EntityGroups;
1191
1636
  this.EntitySearchText = '';
1637
+ this.cdr.detectChanges();
1638
+ // Focus search input after the @if block renders — deferred past the click event
1639
+ setTimeout(() => {
1640
+ if (this.entitySearchInput?.nativeElement) {
1641
+ this.entitySearchInput.nativeElement.focus();
1642
+ }
1643
+ }, 0);
1644
+ }
1645
+ else {
1646
+ this.cdr.detectChanges();
1192
1647
  }
1193
- this.cdr.detectChanges();
1194
1648
  }
1195
1649
  /** Handle template edits from code editor */
1196
1650
  OnTemplateChange(newValue) {
@@ -1334,42 +1788,55 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1334
1788
  // Private helpers
1335
1789
  // ================================================================
1336
1790
  async fetchAllData() {
1337
- // Use KnowledgeHubMetadataEngine for cached global reference data
1791
+ // Use cached engine data BaseEngine's entity-event auto-refresh handles
1792
+ // updates from saves/deletes on the entities it tracks.
1338
1793
  const engine = KnowledgeHubMetadataEngine.Instance;
1339
1794
  await engine.Config(false);
1340
1795
  this.entityDocuments = engine.EntityDocuments;
1341
- this.vectorDatabases = engine.VectorDatabases;
1796
+ this.vectorDatabases = AIEngineBase.Instance.VectorDatabases;
1342
1797
  this.vectorIndexes = engine.VectorIndexes;
1343
- // Entity Record Documents and AI Models are not cached in the engine —
1344
- // record documents are high-volume instance data, and AI models are loaded
1345
- // from a different domain. Fetch them via RunView.
1798
+ // Build per-EntityDocument aggregate stats (vector count + last synced).
1799
+ // Each query fetches only the most recent row (MaxRows: 1) and uses
1800
+ // TotalRowCount for the actual vector count avoids loading all rows.
1801
+ // AI Models come from a different domain — fetched in the same batch.
1346
1802
  const rv = new RunView();
1347
- const [erdResult, modelsResult] = await rv.RunViews([
1348
- {
1349
- EntityName: 'MJ: Entity Record Documents',
1350
- ExtraFilter: '',
1351
- Fields: ['ID', 'EntityDocumentID', 'VectorID', 'EntityDocument', 'Entity', '__mj_UpdatedAt'],
1352
- ResultType: 'simple'
1353
- },
1354
- {
1355
- EntityName: 'MJ: AI Models',
1356
- ExtraFilter: '',
1357
- ResultType: 'entity_object'
1803
+ const erdQueries = this.entityDocuments.map(doc => ({
1804
+ EntityName: 'MJ: Entity Record Documents',
1805
+ ExtraFilter: `EntityDocumentID='${doc.ID}' AND VectorID IS NOT NULL`,
1806
+ ResultType: 'simple',
1807
+ Fields: ['__mj_UpdatedAt'],
1808
+ OrderBy: '__mj_UpdatedAt DESC',
1809
+ MaxRows: 1,
1810
+ }));
1811
+ const allQueries = [
1812
+ ...erdQueries,
1813
+ { EntityName: 'MJ: AI Models', ExtraFilter: '', ResultType: 'entity_object' }
1814
+ ];
1815
+ const allResults = await rv.RunViews(allQueries);
1816
+ // Map results back to erdStats
1817
+ this.erdStats.clear();
1818
+ for (let i = 0; i < this.entityDocuments.length; i++) {
1819
+ const result = allResults[i];
1820
+ if (result.Success) {
1821
+ const rows = result.Results;
1822
+ const lastDate = rows.length > 0 ? new Date(rows[0].__mj_UpdatedAt) : null;
1823
+ this.erdStats.set(this.entityDocuments[i].ID, {
1824
+ vectorCount: result.TotalRowCount,
1825
+ lastSynced: lastDate,
1826
+ });
1358
1827
  }
1359
- ]);
1360
- if (erdResult.Success) {
1361
- this.recordDocuments = erdResult.Results;
1362
1828
  }
1829
+ const modelsResult = allResults[allResults.length - 1];
1363
1830
  if (modelsResult.Success) {
1364
1831
  this.aiModels = modelsResult.Results;
1365
1832
  }
1366
1833
  }
1367
1834
  buildSyncRows() {
1368
1835
  this.SyncRows = this.entityDocuments.map(doc => {
1369
- const docsForEntity = this.recordDocuments.filter(rd => UUIDsEqual(rd.EntityDocumentID, doc.ID));
1370
- const vectorCount = docsForEntity.filter(rd => rd.VectorID != null).length;
1371
- const lastSynced = this.computeLastSynced(docsForEntity);
1372
- const status = this.computeSyncStatus(doc, vectorCount, docsForEntity.length);
1836
+ const stats = this.erdStats.get(doc.ID);
1837
+ const vectorCount = stats?.vectorCount ?? 0;
1838
+ const lastSynced = stats?.lastSynced ?? null;
1839
+ const status = this.computeSyncStatus(doc, vectorCount);
1373
1840
  // Preserve progress info from any active sync
1374
1841
  const existingRow = this.SyncRows.find(r => UUIDsEqual(r.EntityDocumentID, doc.ID));
1375
1842
  return {
@@ -1384,44 +1851,32 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1384
1851
  };
1385
1852
  });
1386
1853
  }
1387
- computeLastSynced(records) {
1388
- if (records.length === 0)
1389
- return null;
1390
- const dates = records
1391
- .map(r => new Date(r.__mj_UpdatedAt))
1392
- .filter(d => !isNaN(d.getTime()));
1393
- if (dates.length === 0)
1394
- return null;
1395
- return new Date(Math.max(...dates.map(d => d.getTime())));
1396
- }
1397
- computeSyncStatus(doc, vectorCount, totalRecords) {
1854
+ computeSyncStatus(doc, vectorCount) {
1398
1855
  if (this.SyncingIds.has(doc.ID)) {
1399
1856
  return 'Syncing';
1400
1857
  }
1401
1858
  if (doc.Status === 'Inactive') {
1402
1859
  return 'Pending';
1403
1860
  }
1404
- if (totalRecords === 0) {
1405
- return 'Pending';
1406
- }
1407
- // If there are any vectors, consider it synced — partial syncs
1408
- // still represent a successful state since the pipeline ran
1409
1861
  if (vectorCount > 0) {
1410
1862
  return 'Synced';
1411
1863
  }
1412
- return 'Synced';
1864
+ return 'Pending';
1413
1865
  }
1414
1866
  buildKPICards() {
1415
- this.TotalVectors = this.recordDocuments.filter(rd => rd.VectorID != null).length;
1867
+ let totalVectors = 0;
1868
+ let latestSync = null;
1869
+ for (const stats of this.erdStats.values()) {
1870
+ totalVectors += stats.vectorCount;
1871
+ if (stats.lastSynced && (!latestSync || stats.lastSynced > latestSync)) {
1872
+ latestSync = stats.lastSynced;
1873
+ }
1874
+ }
1875
+ this.TotalVectors = totalVectors;
1416
1876
  const entitiesSynced = new Set(this.entityDocuments
1417
1877
  .filter(d => d.Status === 'Active')
1418
1878
  .map(d => d.EntityID)).size;
1419
- const allDates = this.recordDocuments
1420
- .map(r => new Date(r.__mj_UpdatedAt))
1421
- .filter(d => !isNaN(d.getTime()));
1422
- const lastSyncDate = allDates.length > 0
1423
- ? new Date(Math.max(...allDates.map(d => d.getTime())))
1424
- : null;
1879
+ const lastSyncDate = latestSync;
1425
1880
  this.KPICards = [
1426
1881
  {
1427
1882
  title: 'Total Vectors',
@@ -1466,7 +1921,7 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1466
1921
  const db = this.vectorDatabases[0];
1467
1922
  this.VectorDBName = db.Name;
1468
1923
  // Determine health based on whether we have records with vectors
1469
- const hasVectors = this.recordDocuments.some(rd => rd.VectorID != null);
1924
+ const hasVectors = this.TotalVectors > 0;
1470
1925
  this.VectorDBStatus = hasVectors ? 'Healthy' : 'Degraded';
1471
1926
  }
1472
1927
  else {
@@ -1488,10 +1943,9 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1488
1943
  }
1489
1944
  }
1490
1945
  buildStorageUsage() {
1491
- // Estimate storage as a ratio of vectorized records vs total record documents
1492
- const total = this.recordDocuments.length;
1493
- const vectorized = this.recordDocuments.filter(rd => rd.VectorID != null).length;
1494
- this.StorageUsagePercent = total > 0 ? Math.round((vectorized / total) * 100) : 0;
1946
+ // All records in erdStats already have vectors (query filters VectorID IS NOT NULL),
1947
+ // so coverage is 100% if any exist.
1948
+ this.StorageUsagePercent = this.TotalVectors > 0 ? 100 : 0;
1495
1949
  }
1496
1950
  /** Check if vector DB and embedding model are configured, populate selection lists */
1497
1951
  checkPrerequisites() {
@@ -1656,15 +2110,19 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1656
2110
  const rv = new RunView();
1657
2111
  const result = await rv.RunView({
1658
2112
  EntityName: 'MJ: Entity Record Documents',
1659
- ExtraFilter: `EntityDocumentID='${entityDocumentId}'`,
1660
- ResultType: 'entity_object'
2113
+ ExtraFilter: `EntityDocumentID='${entityDocumentId}' AND VectorID IS NOT NULL`,
2114
+ Fields: ['__mj_UpdatedAt'],
2115
+ OrderBy: '__mj_UpdatedAt DESC',
2116
+ ResultType: 'simple',
2117
+ MaxRows: 1
1661
2118
  });
1662
2119
  if (result.Success) {
1663
- const docs = result.Results;
1664
- row.VectorCount = docs.filter(d => d.VectorID != null).length;
1665
- row.LastSynced = this.computeLastSynced(docs);
2120
+ row.VectorCount = result.TotalRowCount;
2121
+ row.LastSynced = result.Results.length > 0 ? new Date(result.Results[0].__mj_UpdatedAt) : null;
1666
2122
  row.Status = row.VectorCount > 0 ? 'Synced' : 'Pending';
1667
2123
  row.PercentComplete = 100;
2124
+ this.erdStats.set(entityDocumentId, { vectorCount: row.VectorCount, lastSynced: row.LastSynced });
2125
+ this.buildKPICards();
1668
2126
  this.cdr.detectChanges();
1669
2127
  }
1670
2128
  }
@@ -1744,11 +2202,16 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1744
2202
  };
1745
2203
  }
1746
2204
  static ɵfac = /*@__PURE__*/ (() => { let ɵVectorManagementResourceComponent_BaseFactory; return function VectorManagementResourceComponent_Factory(__ngFactoryType__) { return (ɵVectorManagementResourceComponent_BaseFactory || (ɵVectorManagementResourceComponent_BaseFactory = i0.ɵɵgetInheritedFactory(VectorManagementResourceComponent)))(__ngFactoryType__ || VectorManagementResourceComponent); }; })();
1747
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: VectorManagementResourceComponent, selectors: [["app-vector-management-resource"]], inputs: { EmbeddedMode: "EmbeddedMode" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, "vector-loading"], ["text", "Loading vector management data..."], [1, "vector-dashboard"], [1, "view-mode-toggle"], [1, "kpi-row"], [3, "data"], [1, "content-area"], [1, "sync-table-panel"], [1, "panel-header"], [1, "panel-title"], [1, "fa-solid", "fa-table-list"], [1, "panel-actions"], ["title", "Use AI to suggest an Entity Document template", 1, "suggest-btn", 3, "click"], [1, "fa-solid", "fa-wand-magic-sparkles"], [1, "suggest-btn-text"], ["title", "Refresh data", 1, "refresh-btn", 3, "click"], [1, "fa-solid", "fa-arrows-rotate"], [1, "empty-state"], [1, "table-wrapper"], [1, "sidebar"], [1, "sidebar-card"], [1, "sidebar-title"], [1, "fa-solid", "fa-heart-pulse"], [1, "health-row"], [1, "health-dot"], [1, "health-label"], [1, "health-status"], [1, "fa-solid", "fa-microchip"], [1, "model-info"], [1, "info-row"], [1, "info-label"], [1, "info-value"], [1, "fa-solid", "fa-hard-drive"], [1, "gauge-container"], [1, "gauge-bar"], [1, "gauge-fill"], [1, "gauge-label"], [1, "storage-detail"], [1, "slide-panel-overlay"], [1, "view-mode-btn", 3, "click"], [1, "fa-solid", "fa-cubes"], [1, "fa-solid", "fa-gauge-high"], [1, "fa-solid", "fa-folder-open"], [1, "sync-table"], [1, "text-right"], [1, "text-center"], [1, "entity-name"], [1, "document-name"], [1, "text-right", "vector-count"], [1, "last-synced"], [1, "status-badge"], [1, "text-center", "actions-cell"], ["title", "Sync now", 1, "sync-btn", 3, "click", "disabled"], ["title", "Edit entity document", 1, "edit-btn", 3, "click"], [1, "fa-solid", "fa-pen"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-play"], [1, "slide-panel-overlay", 3, "click"], [1, "slide-panel", "open", 3, "click"], [1, "suggest-dialog-header"], [1, "suggest-dialog-title"], [1, "suggest-close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "suggest-dialog-body"], [1, "suggest-form"], [1, "suggest-field"], [1, "suggest-label"], [1, "edit-readonly-value"], ["type", "text", 1, "suggest-input", 3, "ngModelChange", "ngModel"], [1, "suggest-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "suggest-select", 3, "ngModel"], [1, "edit-readonly-value", 2, "font-size", "13px", "color", "var(--mj-text-muted)"], ["value", "Active"], ["value", "Inactive"], [1, "result-actions", 2, "margin-top", "1rem"], ["text", "Saving...", "size", "small"], ["value", ""], [1, "suggest-submit-btn", 3, "click"], [1, "fa-solid", "fa-save"], [1, "edit-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "suggest-close-action", 3, "click"], [1, "slide-panel", 3, "click"], [1, "suggest-result"], [1, "entity-picker"], [1, "entity-picker-trigger", 3, "click"], [1, "fa-solid", "fa-chevron-down", "entity-picker-arrow"], [1, "entity-picker-dropdown"], [1, "use-case-options"], [1, "use-case-btn", 3, "click"], [1, "fa-solid", "fa-clone"], [1, "fa-solid", "fa-magnifying-glass"], [1, "fa-solid", "fa-tags"], [1, "suggest-submit-btn", 3, "click", "disabled"], [1, "suggestion-error"], [1, "fa-solid", "fa-table"], [1, "entity-picker-value"], [1, "fa-solid", "fa-search"], [1, "entity-picker-placeholder"], [1, "entity-picker-search"], ["type", "text", "placeholder", "Filter entities...", "autofocus", "", 1, "entity-picker-search-input", 3, "ngModelChange", "input", "ngModel"], [1, "entity-picker-list"], [1, "entity-picker-group"], [1, "entity-picker-empty"], [1, "entity-picker-group-header"], [1, "fa-solid", "fa-database"], [1, "entity-picker-item", 3, "entity-picker-item-selected"], [1, "entity-picker-item", 3, "click"], [1, "fa-solid", "fa-circle-exclamation"], [1, "result-section"], [1, "result-heading"], [1, "template-editor-wrapper"], ["language", "markdown", 3, "change", "value", "readonly", "lineWrapping"], [1, "result-tags"], [1, "result-tag"], [1, "result-section", "result-thresholds"], [1, "threshold-item"], [1, "threshold-label"], [1, "threshold-value"], [1, "result-reasoning"], [1, "suggest-field", 2, "margin-top", "0.75rem"], [1, "result-actions"], [1, "save-spinner"], [1, "result-relationship"], [1, "rel-name"], [1, "rel-fields"], [1, "fa-solid", "fa-floppy-disk"], [1, "suggest-submit-btn", "suggest-try-again-btn", 3, "click"], [1, "fa-solid", "fa-rotate"]], template: function VectorManagementResourceComponent_Template(rf, ctx) { if (rf & 1) {
1748
- i0.ɵɵconditionalCreate(0, VectorManagementResourceComponent_Conditional_0_Template, 2, 0, "div", 0)(1, VectorManagementResourceComponent_Conditional_1_Template, 57, 16);
2205
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: VectorManagementResourceComponent, selectors: [["app-vector-management-resource"]], viewQuery: function VectorManagementResourceComponent_Query(rf, ctx) { if (rf & 1) {
2206
+ i0.ɵɵviewQuery(_c0, 5);
2207
+ } if (rf & 2) {
2208
+ let _t;
2209
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.entitySearchInput = _t.first);
2210
+ } }, inputs: { EmbeddedMode: "EmbeddedMode" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [["entitySearchInput", ""], [1, "vector-loading"], ["text", "Loading vector management data..."], [1, "vector-dashboard"], [1, "view-mode-toggle"], [1, "kpi-row"], [3, "data"], [1, "content-area"], [1, "sync-table-panel"], [1, "panel-header"], [1, "panel-title"], [1, "fa-solid", "fa-table-list"], [1, "panel-actions"], ["title", "Use AI to suggest an Entity Document template", 1, "suggest-btn", 3, "click"], [1, "fa-solid", "fa-wand-magic-sparkles"], [1, "suggest-btn-text"], ["title", "Refresh data", 1, "refresh-btn", 3, "click"], [1, "fa-solid", "fa-arrows-rotate"], [1, "empty-state"], [1, "table-wrapper"], [1, "sidebar"], [1, "sidebar-card"], [1, "sidebar-title"], [1, "fa-solid", "fa-heart-pulse"], [1, "health-row"], [1, "health-dot"], [1, "health-label"], [1, "health-status"], [1, "fa-solid", "fa-microchip"], [1, "model-info"], [1, "info-row"], [1, "info-label"], [1, "info-value"], [1, "fa-solid", "fa-hard-drive"], [1, "gauge-container"], [1, "gauge-bar"], [1, "gauge-fill"], [1, "gauge-label"], [1, "storage-detail"], [1, "slide-panel-overlay"], [1, "view-mode-btn", 3, "click"], [1, "fa-solid", "fa-cubes"], [1, "fa-solid", "fa-gauge-high"], [1, "fa-solid", "fa-folder-open"], [1, "sync-table"], [1, "text-right"], [1, "text-center"], [1, "entity-name"], [1, "document-name"], [1, "text-right", "vector-count"], [1, "last-synced"], [1, "status-badge"], [1, "text-center", "actions-cell"], ["title", "Sync now", 1, "sync-btn", 3, "click", "disabled"], ["title", "Schedule recurring sync", 1, "schedule-btn", 3, "click"], [1, "fa-regular", "fa-clock"], ["title", "Edit entity document", 1, "edit-btn", 3, "click"], [1, "fa-solid", "fa-pen"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-play"], [1, "slide-panel-overlay", 3, "click"], [1, "slide-panel", "open", 3, "click"], [1, "suggest-dialog-header"], [1, "suggest-dialog-title"], [1, "suggest-close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "suggest-dialog-body"], [1, "suggest-form"], [1, "suggest-field"], [1, "suggest-label"], [1, "edit-readonly-value"], [1, "edit-template-header"], ["title", "Regenerate template using AI", 1, "edit-regenerate-btn", 3, "click", "disabled"], [1, "template-editor-wrapper"], ["language", "markdown", 3, "change", "value", "readonly", "lineWrapping"], ["type", "text", 1, "suggest-input", 3, "ngModelChange", "ngModel"], [1, "suggest-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "suggest-select", 3, "ngModel"], [1, "edit-readonly-value", 2, "font-size", "13px", "color", "var(--mj-text-muted)"], ["value", "Active"], ["value", "Inactive"], [1, "result-actions", 2, "margin-top", "1rem"], ["text", "Saving...", "size", "small"], [1, "result-tags"], [1, "result-tag"], ["value", ""], [1, "suggest-submit-btn", 3, "click"], [1, "fa-solid", "fa-save"], [1, "edit-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "suggest-close-action", 3, "click"], [1, "schedule-dialog", 3, "click"], ["type", "text", "placeholder", "0 2 * * *", 1, "suggest-input", 3, "ngModelChange", "ngModel"], [1, "schedule-cron-preview"], [1, "fa-solid", "fa-info-circle"], [1, "suggest-field", "schedule-toggle-row"], ["type", "checkbox", 1, "mj-checkbox", 3, "ngModelChange", "ngModel"], [1, "fa-solid", "fa-check"], [1, "no-index-warning-dialog", 3, "click"], [1, "no-index-warning-icon"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "no-index-warning-title"], [1, "no-index-warning-message"], [1, "no-index-warning-actions"], [1, "fa-solid", "fa-gear"], [1, "slide-panel", 3, "click"], [1, "suggest-result"], [1, "entity-picker"], [1, "entity-picker-trigger", 3, "click"], [1, "fa-solid", "fa-chevron-down", "entity-picker-arrow"], [1, "entity-picker-dropdown"], [1, "use-case-options"], [1, "use-case-btn", 3, "click"], [1, "fa-solid", "fa-clone"], [1, "fa-solid", "fa-magnifying-glass"], [1, "fa-solid", "fa-tags"], [1, "suggest-submit-btn", 3, "click", "disabled"], [1, "suggestion-error"], [1, "fa-solid", "fa-table"], [1, "entity-picker-value"], [1, "fa-solid", "fa-search"], [1, "entity-picker-placeholder"], [1, "entity-picker-dropdown", 3, "mousedown"], [1, "entity-picker-search"], ["type", "text", "placeholder", "Filter entities...", 1, "entity-picker-search-input", 3, "ngModelChange", "input", "keydown", "ngModel"], [1, "entity-picker-list"], [1, "entity-picker-group"], [1, "entity-picker-empty"], [1, "entity-picker-group-header"], [1, "fa-solid", "fa-database"], [1, "entity-picker-item", 3, "entity-picker-item-selected", "entity-picker-item-focused"], [1, "entity-picker-item", 3, "click"], [1, "fa-solid", "fa-circle-exclamation"], [1, "result-section"], [1, "result-heading"], [1, "result-section", "result-thresholds"], [1, "threshold-item"], [1, "threshold-label"], [1, "threshold-value"], [1, "result-reasoning"], [1, "suggest-field", 2, "margin-top", "0.75rem"], [1, "result-actions"], [1, "save-spinner"], [1, "result-relationship"], [1, "rel-name"], [1, "rel-fields"], [1, "fa-solid", "fa-floppy-disk"], [1, "suggest-submit-btn", "suggest-try-again-btn", 3, "click"], [1, "fa-solid", "fa-rotate"]], template: function VectorManagementResourceComponent_Template(rf, ctx) { if (rf & 1) {
2211
+ i0.ɵɵconditionalCreate(0, VectorManagementResourceComponent_Conditional_0_Template, 2, 0, "div", 1)(1, VectorManagementResourceComponent_Conditional_1_Template, 59, 18);
1749
2212
  } if (rf & 2) {
1750
2213
  i0.ɵɵconditional(ctx.IsLoading ? 0 : 1);
1751
- } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.CodeEditorComponent, i3.LoadingComponent, i4.KPICardComponent, i5.DecimalPipe], styles: ["\n\n\n\n\n\n\n\n.vector-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n}\n\n\n\n.view-mode-toggle[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.25rem;\n padding: 0 24px 0;\n margin-bottom: -12px;\n}\n\n.view-mode-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.view-mode-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.view-mode-btn-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n.vector-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background: var(--mj-bg-page);\n min-height: 100%;\n}\n\n\n\n.kpi-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n}\n\n@media (max-width: 1200px) {\n .kpi-row[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .kpi-row[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n\n\n.content-area[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 300px;\n gap: 24px;\n align-items: start;\n}\n\n@media (max-width: 1024px) {\n .content-area[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n\n\n.sync-table-panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.refresh-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.refresh-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 36px;\n margin-bottom: 12px;\n opacity: 0.5;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n}\n\n\n\n.table-wrapper[_ngcontent-%COMP%] {\n overflow-x: auto;\n}\n\n.sync-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.sync-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n white-space: nowrap;\n}\n\n.sync-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n\n.sync-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.sync-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.text-right[_ngcontent-%COMP%] {\n text-align: right;\n}\n\n.text-center[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.entity-name[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n.document-name[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n.vector-count[_ngcontent-%COMP%] {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n\n.last-synced[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 12px;\n white-space: nowrap;\n}\n\n\n\n\n.actions-cell[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n align-items: center;\n justify-content: center;\n}\n\n.edit-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.edit-delete-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-delete-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n}\n\n.edit-readonly-value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n padding: 8px 0;\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n}\n\n.status-synced[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n\n.status-syncing[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text, var(--mj-status-error));\n}\n\n.status-pending[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n\n\n\n.sync-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.sync-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.sync-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n\n\n.sidebar[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.sidebar-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n}\n\n.sidebar-title[_ngcontent-%COMP%] {\n margin: 0 0 14px 0;\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sidebar-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n\n\n.health-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.health-dot[_ngcontent-%COMP%] {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.health-healthy[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-success) 50%, transparent);\n}\n\n.health-degraded[_ngcontent-%COMP%] {\n background: var(--mj-status-warning);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-warning) 50%, transparent);\n}\n\n.health-offline[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-error) 50%, transparent);\n}\n\n.health-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.health-status[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding-left: 18px;\n}\n\n\n\n.model-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.info-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.info-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.info-value[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n\n\n.gauge-container[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n}\n\n.gauge-bar[_ngcontent-%COMP%] {\n height: 8px;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n margin-bottom: 6px;\n}\n\n.gauge-fill[_ngcontent-%COMP%] {\n height: 100%;\n border-radius: 4px;\n background: var(--mj-brand-primary);\n transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 2px;\n}\n\n.gauge-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.storage-detail[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n.panel-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n\n\n.suggest-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.suggest-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n}\n\n\n\n.slide-panel-overlay[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n}\n\n.slide-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n width: 480px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow-y: auto;\n}\n\n.slide-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n.suggest-dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.suggest-dialog-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.suggest-dialog-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.suggest-close-btn[_ngcontent-%COMP%] {\n border: none;\n background: none;\n color: var(--mj-text-muted);\n font-size: 16px;\n cursor: pointer;\n padding: 4px;\n}\n\n.suggest-close-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.suggest-dialog-body[_ngcontent-%COMP%] {\n padding: 24px;\n}\n\n\n\n.suggest-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.suggest-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.suggest-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.suggest-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.suggest-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n\n.use-case-options[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.use-case-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.use-case-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.use-case-btn-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.use-case-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n\n.entity-picker[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.entity-picker-trigger[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: border-color 0.15s;\n}\n\n.entity-picker-trigger[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.entity-picker-placeholder[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n flex: 1;\n}\n\n.entity-picker-value[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n}\n\n.entity-picker-arrow[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n transition: transform 0.2s;\n}\n\n.entity-picker-dropdown[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n box-shadow: 0 8px 32px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n z-index: 100;\n max-height: 350px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.entity-picker-search[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.entity-picker-search[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.entity-picker-search-input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n}\n\n.entity-picker-search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.entity-picker-list[_ngcontent-%COMP%] {\n overflow-y: auto;\n max-height: 300px;\n padding: 4px 0;\n}\n\n.entity-picker-group-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px 4px;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n}\n\n.entity-picker-group-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.entity-picker-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 14px 7px 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.entity-picker-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.entity-picker-item-selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.entity-picker-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.entity-picker-item-selected[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.entity-picker-empty[_ngcontent-%COMP%] {\n padding: 20px 14px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n\n\n\n.template-editor-wrapper[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n min-height: 120px;\n max-height: 300px;\n}\n\n.template-editor-wrapper[_ngcontent-%COMP%] .cm-editor {\n min-height: 120px;\n max-height: 300px;\n font-size: 13px;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 20px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.suggestion-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n font-size: 13px;\n line-height: 1.4;\n}\n\n.suggestion-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.suggest-result[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.result-section[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 12px;\n}\n\n.result-section[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.result-heading[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.result-template[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-all;\n margin: 0;\n}\n\n.result-tags[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.result-tag[_ngcontent-%COMP%] {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n}\n\n.result-relationship[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.rel-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.rel-fields[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.result-thresholds[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n}\n\n.threshold-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.threshold-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.threshold-value[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.result-reasoning[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.result-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n}\n\n.suggest-close-action[_ngcontent-%COMP%] {\n padding: 10px 20px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.suggest-close-action[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n.suggest-input[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n width: 100%;\n box-sizing: border-box;\n}\n\n.suggest-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n.suggest-try-again-btn[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n}\n\n.suggest-try-again-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n\n\n.save-spinner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 0;\n}\n\n\n\n\n\n\n@media (max-width: 768px) {\n .panel-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .panel-actions[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 600px) {\n .slide-panel[_ngcontent-%COMP%] {\n width: 100vw;\n max-width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .vector-dashboard[_ngcontent-%COMP%] {\n padding: 12px;\n }\n\n .suggest-btn[_ngcontent-%COMP%] .suggest-btn-text[_ngcontent-%COMP%] {\n display: none;\n }\n}"] });
2214
+ } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.CodeEditorComponent, i3.LoadingComponent, i4.KPICardComponent, i5.DecimalPipe], styles: ["\n\n\n\n\n\n\n\n.vector-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n}\n\n\n\n.view-mode-toggle[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.25rem;\n padding: 0 24px 0;\n margin-bottom: -12px;\n}\n\n.view-mode-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.view-mode-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.view-mode-btn-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n.vector-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background: var(--mj-bg-page);\n min-height: 100%;\n}\n\n\n\n.kpi-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n}\n\n@media (max-width: 1200px) {\n .kpi-row[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .kpi-row[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n\n\n.content-area[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 300px;\n gap: 24px;\n align-items: start;\n}\n\n@media (max-width: 1024px) {\n .content-area[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n\n\n.sync-table-panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.refresh-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.refresh-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 36px;\n margin-bottom: 12px;\n opacity: 0.5;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n}\n\n\n\n.table-wrapper[_ngcontent-%COMP%] {\n overflow-x: auto;\n}\n\n.sync-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.sync-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n white-space: nowrap;\n}\n\n.sync-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n\n.sync-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.sync-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.text-right[_ngcontent-%COMP%] {\n text-align: right;\n}\n\n.text-center[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.entity-name[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n.document-name[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n.vector-count[_ngcontent-%COMP%] {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n\n.last-synced[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 12px;\n white-space: nowrap;\n}\n\n\n\n\n.actions-cell[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n align-items: center;\n justify-content: center;\n}\n\n.schedule-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.schedule-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.edit-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n\n\n.schedule-dialog[_ngcontent-%COMP%] {\n width: 440px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);\n overflow: hidden;\n}\n\n.schedule-cron-preview[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 0 0;\n font-size: 0.82rem;\n color: var(--mj-text-muted);\n}\n\n.schedule-toggle-row[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n}\n\n.edit-delete-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-delete-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n}\n\n.edit-readonly-value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n padding: 8px 0;\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n}\n\n.status-synced[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n\n.status-syncing[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text, var(--mj-status-error));\n}\n\n.status-pending[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n\n\n\n.sync-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.sync-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.sync-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n\n\n.sidebar[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.sidebar-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n}\n\n.sidebar-title[_ngcontent-%COMP%] {\n margin: 0 0 14px 0;\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sidebar-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n\n\n.health-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.health-dot[_ngcontent-%COMP%] {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.health-healthy[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-success) 50%, transparent);\n}\n\n.health-degraded[_ngcontent-%COMP%] {\n background: var(--mj-status-warning);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-warning) 50%, transparent);\n}\n\n.health-offline[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-error) 50%, transparent);\n}\n\n.health-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.health-status[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding-left: 18px;\n}\n\n\n\n.model-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.info-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.info-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.info-value[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n\n\n.gauge-container[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n}\n\n.gauge-bar[_ngcontent-%COMP%] {\n height: 8px;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n margin-bottom: 6px;\n}\n\n.gauge-fill[_ngcontent-%COMP%] {\n height: 100%;\n border-radius: 4px;\n background: var(--mj-brand-primary);\n transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 2px;\n}\n\n.gauge-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.storage-detail[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n.panel-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n\n\n.suggest-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.suggest-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n}\n\n\n\n.slide-panel-overlay[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 100000;\n}\n\n.slide-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n width: 480px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow-y: auto;\n}\n\n.slide-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n.suggest-dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.suggest-dialog-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.suggest-dialog-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.suggest-close-btn[_ngcontent-%COMP%] {\n border: none;\n background: none;\n color: var(--mj-text-muted);\n font-size: 16px;\n cursor: pointer;\n padding: 4px;\n}\n\n.suggest-close-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.suggest-dialog-body[_ngcontent-%COMP%] {\n padding: 24px;\n}\n\n\n\n.suggest-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.suggest-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.suggest-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.suggest-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.suggest-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n\n.use-case-options[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.use-case-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.use-case-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.use-case-btn-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.use-case-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n\n.entity-picker[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.entity-picker-trigger[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: border-color 0.15s;\n}\n\n.entity-picker-trigger[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.entity-picker-placeholder[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n flex: 1;\n}\n\n.entity-picker-value[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n}\n\n.entity-picker-arrow[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n transition: transform 0.2s;\n}\n\n.entity-picker-dropdown[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n box-shadow: 0 8px 32px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n z-index: 100;\n max-height: 350px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.entity-picker-search[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.entity-picker-search[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.entity-picker-search-input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n}\n\n.entity-picker-search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.entity-picker-list[_ngcontent-%COMP%] {\n overflow-y: auto;\n max-height: 300px;\n padding: 4px 0;\n}\n\n.entity-picker-group-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px 4px;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n}\n\n.entity-picker-group-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.entity-picker-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 14px 7px 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.entity-picker-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.entity-picker-item-selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.entity-picker-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.entity-picker-item-selected[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.entity-picker-item-focused[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-hover);\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: -2px;\n}\n\n.entity-picker-empty[_ngcontent-%COMP%] {\n padding: 20px 14px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n\n\n\n.template-editor-wrapper[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n min-height: 120px;\n max-height: 300px;\n}\n\n.template-editor-wrapper[_ngcontent-%COMP%] .cm-editor {\n min-height: 120px;\n max-height: 300px;\n font-size: 13px;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 20px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.suggestion-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n font-size: 13px;\n line-height: 1.4;\n}\n\n.suggestion-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.suggest-result[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.result-section[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 12px;\n}\n\n.result-section[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.result-heading[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.result-template[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-all;\n margin: 0;\n}\n\n.result-tags[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.result-tag[_ngcontent-%COMP%] {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n}\n\n.result-relationship[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.rel-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.rel-fields[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.result-thresholds[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n}\n\n.threshold-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.threshold-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.threshold-value[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.result-reasoning[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.result-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n}\n\n.suggest-close-action[_ngcontent-%COMP%] {\n padding: 10px 20px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.suggest-close-action[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n.suggest-input[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n width: 100%;\n box-sizing: border-box;\n}\n\n.suggest-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n.suggest-try-again-btn[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n}\n\n.suggest-try-again-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n\n\n.save-spinner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 0;\n}\n\n\n\n.edit-template-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.edit-regenerate-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n white-space: nowrap;\n}\n\n.edit-regenerate-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.edit-regenerate-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.no-index-warning-dialog[_ngcontent-%COMP%] {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 440px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 20px 60px color-mix(in srgb, var(--mj-text-primary) 20%, transparent);\n padding: 32px;\n text-align: center;\n}\n\n.no-index-warning-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 56px;\n height: 56px;\n margin: 0 auto 16px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n}\n\n.no-index-warning-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-status-warning);\n}\n\n.no-index-warning-title[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.no-index-warning-message[_ngcontent-%COMP%] {\n margin: 0 0 24px 0;\n font-size: 14px;\n line-height: 1.5;\n color: var(--mj-text-secondary);\n}\n\n.no-index-warning-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n justify-content: center;\n}\n\n\n\n\n\n\n@media (max-width: 768px) {\n .panel-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .panel-actions[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 600px) {\n .slide-panel[_ngcontent-%COMP%] {\n width: 100vw;\n max-width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .vector-dashboard[_ngcontent-%COMP%] {\n padding: 12px;\n }\n\n .suggest-btn[_ngcontent-%COMP%] .suggest-btn-text[_ngcontent-%COMP%] {\n display: none;\n }\n}"] });
1752
2215
  };
1753
2216
  VectorManagementResourceComponent = __decorate([
1754
2217
  RegisterClass(BaseResourceComponent, 'VectorManagementResource')
@@ -1756,11 +2219,14 @@ VectorManagementResourceComponent = __decorate([
1756
2219
  export { VectorManagementResourceComponent };
1757
2220
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(VectorManagementResourceComponent, [{
1758
2221
  type: Component,
1759
- args: [{ standalone: false, selector: 'app-vector-management-resource', template: "@if (IsLoading) {\n <div class=\"vector-loading\">\n <mj-loading text=\"Loading vector management data...\"></mj-loading>\n </div>\n} @else {\n <div class=\"vector-dashboard\">\n <!-- View Mode Toggle -->\n @if (!EmbeddedMode) {\n <div class=\"view-mode-toggle\">\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'index'\" (click)=\"ViewMode = 'index'\">\n <i class=\"fa-solid fa-cubes\"></i> Index View\n </button>\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'operations'\" (click)=\"ViewMode = 'operations'\">\n <i class=\"fa-solid fa-gauge-high\"></i> Operations\n </button>\n </div>\n }\n\n <!-- KPI Cards Row -->\n <div class=\"kpi-row\">\n @for (card of KPICards; track card.title) {\n <app-kpi-card [data]=\"card\"></app-kpi-card>\n }\n </div>\n\n <!-- Main Content Area: Table + Sidebar -->\n <div class=\"content-area\">\n <!-- Entity Sync Table -->\n <div class=\"sync-table-panel\">\n <div class=\"panel-header\">\n <h3 class=\"panel-title\">\n <i class=\"fa-solid fa-table-list\"></i>\n Entity Sync Status\n </h3>\n <div class=\"panel-actions\">\n <button class=\"suggest-btn\" (click)=\"OpenSuggestDialog()\" title=\"Use AI to suggest an Entity Document template\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <span class=\"suggest-btn-text\">Suggest Document</span>\n </button>\n <button class=\"refresh-btn\" (click)=\"LoadData()\" title=\"Refresh data\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Refresh\n </button>\n </div>\n </div>\n\n @if (SyncRows.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>No entity documents configured for vectorization.</p>\n </div>\n } @else {\n <div class=\"table-wrapper\">\n <table class=\"sync-table\">\n <thead>\n <tr>\n <th>Entity</th>\n <th>Document</th>\n <th class=\"text-right\">Vectors</th>\n <th>Last Synced</th>\n <th>Status</th>\n <th class=\"text-center\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (row of SyncRows; track row.EntityDocumentID) {\n <tr>\n <td class=\"entity-name\">{{ row.EntityName }}</td>\n <td class=\"document-name\">{{ row.DocumentName }}</td>\n <td class=\"text-right vector-count\">{{ row.VectorCount | number }}</td>\n <td class=\"last-synced\">{{ FormatDate(row.LastSynced) }}</td>\n <td>\n <span class=\"status-badge\" [class]=\"GetStatusClass(row.Status)\">\n <i [class]=\"GetStatusIcon(row.Status)\"></i>\n @if (row.Status === 'Syncing' && row.PercentComplete > 0) {\n {{ row.PercentComplete }}%\n } @else {\n {{ row.Status }}\n }\n </span>\n </td>\n <td class=\"text-center actions-cell\">\n <button\n class=\"sync-btn\"\n [disabled]=\"SyncingIds.has(row.EntityDocumentID)\"\n (click)=\"SyncEntity(row.EntityDocumentID)\"\n title=\"Sync now\">\n @if (SyncingIds.has(row.EntityDocumentID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n {{ row.PercentComplete > 0 ? row.PercentComplete + '%' : 'Sync' }}\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Sync\n }\n </button>\n <button\n class=\"edit-btn\"\n (click)=\"OpenEditPanel(row.EntityDocumentID)\"\n title=\"Edit entity document\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n\n <!-- Sidebar Panels -->\n <div class=\"sidebar\">\n <!-- Vector DB Health -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-heart-pulse\"></i>\n Vector DB Health\n </h4>\n <div class=\"health-row\">\n <span class=\"health-dot\" [class]=\"DBHealthClass\"></span>\n <span class=\"health-label\">{{ VectorDBName }}</span>\n </div>\n <div class=\"health-status\">{{ VectorDBStatus }}</div>\n </div>\n\n <!-- Embedding Model Info -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-microchip\"></i>\n Embedding Model\n </h4>\n <div class=\"model-info\">\n <div class=\"info-row\">\n <span class=\"info-label\">Model</span>\n <span class=\"info-value\">{{ EmbeddingModel.Name }}</span>\n </div>\n @if (EmbeddingModel.Dimensions != null) {\n <div class=\"info-row\">\n <span class=\"info-label\">Dimensions</span>\n <span class=\"info-value\">{{ EmbeddingModel.Dimensions | number }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Storage Usage -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-hard-drive\"></i>\n Vectorization Coverage\n </h4>\n <div class=\"gauge-container\">\n <div class=\"gauge-bar\">\n <div class=\"gauge-fill\" [style.width.%]=\"StorageUsagePercent\"></div>\n </div>\n <div class=\"gauge-label\">{{ StorageLabel }} of records vectorized</div>\n </div>\n <div class=\"storage-detail\">\n {{ TotalVectors | number }} vectors stored\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Edit Entity Document Slide-in Panel -->\n @if (ShowEditPanel) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseEditPanel()\">\n <div class=\"slide-panel open\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-pen\"></i>\n Edit Entity Document\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseEditPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <span class=\"edit-readonly-value\">{{ EditDocEntityName }}</span>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"EditDocName\" />\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocAIModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (EditFilteredIndexes.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of EditFilteredIndexes; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes for this database \u2014 one will be created automatically on sync\n </span>\n }\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Status</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocStatus\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </div>\n <div class=\"result-actions\" style=\"margin-top: 1rem\">\n @if (IsEditSaving || IsEditDeleting) {\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveEditedDocument()\">\n <i class=\"fa-solid fa-save\"></i> Save Changes\n </button>\n <button class=\"edit-delete-btn\" (click)=\"DeleteEntityDocument()\">\n <i class=\"fa-solid fa-trash-can\"></i> Delete\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseEditPanel()\">\n Cancel\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Suggest Document Slide-in Panel -->\n @if (ShowSuggestDialog) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseSuggestDialog()\">\n <div class=\"slide-panel\" [class.open]=\"ShowSuggestDialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n AI Document Suggestion\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseSuggestDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n @if (!SuggestionResult) {\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <div class=\"entity-picker\">\n <button class=\"entity-picker-trigger\" (click)=\"ToggleEntityPicker()\">\n @if (SuggestEntityName) {\n <i class=\"fa-solid fa-table\"></i>\n <span class=\"entity-picker-value\">{{ SuggestEntityName }}</span>\n } @else {\n <i class=\"fa-solid fa-search\"></i>\n <span class=\"entity-picker-placeholder\">Search and select an entity...</span>\n }\n <i class=\"fa-solid fa-chevron-down entity-picker-arrow\"></i>\n </button>\n @if (ShowEntityPicker) {\n <div class=\"entity-picker-dropdown\">\n <div class=\"entity-picker-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input type=\"text\"\n class=\"entity-picker-search-input\"\n placeholder=\"Filter entities...\"\n [(ngModel)]=\"EntitySearchText\"\n (input)=\"FilterEntities()\"\n autofocus />\n </div>\n <div class=\"entity-picker-list\">\n @for (group of FilteredEntityGroups; track group.SchemaName) {\n <div class=\"entity-picker-group\">\n <div class=\"entity-picker-group-header\">\n <i class=\"fa-solid fa-database\"></i>\n {{ group.SchemaName }}\n </div>\n @for (entity of group.Entities; track entity.ID) {\n <button class=\"entity-picker-item\"\n [class.entity-picker-item-selected]=\"entity.Name === SuggestEntityName\"\n (click)=\"SelectEntity(entity.Name)\">\n <i class=\"fa-solid fa-table\"></i>\n {{ entity.Name }}\n </button>\n }\n </div>\n }\n @if (FilteredEntityGroups.length === 0) {\n <div class=\"entity-picker-empty\">\n No entities matching \"{{ EntitySearchText }}\"\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Use Case</label>\n <div class=\"use-case-options\">\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'duplicate detection'\"\n (click)=\"SuggestUseCase = 'duplicate detection'\">\n <i class=\"fa-solid fa-clone\"></i>\n Duplicate Detection\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'search'\"\n (click)=\"SuggestUseCase = 'search'\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n Search\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'classification'\"\n (click)=\"SuggestUseCase = 'classification'\">\n <i class=\"fa-solid fa-tags\"></i>\n Classification\n </button>\n </div>\n </div>\n <button class=\"suggest-submit-btn\"\n [disabled]=\"IsSuggesting || !SuggestEntityName\"\n (click)=\"RunSuggestion()\">\n @if (IsSuggesting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Generating with AI...\n } @else {\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Generate Template\n }\n </button>\n @if (SuggestionError) {\n <div class=\"suggestion-error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ SuggestionError }}\n </div>\n }\n </div>\n } @else {\n <div class=\"suggest-result\">\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Suggested Template</h4>\n <div class=\"template-editor-wrapper\">\n <mj-code-editor\n [value]=\"EditableTemplate\"\n language=\"markdown\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"OnTemplateChange($event)\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Selected Fields</h4>\n <div class=\"result-tags\">\n @for (field of SuggestionResult.selectedFields; track field) {\n <span class=\"result-tag\">{{ field }}</span>\n }\n </div>\n </div>\n @if (SuggestionResult.selectedRelationships.length > 0) {\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Related Entities</h4>\n @for (rel of SuggestionResult.selectedRelationships; track rel.name) {\n <div class=\"result-relationship\">\n <span class=\"rel-name\">{{ rel.name }}</span>\n <span class=\"rel-fields\">{{ rel.fields.join(', ') }}</span>\n </div>\n }\n </div>\n }\n <div class=\"result-section result-thresholds\">\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Potential Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.potentialMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Absolute Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.absoluteMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Reasoning</h4>\n <p class=\"result-reasoning\">{{ SuggestionResult.reasoning }}</p>\n </div>\n <div class=\"result-section\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"SaveDocumentName\" />\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedEmbeddingModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (FilteredIndexesForSelectedDB.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of FilteredIndexesForSelectedDB; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes yet \u2014 create one in Configuration > Vector Database, or one will be created on sync\n </span>\n }\n </div>\n </div>\n <div class=\"result-actions\">\n @if (IsSavingDocument) {\n <div class=\"save-spinner\">\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveAsEntityDocument()\">\n <i class=\"fa-solid fa-floppy-disk\"></i> Save as Entity Document\n </button>\n <button class=\"suggest-submit-btn suggest-try-again-btn\" (click)=\"ClearSuggestion()\">\n <i class=\"fa-solid fa-rotate\"></i> Try Again\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseSuggestDialog()\">\n Close\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n}\n", styles: ["/* ================================================================\n Vector Management Dashboard\n All colors use MJ design tokens from _tokens.scss\n ================================================================ */\n\n/* --- Loading state --- */\n.vector-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n}\n\n/* --- View Mode Toggle --- */\n.view-mode-toggle {\n display: flex;\n gap: 0.25rem;\n padding: 0 24px 0;\n margin-bottom: -12px;\n}\n\n.view-mode-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.view-mode-btn:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.view-mode-btn-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* --- Dashboard container --- */\n.vector-dashboard {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background: var(--mj-bg-page);\n min-height: 100%;\n}\n\n/* --- KPI cards row --- */\n.kpi-row {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n}\n\n@media (max-width: 1200px) {\n .kpi-row {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .kpi-row {\n grid-template-columns: 1fr;\n }\n}\n\n/* --- Main content: table + sidebar --- */\n.content-area {\n display: grid;\n grid-template-columns: 1fr 300px;\n gap: 24px;\n align-items: start;\n}\n\n@media (max-width: 1024px) {\n .content-area {\n grid-template-columns: 1fr;\n }\n}\n\n/* --- Sync table panel --- */\n.sync-table-panel {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-title {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.refresh-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.refresh-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* --- Empty state --- */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n}\n\n.empty-state i {\n font-size: 36px;\n margin-bottom: 12px;\n opacity: 0.5;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 14px;\n}\n\n/* --- Table --- */\n.table-wrapper {\n overflow-x: auto;\n}\n\n.sync-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.sync-table th {\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n white-space: nowrap;\n}\n\n.sync-table td {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n\n.sync-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.sync-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.text-right {\n text-align: right;\n}\n\n.text-center {\n text-align: center;\n}\n\n.entity-name {\n font-weight: 600;\n}\n\n.document-name {\n color: var(--mj-text-secondary);\n}\n\n.vector-count {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n\n.last-synced {\n color: var(--mj-text-secondary);\n font-size: 12px;\n white-space: nowrap;\n}\n\n/* --- Action buttons in table --- */\n\n.actions-cell {\n display: flex;\n gap: 6px;\n align-items: center;\n justify-content: center;\n}\n\n.edit-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.edit-delete-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-delete-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n}\n\n.edit-readonly-value {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n padding: 8px 0;\n}\n\n/* --- Status badges --- */\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n}\n\n.status-synced {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n\n.status-syncing {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-error {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text, var(--mj-status-error));\n}\n\n.status-pending {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n\n/* --- Sync button --- */\n.sync-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.sync-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.sync-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ================================================================\n Sidebar\n ================================================================ */\n.sidebar {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.sidebar-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n}\n\n.sidebar-title {\n margin: 0 0 14px 0;\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sidebar-title i {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n/* --- Vector DB Health --- */\n.health-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.health-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.health-healthy {\n background: var(--mj-status-success);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-success) 50%, transparent);\n}\n\n.health-degraded {\n background: var(--mj-status-warning);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-warning) 50%, transparent);\n}\n\n.health-offline {\n background: var(--mj-status-error);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-error) 50%, transparent);\n}\n\n.health-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.health-status {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding-left: 18px;\n}\n\n/* --- Model Info --- */\n.model-info {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.info-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.info-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.info-value {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n/* --- Storage / Coverage Gauge --- */\n.gauge-container {\n margin-bottom: 8px;\n}\n\n.gauge-bar {\n height: 8px;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n margin-bottom: 6px;\n}\n\n.gauge-fill {\n height: 100%;\n border-radius: 4px;\n background: var(--mj-brand-primary);\n transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 2px;\n}\n\n.gauge-label {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.storage-detail {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* --- Panel actions row --- */\n.panel-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* --- Suggest Document Button --- */\n.suggest-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.suggest-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n}\n\n/* --- Slide-in Panel Overlay --- */\n.slide-panel-overlay {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n}\n\n.slide-panel {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n width: 480px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow-y: auto;\n}\n\n.slide-panel.open {\n transform: translateX(0);\n}\n\n.suggest-dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.suggest-dialog-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.suggest-dialog-title i {\n color: var(--mj-brand-primary);\n}\n\n.suggest-close-btn {\n border: none;\n background: none;\n color: var(--mj-text-muted);\n font-size: 16px;\n cursor: pointer;\n padding: 4px;\n}\n\n.suggest-close-btn:hover {\n color: var(--mj-text-primary);\n}\n\n.suggest-dialog-body {\n padding: 24px;\n}\n\n/* --- Suggest Form --- */\n.suggest-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.suggest-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.suggest-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.suggest-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.suggest-select:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* ---- Use Case Button Group ---- */\n\n.use-case-options {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.use-case-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.use-case-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.use-case-btn-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.use-case-btn i {\n font-size: 12px;\n}\n\n/* ---- Entity Picker (grouped by schema) ---- */\n\n.entity-picker {\n position: relative;\n}\n\n.entity-picker-trigger {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: border-color 0.15s;\n}\n\n.entity-picker-trigger:hover {\n border-color: var(--mj-border-strong);\n}\n\n.entity-picker-placeholder {\n color: var(--mj-text-muted);\n flex: 1;\n}\n\n.entity-picker-value {\n flex: 1;\n font-weight: 500;\n}\n\n.entity-picker-arrow {\n font-size: 10px;\n color: var(--mj-text-muted);\n transition: transform 0.2s;\n}\n\n.entity-picker-dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n box-shadow: 0 8px 32px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n z-index: 100;\n max-height: 350px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.entity-picker-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.entity-picker-search i {\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.entity-picker-search-input {\n flex: 1;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n}\n\n.entity-picker-search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.entity-picker-list {\n overflow-y: auto;\n max-height: 300px;\n padding: 4px 0;\n}\n\n.entity-picker-group-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px 4px;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n}\n\n.entity-picker-group-header i {\n font-size: 10px;\n}\n\n.entity-picker-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 14px 7px 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.entity-picker-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.entity-picker-item-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.entity-picker-item i {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.entity-picker-item-selected i {\n color: var(--mj-brand-primary);\n}\n\n.entity-picker-empty {\n padding: 20px 14px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n/* ---- Template Editor ---- */\n\n.template-editor-wrapper {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n min-height: 120px;\n max-height: 300px;\n}\n\n.template-editor-wrapper ::ng-deep .cm-editor {\n min-height: 120px;\n max-height: 300px;\n font-size: 13px;\n}\n\n.suggest-submit-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 20px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.suggest-submit-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.suggestion-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n font-size: 13px;\n line-height: 1.4;\n}\n\n.suggestion-error i {\n flex-shrink: 0;\n}\n\n.suggest-submit-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* --- Suggestion Result --- */\n.suggest-result {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.result-section {\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 12px;\n}\n\n.result-section:last-child {\n border-bottom: none;\n}\n\n.result-heading {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.result-template {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-all;\n margin: 0;\n}\n\n.result-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.result-tag {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n}\n\n.result-relationship {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.rel-name {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.rel-fields {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.result-thresholds {\n display: flex;\n gap: 24px;\n}\n\n.threshold-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.threshold-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.threshold-value {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.result-reasoning {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.result-actions {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n}\n\n.suggest-close-action {\n padding: 10px 20px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.suggest-close-action:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* --- Suggest Input --- */\n.suggest-input {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n width: 100%;\n box-sizing: border-box;\n}\n\n.suggest-input:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* --- Try Again Button (secondary style) --- */\n.suggest-try-again-btn {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n}\n\n.suggest-try-again-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n/* --- Save Spinner --- */\n.save-spinner {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 0;\n}\n\n/* ================================================================\n Responsive \u2014 Vector Management\n ================================================================ */\n\n@media (max-width: 768px) {\n .panel-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .panel-actions {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 600px) {\n .slide-panel {\n width: 100vw;\n max-width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .vector-dashboard {\n padding: 12px;\n }\n\n .suggest-btn .suggest-btn-text {\n display: none;\n }\n}\n"] }]
2222
+ args: [{ standalone: false, selector: 'app-vector-management-resource', template: "@if (IsLoading) {\n <div class=\"vector-loading\">\n <mj-loading text=\"Loading vector management data...\"></mj-loading>\n </div>\n} @else {\n <div class=\"vector-dashboard\">\n <!-- View Mode Toggle -->\n @if (!EmbeddedMode) {\n <div class=\"view-mode-toggle\">\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'index'\" (click)=\"ViewMode = 'index'\">\n <i class=\"fa-solid fa-cubes\"></i> Index View\n </button>\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'operations'\" (click)=\"ViewMode = 'operations'\">\n <i class=\"fa-solid fa-gauge-high\"></i> Operations\n </button>\n </div>\n }\n\n <!-- KPI Cards Row -->\n <div class=\"kpi-row\">\n @for (card of KPICards; track card.title) {\n <app-kpi-card [data]=\"card\"></app-kpi-card>\n }\n </div>\n\n <!-- Main Content Area: Table + Sidebar -->\n <div class=\"content-area\">\n <!-- Entity Sync Table -->\n <div class=\"sync-table-panel\">\n <div class=\"panel-header\">\n <h3 class=\"panel-title\">\n <i class=\"fa-solid fa-table-list\"></i>\n Entity Sync Status\n </h3>\n <div class=\"panel-actions\">\n <button class=\"suggest-btn\" (click)=\"OpenSuggestDialog()\" title=\"Use AI to suggest an Entity Document template\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <span class=\"suggest-btn-text\">Suggest Document</span>\n </button>\n <button class=\"refresh-btn\" (click)=\"LoadData()\" title=\"Refresh data\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Refresh\n </button>\n </div>\n </div>\n\n @if (SyncRows.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>No entity documents configured for vectorization.</p>\n </div>\n } @else {\n <div class=\"table-wrapper\">\n <table class=\"sync-table\">\n <thead>\n <tr>\n <th>Entity</th>\n <th>Document</th>\n <th class=\"text-right\">Vectors</th>\n <th>Last Synced</th>\n <th>Status</th>\n <th class=\"text-center\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (row of SyncRows; track row.EntityDocumentID) {\n <tr>\n <td class=\"entity-name\">{{ row.EntityName }}</td>\n <td class=\"document-name\">{{ row.DocumentName }}</td>\n <td class=\"text-right vector-count\">{{ row.VectorCount | number }}</td>\n <td class=\"last-synced\">{{ FormatDate(row.LastSynced) }}</td>\n <td>\n <span class=\"status-badge\" [class]=\"GetStatusClass(row.Status)\">\n <i [class]=\"GetStatusIcon(row.Status)\"></i>\n @if (row.Status === 'Syncing' && row.PercentComplete > 0) {\n {{ row.PercentComplete }}%\n } @else {\n {{ row.Status }}\n }\n </span>\n </td>\n <td class=\"text-center actions-cell\">\n <button\n class=\"sync-btn\"\n [disabled]=\"SyncingIds.has(row.EntityDocumentID)\"\n (click)=\"SyncEntity(row.EntityDocumentID)\"\n title=\"Sync now\">\n @if (SyncingIds.has(row.EntityDocumentID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n {{ row.PercentComplete > 0 ? row.PercentComplete + '%' : 'Sync' }}\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Sync\n }\n </button>\n <button\n class=\"schedule-btn\"\n (click)=\"OpenScheduleSyncDialog(row.EntityDocumentID)\"\n title=\"Schedule recurring sync\">\n <i class=\"fa-regular fa-clock\"></i>\n </button>\n <button\n class=\"edit-btn\"\n (click)=\"OpenEditPanel(row.EntityDocumentID)\"\n title=\"Edit entity document\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n\n <!-- Sidebar Panels -->\n <div class=\"sidebar\">\n <!-- Vector DB Health -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-heart-pulse\"></i>\n Vector DB Health\n </h4>\n <div class=\"health-row\">\n <span class=\"health-dot\" [class]=\"DBHealthClass\"></span>\n <span class=\"health-label\">{{ VectorDBName }}</span>\n </div>\n <div class=\"health-status\">{{ VectorDBStatus }}</div>\n </div>\n\n <!-- Embedding Model Info -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-microchip\"></i>\n Embedding Model\n </h4>\n <div class=\"model-info\">\n <div class=\"info-row\">\n <span class=\"info-label\">Model</span>\n <span class=\"info-value\">{{ EmbeddingModel.Name }}</span>\n </div>\n @if (EmbeddingModel.Dimensions != null) {\n <div class=\"info-row\">\n <span class=\"info-label\">Dimensions</span>\n <span class=\"info-value\">{{ EmbeddingModel.Dimensions | number }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Storage Usage -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-hard-drive\"></i>\n Vectorization Coverage\n </h4>\n <div class=\"gauge-container\">\n <div class=\"gauge-bar\">\n <div class=\"gauge-fill\" [style.width.%]=\"StorageUsagePercent\"></div>\n </div>\n <div class=\"gauge-label\">{{ StorageLabel }} of records vectorized</div>\n </div>\n <div class=\"storage-detail\">\n {{ TotalVectors | number }} vectors stored\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Edit Entity Document Slide-in Panel -->\n @if (ShowEditPanel) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseEditPanel()\">\n <div class=\"slide-panel open\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-pen\"></i>\n Edit Entity Document\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseEditPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <span class=\"edit-readonly-value\">{{ EditDocEntityName }}</span>\n </div>\n\n <!-- Template Section -->\n <div class=\"suggest-field\">\n <div class=\"edit-template-header\">\n <label class=\"suggest-label\">Template</label>\n <button class=\"edit-regenerate-btn\"\n [disabled]=\"IsEditRegenerating\"\n (click)=\"RegenerateTemplate()\"\n title=\"Regenerate template using AI\">\n @if (IsEditRegenerating) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Regenerating...\n } @else {\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Regenerate with AI\n }\n </button>\n </div>\n <div class=\"template-editor-wrapper\">\n <mj-code-editor\n [value]=\"EditDocTemplate\"\n language=\"markdown\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"OnEditTemplateChange($event)\">\n </mj-code-editor>\n </div>\n </div>\n\n <!-- Selected Fields (parsed from template) -->\n @if (EditDocSelectedFields.length > 0) {\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Selected Fields</label>\n <div class=\"result-tags\">\n @for (field of EditDocSelectedFields; track field) {\n <span class=\"result-tag\">{{ field }}</span>\n }\n </div>\n </div>\n }\n\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"EditDocName\" />\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocAIModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (EditFilteredIndexes.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of EditFilteredIndexes; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes for this database \u2014 one will be created automatically on sync\n </span>\n }\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Status</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocStatus\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </div>\n <div class=\"result-actions\" style=\"margin-top: 1rem\">\n @if (IsEditSaving || IsEditDeleting) {\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveEditedDocument()\">\n <i class=\"fa-solid fa-save\"></i> Save Changes\n </button>\n <button class=\"edit-delete-btn\" (click)=\"DeleteEntityDocument()\">\n <i class=\"fa-solid fa-trash-can\"></i> Delete\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseEditPanel()\">\n Cancel\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Schedule Sync Dialog -->\n @if (ShowScheduleSyncDialog) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseScheduleSyncDialog()\">\n <div class=\"schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-regular fa-clock\"></i>\n Schedule Vector Sync\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseScheduleSyncDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity Document</label>\n <span class=\"edit-readonly-value\">{{ ScheduleSyncDocName }}</span>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Action</label>\n <span class=\"edit-readonly-value\">__VectorizeEntity</span>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Cron Expression</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"ScheduleSyncCron\" placeholder=\"0 2 * * *\" />\n <div class=\"schedule-cron-preview\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{ GetScheduleCronPreview(ScheduleSyncCron) }}\n </div>\n </div>\n <div class=\"suggest-field schedule-toggle-row\">\n <label class=\"suggest-label\">Enabled</label>\n <input type=\"checkbox\" class=\"mj-checkbox\" [(ngModel)]=\"ScheduleSyncEnabled\" />\n </div>\n <div class=\"result-actions\" style=\"margin-top: 1rem\">\n @if (ScheduleSyncSaving) {\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveScheduleSync()\">\n <i class=\"fa-solid fa-check\"></i> Create Schedule\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseScheduleSyncDialog()\">\n Cancel\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- No Vector Index Warning Dialog -->\n @if (ShowNoIndexWarning) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseNoIndexWarning()\">\n <div class=\"no-index-warning-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"no-index-warning-icon\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n </div>\n <h3 class=\"no-index-warning-title\">Vector Index Required</h3>\n <p class=\"no-index-warning-message\">\n You need to create at least one vector database and index before creating entity documents.\n Go to the Configuration section to set up a vector database and create an index.\n </p>\n <div class=\"no-index-warning-actions\">\n <button class=\"suggest-submit-btn\" (click)=\"GoToConfiguration()\">\n <i class=\"fa-solid fa-gear\"></i> Go to Configuration\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseNoIndexWarning()\">\n Close\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Suggest Document Slide-in Panel -->\n @if (ShowSuggestDialog) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseSuggestDialog()\">\n <div class=\"slide-panel\" [class.open]=\"ShowSuggestDialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n AI Document Suggestion\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseSuggestDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n @if (!SuggestionResult) {\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <div class=\"entity-picker\">\n <button class=\"entity-picker-trigger\" (click)=\"ToggleEntityPicker()\">\n @if (SuggestEntityName) {\n <i class=\"fa-solid fa-table\"></i>\n <span class=\"entity-picker-value\">{{ SuggestEntityName }}</span>\n } @else {\n <i class=\"fa-solid fa-search\"></i>\n <span class=\"entity-picker-placeholder\">Search and select an entity...</span>\n }\n <i class=\"fa-solid fa-chevron-down entity-picker-arrow\"></i>\n </button>\n @if (ShowEntityPicker) {\n <div class=\"entity-picker-dropdown\" (mousedown)=\"$event.stopPropagation()\">\n <div class=\"entity-picker-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input #entitySearchInput\n type=\"text\"\n class=\"entity-picker-search-input\"\n placeholder=\"Filter entities...\"\n [(ngModel)]=\"EntitySearchText\"\n (input)=\"FilterEntities()\"\n (keydown)=\"OnEntityPickerKeyDown($event)\" />\n </div>\n <div class=\"entity-picker-list\">\n @for (group of FilteredEntityGroups; track group.SchemaName) {\n <div class=\"entity-picker-group\">\n <div class=\"entity-picker-group-header\">\n <i class=\"fa-solid fa-database\"></i>\n {{ group.SchemaName }}\n </div>\n @for (entity of group.Entities; track entity.ID) {\n <button class=\"entity-picker-item\"\n [class.entity-picker-item-selected]=\"entity.Name === SuggestEntityName\"\n [class.entity-picker-item-focused]=\"FlatFilteredEntities[SelectedEntityIndex]?.ID === entity.ID\"\n (click)=\"SelectEntity(entity.Name)\">\n <i class=\"fa-solid fa-table\"></i>\n {{ entity.Name }}\n </button>\n }\n </div>\n }\n @if (FilteredEntityGroups.length === 0) {\n <div class=\"entity-picker-empty\">\n No entities matching \"{{ EntitySearchText }}\"\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Use Case</label>\n <div class=\"use-case-options\">\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'duplicate detection'\"\n (click)=\"SuggestUseCase = 'duplicate detection'\">\n <i class=\"fa-solid fa-clone\"></i>\n Duplicate Detection\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'search'\"\n (click)=\"SuggestUseCase = 'search'\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n Search\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'classification'\"\n (click)=\"SuggestUseCase = 'classification'\">\n <i class=\"fa-solid fa-tags\"></i>\n Classification\n </button>\n </div>\n </div>\n <button class=\"suggest-submit-btn\"\n [disabled]=\"IsSuggesting || !SuggestEntityName\"\n (click)=\"RunSuggestion()\">\n @if (IsSuggesting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Generating with AI...\n } @else {\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Generate Template\n }\n </button>\n @if (SuggestionError) {\n <div class=\"suggestion-error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ SuggestionError }}\n </div>\n }\n </div>\n } @else {\n <div class=\"suggest-result\">\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Suggested Template</h4>\n <div class=\"template-editor-wrapper\">\n <mj-code-editor\n [value]=\"EditableTemplate\"\n language=\"markdown\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"OnTemplateChange($event)\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Selected Fields</h4>\n <div class=\"result-tags\">\n @for (field of SuggestionResult.selectedFields; track field) {\n <span class=\"result-tag\">{{ field }}</span>\n }\n </div>\n </div>\n @if (SuggestionResult.selectedRelationships.length > 0) {\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Related Entities</h4>\n @for (rel of SuggestionResult.selectedRelationships; track rel.name) {\n <div class=\"result-relationship\">\n <span class=\"rel-name\">{{ rel.name }}</span>\n <span class=\"rel-fields\">{{ rel.fields.join(', ') }}</span>\n </div>\n }\n </div>\n }\n <div class=\"result-section result-thresholds\">\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Potential Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.potentialMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Absolute Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.absoluteMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Reasoning</h4>\n <p class=\"result-reasoning\">{{ SuggestionResult.reasoning }}</p>\n </div>\n <div class=\"result-section\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"SaveDocumentName\" />\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedEmbeddingModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (FilteredIndexesForSelectedDB.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of FilteredIndexesForSelectedDB; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes yet \u2014 create one in Configuration > Vector Database, or one will be created on sync\n </span>\n }\n </div>\n </div>\n <div class=\"result-actions\">\n @if (IsSavingDocument) {\n <div class=\"save-spinner\">\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveAsEntityDocument()\">\n <i class=\"fa-solid fa-floppy-disk\"></i> Save as Entity Document\n </button>\n <button class=\"suggest-submit-btn suggest-try-again-btn\" (click)=\"ClearSuggestion()\">\n <i class=\"fa-solid fa-rotate\"></i> Try Again\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseSuggestDialog()\">\n Close\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n}\n", styles: ["/* ================================================================\n Vector Management Dashboard\n All colors use MJ design tokens from _tokens.scss\n ================================================================ */\n\n/* --- Loading state --- */\n.vector-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n}\n\n/* --- View Mode Toggle --- */\n.view-mode-toggle {\n display: flex;\n gap: 0.25rem;\n padding: 0 24px 0;\n margin-bottom: -12px;\n}\n\n.view-mode-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.view-mode-btn:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.view-mode-btn-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* --- Dashboard container --- */\n.vector-dashboard {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background: var(--mj-bg-page);\n min-height: 100%;\n}\n\n/* --- KPI cards row --- */\n.kpi-row {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n}\n\n@media (max-width: 1200px) {\n .kpi-row {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .kpi-row {\n grid-template-columns: 1fr;\n }\n}\n\n/* --- Main content: table + sidebar --- */\n.content-area {\n display: grid;\n grid-template-columns: 1fr 300px;\n gap: 24px;\n align-items: start;\n}\n\n@media (max-width: 1024px) {\n .content-area {\n grid-template-columns: 1fr;\n }\n}\n\n/* --- Sync table panel --- */\n.sync-table-panel {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-title {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.refresh-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.refresh-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* --- Empty state --- */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n}\n\n.empty-state i {\n font-size: 36px;\n margin-bottom: 12px;\n opacity: 0.5;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 14px;\n}\n\n/* --- Table --- */\n.table-wrapper {\n overflow-x: auto;\n}\n\n.sync-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.sync-table th {\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n white-space: nowrap;\n}\n\n.sync-table td {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n\n.sync-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.sync-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.text-right {\n text-align: right;\n}\n\n.text-center {\n text-align: center;\n}\n\n.entity-name {\n font-weight: 600;\n}\n\n.document-name {\n color: var(--mj-text-secondary);\n}\n\n.vector-count {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n\n.last-synced {\n color: var(--mj-text-secondary);\n font-size: 12px;\n white-space: nowrap;\n}\n\n/* --- Action buttons in table --- */\n\n.actions-cell {\n display: flex;\n gap: 6px;\n align-items: center;\n justify-content: center;\n}\n\n.schedule-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.schedule-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.edit-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* --- Schedule Dialog --- */\n.schedule-dialog {\n width: 440px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);\n overflow: hidden;\n}\n\n.schedule-cron-preview {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 0 0;\n font-size: 0.82rem;\n color: var(--mj-text-muted);\n}\n\n.schedule-toggle-row {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n}\n\n.edit-delete-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-delete-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n}\n\n.edit-readonly-value {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n padding: 8px 0;\n}\n\n/* --- Status badges --- */\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n}\n\n.status-synced {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n\n.status-syncing {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-error {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text, var(--mj-status-error));\n}\n\n.status-pending {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n\n/* --- Sync button --- */\n.sync-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.sync-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.sync-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ================================================================\n Sidebar\n ================================================================ */\n.sidebar {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.sidebar-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n}\n\n.sidebar-title {\n margin: 0 0 14px 0;\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sidebar-title i {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n/* --- Vector DB Health --- */\n.health-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.health-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.health-healthy {\n background: var(--mj-status-success);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-success) 50%, transparent);\n}\n\n.health-degraded {\n background: var(--mj-status-warning);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-warning) 50%, transparent);\n}\n\n.health-offline {\n background: var(--mj-status-error);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-error) 50%, transparent);\n}\n\n.health-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.health-status {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding-left: 18px;\n}\n\n/* --- Model Info --- */\n.model-info {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.info-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.info-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.info-value {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n/* --- Storage / Coverage Gauge --- */\n.gauge-container {\n margin-bottom: 8px;\n}\n\n.gauge-bar {\n height: 8px;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n margin-bottom: 6px;\n}\n\n.gauge-fill {\n height: 100%;\n border-radius: 4px;\n background: var(--mj-brand-primary);\n transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 2px;\n}\n\n.gauge-label {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.storage-detail {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* --- Panel actions row --- */\n.panel-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* --- Suggest Document Button --- */\n.suggest-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.suggest-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n}\n\n/* --- Slide-in Panel Overlay --- */\n.slide-panel-overlay {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 100000;\n}\n\n.slide-panel {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n width: 480px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow-y: auto;\n}\n\n.slide-panel.open {\n transform: translateX(0);\n}\n\n.suggest-dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.suggest-dialog-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.suggest-dialog-title i {\n color: var(--mj-brand-primary);\n}\n\n.suggest-close-btn {\n border: none;\n background: none;\n color: var(--mj-text-muted);\n font-size: 16px;\n cursor: pointer;\n padding: 4px;\n}\n\n.suggest-close-btn:hover {\n color: var(--mj-text-primary);\n}\n\n.suggest-dialog-body {\n padding: 24px;\n}\n\n/* --- Suggest Form --- */\n.suggest-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.suggest-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.suggest-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.suggest-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.suggest-select:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* ---- Use Case Button Group ---- */\n\n.use-case-options {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.use-case-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.use-case-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.use-case-btn-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.use-case-btn i {\n font-size: 12px;\n}\n\n/* ---- Entity Picker (grouped by schema) ---- */\n\n.entity-picker {\n position: relative;\n}\n\n.entity-picker-trigger {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: border-color 0.15s;\n}\n\n.entity-picker-trigger:hover {\n border-color: var(--mj-border-strong);\n}\n\n.entity-picker-placeholder {\n color: var(--mj-text-muted);\n flex: 1;\n}\n\n.entity-picker-value {\n flex: 1;\n font-weight: 500;\n}\n\n.entity-picker-arrow {\n font-size: 10px;\n color: var(--mj-text-muted);\n transition: transform 0.2s;\n}\n\n.entity-picker-dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n box-shadow: 0 8px 32px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n z-index: 100;\n max-height: 350px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.entity-picker-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.entity-picker-search i {\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.entity-picker-search-input {\n flex: 1;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n}\n\n.entity-picker-search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.entity-picker-list {\n overflow-y: auto;\n max-height: 300px;\n padding: 4px 0;\n}\n\n.entity-picker-group-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px 4px;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n}\n\n.entity-picker-group-header i {\n font-size: 10px;\n}\n\n.entity-picker-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 14px 7px 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.entity-picker-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.entity-picker-item-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.entity-picker-item i {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.entity-picker-item-selected i {\n color: var(--mj-brand-primary);\n}\n\n.entity-picker-item-focused {\n background: var(--mj-bg-surface-hover);\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: -2px;\n}\n\n.entity-picker-empty {\n padding: 20px 14px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n/* ---- Template Editor ---- */\n\n.template-editor-wrapper {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n min-height: 120px;\n max-height: 300px;\n}\n\n.template-editor-wrapper ::ng-deep .cm-editor {\n min-height: 120px;\n max-height: 300px;\n font-size: 13px;\n}\n\n.suggest-submit-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 20px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.suggest-submit-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.suggestion-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n font-size: 13px;\n line-height: 1.4;\n}\n\n.suggestion-error i {\n flex-shrink: 0;\n}\n\n.suggest-submit-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* --- Suggestion Result --- */\n.suggest-result {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.result-section {\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 12px;\n}\n\n.result-section:last-child {\n border-bottom: none;\n}\n\n.result-heading {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.result-template {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-all;\n margin: 0;\n}\n\n.result-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.result-tag {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n}\n\n.result-relationship {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.rel-name {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.rel-fields {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.result-thresholds {\n display: flex;\n gap: 24px;\n}\n\n.threshold-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.threshold-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.threshold-value {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.result-reasoning {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.result-actions {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n}\n\n.suggest-close-action {\n padding: 10px 20px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.suggest-close-action:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* --- Suggest Input --- */\n.suggest-input {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n width: 100%;\n box-sizing: border-box;\n}\n\n.suggest-input:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* --- Try Again Button (secondary style) --- */\n.suggest-try-again-btn {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n}\n\n.suggest-try-again-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n/* --- Save Spinner --- */\n.save-spinner {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 0;\n}\n\n/* --- Edit Panel Template Header --- */\n.edit-template-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.edit-regenerate-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n white-space: nowrap;\n}\n\n.edit-regenerate-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.edit-regenerate-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* --- No Vector Index Warning Dialog --- */\n.no-index-warning-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 440px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 20px 60px color-mix(in srgb, var(--mj-text-primary) 20%, transparent);\n padding: 32px;\n text-align: center;\n}\n\n.no-index-warning-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 56px;\n height: 56px;\n margin: 0 auto 16px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n}\n\n.no-index-warning-icon i {\n font-size: 24px;\n color: var(--mj-status-warning);\n}\n\n.no-index-warning-title {\n margin: 0 0 8px 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.no-index-warning-message {\n margin: 0 0 24px 0;\n font-size: 14px;\n line-height: 1.5;\n color: var(--mj-text-secondary);\n}\n\n.no-index-warning-actions {\n display: flex;\n gap: 8px;\n justify-content: center;\n}\n\n/* ================================================================\n Responsive \u2014 Vector Management\n ================================================================ */\n\n@media (max-width: 768px) {\n .panel-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .panel-actions {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 600px) {\n .slide-panel {\n width: 100vw;\n max-width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .vector-dashboard {\n padding: 12px;\n }\n\n .suggest-btn .suggest-btn-text {\n display: none;\n }\n}\n"] }]
1760
2223
  }], null, { EmbeddedMode: [{
1761
2224
  type: Input
2225
+ }], entitySearchInput: [{
2226
+ type: ViewChild,
2227
+ args: ['entitySearchInput']
1762
2228
  }] }); })();
1763
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(VectorManagementResourceComponent, { className: "VectorManagementResourceComponent", filePath: "src/AI/components/vectors/vector-management-resource.component.ts", lineNumber: 70 }); })();
2229
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(VectorManagementResourceComponent, { className: "VectorManagementResourceComponent", filePath: "src/AI/components/vectors/vector-management-resource.component.ts", lineNumber: 71 }); })();
1764
2230
  export function LoadVectorManagementResource() {
1765
2231
  // Prevents tree-shaking
1766
2232
  }