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