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.
- package/config/constants.ts +18 -3
- package/config/hooks/install-hooks.sh +88 -0
- package/config/hooks/pre-commit +104 -0
- package/config/orchestrator_tasks/prompts/orchestrator-prompt.md +17 -24
- package/config/roles/auditor/role.json +13 -0
- package/config/roles/orchestrator/prompt.md +25 -0
- package/config/roles/product-manager/prompt.md +18 -1
- package/config/roles/researcher/prompt.md +110 -0
- package/config/roles/team-leader/prompt.md +31 -8
- package/config/roles/team-leader/tl-addon.md +40 -9
- package/config/roles/ux-designer/prompt.md +111 -0
- package/config/skills/_common/lib.sh +33 -0
- package/config/skills/agent/browse-stealth/{instructions.md → SKILL.md} +40 -0
- package/config/skills/agent/chrome-attach/SKILL.md +84 -0
- package/config/skills/agent/chrome-attach/execute.sh +279 -0
- package/config/skills/agent/competitor-content-tracker/{instructions.md → SKILL.md} +34 -0
- package/config/skills/agent/computer-use/{instructions.md → SKILL.md} +43 -0
- package/config/skills/agent/content-calendar/{instructions.md → SKILL.md} +32 -0
- package/config/skills/agent/content-repurposer/{instructions.md → SKILL.md} +38 -0
- package/config/skills/agent/content-writer/{instructions.md → SKILL.md} +38 -0
- package/config/skills/agent/core/accept-task/{instructions.md → SKILL.md} +37 -0
- package/config/skills/agent/core/block-task/{instructions.md → SKILL.md} +37 -0
- package/config/skills/agent/core/check-quality-gates/{instructions.md → SKILL.md} +40 -0
- package/config/skills/agent/core/complete-task/{instructions.md → SKILL.md} +37 -0
- package/config/skills/agent/core/complete-task/execute.sh +15 -0
- package/config/skills/agent/core/generate-pdf/{instructions.md → SKILL.md} +42 -0
- package/config/skills/agent/core/get-my-context/{instructions.md → SKILL.md} +38 -0
- package/config/skills/agent/core/get-sops/{instructions.md → SKILL.md} +38 -0
- package/config/skills/agent/core/get-team-norms/execute.sh +106 -0
- package/config/skills/agent/core/get-team-status/SKILL.md +55 -0
- package/config/skills/agent/core/handoff-task/execute.sh +150 -0
- package/config/skills/agent/core/heartbeat/{instructions.md → SKILL.md} +27 -0
- package/config/skills/agent/core/marketplace-search/{instructions.md → SKILL.md} +41 -0
- package/config/skills/agent/core/query-knowledge/{instructions.md → SKILL.md} +40 -0
- package/config/skills/agent/core/read-task/SKILL.md +56 -0
- package/config/skills/agent/core/recall/{instructions.md → SKILL.md} +38 -0
- package/config/skills/agent/core/record-learning/{instructions.md → SKILL.md} +38 -0
- package/config/skills/agent/core/register-self/SKILL.md +54 -0
- package/config/skills/agent/core/remember/{instructions.md → SKILL.md} +37 -0
- package/config/skills/agent/core/remember/execute.sh +6 -0
- package/config/skills/agent/core/reply-chat/{instructions.md → SKILL.md} +37 -0
- package/config/skills/agent/core/report-progress/{instructions.md → SKILL.md} +38 -0
- package/config/skills/agent/core/report-status/{instructions.md → SKILL.md} +39 -0
- package/config/skills/agent/core/send-chat-response/{instructions.md → SKILL.md} +37 -0
- package/config/skills/agent/core/send-message/SKILL.md +58 -0
- package/config/skills/agent/core/update-team-norm/execute.sh +115 -0
- package/config/skills/agent/desktop-app-control/{instructions.md → SKILL.md} +42 -0
- package/config/skills/agent/trend-monitor/{instructions.md → SKILL.md} +34 -0
- package/config/skills/agent/vnc-browser/{instructions.md → SKILL.md} +38 -0
- package/config/skills/auditor/score-task/SKILL.md +28 -0
- package/config/skills/auditor/score-task/execute.sh +21 -0
- package/config/skills/examples/enterprise-skill-example.json +22 -0
- package/config/skills/examples/premium-skill-example.json +22 -0
- package/config/skills/orchestrator/assign-task/SKILL.md +41 -0
- package/config/skills/orchestrator/assign-team-to-project/{instructions.md → SKILL.md} +25 -0
- package/config/skills/orchestrator/broadcast/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/broadcast-to-org/{instructions.md → SKILL.md} +25 -0
- package/config/skills/orchestrator/cancel-all-schedules/{instructions.md → SKILL.md} +5 -0
- package/config/skills/orchestrator/cancel-schedule/SKILL.md +43 -0
- package/config/skills/orchestrator/complete-task/SKILL.md +41 -0
- package/config/skills/orchestrator/create-project/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/create-team/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/delegate-task/{instructions.md → SKILL.md} +27 -0
- package/config/skills/orchestrator/delegate-task/execute.sh +31 -2
- package/config/skills/orchestrator/get-agent-logs/{instructions.md → SKILL.md} +25 -0
- package/config/skills/orchestrator/get-agent-status/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/get-project-overview/SKILL.md +41 -0
- package/config/skills/orchestrator/get-tasks/SKILL.md +41 -0
- package/config/skills/orchestrator/get-team-status/SKILL.md +43 -0
- package/config/skills/orchestrator/handle-agent-failure/{instructions.md → SKILL.md} +27 -0
- package/config/skills/orchestrator/heartbeat/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/list-schedules/{instructions.md → SKILL.md} +5 -0
- package/config/skills/orchestrator/list-subscriptions/SKILL.md +41 -0
- package/config/skills/orchestrator/query-knowledge/{instructions.md → SKILL.md} +28 -0
- package/config/skills/orchestrator/read-session-logs/{instructions.md → SKILL.md} +26 -0
- package/config/skills/orchestrator/read-system-logs/{instructions.md → SKILL.md} +25 -0
- package/config/skills/orchestrator/recall/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/record-failure/{instructions.md → SKILL.md} +27 -0
- package/config/skills/orchestrator/record-learning/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/record-success/{instructions.md → SKILL.md} +26 -0
- package/config/skills/orchestrator/register-self/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/remember/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/reply-chat/{instructions.md → SKILL.md} +25 -0
- package/config/skills/orchestrator/reply-chat/execute.sh +0 -13
- package/config/skills/orchestrator/reply-gchat/{instructions.md → SKILL.md} +25 -0
- package/config/skills/orchestrator/reply-gchat/execute.sh +0 -18
- package/config/skills/orchestrator/reply-slack/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/reply-slack/execute.sh +18 -31
- package/config/skills/orchestrator/report-bug/{instructions.md → SKILL.md} +26 -0
- package/config/skills/orchestrator/restart-crewly/{instructions.md → SKILL.md} +26 -0
- package/config/skills/orchestrator/resume-session/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/schedule-check/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/send-key/{instructions.md → SKILL.md} +26 -0
- package/config/skills/orchestrator/send-message/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/send-pdf-to-slack/{instructions.md → SKILL.md} +27 -0
- package/config/skills/orchestrator/set-goal/{instructions.md → SKILL.md} +26 -0
- package/config/skills/orchestrator/start-agent/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/start-team/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/stop-agent/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/stop-team/SKILL.md +43 -0
- package/config/skills/orchestrator/subscribe-event/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/terminate-agent/{instructions.md → SKILL.md} +24 -0
- package/config/skills/orchestrator/unsubscribe-event/SKILL.md +42 -0
- package/config/skills/orchestrator/update-focus/{instructions.md → SKILL.md} +26 -0
- package/config/skills/orchestrator/update-team/{instructions.md → SKILL.md} +24 -0
- package/config/skills/team-leader/aggregate-results/{instructions.md → SKILL.md} +26 -0
- package/config/skills/team-leader/decompose-goal/{instructions.md → SKILL.md} +26 -0
- package/config/skills/team-leader/delegate-task/{instructions.md → SKILL.md} +26 -0
- package/config/skills/team-leader/delegate-task/execute.sh +14 -6
- package/config/skills/team-leader/delegate-task/execute.test.sh +401 -0
- package/config/skills/team-leader/handle-failure/{instructions.md → SKILL.md} +27 -0
- package/config/skills/team-leader/schedule-check/{instructions.md → SKILL.md} +26 -0
- package/config/skills/team-leader/start-agent/{instructions.md → SKILL.md} +26 -0
- package/config/skills/team-leader/stop-agent/{instructions.md → SKILL.md} +26 -0
- package/config/skills/team-leader/verify-output/{instructions.md → SKILL.md} +27 -0
- package/config/templates/agent-agents-md.md +35 -0
- package/config/templates/agent-gemini-md.md +35 -0
- package/config/templates/code-review-team/team-config.json +7 -0
- package/config/templates/content-generation-team/norms/brand-guidelines.md +64 -0
- package/config/templates/content-generation-team/norms/content-review.md +66 -0
- package/config/templates/content-generation-team/norms/publish-checklist.md +58 -0
- package/config/templates/content-generation-team/team-config.json +8 -0
- package/config/templates/dev-fullstack/norms/code-commit-sop.md +40 -0
- package/config/templates/dev-fullstack/norms/quality-gates.md +35 -0
- package/config/templates/dev-fullstack/template.json +17 -1
- package/config/templates/education-smb/template.json +10 -1
- package/config/templates/insurance-smb/template.json +10 -1
- package/config/templates/research-analysis/norms/research-methodology.md +36 -0
- package/config/templates/research-analysis/norms/source-citation.md +33 -0
- package/config/templates/research-analysis/template.json +17 -1
- package/config/templates/security-audit-team.json +67 -0
- package/config/templates/social-media-ops/norms/engagement-rules.md +35 -0
- package/config/templates/social-media-ops/norms/posting-schedule.md +43 -0
- package/config/templates/social-media-ops/template.json +17 -1
- package/config/templates/video-production/template.json +10 -1
- package/dist/backend/backend/src/constants.d.ts +80 -11
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +85 -11
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/approvals/approvals.controller.d.ts +99 -0
- package/dist/backend/backend/src/controllers/approvals/approvals.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/approvals/approvals.controller.js +183 -0
- package/dist/backend/backend/src/controllers/approvals/approvals.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/approvals/approvals.routes.d.ts +15 -0
- package/dist/backend/backend/src/controllers/approvals/approvals.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/approvals/approvals.routes.js +27 -0
- package/dist/backend/backend/src/controllers/approvals/approvals.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-google-auth.controller.d.ts +70 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-google-auth.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-google-auth.controller.js +368 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-google-auth.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts +24 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +202 -3
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts +9 -4
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.js +19 -5
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/index.d.ts +1 -0
- package/dist/backend/backend/src/controllers/cloud/index.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/index.js +1 -0
- package/dist/backend/backend/src/controllers/cloud/index.js.map +1 -1
- package/dist/backend/backend/src/controllers/index.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/index.js +2 -0
- package/dist/backend/backend/src/controllers/index.js.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js +1 -1
- package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.d.ts +3 -3
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.js +9 -9
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/memory/memory.controller.js +6 -6
- package/dist/backend/backend/src/controllers/memory/memory.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.d.ts +0 -7
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.js +2 -135
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts +14 -0
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +96 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/oauth/oauth.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/oauth/oauth.routes.js +8 -1
- package/dist/backend/backend/src/controllers/oauth/oauth.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.d.ts +16 -0
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js +124 -13
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/payment/payment.controller.js +2 -2
- package/dist/backend/backend/src/controllers/payment/payment.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/payment/payment.routes.d.ts +3 -3
- package/dist/backend/backend/src/controllers/payment/payment.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/payment/payment.routes.js +4 -14
- package/dist/backend/backend/src/controllers/payment/payment.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/payment/payment.types.d.ts +15 -94
- package/dist/backend/backend/src/controllers/payment/payment.types.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/payment/payment.types.js +11 -35
- package/dist/backend/backend/src/controllers/payment/payment.types.js.map +1 -1
- package/dist/backend/backend/src/controllers/pr-review/pr-review.controller.d.ts +49 -0
- package/dist/backend/backend/src/controllers/pr-review/pr-review.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/pr-review/pr-review.controller.js +138 -0
- package/dist/backend/backend/src/controllers/pr-review/pr-review.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/pr-review/pr-review.routes.d.ts +20 -0
- package/dist/backend/backend/src/controllers/pr-review/pr-review.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/pr-review/pr-review.routes.js +30 -0
- package/dist/backend/backend/src/controllers/pr-review/pr-review.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/quality-gate/quality-gate.controller.d.ts +12 -0
- package/dist/backend/backend/src/controllers/quality-gate/quality-gate.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/quality-gate/quality-gate.controller.js +107 -0
- package/dist/backend/backend/src/controllers/quality-gate/quality-gate.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/request-types.d.ts +20 -1
- package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +11 -5
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +46 -0
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +598 -326
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts +12 -0
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +105 -36
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.routes.js +2 -1
- package/dist/backend/backend/src/controllers/team/team.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/template/template.controller.d.ts +11 -0
- package/dist/backend/backend/src/controllers/template/template.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/template/template.controller.js +59 -0
- package/dist/backend/backend/src/controllers/template/template.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/template/template.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/template/template.routes.js +2 -1
- package/dist/backend/backend/src/controllers/template/template.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/workspace/workspace.controller.d.ts +39 -0
- package/dist/backend/backend/src/controllers/workspace/workspace.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/workspace/workspace.controller.js +120 -0
- package/dist/backend/backend/src/controllers/workspace/workspace.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/workspace/workspace.routes.d.ts +18 -0
- package/dist/backend/backend/src/controllers/workspace/workspace.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/workspace/workspace.routes.js +27 -0
- package/dist/backend/backend/src/controllers/workspace/workspace.routes.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +108 -15
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/middleware/require-auth.middleware.d.ts +20 -0
- package/dist/backend/backend/src/middleware/require-auth.middleware.d.ts.map +1 -0
- package/dist/backend/backend/src/middleware/require-auth.middleware.js +21 -0
- package/dist/backend/backend/src/middleware/require-auth.middleware.js.map +1 -0
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +18 -5
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/routes/modules/quality-gate.routes.d.ts +2 -1
- package/dist/backend/backend/src/routes/modules/quality-gate.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/modules/quality-gate.routes.js +4 -2
- package/dist/backend/backend/src/routes/modules/quality-gate.routes.js.map +1 -1
- package/dist/backend/backend/src/routes/modules/task-management.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/modules/task-management.routes.js +8 -0
- package/dist/backend/backend/src/routes/modules/task-management.routes.js.map +1 -1
- package/dist/backend/backend/src/routes/modules/terminal.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/modules/terminal.routes.js +4 -0
- package/dist/backend/backend/src/routes/modules/terminal.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/adaptive-heartbeat.service.d.ts +149 -0
- package/dist/backend/backend/src/services/agent/adaptive-heartbeat.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/adaptive-heartbeat.service.js +200 -0
- package/dist/backend/backend/src/services/agent/adaptive-heartbeat.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.d.ts +13 -0
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js +65 -6
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +36 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +174 -52
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/auditor-scheduler.service.d.ts +66 -20
- package/dist/backend/backend/src/services/agent/auditor-scheduler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/auditor-scheduler.service.js +261 -60
- package/dist/backend/backend/src/services/agent/auditor-scheduler.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts +19 -0
- package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/claude-runtime.service.js +80 -0
- package/dist/backend/backend/src/services/agent/claude-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/context-window-monitor.service.d.ts +11 -0
- package/dist/backend/backend/src/services/agent/context-window-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/context-window-monitor.service.js +49 -1
- package/dist/backend/backend/src/services/agent/context-window-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +74 -3
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +248 -18
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/approval-queue.service.d.ts +161 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/approval-queue.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/approval-queue.service.js +237 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/approval-queue.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts +74 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js +140 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js +50 -2
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts +16 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +45 -5
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts +3 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/index.js +3 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/index.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts +135 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js +185 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +10 -2
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +22 -2
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts +143 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js +264 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js +2 -2
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +55 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +660 -45
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts +75 -3
- package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js +49 -2
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +17 -2
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts +37 -0
- package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js +170 -3
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/chrome-discovery.service.d.ts +108 -0
- package/dist/backend/backend/src/services/browser/chrome-discovery.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/browser/chrome-discovery.service.js +251 -0
- package/dist/backend/backend/src/services/browser/chrome-discovery.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.js +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts +12 -0
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js +19 -0
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/device-auto-discovery.service.d.ts +191 -0
- package/dist/backend/backend/src/services/cloud/device-auto-discovery.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/device-auto-discovery.service.js +415 -0
- package/dist/backend/backend/src/services/cloud/device-auto-discovery.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/device-identity.service.d.ts +89 -0
- package/dist/backend/backend/src/services/cloud/device-identity.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/device-identity.service.js +148 -0
- package/dist/backend/backend/src/services/cloud/device-identity.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/relay-client.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/relay-client.service.js +5 -3
- package/dist/backend/backend/src/services/cloud/relay-client.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/tracing.service.d.ts +127 -0
- package/dist/backend/backend/src/services/core/tracing.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/core/tracing.service.js +238 -0
- package/dist/backend/backend/src/services/core/tracing.service.js.map +1 -0
- package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js +11 -3
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
- package/dist/backend/backend/src/services/index.d.ts +1 -0
- package/dist/backend/backend/src/services/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/index.js +1 -0
- package/dist/backend/backend/src/services/index.js.map +1 -1
- package/dist/backend/backend/src/services/knowledge/embedding-provider.d.ts +78 -0
- package/dist/backend/backend/src/services/knowledge/embedding-provider.d.ts.map +1 -0
- package/dist/backend/backend/src/services/knowledge/embedding-provider.js +164 -0
- package/dist/backend/backend/src/services/knowledge/embedding-provider.js.map +1 -0
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts +39 -13
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js +114 -17
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js.map +1 -1
- package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts +170 -23
- package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/knowledge/vector-store.service.js +565 -73
- package/dist/backend/backend/src/services/knowledge/vector-store.service.js.map +1 -1
- package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.js +8 -11
- package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -1
- package/dist/backend/backend/src/services/marketplace/marketplace.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/marketplace/marketplace.service.js +1 -0
- package/dist/backend/backend/src/services/marketplace/marketplace.service.js.map +1 -1
- package/dist/backend/backend/src/services/memory/context-flush.service.d.ts +73 -0
- package/dist/backend/backend/src/services/memory/context-flush.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/context-flush.service.js +131 -0
- package/dist/backend/backend/src/services/memory/context-flush.service.js.map +1 -0
- package/dist/backend/backend/src/services/memory/learning-accumulation.service.d.ts +23 -2
- package/dist/backend/backend/src/services/memory/learning-accumulation.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/memory/learning-accumulation.service.js +78 -16
- package/dist/backend/backend/src/services/memory/learning-accumulation.service.js.map +1 -1
- package/dist/backend/backend/src/services/memory/memory.service.d.ts +38 -0
- package/dist/backend/backend/src/services/memory/memory.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/memory/memory.service.js +121 -2
- package/dist/backend/backend/src/services/memory/memory.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.d.ts +29 -207
- package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.js +97 -683
- package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/google-chat-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/google-chat-initializer.js +13 -12
- package/dist/backend/backend/src/services/messaging/google-chat-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/messenger-adapter.interface.d.ts +2 -0
- package/dist/backend/backend/src/services/messaging/messenger-adapter.interface.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts +6 -23
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js +48 -184
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +51 -5
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/index.d.ts +1 -1
- package/dist/backend/backend/src/services/orchestrator/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/index.js +1 -1
- package/dist/backend/backend/src/services/orchestrator/index.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.d.ts +65 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js +165 -2
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts +8 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js +23 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js.map +1 -1
- package/dist/backend/backend/src/services/payment/stripe.service.d.ts +95 -43
- package/dist/backend/backend/src/services/payment/stripe.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/payment/stripe.service.js +229 -190
- package/dist/backend/backend/src/services/payment/stripe.service.js.map +1 -1
- package/dist/backend/backend/src/services/pr-review/pr-review.service.d.ts +181 -0
- package/dist/backend/backend/src/services/pr-review/pr-review.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/pr-review/pr-review.service.js +336 -0
- package/dist/backend/backend/src/services/pr-review/pr-review.service.js.map +1 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +23 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project/task-tracking.service.js +88 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.js.map +1 -1
- package/dist/backend/backend/src/services/session/index.d.ts +2 -0
- package/dist/backend/backend/src/services/session/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/index.js +2 -0
- package/dist/backend/backend/src/services/session/index.js.map +1 -1
- package/dist/backend/backend/src/services/session/session-handoff.service.d.ts +294 -0
- package/dist/backend/backend/src/services/session/session-handoff.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/session/session-handoff.service.js +674 -0
- package/dist/backend/backend/src/services/session/session-handoff.service.js.map +1 -0
- package/dist/backend/backend/src/services/skill/index.d.ts +1 -0
- package/dist/backend/backend/src/services/skill/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/skill/index.js +1 -0
- package/dist/backend/backend/src/services/skill/index.js.map +1 -1
- package/dist/backend/backend/src/services/skill/skill-catalog.service.d.ts +25 -6
- package/dist/backend/backend/src/services/skill/skill-catalog.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/skill/skill-catalog.service.js +78 -20
- package/dist/backend/backend/src/services/skill/skill-catalog.service.js.map +1 -1
- package/dist/backend/backend/src/services/skill/skill-tier.service.d.ts +116 -0
- package/dist/backend/backend/src/services/skill/skill-tier.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/skill/skill-tier.service.js +155 -0
- package/dist/backend/backend/src/services/skill/skill-tier.service.js.map +1 -0
- package/dist/backend/backend/src/services/skill/skill.service.d.ts +35 -7
- package/dist/backend/backend/src/services/skill/skill.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/skill/skill.service.js +128 -35
- package/dist/backend/backend/src/services/skill/skill.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +50 -47
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +267 -202
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts +28 -2
- package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.js +69 -3
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/backend/backend/src/services/template/template.service.d.ts +19 -1
- package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/template/template.service.js +110 -3
- package/dist/backend/backend/src/services/template/template.service.js.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.d.ts +11 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.js +57 -3
- package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/message-scheduler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/message-scheduler.service.js +6 -0
- package/dist/backend/backend/src/services/workflow/message-scheduler.service.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts +52 -0
- package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/scheduler.service.js +319 -6
- package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
- package/dist/backend/backend/src/types/chat.types.d.ts +2 -2
- package/dist/backend/backend/src/types/chat.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/chat.types.js +18 -22
- package/dist/backend/backend/src/types/chat.types.js.map +1 -1
- package/dist/backend/backend/src/types/index.d.ts +37 -0
- package/dist/backend/backend/src/types/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/index.js.map +1 -1
- package/dist/backend/backend/src/types/marketplace.types.d.ts +1 -1
- package/dist/backend/backend/src/types/marketplace.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/scheduler.types.d.ts +4 -0
- package/dist/backend/backend/src/types/scheduler.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/scheduler.types.js.map +1 -1
- package/dist/backend/backend/src/types/skill.types.d.ts +4 -0
- package/dist/backend/backend/src/types/skill.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/skill.types.js.map +1 -1
- package/dist/backend/backend/src/types/task-tracking.types.d.ts +6 -0
- package/dist/backend/backend/src/types/task-tracking.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/task-tracking.types.js.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.d.ts +2 -0
- package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
- package/dist/backend/backend/src/utils/skill-md-parser.d.ts +38 -0
- package/dist/backend/backend/src/utils/skill-md-parser.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/skill-md-parser.js +47 -0
- package/dist/backend/backend/src/utils/skill-md-parser.js.map +1 -0
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts +0 -154
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -1
- package/dist/backend/backend/src/websocket/terminal.gateway.js +0 -515
- package/dist/backend/backend/src/websocket/terminal.gateway.js.map +1 -1
- package/dist/backend/config/constants.d.ts +18 -3
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +18 -3
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +80 -11
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +85 -11
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/knowledge/embedding-provider.d.ts +78 -0
- package/dist/cli/backend/src/services/knowledge/embedding-provider.d.ts.map +1 -0
- package/dist/cli/backend/src/services/knowledge/embedding-provider.js +164 -0
- package/dist/cli/backend/src/services/knowledge/embedding-provider.js.map +1 -0
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts +39 -13
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js +114 -17
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js.map +1 -1
- package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts +170 -23
- package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/knowledge/vector-store.service.js +565 -73
- package/dist/cli/backend/src/services/knowledge/vector-store.service.js.map +1 -1
- package/dist/cli/backend/src/services/memory/memory.service.d.ts +38 -0
- package/dist/cli/backend/src/services/memory/memory.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/memory/memory.service.js +121 -2
- package/dist/cli/backend/src/services/memory/memory.service.js.map +1 -1
- package/dist/cli/backend/src/types/chat.types.d.ts +2 -2
- package/dist/cli/backend/src/types/chat.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/chat.types.js +18 -22
- package/dist/cli/backend/src/types/chat.types.js.map +1 -1
- package/dist/cli/backend/src/types/index.d.ts +37 -0
- package/dist/cli/backend/src/types/index.d.ts.map +1 -1
- package/dist/cli/backend/src/types/index.js.map +1 -1
- package/dist/cli/backend/src/types/scheduler.types.d.ts +4 -0
- package/dist/cli/backend/src/types/scheduler.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/scheduler.types.js.map +1 -1
- package/dist/cli/backend/src/types/skill.types.d.ts +4 -0
- package/dist/cli/backend/src/types/skill.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/skill.types.js.map +1 -1
- package/dist/cli/cli/src/commands/onboard.d.ts +19 -2
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +58 -15
- package/dist/cli/cli/src/commands/onboard.js.map +1 -1
- package/dist/cli/cli/src/commands/pair.d.ts +46 -0
- package/dist/cli/cli/src/commands/pair.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/pair.js +258 -0
- package/dist/cli/cli/src/commands/pair.js.map +1 -0
- package/dist/cli/cli/src/commands/service.d.ts +86 -0
- package/dist/cli/cli/src/commands/service.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/service.js +687 -0
- package/dist/cli/cli/src/commands/service.js.map +1 -0
- package/dist/cli/cli/src/index.js +17 -0
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/config/constants.d.ts +18 -3
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +18 -3
- package/dist/cli/config/constants.js.map +1 -1
- package/frontend/dist/assets/index-60a9e4ea.css +33 -0
- package/frontend/dist/assets/{index-e6d7db4a.js → index-e8162966.js} +353 -353
- package/frontend/dist/index.html +2 -2
- package/package.json +22 -10
- package/config/skills/agent/browse-stealth/skill.json +0 -20
- package/config/skills/agent/competitor-content-tracker/skill.json +0 -22
- package/config/skills/agent/computer-use/skill.json +0 -29
- package/config/skills/agent/content-calendar/skill.json +0 -22
- package/config/skills/agent/content-repurposer/skill.json +0 -22
- package/config/skills/agent/content-writer/skill.json +0 -22
- package/config/skills/agent/core/accept-task/skill.json +0 -20
- package/config/skills/agent/core/block-task/skill.json +0 -20
- package/config/skills/agent/core/check-quality-gates/skill.json +0 -20
- package/config/skills/agent/core/complete-task/skill.json +0 -20
- package/config/skills/agent/core/generate-pdf/skill.json +0 -20
- package/config/skills/agent/core/get-my-context/skill.json +0 -20
- package/config/skills/agent/core/get-sops/skill.json +0 -20
- package/config/skills/agent/core/get-team-status/instructions.md +0 -17
- package/config/skills/agent/core/get-team-status/skill.json +0 -20
- package/config/skills/agent/core/heartbeat/skill.json +0 -20
- package/config/skills/agent/core/marketplace-search/skill.json +0 -20
- package/config/skills/agent/core/query-knowledge/skill.json +0 -20
- package/config/skills/agent/core/read-task/instructions.md +0 -19
- package/config/skills/agent/core/read-task/skill.json +0 -20
- package/config/skills/agent/core/recall/skill.json +0 -20
- package/config/skills/agent/core/record-learning/skill.json +0 -20
- package/config/skills/agent/core/register-self/instructions.md +0 -18
- package/config/skills/agent/core/register-self/skill.json +0 -20
- package/config/skills/agent/core/remember/skill.json +0 -20
- package/config/skills/agent/core/reply-chat/skill.json +0 -20
- package/config/skills/agent/core/report-progress/skill.json +0 -20
- package/config/skills/agent/core/report-status/skill.json +0 -20
- package/config/skills/agent/core/send-chat-response/skill.json +0 -20
- package/config/skills/agent/core/send-message/instructions.md +0 -20
- package/config/skills/agent/core/send-message/skill.json +0 -20
- package/config/skills/agent/desktop-app-control/skill.json +0 -33
- package/config/skills/agent/trend-monitor/skill.json +0 -22
- package/config/skills/agent/vnc-browser/skill.json +0 -20
- package/config/skills/orchestrator/assign-task/instructions.md +0 -17
- package/config/skills/orchestrator/assign-task/skill.json +0 -20
- package/config/skills/orchestrator/assign-team-to-project/skill.json +0 -20
- package/config/skills/orchestrator/broadcast/skill.json +0 -20
- package/config/skills/orchestrator/broadcast-to-org/skill.json +0 -20
- package/config/skills/orchestrator/cancel-all-schedules/skill.json +0 -17
- package/config/skills/orchestrator/cancel-schedule/instructions.md +0 -19
- package/config/skills/orchestrator/cancel-schedule/skill.json +0 -20
- package/config/skills/orchestrator/complete-task/instructions.md +0 -17
- package/config/skills/orchestrator/complete-task/skill.json +0 -20
- package/config/skills/orchestrator/create-project/skill.json +0 -20
- package/config/skills/orchestrator/create-team/skill.json +0 -20
- package/config/skills/orchestrator/delegate-task/skill.json +0 -20
- package/config/skills/orchestrator/get-agent-logs/skill.json +0 -20
- package/config/skills/orchestrator/get-agent-status/skill.json +0 -20
- package/config/skills/orchestrator/get-project-overview/instructions.md +0 -17
- package/config/skills/orchestrator/get-project-overview/skill.json +0 -20
- package/config/skills/orchestrator/get-tasks/instructions.md +0 -17
- package/config/skills/orchestrator/get-tasks/skill.json +0 -20
- package/config/skills/orchestrator/get-team-status/instructions.md +0 -17
- package/config/skills/orchestrator/get-team-status/skill.json +0 -20
- package/config/skills/orchestrator/handle-agent-failure/skill.json +0 -20
- package/config/skills/orchestrator/heartbeat/skill.json +0 -20
- package/config/skills/orchestrator/list-schedules/skill.json +0 -12
- package/config/skills/orchestrator/list-subscriptions/instructions.md +0 -17
- package/config/skills/orchestrator/list-subscriptions/skill.json +0 -20
- package/config/skills/orchestrator/query-knowledge/skill.json +0 -20
- package/config/skills/orchestrator/read-session-logs/skill.json +0 -20
- package/config/skills/orchestrator/read-system-logs/skill.json +0 -20
- package/config/skills/orchestrator/recall/skill.json +0 -20
- package/config/skills/orchestrator/record-failure/skill.json +0 -20
- package/config/skills/orchestrator/record-learning/skill.json +0 -20
- package/config/skills/orchestrator/record-success/skill.json +0 -20
- package/config/skills/orchestrator/register-self/skill.json +0 -20
- package/config/skills/orchestrator/remember/skill.json +0 -20
- package/config/skills/orchestrator/reply-chat/skill.json +0 -20
- package/config/skills/orchestrator/reply-gchat/skill.json +0 -20
- package/config/skills/orchestrator/reply-slack/skill.json +0 -20
- package/config/skills/orchestrator/report-bug/skill.json +0 -20
- package/config/skills/orchestrator/restart-crewly/skill.json +0 -20
- package/config/skills/orchestrator/resume-session/skill.json +0 -20
- package/config/skills/orchestrator/schedule-check/skill.json +0 -20
- package/config/skills/orchestrator/send-key/skill.json +0 -20
- package/config/skills/orchestrator/send-message/skill.json +0 -20
- package/config/skills/orchestrator/send-pdf-to-slack/skill.json +0 -20
- package/config/skills/orchestrator/set-goal/skill.json +0 -20
- package/config/skills/orchestrator/start-agent/skill.json +0 -20
- package/config/skills/orchestrator/start-team/skill.json +0 -20
- package/config/skills/orchestrator/stop-agent/skill.json +0 -20
- package/config/skills/orchestrator/stop-team/instructions.md +0 -19
- package/config/skills/orchestrator/stop-team/skill.json +0 -20
- package/config/skills/orchestrator/subscribe-event/skill.json +0 -20
- package/config/skills/orchestrator/terminate-agent/skill.json +0 -20
- package/config/skills/orchestrator/unsubscribe-event/instructions.md +0 -19
- package/config/skills/orchestrator/unsubscribe-event/skill.json +0 -20
- package/config/skills/orchestrator/update-focus/skill.json +0 -20
- package/config/skills/orchestrator/update-team/skill.json +0 -20
- package/config/skills/team-leader/aggregate-results/skill.json +0 -20
- package/config/skills/team-leader/decompose-goal/skill.json +0 -20
- package/config/skills/team-leader/delegate-task/skill.json +0 -20
- package/config/skills/team-leader/handle-failure/skill.json +0 -20
- package/config/skills/team-leader/schedule-check/skill.json +0 -20
- package/config/skills/team-leader/start-agent/skill.json +0 -20
- package/config/skills/team-leader/stop-agent/skill.json +0 -20
- package/config/skills/team-leader/verify-output/skill.json +0 -20
- 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
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
56
|
-
*
|
|
57
|
-
|
|
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
|
-
*
|
|
60
|
-
*
|
|
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'
|
|
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
|
-
*
|
|
123
|
-
*
|
|
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
|
|
271
|
+
* @returns Internal DatabaseState
|
|
128
272
|
*/
|
|
129
|
-
|
|
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
|
-
//
|
|
285
|
+
// Performance pragmas
|
|
142
286
|
db.pragma('journal_mode = WAL');
|
|
143
|
-
|
|
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
|
|
146
|
-
|
|
147
|
-
|
|
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
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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
|
-
*
|
|
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 [
|
|
469
|
+
for (const [filePath, state] of this.databases) {
|
|
163
470
|
try {
|
|
164
|
-
|
|
165
|
-
|
|
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:
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
203
|
-
const
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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
|
|
224
|
-
const
|
|
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:
|
|
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
|
|
246
|
-
|
|
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
|
|
259
|
-
const
|
|
260
|
-
return
|
|
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
|
|
271
|
-
const
|
|
272
|
-
return
|
|
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
|
|
276
|
-
*
|
|
277
|
-
*
|
|
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
|
|
293
|
-
|
|
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 =
|
|
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
|
|
318
|
-
|
|
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
|
}
|