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