crewly 1.13.1 → 1.14.1

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 (426) hide show
  1. package/config/constants.ts +8 -0
  2. package/config/roles/orchestrator/prompt.md +23 -0
  3. package/config/skills/agent/core/reply-channel/SKILL.md +6 -0
  4. package/config/skills/agent/core/reply-channel/execute.sh +14 -2
  5. package/config/skills/agent/core/slack-post/SKILL.md +126 -0
  6. package/config/skills/agent/core/slack-post/execute.sh +127 -0
  7. package/config/skills/agent/remote-browser/SKILL.md +178 -0
  8. package/config/skills/agent/xiaoyuzhoufm-transcript/SKILL.md +46 -22
  9. package/config/skills/agent/xiaoyuzhoufm-transcript/execute.sh +82 -214
  10. package/config/skills/agent/xiaoyuzhoufm-transcript/skill.json +3 -3
  11. package/config/skills/orchestrator/get-team-status/SKILL.md +5 -1
  12. package/config/skills/orchestrator/get-team-status/execute.sh +28 -2
  13. package/config/slack-app-manifest.json +7 -1
  14. package/dist/backend/backend/src/config/oauth.config.d.ts +93 -19
  15. package/dist/backend/backend/src/config/oauth.config.d.ts.map +1 -1
  16. package/dist/backend/backend/src/config/oauth.config.js +121 -19
  17. package/dist/backend/backend/src/config/oauth.config.js.map +1 -1
  18. package/dist/backend/backend/src/constants.d.ts +60 -0
  19. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  20. package/dist/backend/backend/src/constants.js +74 -0
  21. package/dist/backend/backend/src/constants.js.map +1 -1
  22. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  23. package/dist/backend/backend/src/controllers/chat/chat.controller.js +33 -4
  24. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  25. package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.d.ts.map +1 -1
  26. package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.js +27 -9
  27. package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.js.map +1 -1
  28. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  29. package/dist/backend/backend/src/controllers/slack/slack.controller.js +342 -0
  30. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  31. package/dist/backend/backend/src/index.d.ts.map +1 -1
  32. package/dist/backend/backend/src/index.js +31 -7
  33. package/dist/backend/backend/src/index.js.map +1 -1
  34. package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts +10 -0
  35. package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
  36. package/dist/backend/backend/src/services/agent/idle-detection.service.js +37 -0
  37. package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
  38. package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
  39. package/dist/backend/backend/src/services/browser/browser-bridge.service.js +13 -11
  40. package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
  41. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +14 -0
  42. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -1
  43. package/dist/backend/backend/src/services/browser/browser-proxy.service.js +56 -0
  44. package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
  45. package/dist/backend/backend/src/services/browser/browser-services.registry.d.ts +63 -0
  46. package/dist/backend/backend/src/services/browser/browser-services.registry.d.ts.map +1 -0
  47. package/dist/backend/backend/src/services/browser/browser-services.registry.js +74 -0
  48. package/dist/backend/backend/src/services/browser/browser-services.registry.js.map +1 -0
  49. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +25 -1
  50. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  51. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +19 -7
  52. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  53. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +66 -0
  54. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  55. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +121 -1
  56. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  57. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +35 -0
  58. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  59. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +63 -0
  60. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  61. package/dist/backend/backend/src/services/core/storage.service.d.ts +6 -0
  62. package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
  63. package/dist/backend/backend/src/services/core/storage.service.js +1 -1
  64. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  65. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -1
  66. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +6 -2
  67. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -1
  68. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -1
  69. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +14 -0
  70. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -1
  71. package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +8 -0
  72. package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -1
  73. package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.js +31 -3
  74. package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
  75. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +34 -0
  76. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  77. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +99 -10
  78. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  79. package/dist/backend/backend/src/services/slack/slack-agent-identity.service.d.ts +209 -0
  80. package/dist/backend/backend/src/services/slack/slack-agent-identity.service.d.ts.map +1 -0
  81. package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js +416 -0
  82. package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js.map +1 -0
  83. package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts +124 -0
  84. package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts.map +1 -0
  85. package/dist/backend/backend/src/services/slack/slack-agent-post.service.js +243 -0
  86. package/dist/backend/backend/src/services/slack/slack-agent-post.service.js.map +1 -0
  87. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts +11 -0
  88. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  89. package/dist/backend/backend/src/services/slack/slack-initializer.js +56 -0
  90. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  91. package/dist/backend/backend/src/services/slack/slack-mention-resolver.d.ts +103 -0
  92. package/dist/backend/backend/src/services/slack/slack-mention-resolver.d.ts.map +1 -0
  93. package/dist/backend/backend/src/services/slack/slack-mention-resolver.js +197 -0
  94. package/dist/backend/backend/src/services/slack/slack-mention-resolver.js.map +1 -0
  95. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  96. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +18 -0
  97. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  98. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +329 -0
  99. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -0
  100. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +821 -0
  101. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -0
  102. package/dist/backend/backend/src/services/slack/slack.service.d.ts +116 -1
  103. package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
  104. package/dist/backend/backend/src/services/slack/slack.service.js +297 -3
  105. package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
  106. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +22 -0
  107. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  108. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +71 -0
  109. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  110. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts +20 -2
  111. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts.map +1 -1
  112. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js +27 -2
  113. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js.map +1 -1
  114. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts +36 -2
  115. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts.map +1 -1
  116. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js +86 -10
  117. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js.map +1 -1
  118. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts +37 -0
  119. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts.map +1 -1
  120. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js +74 -8
  121. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js.map +1 -1
  122. package/dist/backend/backend/src/types/slack.types.d.ts +87 -0
  123. package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
  124. package/dist/backend/backend/src/types/slack.types.js.map +1 -1
  125. package/dist/backend/build-info.json +2 -2
  126. package/dist/backend/config/constants.d.ts +8 -0
  127. package/dist/backend/config/constants.d.ts.map +1 -1
  128. package/dist/backend/config/constants.js +8 -0
  129. package/dist/backend/config/constants.js.map +1 -1
  130. package/dist/cli/backend/src/config/oauth.config.d.ts +93 -19
  131. package/dist/cli/backend/src/config/oauth.config.d.ts.map +1 -1
  132. package/dist/cli/backend/src/config/oauth.config.js +121 -19
  133. package/dist/cli/backend/src/config/oauth.config.js.map +1 -1
  134. package/dist/cli/backend/src/constants.d.ts +60 -0
  135. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  136. package/dist/cli/backend/src/constants.js +74 -0
  137. package/dist/cli/backend/src/constants.js.map +1 -1
  138. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +292 -0
  139. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -0
  140. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +420 -0
  141. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -0
  142. package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts +134 -0
  143. package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts.map +1 -0
  144. package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.js +232 -0
  145. package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.js.map +1 -0
  146. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +66 -0
  147. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  148. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +121 -1
  149. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  150. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +35 -0
  151. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  152. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +63 -0
  153. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  154. package/dist/cli/backend/src/services/core/storage.service.d.ts +6 -0
  155. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  156. package/dist/cli/backend/src/services/core/storage.service.js +1 -1
  157. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  158. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -1
  159. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +6 -2
  160. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -1
  161. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +8 -0
  162. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -1
  163. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js +31 -3
  164. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
  165. package/dist/cli/backend/src/services/slack/slack-agent-identity.service.d.ts +209 -0
  166. package/dist/cli/backend/src/services/slack/slack-agent-identity.service.d.ts.map +1 -0
  167. package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js +416 -0
  168. package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js.map +1 -0
  169. package/dist/cli/backend/src/services/slack/slack-mention-resolver.d.ts +103 -0
  170. package/dist/cli/backend/src/services/slack/slack-mention-resolver.d.ts.map +1 -0
  171. package/dist/cli/backend/src/services/slack/slack-mention-resolver.js +197 -0
  172. package/dist/cli/backend/src/services/slack/slack-mention-resolver.js.map +1 -0
  173. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  174. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +18 -0
  175. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  176. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +329 -0
  177. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -0
  178. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +821 -0
  179. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -0
  180. package/dist/cli/backend/src/services/slack/slack.service.d.ts +116 -1
  181. package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
  182. package/dist/cli/backend/src/services/slack/slack.service.js +297 -3
  183. package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
  184. package/dist/cli/backend/src/types/slack.types.d.ts +87 -0
  185. package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
  186. package/dist/cli/backend/src/types/slack.types.js.map +1 -1
  187. package/dist/cli/backend/src/utils/team.utils.d.ts +40 -0
  188. package/dist/cli/backend/src/utils/team.utils.d.ts.map +1 -0
  189. package/dist/cli/backend/src/utils/team.utils.js +66 -0
  190. package/dist/cli/backend/src/utils/team.utils.js.map +1 -0
  191. package/dist/cli/cli/src/index.js +0 -0
  192. package/dist/cli/config/constants.d.ts +8 -0
  193. package/dist/cli/config/constants.d.ts.map +1 -1
  194. package/dist/cli/config/constants.js +8 -0
  195. package/dist/cli/config/constants.js.map +1 -1
  196. package/frontend/dist/assets/{index-890d3f9d.js → index-190a957f.js} +294 -294
  197. package/frontend/dist/assets/{index-8205ea5e.css → index-88feb412.css} +1 -1
  198. package/frontend/dist/index.html +2 -2
  199. package/package.json +1 -1
  200. package/config/constants.d.ts.map +0 -1
  201. package/config/index.d.ts.map +0 -1
  202. package/dist/backend/backend/src/controllers/knowledge/index.d.ts +0 -7
  203. package/dist/backend/backend/src/controllers/knowledge/index.d.ts.map +0 -1
  204. package/dist/backend/backend/src/controllers/knowledge/index.js +0 -7
  205. package/dist/backend/backend/src/controllers/knowledge/index.js.map +0 -1
  206. package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.d.ts +0 -71
  207. package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.d.ts.map +0 -1
  208. package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.js +0 -237
  209. package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.js.map +0 -1
  210. package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.d.ts +0 -24
  211. package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.d.ts.map +0 -1
  212. package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.js +0 -34
  213. package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.js.map +0 -1
  214. package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.d.ts +0 -91
  215. package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.d.ts.map +0 -1
  216. package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.js +0 -290
  217. package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.js.map +0 -1
  218. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +0 -169
  219. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +0 -1
  220. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +0 -1779
  221. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +0 -1
  222. package/dist/backend/backend/src/index.js.orc-bak-20260529 +0 -3130
  223. package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.d.ts +0 -27
  224. package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.d.ts.map +0 -1
  225. package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.js +0 -40
  226. package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.js.map +0 -1
  227. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +0 -513
  228. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +0 -1
  229. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +0 -1568
  230. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +0 -1
  231. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts +0 -86
  232. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts.map +0 -1
  233. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js +0 -147
  234. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js.map +0 -1
  235. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts +0 -68
  236. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts.map +0 -1
  237. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js +0 -131
  238. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js.map +0 -1
  239. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts +0 -130
  240. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts.map +0 -1
  241. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js +0 -263
  242. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js.map +0 -1
  243. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts +0 -74
  244. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts.map +0 -1
  245. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js +0 -140
  246. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js.map +0 -1
  247. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts +0 -29
  248. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts.map +0 -1
  249. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js +0 -279
  250. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js.map +0 -1
  251. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts +0 -340
  252. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +0 -1
  253. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +0 -1176
  254. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +0 -1
  255. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts +0 -79
  256. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts.map +0 -1
  257. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js +0 -145
  258. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js.map +0 -1
  259. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts +0 -79
  260. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts.map +0 -1
  261. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js +0 -218
  262. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js.map +0 -1
  263. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts +0 -16
  264. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts.map +0 -1
  265. package/dist/backend/backend/src/services/agent/crewly-agent/index.js +0 -16
  266. package/dist/backend/backend/src/services/agent/crewly-agent/index.js.map +0 -1
  267. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts +0 -135
  268. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts.map +0 -1
  269. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js +0 -185
  270. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js.map +0 -1
  271. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +0 -141
  272. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +0 -1
  273. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +0 -310
  274. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +0 -1
  275. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts +0 -91
  276. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts.map +0 -1
  277. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js +0 -143
  278. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js.map +0 -1
  279. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts +0 -103
  280. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts.map +0 -1
  281. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js +0 -256
  282. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js.map +0 -1
  283. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts +0 -143
  284. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts.map +0 -1
  285. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js +0 -264
  286. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js.map +0 -1
  287. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts +0 -13
  288. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts.map +0 -1
  289. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js +0 -91
  290. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js.map +0 -1
  291. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +0 -135
  292. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +0 -1
  293. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +0 -1937
  294. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +0 -1
  295. package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts +0 -429
  296. package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts.map +0 -1
  297. package/dist/backend/backend/src/services/autonomous/auto-assign.service.js +0 -852
  298. package/dist/backend/backend/src/services/autonomous/auto-assign.service.js.map +0 -1
  299. package/dist/backend/backend/src/services/knowledge/embedding-provider.d.ts +0 -78
  300. package/dist/backend/backend/src/services/knowledge/embedding-provider.d.ts.map +0 -1
  301. package/dist/backend/backend/src/services/knowledge/embedding-provider.js +0 -179
  302. package/dist/backend/backend/src/services/knowledge/embedding-provider.js.map +0 -1
  303. package/dist/backend/backend/src/services/knowledge/fts5-index.service.d.ts +0 -118
  304. package/dist/backend/backend/src/services/knowledge/fts5-index.service.d.ts.map +0 -1
  305. package/dist/backend/backend/src/services/knowledge/fts5-index.service.js +0 -241
  306. package/dist/backend/backend/src/services/knowledge/fts5-index.service.js.map +0 -1
  307. package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.d.ts +0 -102
  308. package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.d.ts.map +0 -1
  309. package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.js +0 -118
  310. package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.js.map +0 -1
  311. package/dist/backend/backend/src/services/knowledge/index.d.ts +0 -8
  312. package/dist/backend/backend/src/services/knowledge/index.d.ts.map +0 -1
  313. package/dist/backend/backend/src/services/knowledge/index.js +0 -8
  314. package/dist/backend/backend/src/services/knowledge/index.js.map +0 -1
  315. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts +0 -241
  316. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts.map +0 -1
  317. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js +0 -590
  318. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js.map +0 -1
  319. package/dist/backend/backend/src/services/knowledge/knowledge.service.d.ts +0 -153
  320. package/dist/backend/backend/src/services/knowledge/knowledge.service.d.ts.map +0 -1
  321. package/dist/backend/backend/src/services/knowledge/knowledge.service.js +0 -409
  322. package/dist/backend/backend/src/services/knowledge/knowledge.service.js.map +0 -1
  323. package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts +0 -331
  324. package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts.map +0 -1
  325. package/dist/backend/backend/src/services/knowledge/vector-store.service.js +0 -830
  326. package/dist/backend/backend/src/services/knowledge/vector-store.service.js.map +0 -1
  327. package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.d.ts +0 -115
  328. package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.d.ts.map +0 -1
  329. package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.js +0 -215
  330. package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.js.map +0 -1
  331. package/dist/backend/backend/src/services/memory/embedding-provider.d.ts +0 -78
  332. package/dist/backend/backend/src/services/memory/embedding-provider.d.ts.map +0 -1
  333. package/dist/backend/backend/src/services/memory/embedding-provider.js +0 -185
  334. package/dist/backend/backend/src/services/memory/embedding-provider.js.map +0 -1
  335. package/dist/backend/backend/src/services/memory/vector-store.service.d.ts +0 -331
  336. package/dist/backend/backend/src/services/memory/vector-store.service.d.ts.map +0 -1
  337. package/dist/backend/backend/src/services/memory/vector-store.service.js +0 -825
  338. package/dist/backend/backend/src/services/memory/vector-store.service.js.map +0 -1
  339. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +0 -171
  340. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +0 -1
  341. package/dist/backend/backend/src/services/project/task-tracking.service.js +0 -725
  342. package/dist/backend/backend/src/services/project/task-tracking.service.js.map +0 -1
  343. package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts +0 -118
  344. package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts.map +0 -1
  345. package/dist/backend/backend/src/services/v3/project-task-watcher.service.js +0 -326
  346. package/dist/backend/backend/src/services/v3/project-task-watcher.service.js.map +0 -1
  347. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts +0 -74
  348. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts.map +0 -1
  349. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js +0 -154
  350. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js.map +0 -1
  351. package/dist/backend/backend/src/services/workflow/unified-scheduler.service.d.ts +0 -234
  352. package/dist/backend/backend/src/services/workflow/unified-scheduler.service.d.ts.map +0 -1
  353. package/dist/backend/backend/src/services/workflow/unified-scheduler.service.js +0 -636
  354. package/dist/backend/backend/src/services/workflow/unified-scheduler.service.js.map +0 -1
  355. package/dist/backend/backend/src/services/workflow/unified-scheduler.types.d.ts +0 -156
  356. package/dist/backend/backend/src/services/workflow/unified-scheduler.types.d.ts.map +0 -1
  357. package/dist/backend/backend/src/services/workflow/unified-scheduler.types.js +0 -81
  358. package/dist/backend/backend/src/services/workflow/unified-scheduler.types.js.map +0 -1
  359. package/dist/backend/backend/src/types/auto-assign.types.d.ts +0 -271
  360. package/dist/backend/backend/src/types/auto-assign.types.d.ts.map +0 -1
  361. package/dist/backend/backend/src/types/auto-assign.types.js +0 -136
  362. package/dist/backend/backend/src/types/auto-assign.types.js.map +0 -1
  363. package/dist/backend/backend/src/types/knowledge.types.d.ts +0 -195
  364. package/dist/backend/backend/src/types/knowledge.types.d.ts.map +0 -1
  365. package/dist/backend/backend/src/types/knowledge.types.js +0 -38
  366. package/dist/backend/backend/src/types/knowledge.types.js.map +0 -1
  367. package/dist/backend/backend/src/utils/esm-require.utils.d.ts +0 -111
  368. package/dist/backend/backend/src/utils/esm-require.utils.d.ts.map +0 -1
  369. package/dist/backend/backend/src/utils/esm-require.utils.js +0 -124
  370. package/dist/backend/backend/src/utils/esm-require.utils.js.map +0 -1
  371. package/dist/cli/backend/src/services/knowledge/embedding-provider.d.ts +0 -78
  372. package/dist/cli/backend/src/services/knowledge/embedding-provider.d.ts.map +0 -1
  373. package/dist/cli/backend/src/services/knowledge/embedding-provider.js +0 -179
  374. package/dist/cli/backend/src/services/knowledge/embedding-provider.js.map +0 -1
  375. package/dist/cli/backend/src/services/knowledge/fts5-index.service.d.ts +0 -118
  376. package/dist/cli/backend/src/services/knowledge/fts5-index.service.d.ts.map +0 -1
  377. package/dist/cli/backend/src/services/knowledge/fts5-index.service.js +0 -241
  378. package/dist/cli/backend/src/services/knowledge/fts5-index.service.js.map +0 -1
  379. package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.d.ts +0 -102
  380. package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.d.ts.map +0 -1
  381. package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.js +0 -118
  382. package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.js.map +0 -1
  383. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts +0 -56
  384. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts.map +0 -1
  385. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js +0 -91
  386. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js.map +0 -1
  387. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts +0 -241
  388. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts.map +0 -1
  389. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js +0 -590
  390. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js.map +0 -1
  391. package/dist/cli/backend/src/services/knowledge/knowledge.service.d.ts +0 -153
  392. package/dist/cli/backend/src/services/knowledge/knowledge.service.d.ts.map +0 -1
  393. package/dist/cli/backend/src/services/knowledge/knowledge.service.js +0 -409
  394. package/dist/cli/backend/src/services/knowledge/knowledge.service.js.map +0 -1
  395. package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts +0 -159
  396. package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts.map +0 -1
  397. package/dist/cli/backend/src/services/knowledge/learnings-index.service.js +0 -304
  398. package/dist/cli/backend/src/services/knowledge/learnings-index.service.js.map +0 -1
  399. package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts +0 -331
  400. package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts.map +0 -1
  401. package/dist/cli/backend/src/services/knowledge/vector-store.service.js +0 -830
  402. package/dist/cli/backend/src/services/knowledge/vector-store.service.js.map +0 -1
  403. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts +0 -115
  404. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts.map +0 -1
  405. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js +0 -215
  406. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js.map +0 -1
  407. package/dist/cli/backend/src/services/memory/embedding-provider.d.ts +0 -78
  408. package/dist/cli/backend/src/services/memory/embedding-provider.d.ts.map +0 -1
  409. package/dist/cli/backend/src/services/memory/embedding-provider.js +0 -179
  410. package/dist/cli/backend/src/services/memory/embedding-provider.js.map +0 -1
  411. package/dist/cli/backend/src/services/memory/vector-store.service.d.ts +0 -331
  412. package/dist/cli/backend/src/services/memory/vector-store.service.d.ts.map +0 -1
  413. package/dist/cli/backend/src/services/memory/vector-store.service.js +0 -814
  414. package/dist/cli/backend/src/services/memory/vector-store.service.js.map +0 -1
  415. package/dist/cli/backend/src/services/project/task-tracking.service.d.ts +0 -171
  416. package/dist/cli/backend/src/services/project/task-tracking.service.d.ts.map +0 -1
  417. package/dist/cli/backend/src/services/project/task-tracking.service.js +0 -725
  418. package/dist/cli/backend/src/services/project/task-tracking.service.js.map +0 -1
  419. package/dist/cli/backend/src/types/auto-assign.types.d.ts +0 -271
  420. package/dist/cli/backend/src/types/auto-assign.types.d.ts.map +0 -1
  421. package/dist/cli/backend/src/types/auto-assign.types.js +0 -136
  422. package/dist/cli/backend/src/types/auto-assign.types.js.map +0 -1
  423. package/dist/cli/backend/src/types/knowledge.types.d.ts +0 -195
  424. package/dist/cli/backend/src/types/knowledge.types.d.ts.map +0 -1
  425. package/dist/cli/backend/src/types/knowledge.types.js +0 -38
  426. package/dist/cli/backend/src/types/knowledge.types.js.map +0 -1
@@ -1,825 +0,0 @@
1
- /**
2
- * Vector Store Service — v2
3
- *
4
- * Local, on-device vector storage using SQLite (better-sqlite3) with optional
5
- * sqlite-vec extension for native KNN search. Falls back gracefully to
6
- * JavaScript cosine similarity when the extension is unavailable.
7
- *
8
- * v2 improvements over v1:
9
- * - Binary BLOB storage (Float32Array) instead of JSON TEXT (~4× smaller, faster)
10
- * - Optional sqlite-vec integration for native SQL-based KNN search (cosine metric)
11
- * - Dimension validation ensures all vectors in a scope share the same width
12
- * - Prepared statement caching for repeated operations
13
- * - Input sanitization (NaN, Infinity rejection)
14
- * - Batch upsert with transaction wrapping
15
- * - Automatic schema migration from v1 (JSON TEXT) databases
16
- *
17
- * Storage locations:
18
- * - Global scope: ~/.crewly/vector-store.db
19
- * - Project scope: {projectPath}/.crewly/vector-store.db
20
- *
21
- * @module services/memory/vector-store.service
22
- */
23
- import * as path from 'path';
24
- import { existsSync, mkdirSync } from 'fs';
25
- import { createBareModuleRequire } from '../../utils/node-require.utils.js';
26
- import { LoggerService } from '../core/logger.service.js';
27
- import { CREWLY_CONSTANTS } from '../../constants.js';
28
- // ---------------------------------------------------------------------------
29
- // Lazy module loading
30
- // ---------------------------------------------------------------------------
31
- /**
32
- * CJS-style `require` scoped to this module. better-sqlite3 and sqlite-vec
33
- * are native addons and must be loaded via CJS `require`, but this file
34
- * compiles to ESM where the bare `require` global is undefined.
35
- *
36
- * Anchor: see `backend/src/utils/node-require.utils.ts` — the helper
37
- * hides `import.meta.url` behind direct `eval` so ts-jest's CommonJS
38
- * transpile does not see the meta-property token. The createRequire
39
- * anchor is THIS file's URL, so Node's resolver walks up from here
40
- * to find `node_modules` (and to resolve any future relative paths).
41
- */
42
- const nodeRequire = createBareModuleRequire(typeof require === 'function' ? require : null);
43
- /**
44
- * Lazy-loaded better-sqlite3 module reference.
45
- * Uses dynamic require so that a native-module load failure does NOT cascade
46
- * to every test file that transitively imports this service.
47
- *
48
- * @see https://github.com/stevehuang0115/crewly/issues/170
49
- */
50
- let _BetterSqlite3 = null;
51
- /**
52
- * Load better-sqlite3 on demand. Throws a clear error if the native module
53
- * is not available (e.g. needs `npm rebuild better-sqlite3`).
54
- */
55
- function getBetterSqlite3() {
56
- if (!_BetterSqlite3) {
57
- try {
58
- _BetterSqlite3 = nodeRequire('better-sqlite3');
59
- }
60
- catch (err) {
61
- throw new Error('better-sqlite3 native module failed to load. Run `npm rebuild better-sqlite3` to fix. ' +
62
- `Original error: ${err instanceof Error ? err.message : String(err)}`);
63
- }
64
- }
65
- return _BetterSqlite3;
66
- }
67
- /** Lazy-loaded sqlite-vec extension loader. */
68
- let _sqliteVec = null;
69
- let _sqliteVecLoadAttempted = false;
70
- /**
71
- * Attempt to load the sqlite-vec module. Returns null if unavailable.
72
- */
73
- function getSqliteVec() {
74
- if (!_sqliteVecLoadAttempted) {
75
- _sqliteVecLoadAttempted = true;
76
- try {
77
- _sqliteVec = nodeRequire('sqlite-vec');
78
- }
79
- catch {
80
- _sqliteVec = null;
81
- }
82
- }
83
- return _sqliteVec;
84
- }
85
- /** Reset the sqlite-vec loader state (for testing). */
86
- export function resetSqliteVecLoader() {
87
- _sqliteVec = null;
88
- _sqliteVecLoadAttempted = false;
89
- }
90
- /** Constants for the vector store */
91
- export const VECTOR_STORE_CONSTANTS = {
92
- /** SQLite database filename */
93
- DB_FILENAME: 'vector-store.db',
94
- /** Default number of results for similarity search */
95
- DEFAULT_SEARCH_LIMIT: 10,
96
- /** Minimum cosine similarity threshold for search results */
97
- DEFAULT_SIMILARITY_THRESHOLD: 0.1,
98
- /** Maximum metadata JSON size (bytes) */
99
- MAX_METADATA_SIZE: 65536,
100
- /** Current schema version */
101
- SCHEMA_VERSION: 2,
102
- /** Maximum supported embedding dimensions */
103
- MAX_DIMENSIONS: 4096,
104
- /** Maximum items in a single batch upsert */
105
- MAX_BATCH_SIZE: 500,
106
- };
107
- // ---------------------------------------------------------------------------
108
- // Utility functions
109
- // ---------------------------------------------------------------------------
110
- /**
111
- * Convert a number array to a Float32Array Buffer for efficient BLOB storage.
112
- *
113
- * @param embedding - The embedding vector
114
- * @returns Buffer containing the Float32Array binary data
115
- */
116
- export function embeddingToBlob(embedding) {
117
- const f32 = new Float32Array(embedding);
118
- return Buffer.from(f32.buffer);
119
- }
120
- /**
121
- * Convert a BLOB Buffer back to a number array.
122
- *
123
- * @param blob - Buffer containing Float32Array binary data
124
- * @returns The embedding as a number array
125
- */
126
- export function blobToEmbedding(blob) {
127
- const f32 = new Float32Array(blob.buffer, blob.byteOffset, blob.byteLength / Float32Array.BYTES_PER_ELEMENT);
128
- return Array.from(f32);
129
- }
130
- /**
131
- * Compute cosine similarity between two vectors.
132
- *
133
- * @param a - First vector
134
- * @param b - Second vector
135
- * @returns Cosine similarity in range [-1, 1], or 0 if vectors are incompatible
136
- */
137
- export function cosineSimilarity(a, b) {
138
- if (a.length !== b.length || a.length === 0) {
139
- return 0;
140
- }
141
- let dotProduct = 0;
142
- let normA = 0;
143
- let normB = 0;
144
- for (let i = 0; i < a.length; i++) {
145
- dotProduct += a[i] * b[i];
146
- normA += a[i] * a[i];
147
- normB += b[i] * b[i];
148
- }
149
- const denominator = Math.sqrt(normA) * Math.sqrt(normB);
150
- return denominator === 0 ? 0 : dotProduct / denominator;
151
- }
152
- /**
153
- * Validate an embedding vector for storage. Rejects empty arrays, values
154
- * that are not finite numbers (NaN, Infinity), and dimensions exceeding
155
- * the maximum.
156
- *
157
- * @param embedding - The embedding to validate
158
- * @throws Error if the embedding is invalid
159
- */
160
- export function validateEmbedding(embedding) {
161
- if (!embedding || embedding.length === 0) {
162
- throw new Error('embedding must be a non-empty array');
163
- }
164
- if (embedding.length > VECTOR_STORE_CONSTANTS.MAX_DIMENSIONS) {
165
- throw new Error(`embedding dimensions (${embedding.length}) exceed maximum (${VECTOR_STORE_CONSTANTS.MAX_DIMENSIONS})`);
166
- }
167
- for (let i = 0; i < embedding.length; i++) {
168
- if (typeof embedding[i] !== 'number' || !isFinite(embedding[i])) {
169
- throw new Error(`embedding contains invalid value at index ${i}: ${embedding[i]}`);
170
- }
171
- }
172
- }
173
- // ---------------------------------------------------------------------------
174
- // Service
175
- // ---------------------------------------------------------------------------
176
- /**
177
- * VectorStoreService provides local SQLite-based vector storage with optional
178
- * native KNN search via the sqlite-vec extension.
179
- *
180
- * When sqlite-vec is available, search uses a `vec0` virtual table with cosine
181
- * distance metric for hardware-accelerated nearest-neighbor queries. When it is
182
- * not available, search falls back to JavaScript cosine similarity (fully
183
- * portable, no native extension required).
184
- *
185
- * Each scope (global / project) gets its own database file so project data
186
- * stays isolated and portable.
187
- *
188
- * @example
189
- * ```typescript
190
- * const store = VectorStoreService.getInstance();
191
- * store.upsert('doc-123', embedding, { title: 'My Doc' }, 'global');
192
- * const results = store.search(queryEmbedding, 'global');
193
- * console.log(store.isVecEnabled('global')); // true if sqlite-vec loaded
194
- * ```
195
- */
196
- export class VectorStoreService {
197
- static instance = null;
198
- logger;
199
- /** Cache of open database connections by resolved db path */
200
- databases = new Map();
201
- constructor() {
202
- this.logger = LoggerService.getInstance().createComponentLogger('VectorStoreService');
203
- }
204
- /**
205
- * Get the singleton instance.
206
- *
207
- * @returns VectorStoreService instance
208
- */
209
- static getInstance() {
210
- if (!VectorStoreService.instance) {
211
- VectorStoreService.instance = new VectorStoreService();
212
- }
213
- return VectorStoreService.instance;
214
- }
215
- /**
216
- * Reset the singleton and close all open databases (for testing).
217
- */
218
- static resetInstance() {
219
- if (VectorStoreService.instance) {
220
- VectorStoreService.instance.closeAll();
221
- }
222
- VectorStoreService.instance = null;
223
- }
224
- // ---------------------------------------------------------------------------
225
- // Path helpers
226
- // ---------------------------------------------------------------------------
227
- /**
228
- * Resolve the database file path for a given scope.
229
- *
230
- * @param scope - 'global' or 'project'
231
- * @param projectPath - Required when scope is 'project'
232
- * @returns Absolute path to the SQLite database file
233
- * @throws Error if projectPath is missing for project scope
234
- */
235
- dbPath(scope, projectPath) {
236
- if (scope === 'project') {
237
- if (!projectPath) {
238
- throw new Error('projectPath is required for project scope');
239
- }
240
- return path.join(projectPath, CREWLY_CONSTANTS.PATHS.CREWLY_HOME, VECTOR_STORE_CONSTANTS.DB_FILENAME);
241
- }
242
- const home = process.env.HOME || process.env.USERPROFILE || '/tmp';
243
- return path.join(home, CREWLY_CONSTANTS.PATHS.CREWLY_HOME, VECTOR_STORE_CONSTANTS.DB_FILENAME);
244
- }
245
- // ---------------------------------------------------------------------------
246
- // Database management
247
- // ---------------------------------------------------------------------------
248
- /**
249
- * Check whether the sqlite-vec native KNN search is available for a scope.
250
- *
251
- * @param scope - Storage scope
252
- * @param projectPath - Required when scope is 'project'
253
- * @returns true if vec0 virtual table is active
254
- */
255
- isVecEnabled(scope, projectPath) {
256
- const state = this.getDbState(scope, projectPath);
257
- return state.vecEnabled;
258
- }
259
- /**
260
- * Get (or prepare + cache) a statement for the given database state.
261
- *
262
- * @param state - Database state to prepare on
263
- * @param key - Unique cache key
264
- * @param sql - SQL to prepare if not yet cached
265
- * @returns A prepared Statement
266
- */
267
- getStmt(state, key, sql) {
268
- let stmt = state.stmtCache.get(key);
269
- if (!stmt) {
270
- stmt = state.db.prepare(sql);
271
- state.stmtCache.set(key, stmt);
272
- }
273
- return stmt;
274
- }
275
- /**
276
- * Open or retrieve a cached database connection. Creates the parent
277
- * directory, schema, and vec0 table (if sqlite-vec is available) on first
278
- * access. Handles automatic migration from v1 databases.
279
- *
280
- * @param scope - Document scope
281
- * @param projectPath - Project path for project-scoped databases
282
- * @returns Internal DatabaseState
283
- */
284
- getDbState(scope, projectPath) {
285
- const dbFile = this.dbPath(scope, projectPath);
286
- const cached = this.databases.get(dbFile);
287
- if (cached)
288
- return cached;
289
- // Ensure parent directory exists
290
- const dir = path.dirname(dbFile);
291
- if (!existsSync(dir)) {
292
- mkdirSync(dir, { recursive: true });
293
- }
294
- const Database = getBetterSqlite3();
295
- const db = new Database(dbFile);
296
- // Performance pragmas
297
- db.pragma('journal_mode = WAL');
298
- db.pragma('synchronous = NORMAL');
299
- // Try loading sqlite-vec extension
300
- let vecEnabled = false;
301
- const sqliteVec = getSqliteVec();
302
- if (sqliteVec) {
303
- try {
304
- sqliteVec.load(db);
305
- vecEnabled = true;
306
- this.logger.info('sqlite-vec extension loaded', { path: dbFile });
307
- }
308
- catch (err) {
309
- this.logger.warn('sqlite-vec extension failed to load, using JS fallback', {
310
- error: err instanceof Error ? err.message : String(err),
311
- });
312
- }
313
- }
314
- // Run schema migration
315
- this.migrateSchema(db, vecEnabled);
316
- const state = {
317
- db,
318
- vecEnabled,
319
- dimensions: this.getStoredDimensions(db),
320
- stmtCache: new Map(),
321
- };
322
- this.databases.set(dbFile, state);
323
- this.logger.info('Opened vector store database', { path: dbFile, scope, vecEnabled });
324
- return state;
325
- }
326
- /**
327
- * Migrate database schema to v2.
328
- * - Creates vec_config table for tracking schema version and dimensions
329
- * - Adds dimensions column if missing
330
- * - Converts JSON TEXT embeddings to BLOB if needed
331
- * - Creates vec0 virtual table if sqlite-vec is available and dimensions are known
332
- *
333
- * @param db - The database to migrate
334
- * @param vecEnabled - Whether sqlite-vec extension is loaded
335
- */
336
- migrateSchema(db, vecEnabled) {
337
- // Config table for schema metadata
338
- db.exec(`
339
- CREATE TABLE IF NOT EXISTS vec_config (
340
- key TEXT PRIMARY KEY,
341
- value TEXT NOT NULL
342
- );
343
- `);
344
- const versionRow = db.prepare('SELECT value FROM vec_config WHERE key = ?').get('schema_version');
345
- const currentVersion = versionRow ? parseInt(versionRow.value, 10) : 0;
346
- if (currentVersion < VECTOR_STORE_CONSTANTS.SCHEMA_VERSION) {
347
- const tableExists = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='embeddings'").get();
348
- if (tableExists) {
349
- // Check column types to detect v1 vs v2
350
- const colInfo = db.prepare('PRAGMA table_info(embeddings)').all();
351
- const embeddingCol = colInfo.find((c) => c.name === 'embedding');
352
- const hasDimensionsCol = colInfo.some((c) => c.name === 'dimensions');
353
- if (embeddingCol && embeddingCol.type === 'TEXT') {
354
- // v1 → v2: convert JSON TEXT embeddings to BLOB
355
- this.logger.info('Migrating vector store from v1 (JSON) to v2 (BLOB)');
356
- if (!hasDimensionsCol) {
357
- db.exec('ALTER TABLE embeddings ADD COLUMN dimensions INTEGER NOT NULL DEFAULT 0');
358
- }
359
- const rows = db.prepare("SELECT id, embedding FROM embeddings WHERE typeof(embedding) = 'text'").all();
360
- const updateStmt = db.prepare('UPDATE embeddings SET embedding = ?, dimensions = ? WHERE id = ?');
361
- const migrate = db.transaction(() => {
362
- for (const row of rows) {
363
- try {
364
- const arr = JSON.parse(row.embedding);
365
- updateStmt.run(embeddingToBlob(arr), arr.length, row.id);
366
- }
367
- catch (err) {
368
- this.logger.warn('Failed to migrate embedding', {
369
- id: row.id,
370
- error: String(err),
371
- });
372
- }
373
- }
374
- });
375
- migrate();
376
- }
377
- else if (!hasDimensionsCol) {
378
- db.exec('ALTER TABLE embeddings ADD COLUMN dimensions INTEGER NOT NULL DEFAULT 0');
379
- }
380
- }
381
- else {
382
- // Fresh database — create v2 schema directly
383
- db.exec(`
384
- CREATE TABLE embeddings (
385
- id TEXT PRIMARY KEY,
386
- embedding BLOB NOT NULL,
387
- metadata TEXT NOT NULL DEFAULT '{}',
388
- dimensions INTEGER NOT NULL DEFAULT 0,
389
- created_at TEXT NOT NULL,
390
- updated_at TEXT NOT NULL
391
- );
392
- CREATE INDEX IF NOT EXISTS idx_embeddings_updated_at ON embeddings(updated_at);
393
- `);
394
- }
395
- db.prepare('INSERT OR REPLACE INTO vec_config (key, value) VALUES (?, ?)').run('schema_version', String(VECTOR_STORE_CONSTANTS.SCHEMA_VERSION));
396
- }
397
- // Create vec0 virtual table if sqlite-vec is available and dimensions are known
398
- if (vecEnabled) {
399
- this.ensureVecTable(db);
400
- }
401
- }
402
- /**
403
- * Create the vec0 virtual table if it doesn't already exist and dimensions
404
- * are known. Returns true if the table is ready for use.
405
- *
406
- * @param db - The database
407
- * @param dimensions - Explicit dimensions; if omitted, reads from vec_config
408
- * @returns true if vec0 table exists and is ready
409
- */
410
- ensureVecTable(db, dimensions) {
411
- const dim = dimensions || this.getStoredDimensions(db);
412
- if (!dim || dim <= 0)
413
- return false;
414
- const vecTableExists = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='vec_embeddings'").get();
415
- if (!vecTableExists) {
416
- try {
417
- db.exec(`CREATE VIRTUAL TABLE vec_embeddings USING vec0(embedding float[${dim}] distance_metric=cosine)`);
418
- db.prepare('INSERT OR REPLACE INTO vec_config (key, value) VALUES (?, ?)').run('vec_dimensions', String(dim));
419
- this.logger.info('Created vec0 virtual table', { dimensions: dim });
420
- // Backfill existing embeddings into vec0
421
- this.backfillVecTable(db, dim);
422
- return true;
423
- }
424
- catch (err) {
425
- this.logger.warn('Failed to create vec0 table', {
426
- error: err instanceof Error ? err.message : String(err),
427
- });
428
- return false;
429
- }
430
- }
431
- return true;
432
- }
433
- /**
434
- * Copy all existing embeddings matching the target dimensions into the vec0
435
- * virtual table.
436
- *
437
- * @param db - The database
438
- * @param dimensions - Target embedding dimensions
439
- */
440
- backfillVecTable(db, dimensions) {
441
- const rows = db.prepare('SELECT rowid, embedding, dimensions FROM embeddings WHERE dimensions = ?').all(dimensions);
442
- if (rows.length === 0)
443
- return;
444
- const insertVec = db.prepare('INSERT OR REPLACE INTO vec_embeddings(rowid, embedding) VALUES (CAST(? AS INTEGER), ?)');
445
- const backfill = db.transaction(() => {
446
- for (const row of rows) {
447
- try {
448
- insertVec.run(row.rowid, row.embedding);
449
- }
450
- catch (err) {
451
- this.logger.warn('Failed to backfill vec embedding', {
452
- rowid: row.rowid,
453
- error: String(err),
454
- });
455
- }
456
- }
457
- });
458
- backfill();
459
- this.logger.info('Backfilled vec0 table', { count: rows.length });
460
- }
461
- /**
462
- * Read the stored embedding dimensions from the vec_config table.
463
- *
464
- * @param db - The database
465
- * @returns Stored dimensions, or null if not yet determined
466
- */
467
- getStoredDimensions(db) {
468
- try {
469
- const row = db.prepare('SELECT value FROM vec_config WHERE key = ?').get('vec_dimensions');
470
- return row ? parseInt(row.value, 10) : null;
471
- }
472
- catch {
473
- return null;
474
- }
475
- }
476
- /**
477
- * Close all open database connections and clear caches.
478
- */
479
- closeAll() {
480
- for (const [filePath, state] of this.databases) {
481
- try {
482
- state.stmtCache.clear();
483
- state.db.close();
484
- this.logger.debug('Closed vector store database', { path: filePath });
485
- }
486
- catch (error) {
487
- this.logger.warn('Error closing database', {
488
- path: filePath,
489
- error: error instanceof Error ? error.message : String(error),
490
- });
491
- }
492
- }
493
- this.databases.clear();
494
- }
495
- // ---------------------------------------------------------------------------
496
- // Public API
497
- // ---------------------------------------------------------------------------
498
- /**
499
- * Store or update an embedding for a document.
500
- *
501
- * @param id - Document identifier
502
- * @param embedding - The embedding vector (array of numbers)
503
- * @param metadata - Optional metadata to associate with the embedding
504
- * @param scope - Storage scope ('global' or 'project')
505
- * @param projectPath - Required when scope is 'project'
506
- * @throws Error if id is empty, embedding is invalid, metadata exceeds size,
507
- * or dimensions don't match previously stored embeddings
508
- */
509
- upsert(id, embedding, metadata, scope, projectPath) {
510
- if (!id) {
511
- throw new Error('id is required');
512
- }
513
- validateEmbedding(embedding);
514
- const metadataJson = JSON.stringify(metadata);
515
- if (metadataJson.length > VECTOR_STORE_CONSTANTS.MAX_METADATA_SIZE) {
516
- throw new Error(`metadata exceeds maximum size of ${VECTOR_STORE_CONSTANTS.MAX_METADATA_SIZE} bytes`);
517
- }
518
- const state = this.getDbState(scope, projectPath);
519
- // Dimension consistency: all vectors in a scope must share the same width
520
- if (state.dimensions && state.dimensions !== embedding.length) {
521
- throw new Error(`Dimension mismatch: expected ${state.dimensions}, got ${embedding.length}. ` +
522
- 'All embeddings in a scope must have the same dimensions.');
523
- }
524
- const now = new Date().toISOString();
525
- const blob = embeddingToBlob(embedding);
526
- const upsertStmt = this.getStmt(state, 'upsert', `INSERT INTO embeddings (id, embedding, metadata, dimensions, created_at, updated_at)
527
- VALUES (?, ?, ?, ?, ?, ?)
528
- ON CONFLICT(id) DO UPDATE SET
529
- embedding = excluded.embedding,
530
- metadata = excluded.metadata,
531
- dimensions = excluded.dimensions,
532
- updated_at = excluded.updated_at`);
533
- upsertStmt.run(id, blob, metadataJson, embedding.length, now, now);
534
- // Track dimensions on first insert
535
- if (!state.dimensions) {
536
- state.dimensions = embedding.length;
537
- state.db.prepare('INSERT OR REPLACE INTO vec_config (key, value) VALUES (?, ?)').run('vec_dimensions', String(embedding.length));
538
- // Now we know dimensions — create vec0 table if available
539
- if (state.vecEnabled) {
540
- this.ensureVecTable(state.db, embedding.length);
541
- }
542
- }
543
- // Sync to vec0 table
544
- if (state.vecEnabled && state.dimensions === embedding.length) {
545
- this.syncToVec(state, id, blob);
546
- }
547
- this.logger.debug('Upserted embedding', {
548
- id,
549
- scope,
550
- dimensions: embedding.length,
551
- vecEnabled: state.vecEnabled,
552
- });
553
- }
554
- /**
555
- * Sync a single embedding to the vec0 virtual table.
556
- * Uses CAST(? AS INTEGER) for rowid because sqlite-vec's vec0 virtual
557
- * table does not accept JS number params directly for primary keys.
558
- *
559
- * @param state - Database state
560
- * @param id - Document identifier
561
- * @param blob - Embedding as a Float32Array buffer
562
- */
563
- syncToVec(state, id, blob) {
564
- try {
565
- const rowObj = state.db.prepare('SELECT rowid FROM embeddings WHERE id = ?').get(id);
566
- if (rowObj) {
567
- state.db.prepare('DELETE FROM vec_embeddings WHERE rowid = CAST(? AS INTEGER)').run(rowObj.rowid);
568
- state.db.prepare('INSERT INTO vec_embeddings(rowid, embedding) VALUES (CAST(? AS INTEGER), ?)').run(rowObj.rowid, blob);
569
- }
570
- }
571
- catch (err) {
572
- this.logger.warn('Failed to sync embedding to vec0', {
573
- id,
574
- error: err instanceof Error ? err.message : String(err),
575
- });
576
- }
577
- }
578
- /**
579
- * Batch upsert multiple embeddings in a single transaction. Significantly
580
- * faster than individual upserts for bulk imports.
581
- *
582
- * @param items - Array of { id, embedding, metadata } objects
583
- * @param scope - Storage scope
584
- * @param projectPath - Required when scope is 'project'
585
- * @returns Count of succeeded and failed inserts
586
- * @throws Error if batch size exceeds MAX_BATCH_SIZE
587
- */
588
- batchUpsert(items, scope, projectPath) {
589
- if (items.length > VECTOR_STORE_CONSTANTS.MAX_BATCH_SIZE) {
590
- throw new Error(`Batch size ${items.length} exceeds maximum ${VECTOR_STORE_CONSTANTS.MAX_BATCH_SIZE}`);
591
- }
592
- let succeeded = 0;
593
- let failed = 0;
594
- const state = this.getDbState(scope, projectPath);
595
- const txn = state.db.transaction(() => {
596
- for (const item of items) {
597
- try {
598
- this.upsert(item.id, item.embedding, item.metadata, scope, projectPath);
599
- succeeded++;
600
- }
601
- catch (err) {
602
- this.logger.warn('Batch upsert item failed', {
603
- id: item.id,
604
- error: err instanceof Error ? err.message : String(err),
605
- });
606
- failed++;
607
- }
608
- }
609
- });
610
- txn();
611
- return { succeeded, failed };
612
- }
613
- /**
614
- * Retrieve a stored embedding by document ID.
615
- *
616
- * @param id - Document identifier
617
- * @param scope - Storage scope
618
- * @param projectPath - Required when scope is 'project'
619
- * @returns The vector record, or null if not found
620
- */
621
- get(id, scope, projectPath) {
622
- const state = this.getDbState(scope, projectPath);
623
- const stmt = this.getStmt(state, 'get', 'SELECT * FROM embeddings WHERE id = ?');
624
- const row = stmt.get(id);
625
- if (!row) {
626
- return null;
627
- }
628
- return {
629
- id: row.id,
630
- embedding: row.embedding instanceof Buffer
631
- ? blobToEmbedding(row.embedding)
632
- : JSON.parse(row.embedding),
633
- metadata: JSON.parse(row.metadata),
634
- createdAt: row.created_at,
635
- updatedAt: row.updated_at,
636
- };
637
- }
638
- /**
639
- * Delete an embedding by document ID.
640
- *
641
- * @param id - Document identifier
642
- * @param scope - Storage scope
643
- * @param projectPath - Required when scope is 'project'
644
- * @returns True if a record was deleted, false if not found
645
- */
646
- delete(id, scope, projectPath) {
647
- const state = this.getDbState(scope, projectPath);
648
- // Remove from vec0 first if available
649
- if (state.vecEnabled) {
650
- try {
651
- const rowObj = state.db.prepare('SELECT rowid FROM embeddings WHERE id = ?').get(id);
652
- if (rowObj) {
653
- state.db.prepare('DELETE FROM vec_embeddings WHERE rowid = CAST(? AS INTEGER)').run(rowObj.rowid);
654
- }
655
- }
656
- catch {
657
- // vec0 delete failure is non-fatal
658
- }
659
- }
660
- const stmt = this.getStmt(state, 'delete', 'DELETE FROM embeddings WHERE id = ?');
661
- const result = stmt.run(id);
662
- return result.changes > 0;
663
- }
664
- /**
665
- * Check whether an embedding exists for a given document ID.
666
- *
667
- * @param id - Document identifier
668
- * @param scope - Storage scope
669
- * @param projectPath - Required when scope is 'project'
670
- * @returns True if the embedding exists
671
- */
672
- has(id, scope, projectPath) {
673
- const state = this.getDbState(scope, projectPath);
674
- const stmt = this.getStmt(state, 'has', 'SELECT 1 FROM embeddings WHERE id = ?');
675
- return stmt.get(id) !== undefined;
676
- }
677
- /**
678
- * Return the total number of stored embeddings.
679
- *
680
- * @param scope - Storage scope
681
- * @param projectPath - Required when scope is 'project'
682
- * @returns Count of stored embeddings
683
- */
684
- count(scope, projectPath) {
685
- const state = this.getDbState(scope, projectPath);
686
- const stmt = this.getStmt(state, 'count', 'SELECT COUNT(*) as cnt FROM embeddings');
687
- return stmt.get().cnt;
688
- }
689
- /**
690
- * Search for the most similar embeddings. Uses native vec0 KNN search when
691
- * sqlite-vec is available, otherwise falls back to JavaScript cosine
692
- * similarity.
693
- *
694
- * @param queryEmbedding - The query embedding vector
695
- * @param scope - Storage scope
696
- * @param projectPath - Required when scope is 'project'
697
- * @param limit - Maximum number of results (default 10)
698
- * @param threshold - Minimum similarity threshold (default 0.1)
699
- * @returns Matching records sorted by descending similarity
700
- */
701
- search(queryEmbedding, scope, projectPath, limit = VECTOR_STORE_CONSTANTS.DEFAULT_SEARCH_LIMIT, threshold = VECTOR_STORE_CONSTANTS.DEFAULT_SIMILARITY_THRESHOLD) {
702
- if (!queryEmbedding || queryEmbedding.length === 0) {
703
- return [];
704
- }
705
- const state = this.getDbState(scope, projectPath);
706
- // Try native vec0 KNN search
707
- if (state.vecEnabled && state.dimensions === queryEmbedding.length) {
708
- try {
709
- return this.vecSearch(state, queryEmbedding, limit, threshold);
710
- }
711
- catch (err) {
712
- this.logger.warn('vec0 search failed, falling back to JS', {
713
- error: err instanceof Error ? err.message : String(err),
714
- });
715
- }
716
- }
717
- // Fallback: JavaScript cosine similarity
718
- return this.jsFallbackSearch(state, queryEmbedding, limit, threshold);
719
- }
720
- /**
721
- * Native KNN search using sqlite-vec's vec0 virtual table with cosine
722
- * distance metric. Results are converted from cosine distance (0 = identical,
723
- * 1 = orthogonal) to cosine similarity (1 = identical, 0 = orthogonal).
724
- *
725
- * @param state - Database state
726
- * @param queryEmbedding - The query vector
727
- * @param limit - Max results
728
- * @param threshold - Minimum cosine similarity
729
- * @returns Sorted search results
730
- */
731
- vecSearch(state, queryEmbedding, limit, threshold) {
732
- const queryBlob = embeddingToBlob(queryEmbedding);
733
- // Fetch candidates from vec0 (request extra to account for threshold filtering)
734
- const vecRows = state.db.prepare(`SELECT rowid, distance
735
- FROM vec_embeddings
736
- WHERE embedding MATCH ?
737
- ORDER BY distance
738
- LIMIT ?`).all(queryBlob, limit * 2);
739
- if (vecRows.length === 0)
740
- return [];
741
- // Fetch metadata for matched rowids
742
- const rowids = vecRows.map((r) => r.rowid);
743
- const placeholders = rowids.map(() => '?').join(',');
744
- const metaRows = state.db.prepare(`SELECT rowid, id, metadata FROM embeddings WHERE rowid IN (${placeholders})`).all(...rowids);
745
- const metaMap = new Map(metaRows.map((r) => [r.rowid, r]));
746
- // Convert cosine distance to cosine similarity: sim = 1 - distance
747
- const results = [];
748
- for (const vr of vecRows) {
749
- const meta = metaMap.get(vr.rowid);
750
- if (!meta)
751
- continue;
752
- const score = 1 - vr.distance;
753
- if (score >= threshold) {
754
- results.push({
755
- id: meta.id,
756
- score,
757
- metadata: JSON.parse(meta.metadata),
758
- });
759
- }
760
- }
761
- results.sort((a, b) => b.score - a.score);
762
- return results.slice(0, limit);
763
- }
764
- /**
765
- * JavaScript fallback search using cosine similarity on BLOB embeddings.
766
- * Used when sqlite-vec is not available.
767
- *
768
- * @param state - Database state
769
- * @param queryEmbedding - The query vector
770
- * @param limit - Max results
771
- * @param threshold - Minimum cosine similarity
772
- * @returns Sorted search results
773
- */
774
- jsFallbackSearch(state, queryEmbedding, limit, threshold) {
775
- const rows = state.db.prepare('SELECT id, embedding, metadata FROM embeddings').all();
776
- const results = [];
777
- for (const row of rows) {
778
- const storedEmbedding = row.embedding instanceof Buffer
779
- ? blobToEmbedding(row.embedding)
780
- : JSON.parse(row.embedding);
781
- const score = cosineSimilarity(queryEmbedding, storedEmbedding);
782
- if (score >= threshold) {
783
- results.push({
784
- id: row.id,
785
- score,
786
- metadata: JSON.parse(row.metadata),
787
- });
788
- }
789
- }
790
- results.sort((a, b) => b.score - a.score);
791
- return results.slice(0, limit);
792
- }
793
- /**
794
- * Delete all embeddings from the store. Also resets the stored dimension
795
- * constraint so that subsequent inserts may use a different embedding width.
796
- *
797
- * @param scope - Storage scope
798
- * @param projectPath - Required when scope is 'project'
799
- * @returns Number of records deleted
800
- */
801
- clear(scope, projectPath) {
802
- const state = this.getDbState(scope, projectPath);
803
- // Drop vec0 table so it can be recreated with new dimensions
804
- if (state.vecEnabled) {
805
- try {
806
- state.db.exec('DROP TABLE IF EXISTS vec_embeddings');
807
- }
808
- catch {
809
- // Non-fatal
810
- }
811
- }
812
- const stmt = this.getStmt(state, 'clear', 'DELETE FROM embeddings');
813
- const result = stmt.run();
814
- // Reset dimension tracking — no data means no dimension constraint
815
- state.dimensions = null;
816
- try {
817
- state.db.prepare('DELETE FROM vec_config WHERE key = ?').run('vec_dimensions');
818
- }
819
- catch {
820
- // Non-fatal
821
- }
822
- return result.changes;
823
- }
824
- }
825
- //# sourceMappingURL=vector-store.service.js.map