crewly 1.13.1 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/constants.ts +8 -0
- package/config/roles/orchestrator/prompt.md +23 -0
- package/config/skills/agent/core/reply-channel/SKILL.md +6 -0
- package/config/skills/agent/core/reply-channel/execute.sh +14 -2
- package/config/skills/agent/core/slack-post/SKILL.md +126 -0
- package/config/skills/agent/core/slack-post/execute.sh +127 -0
- package/config/skills/agent/remote-browser/SKILL.md +178 -0
- package/config/skills/agent/xiaoyuzhoufm-transcript/SKILL.md +46 -22
- package/config/skills/agent/xiaoyuzhoufm-transcript/execute.sh +82 -214
- package/config/skills/agent/xiaoyuzhoufm-transcript/skill.json +3 -3
- package/config/skills/orchestrator/get-team-status/SKILL.md +5 -1
- package/config/skills/orchestrator/get-team-status/execute.sh +28 -2
- package/config/slack-app-manifest.json +7 -1
- package/dist/backend/backend/src/config/oauth.config.d.ts +93 -19
- package/dist/backend/backend/src/config/oauth.config.d.ts.map +1 -1
- package/dist/backend/backend/src/config/oauth.config.js +121 -19
- package/dist/backend/backend/src/config/oauth.config.js.map +1 -1
- package/dist/backend/backend/src/constants.d.ts +60 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +74 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js +33 -4
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.js +27 -9
- package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.js.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 +342 -0
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +23 -7
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts +10 -0
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.js +37 -0
- package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js +13 -11
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +14 -0
- package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js +56 -0
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-services.registry.d.ts +63 -0
- package/dist/backend/backend/src/services/browser/browser-services.registry.d.ts.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-services.registry.js +74 -0
- package/dist/backend/backend/src/services/browser/browser-services.registry.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +25 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +19 -7
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +57 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +110 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +21 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +43 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.d.ts +6 -0
- package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.js +1 -1
- package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -1
- package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +6 -2
- package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +14 -0
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +8 -0
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.js +31 -3
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +34 -0
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +99 -10
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.d.ts +209 -0
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js +416 -0
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts +124 -0
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.js +243 -0
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts +11 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js +56 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-mention-resolver.d.ts +103 -0
- package/dist/backend/backend/src/services/slack/slack-mention-resolver.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-mention-resolver.js +197 -0
- package/dist/backend/backend/src/services/slack/slack-mention-resolver.js.map +1 -0
- 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 +18 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +329 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +821 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack.service.d.ts +116 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.js +297 -3
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +22 -0
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +71 -0
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts +20 -2
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js +27 -2
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts +15 -2
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js +33 -7
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts +37 -0
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js +74 -8
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/types/slack.types.d.ts +87 -0
- package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/slack.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/backend/config/constants.d.ts +8 -0
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +8 -0
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/cli/backend/src/config/oauth.config.d.ts +93 -19
- package/dist/cli/backend/src/config/oauth.config.d.ts.map +1 -1
- package/dist/cli/backend/src/config/oauth.config.js +121 -19
- package/dist/cli/backend/src/config/oauth.config.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +60 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +74 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +292 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +420 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts +134 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.js +232 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +57 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +110 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +21 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +43 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.d.ts +6 -0
- package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.js +1 -1
- package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -1
- package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +6 -2
- package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -1
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +8 -0
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js +31 -3
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.d.ts +209 -0
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js +416 -0
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-mention-resolver.d.ts +103 -0
- package/dist/cli/backend/src/services/slack/slack-mention-resolver.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-mention-resolver.js +197 -0
- package/dist/cli/backend/src/services/slack/slack-mention-resolver.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +18 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +329 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +821 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack.service.d.ts +116 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.js +297 -3
- package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/cli/backend/src/types/slack.types.d.ts +87 -0
- package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/slack.types.js.map +1 -1
- package/dist/cli/backend/src/utils/team.utils.d.ts +40 -0
- package/dist/cli/backend/src/utils/team.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/team.utils.js +66 -0
- package/dist/cli/backend/src/utils/team.utils.js.map +1 -0
- package/dist/cli/cli/src/index.js +0 -0
- package/dist/cli/config/constants.d.ts +8 -0
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +8 -0
- package/dist/cli/config/constants.js.map +1 -1
- package/frontend/dist/assets/{index-890d3f9d.js → index-190a957f.js} +294 -294
- package/frontend/dist/assets/{index-8205ea5e.css → index-88feb412.css} +1 -1
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/dist/backend/backend/src/controllers/knowledge/index.d.ts +0 -7
- package/dist/backend/backend/src/controllers/knowledge/index.d.ts.map +0 -1
- package/dist/backend/backend/src/controllers/knowledge/index.js +0 -7
- package/dist/backend/backend/src/controllers/knowledge/index.js.map +0 -1
- package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.d.ts +0 -71
- package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.d.ts.map +0 -1
- package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.js +0 -237
- package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.js.map +0 -1
- package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.d.ts +0 -24
- package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.d.ts.map +0 -1
- package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.js +0 -34
- package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.js.map +0 -1
- package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.d.ts +0 -91
- package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.d.ts.map +0 -1
- package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.js +0 -290
- package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.js.map +0 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +0 -169
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +0 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +0 -1779
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +0 -1
- package/dist/backend/backend/src/index.js.orc-bak-20260529 +0 -3130
- package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.d.ts +0 -27
- package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.d.ts.map +0 -1
- package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.js +0 -40
- package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +0 -513
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +0 -1568
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts +0 -86
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js +0 -147
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts +0 -68
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js +0 -131
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts +0 -130
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js +0 -263
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts +0 -74
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js +0 -140
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts +0 -29
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js +0 -279
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts +0 -340
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +0 -1176
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts +0 -79
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js +0 -145
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts +0 -79
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js +0 -218
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts +0 -16
- package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/index.js +0 -16
- package/dist/backend/backend/src/services/agent/crewly-agent/index.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts +0 -135
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js +0 -185
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +0 -141
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +0 -310
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts +0 -91
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js +0 -143
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts +0 -103
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js +0 -256
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts +0 -143
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js +0 -264
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts +0 -13
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js +0 -91
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +0 -135
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +0 -1937
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +0 -1
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts +0 -429
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.js +0 -852
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/embedding-provider.d.ts +0 -78
- package/dist/backend/backend/src/services/knowledge/embedding-provider.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/embedding-provider.js +0 -179
- package/dist/backend/backend/src/services/knowledge/embedding-provider.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/fts5-index.service.d.ts +0 -118
- package/dist/backend/backend/src/services/knowledge/fts5-index.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/fts5-index.service.js +0 -241
- package/dist/backend/backend/src/services/knowledge/fts5-index.service.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.d.ts +0 -102
- package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.js +0 -118
- package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/index.d.ts +0 -8
- package/dist/backend/backend/src/services/knowledge/index.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/index.js +0 -8
- package/dist/backend/backend/src/services/knowledge/index.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts +0 -241
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js +0 -590
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/knowledge.service.d.ts +0 -153
- package/dist/backend/backend/src/services/knowledge/knowledge.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/knowledge.service.js +0 -409
- package/dist/backend/backend/src/services/knowledge/knowledge.service.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts +0 -331
- package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/vector-store.service.js +0 -830
- package/dist/backend/backend/src/services/knowledge/vector-store.service.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.d.ts +0 -115
- package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.js +0 -215
- package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.js.map +0 -1
- package/dist/backend/backend/src/services/memory/embedding-provider.d.ts +0 -78
- package/dist/backend/backend/src/services/memory/embedding-provider.d.ts.map +0 -1
- package/dist/backend/backend/src/services/memory/embedding-provider.js +0 -185
- package/dist/backend/backend/src/services/memory/embedding-provider.js.map +0 -1
- package/dist/backend/backend/src/services/memory/vector-store.service.d.ts +0 -331
- package/dist/backend/backend/src/services/memory/vector-store.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/memory/vector-store.service.js +0 -825
- package/dist/backend/backend/src/services/memory/vector-store.service.js.map +0 -1
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +0 -171
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/project/task-tracking.service.js +0 -725
- package/dist/backend/backend/src/services/project/task-tracking.service.js.map +0 -1
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts +0 -118
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.js +0 -326
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.js.map +0 -1
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts +0 -74
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js +0 -154
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js.map +0 -1
- package/dist/backend/backend/src/services/workflow/unified-scheduler.service.d.ts +0 -234
- package/dist/backend/backend/src/services/workflow/unified-scheduler.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/workflow/unified-scheduler.service.js +0 -636
- package/dist/backend/backend/src/services/workflow/unified-scheduler.service.js.map +0 -1
- package/dist/backend/backend/src/services/workflow/unified-scheduler.types.d.ts +0 -156
- package/dist/backend/backend/src/services/workflow/unified-scheduler.types.d.ts.map +0 -1
- package/dist/backend/backend/src/services/workflow/unified-scheduler.types.js +0 -81
- package/dist/backend/backend/src/services/workflow/unified-scheduler.types.js.map +0 -1
- package/dist/backend/backend/src/types/auto-assign.types.d.ts +0 -271
- package/dist/backend/backend/src/types/auto-assign.types.d.ts.map +0 -1
- package/dist/backend/backend/src/types/auto-assign.types.js +0 -136
- package/dist/backend/backend/src/types/auto-assign.types.js.map +0 -1
- package/dist/backend/backend/src/types/knowledge.types.d.ts +0 -195
- package/dist/backend/backend/src/types/knowledge.types.d.ts.map +0 -1
- package/dist/backend/backend/src/types/knowledge.types.js +0 -38
- package/dist/backend/backend/src/types/knowledge.types.js.map +0 -1
- package/dist/backend/backend/src/utils/esm-require.utils.d.ts +0 -111
- package/dist/backend/backend/src/utils/esm-require.utils.d.ts.map +0 -1
- package/dist/backend/backend/src/utils/esm-require.utils.js +0 -124
- package/dist/backend/backend/src/utils/esm-require.utils.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/embedding-provider.d.ts +0 -78
- package/dist/cli/backend/src/services/knowledge/embedding-provider.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/embedding-provider.js +0 -179
- package/dist/cli/backend/src/services/knowledge/embedding-provider.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/fts5-index.service.d.ts +0 -118
- package/dist/cli/backend/src/services/knowledge/fts5-index.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/fts5-index.service.js +0 -241
- package/dist/cli/backend/src/services/knowledge/fts5-index.service.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.d.ts +0 -102
- package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.js +0 -118
- package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts +0 -56
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js +0 -91
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts +0 -241
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js +0 -590
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/knowledge.service.d.ts +0 -153
- package/dist/cli/backend/src/services/knowledge/knowledge.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/knowledge.service.js +0 -409
- package/dist/cli/backend/src/services/knowledge/knowledge.service.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts +0 -159
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.js +0 -304
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts +0 -331
- package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/vector-store.service.js +0 -830
- package/dist/cli/backend/src/services/knowledge/vector-store.service.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts +0 -115
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js +0 -215
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js.map +0 -1
- package/dist/cli/backend/src/services/memory/embedding-provider.d.ts +0 -78
- package/dist/cli/backend/src/services/memory/embedding-provider.d.ts.map +0 -1
- package/dist/cli/backend/src/services/memory/embedding-provider.js +0 -179
- package/dist/cli/backend/src/services/memory/embedding-provider.js.map +0 -1
- package/dist/cli/backend/src/services/memory/vector-store.service.d.ts +0 -331
- package/dist/cli/backend/src/services/memory/vector-store.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/memory/vector-store.service.js +0 -814
- package/dist/cli/backend/src/services/memory/vector-store.service.js.map +0 -1
- package/dist/cli/backend/src/services/project/task-tracking.service.d.ts +0 -171
- package/dist/cli/backend/src/services/project/task-tracking.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/project/task-tracking.service.js +0 -725
- package/dist/cli/backend/src/services/project/task-tracking.service.js.map +0 -1
- package/dist/cli/backend/src/types/auto-assign.types.d.ts +0 -271
- package/dist/cli/backend/src/types/auto-assign.types.d.ts.map +0 -1
- package/dist/cli/backend/src/types/auto-assign.types.js +0 -136
- package/dist/cli/backend/src/types/auto-assign.types.js.map +0 -1
- package/dist/cli/backend/src/types/knowledge.types.d.ts +0 -195
- package/dist/cli/backend/src/types/knowledge.types.d.ts.map +0 -1
- package/dist/cli/backend/src/types/knowledge.types.js +0 -38
- package/dist/cli/backend/src/types/knowledge.types.js.map +0 -1
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Embedding Provider Abstraction (#155)
|
|
3
|
-
*
|
|
4
|
-
* Decouples embedding logic from specific APIs. Supports:
|
|
5
|
-
* - Cloud: Gemini (default), OpenAI, Voyage
|
|
6
|
-
* - Local: Ollama (for air-gapped/high-security environments)
|
|
7
|
-
*
|
|
8
|
-
* Provider selection via environment variables:
|
|
9
|
-
* - GEMINI_API_KEY → GeminiEmbeddingProvider
|
|
10
|
-
* - OPENAI_API_KEY → OpenAIEmbeddingProvider
|
|
11
|
-
* - OLLAMA_HOST → OllamaEmbeddingProvider
|
|
12
|
-
*
|
|
13
|
-
* @see https://github.com/stevehuang0115/crewly/issues/155
|
|
14
|
-
* @module services/knowledge/embedding-provider
|
|
15
|
-
*/
|
|
16
|
-
import { LoggerService } from '../core/logger.service.js';
|
|
17
|
-
import { EMBEDDING_CONSTANTS } from '../../constants.js';
|
|
18
|
-
/**
|
|
19
|
-
* Gemini embedding provider (default cloud provider).
|
|
20
|
-
*/
|
|
21
|
-
export class GeminiEmbeddingProvider {
|
|
22
|
-
name = 'gemini';
|
|
23
|
-
dimensions = 768;
|
|
24
|
-
apiKey;
|
|
25
|
-
logger;
|
|
26
|
-
constructor(apiKey) {
|
|
27
|
-
this.apiKey = apiKey;
|
|
28
|
-
this.logger = LoggerService.getInstance().createComponentLogger('GeminiEmbedding');
|
|
29
|
-
}
|
|
30
|
-
async embed(text) {
|
|
31
|
-
try {
|
|
32
|
-
const url = `${EMBEDDING_CONSTANTS.GEMINI_ENDPOINT}/${EMBEDDING_CONSTANTS.GEMINI_MODEL}:embedContent?key=${this.apiKey}`;
|
|
33
|
-
const controller = new AbortController();
|
|
34
|
-
const timeout = setTimeout(() => controller.abort(), EMBEDDING_CONSTANTS.TIMEOUT_MS);
|
|
35
|
-
try {
|
|
36
|
-
const response = await fetch(url, {
|
|
37
|
-
method: 'POST',
|
|
38
|
-
headers: { 'Content-Type': 'application/json' },
|
|
39
|
-
body: JSON.stringify({
|
|
40
|
-
model: `models/${EMBEDDING_CONSTANTS.GEMINI_MODEL}`,
|
|
41
|
-
content: { parts: [{ text }] },
|
|
42
|
-
}),
|
|
43
|
-
signal: controller.signal,
|
|
44
|
-
});
|
|
45
|
-
if (!response.ok) {
|
|
46
|
-
// #214: Log specific guidance for common error codes
|
|
47
|
-
const hint = response.status === 404
|
|
48
|
-
? 'Model may be deprecated — check Gemini embedding model availability'
|
|
49
|
-
: response.status === 401 || response.status === 403
|
|
50
|
-
? 'Check your GEMINI_API_KEY — it may be invalid or lack permissions'
|
|
51
|
-
: '';
|
|
52
|
-
this.logger.warn('Gemini embedding API error, falling back to keyword search', {
|
|
53
|
-
status: response.status,
|
|
54
|
-
model: EMBEDDING_CONSTANTS.GEMINI_MODEL,
|
|
55
|
-
hint,
|
|
56
|
-
});
|
|
57
|
-
return null;
|
|
58
|
-
}
|
|
59
|
-
const data = (await response.json());
|
|
60
|
-
return data.embedding?.values ?? null;
|
|
61
|
-
}
|
|
62
|
-
finally {
|
|
63
|
-
clearTimeout(timeout);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
catch (error) {
|
|
67
|
-
this.logger.warn('Gemini embedding API call failed, falling back to keyword search', {
|
|
68
|
-
error: error instanceof Error ? error.message : String(error),
|
|
69
|
-
});
|
|
70
|
-
return null;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* OpenAI embedding provider.
|
|
76
|
-
* Uses the text-embedding-3-small model by default.
|
|
77
|
-
*/
|
|
78
|
-
export class OpenAIEmbeddingProvider {
|
|
79
|
-
name = 'openai';
|
|
80
|
-
dimensions = 1536;
|
|
81
|
-
apiKey;
|
|
82
|
-
model;
|
|
83
|
-
logger;
|
|
84
|
-
constructor(apiKey, model = 'text-embedding-3-small') {
|
|
85
|
-
this.apiKey = apiKey;
|
|
86
|
-
this.model = model;
|
|
87
|
-
this.logger = LoggerService.getInstance().createComponentLogger('OpenAIEmbedding');
|
|
88
|
-
}
|
|
89
|
-
async embed(text) {
|
|
90
|
-
try {
|
|
91
|
-
const controller = new AbortController();
|
|
92
|
-
const timeout = setTimeout(() => controller.abort(), 30000);
|
|
93
|
-
try {
|
|
94
|
-
const response = await fetch('https://api.openai.com/v1/embeddings', {
|
|
95
|
-
method: 'POST',
|
|
96
|
-
headers: {
|
|
97
|
-
'Content-Type': 'application/json',
|
|
98
|
-
'Authorization': `Bearer ${this.apiKey}`,
|
|
99
|
-
},
|
|
100
|
-
body: JSON.stringify({ input: text, model: this.model }),
|
|
101
|
-
signal: controller.signal,
|
|
102
|
-
});
|
|
103
|
-
if (!response.ok)
|
|
104
|
-
return null;
|
|
105
|
-
const data = (await response.json());
|
|
106
|
-
return data.data?.[0]?.embedding ?? null;
|
|
107
|
-
}
|
|
108
|
-
finally {
|
|
109
|
-
clearTimeout(timeout);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
catch {
|
|
113
|
-
return null;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Ollama local embedding provider.
|
|
119
|
-
* Runs entirely on-device for air-gapped environments.
|
|
120
|
-
*/
|
|
121
|
-
export class OllamaEmbeddingProvider {
|
|
122
|
-
name = 'ollama';
|
|
123
|
-
dimensions = 768; // depends on model
|
|
124
|
-
host;
|
|
125
|
-
model;
|
|
126
|
-
logger;
|
|
127
|
-
constructor(host = 'http://localhost:11434', model = 'nomic-embed-text') {
|
|
128
|
-
this.host = host;
|
|
129
|
-
this.model = model;
|
|
130
|
-
this.logger = LoggerService.getInstance().createComponentLogger('OllamaEmbedding');
|
|
131
|
-
}
|
|
132
|
-
async embed(text) {
|
|
133
|
-
try {
|
|
134
|
-
const controller = new AbortController();
|
|
135
|
-
const timeout = setTimeout(() => controller.abort(), 30000);
|
|
136
|
-
try {
|
|
137
|
-
const response = await fetch(`${this.host}/api/embeddings`, {
|
|
138
|
-
method: 'POST',
|
|
139
|
-
headers: { 'Content-Type': 'application/json' },
|
|
140
|
-
body: JSON.stringify({ model: this.model, prompt: text }),
|
|
141
|
-
signal: controller.signal,
|
|
142
|
-
});
|
|
143
|
-
if (!response.ok)
|
|
144
|
-
return null;
|
|
145
|
-
const data = (await response.json());
|
|
146
|
-
return data.embedding ?? null;
|
|
147
|
-
}
|
|
148
|
-
finally {
|
|
149
|
-
clearTimeout(timeout);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
catch {
|
|
153
|
-
return null;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Create the best available embedding provider based on environment config.
|
|
159
|
-
*
|
|
160
|
-
* Priority: GEMINI_API_KEY > OPENAI_API_KEY > OLLAMA_HOST > null
|
|
161
|
-
*
|
|
162
|
-
* @returns EmbeddingProvider instance, or null if none configured
|
|
163
|
-
*/
|
|
164
|
-
export function createEmbeddingProvider() {
|
|
165
|
-
const geminiKey = process.env.GEMINI_API_KEY;
|
|
166
|
-
if (geminiKey) {
|
|
167
|
-
return new GeminiEmbeddingProvider(geminiKey);
|
|
168
|
-
}
|
|
169
|
-
const openaiKey = process.env.OPENAI_API_KEY;
|
|
170
|
-
if (openaiKey) {
|
|
171
|
-
return new OpenAIEmbeddingProvider(openaiKey);
|
|
172
|
-
}
|
|
173
|
-
const ollamaHost = process.env.OLLAMA_HOST;
|
|
174
|
-
if (ollamaHost) {
|
|
175
|
-
return new OllamaEmbeddingProvider(ollamaHost);
|
|
176
|
-
}
|
|
177
|
-
return null;
|
|
178
|
-
}
|
|
179
|
-
//# sourceMappingURL=embedding-provider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"embedding-provider.js","sourceRoot":"","sources":["../../../../../../backend/src/services/knowledge/embedding-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* FTS5 Index Service
|
|
3
|
-
*
|
|
4
|
-
* Manages a SQLite FTS5 full-text search index for the Wiki-First
|
|
5
|
-
* Knowledge System. Provides upsert, remove, search, and rebuild
|
|
6
|
-
* operations over a `knowledge_fts` virtual table using Porter stemming
|
|
7
|
-
* and Unicode61 tokenization.
|
|
8
|
-
*
|
|
9
|
-
* The database file is stored at `<knowledgePath>/index.fts5.db`.
|
|
10
|
-
*
|
|
11
|
-
* @module services/knowledge/fts5-index.service
|
|
12
|
-
*/
|
|
13
|
-
/**
|
|
14
|
-
* A single result from an FTS5 search query.
|
|
15
|
-
*/
|
|
16
|
-
export interface FtsSearchResult {
|
|
17
|
-
/** Document identifier */
|
|
18
|
-
id: string;
|
|
19
|
-
/** Document title */
|
|
20
|
-
title: string;
|
|
21
|
-
/** Space-separated tags */
|
|
22
|
-
tags: string;
|
|
23
|
-
/** Document body content */
|
|
24
|
-
content: string;
|
|
25
|
-
/** Document category */
|
|
26
|
-
category: string;
|
|
27
|
-
/** BM25 relevance rank (lower/more negative = more relevant in FTS5) */
|
|
28
|
-
rank: number;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Input document shape for upserting into the FTS5 index.
|
|
32
|
-
*/
|
|
33
|
-
export interface FtsDocument {
|
|
34
|
-
/** Unique document identifier */
|
|
35
|
-
id: string;
|
|
36
|
-
/** Document title */
|
|
37
|
-
title: string;
|
|
38
|
-
/** Space-separated or comma-separated tags */
|
|
39
|
-
tags: string;
|
|
40
|
-
/** Document body content */
|
|
41
|
-
content: string;
|
|
42
|
-
/** Document category */
|
|
43
|
-
category: string;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Fts5IndexService manages a SQLite FTS5 full-text search database.
|
|
47
|
-
*
|
|
48
|
-
* It lazily initializes the database and FTS5 virtual table on first use,
|
|
49
|
-
* and provides methods to upsert, remove, search, and rebuild the index.
|
|
50
|
-
*
|
|
51
|
-
* @example
|
|
52
|
-
* ```typescript
|
|
53
|
-
* const fts5 = new Fts5IndexService('/path/to/knowledge');
|
|
54
|
-
* fts5.upsertDocument({ id: 'doc-1', title: 'Setup', tags: 'devops', content: '...', category: 'SOPs' });
|
|
55
|
-
* const results = fts5.search('setup devops');
|
|
56
|
-
* ```
|
|
57
|
-
*/
|
|
58
|
-
export declare class Fts5IndexService {
|
|
59
|
-
private db;
|
|
60
|
-
private readonly dbPath;
|
|
61
|
-
private readonly logger;
|
|
62
|
-
/**
|
|
63
|
-
* Create an Fts5IndexService.
|
|
64
|
-
*
|
|
65
|
-
* @param knowledgePath - Directory where the FTS5 database will be stored
|
|
66
|
-
*/
|
|
67
|
-
constructor(knowledgePath: string);
|
|
68
|
-
/**
|
|
69
|
-
* Get or lazily initialize the SQLite database connection.
|
|
70
|
-
* Creates the parent directory and FTS5 virtual table if they do not exist.
|
|
71
|
-
*
|
|
72
|
-
* @returns The better-sqlite3 Database instance
|
|
73
|
-
*/
|
|
74
|
-
private getDb;
|
|
75
|
-
/**
|
|
76
|
-
* Create the FTS5 virtual table if it does not already exist.
|
|
77
|
-
* Uses Porter stemming and Unicode61 tokenization for broad language support.
|
|
78
|
-
*/
|
|
79
|
-
private initSchema;
|
|
80
|
-
/**
|
|
81
|
-
* Upsert a document into the FTS5 index.
|
|
82
|
-
* Removes any existing row with the same ID before inserting.
|
|
83
|
-
*
|
|
84
|
-
* @param doc - The document to upsert
|
|
85
|
-
*/
|
|
86
|
-
upsertDocument(doc: FtsDocument): void;
|
|
87
|
-
/**
|
|
88
|
-
* Remove a document from the FTS5 index by its ID.
|
|
89
|
-
*
|
|
90
|
-
* @param id - The document identifier to remove
|
|
91
|
-
*/
|
|
92
|
-
removeDocument(id: string): void;
|
|
93
|
-
/**
|
|
94
|
-
* Search the FTS5 index using a MATCH query with BM25 ranking.
|
|
95
|
-
*
|
|
96
|
-
* @param query - The search query string (FTS5 MATCH syntax)
|
|
97
|
-
* @param options - Optional search parameters
|
|
98
|
-
* @param options.category - Filter results by category
|
|
99
|
-
* @param options.limit - Maximum number of results (default 10)
|
|
100
|
-
* @returns Array of matching documents sorted by relevance
|
|
101
|
-
*/
|
|
102
|
-
search(query: string, options?: {
|
|
103
|
-
category?: string;
|
|
104
|
-
limit?: number;
|
|
105
|
-
}): FtsSearchResult[];
|
|
106
|
-
/**
|
|
107
|
-
* Rebuild the entire FTS5 index from scratch.
|
|
108
|
-
* Drops all existing rows and reinserts the provided documents in a single transaction.
|
|
109
|
-
*
|
|
110
|
-
* @param documents - The complete set of documents to index
|
|
111
|
-
*/
|
|
112
|
-
rebuildIndex(documents: FtsDocument[]): void;
|
|
113
|
-
/**
|
|
114
|
-
* Close the database connection and release resources.
|
|
115
|
-
*/
|
|
116
|
-
close(): void;
|
|
117
|
-
}
|
|
118
|
-
//# sourceMappingURL=fts5-index.service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fts5-index.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/knowledge/fts5-index.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAuDH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,iCAAiC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAMD;;;;;;;;;;;;GAYG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,EAAE,CAA6B;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAEzC;;;;OAIG;gBACS,aAAa,EAAE,MAAM;IAKjC;;;;;OAKG;IACH,OAAO,CAAC,KAAK;IAwBb;;;OAGG;IACH,OAAO,CAAC,UAAU;IAclB;;;;;OAKG;IACH,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAgBtC;;;;OAIG;IACH,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAKhC;;;;;;;;OAQG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,eAAe,EAAE;IAoDzF;;;;;OAKG;IACH,YAAY,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,IAAI;IAmB5C;;OAEG;IACH,KAAK,IAAI,IAAI;CAad"}
|
|
@@ -1,241 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* FTS5 Index Service
|
|
3
|
-
*
|
|
4
|
-
* Manages a SQLite FTS5 full-text search index for the Wiki-First
|
|
5
|
-
* Knowledge System. Provides upsert, remove, search, and rebuild
|
|
6
|
-
* operations over a `knowledge_fts` virtual table using Porter stemming
|
|
7
|
-
* and Unicode61 tokenization.
|
|
8
|
-
*
|
|
9
|
-
* The database file is stored at `<knowledgePath>/index.fts5.db`.
|
|
10
|
-
*
|
|
11
|
-
* @module services/knowledge/fts5-index.service
|
|
12
|
-
*/
|
|
13
|
-
import * as path from 'path';
|
|
14
|
-
import { existsSync, mkdirSync } from 'fs';
|
|
15
|
-
import { createBareModuleRequire } from '../../utils/node-require.utils.js';
|
|
16
|
-
import { LoggerService } from '../core/logger.service.js';
|
|
17
|
-
import { toFts5Phrase } from './fts5-query-sanitizer.js';
|
|
18
|
-
// ---------------------------------------------------------------------------
|
|
19
|
-
// Lazy module loading
|
|
20
|
-
// ---------------------------------------------------------------------------
|
|
21
|
-
/**
|
|
22
|
-
* CJS-style `require` scoped to this module. `better-sqlite3` is a native
|
|
23
|
-
* addon and must be loaded via CJS `require`, but this file compiles to
|
|
24
|
-
* ESM where the bare `require` global is undefined.
|
|
25
|
-
*
|
|
26
|
-
* Anchor: see `backend/src/utils/node-require.utils.ts` — the helper
|
|
27
|
-
* hides `import.meta.url` behind direct `eval` so ts-jest's CommonJS
|
|
28
|
-
* transpile does not see the meta-property token. The createRequire
|
|
29
|
-
* anchor is THIS file's URL, so Node's resolver walks up from here
|
|
30
|
-
* to find `node_modules` (and to resolve any future relative paths).
|
|
31
|
-
*/
|
|
32
|
-
const nodeRequire = createBareModuleRequire(typeof require === 'function' ? require : null);
|
|
33
|
-
/** Lazy-loaded better-sqlite3 module reference. */
|
|
34
|
-
let _BetterSqlite3 = null;
|
|
35
|
-
/**
|
|
36
|
-
* Load better-sqlite3 on demand. Throws a clear error if the native module
|
|
37
|
-
* is not available.
|
|
38
|
-
*/
|
|
39
|
-
function getBetterSqlite3() {
|
|
40
|
-
if (!_BetterSqlite3) {
|
|
41
|
-
try {
|
|
42
|
-
_BetterSqlite3 = nodeRequire('better-sqlite3');
|
|
43
|
-
}
|
|
44
|
-
catch (err) {
|
|
45
|
-
throw new Error('better-sqlite3 native module failed to load. Run `npm rebuild better-sqlite3` to fix. ' +
|
|
46
|
-
`Original error: ${err instanceof Error ? err.message : String(err)}`);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return _BetterSqlite3;
|
|
50
|
-
}
|
|
51
|
-
// ---------------------------------------------------------------------------
|
|
52
|
-
// Service
|
|
53
|
-
// ---------------------------------------------------------------------------
|
|
54
|
-
/**
|
|
55
|
-
* Fts5IndexService manages a SQLite FTS5 full-text search database.
|
|
56
|
-
*
|
|
57
|
-
* It lazily initializes the database and FTS5 virtual table on first use,
|
|
58
|
-
* and provides methods to upsert, remove, search, and rebuild the index.
|
|
59
|
-
*
|
|
60
|
-
* @example
|
|
61
|
-
* ```typescript
|
|
62
|
-
* const fts5 = new Fts5IndexService('/path/to/knowledge');
|
|
63
|
-
* fts5.upsertDocument({ id: 'doc-1', title: 'Setup', tags: 'devops', content: '...', category: 'SOPs' });
|
|
64
|
-
* const results = fts5.search('setup devops');
|
|
65
|
-
* ```
|
|
66
|
-
*/
|
|
67
|
-
export class Fts5IndexService {
|
|
68
|
-
db = null;
|
|
69
|
-
dbPath;
|
|
70
|
-
logger;
|
|
71
|
-
/**
|
|
72
|
-
* Create an Fts5IndexService.
|
|
73
|
-
*
|
|
74
|
-
* @param knowledgePath - Directory where the FTS5 database will be stored
|
|
75
|
-
*/
|
|
76
|
-
constructor(knowledgePath) {
|
|
77
|
-
this.dbPath = path.join(knowledgePath, 'index.fts5.db');
|
|
78
|
-
this.logger = LoggerService.getInstance().createComponentLogger('Fts5IndexService');
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Get or lazily initialize the SQLite database connection.
|
|
82
|
-
* Creates the parent directory and FTS5 virtual table if they do not exist.
|
|
83
|
-
*
|
|
84
|
-
* @returns The better-sqlite3 Database instance
|
|
85
|
-
*/
|
|
86
|
-
getDb() {
|
|
87
|
-
if (this.db) {
|
|
88
|
-
return this.db;
|
|
89
|
-
}
|
|
90
|
-
// Ensure parent directory exists
|
|
91
|
-
const dir = path.dirname(this.dbPath);
|
|
92
|
-
if (!existsSync(dir)) {
|
|
93
|
-
mkdirSync(dir, { recursive: true });
|
|
94
|
-
}
|
|
95
|
-
const Database = getBetterSqlite3();
|
|
96
|
-
this.db = new Database(this.dbPath);
|
|
97
|
-
// Performance pragmas
|
|
98
|
-
this.db.pragma('journal_mode = WAL');
|
|
99
|
-
this.db.pragma('synchronous = NORMAL');
|
|
100
|
-
this.initSchema();
|
|
101
|
-
this.logger.info('FTS5 index database opened', { path: this.dbPath });
|
|
102
|
-
return this.db;
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Create the FTS5 virtual table if it does not already exist.
|
|
106
|
-
* Uses Porter stemming and Unicode61 tokenization for broad language support.
|
|
107
|
-
*/
|
|
108
|
-
initSchema() {
|
|
109
|
-
const db = this.db;
|
|
110
|
-
db.exec(`
|
|
111
|
-
CREATE VIRTUAL TABLE IF NOT EXISTS knowledge_fts USING fts5(
|
|
112
|
-
id UNINDEXED,
|
|
113
|
-
title,
|
|
114
|
-
tags,
|
|
115
|
-
content,
|
|
116
|
-
category UNINDEXED,
|
|
117
|
-
tokenize='porter unicode61'
|
|
118
|
-
);
|
|
119
|
-
`);
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Upsert a document into the FTS5 index.
|
|
123
|
-
* Removes any existing row with the same ID before inserting.
|
|
124
|
-
*
|
|
125
|
-
* @param doc - The document to upsert
|
|
126
|
-
*/
|
|
127
|
-
upsertDocument(doc) {
|
|
128
|
-
const db = this.getDb();
|
|
129
|
-
// FTS5 tables do not support ON CONFLICT, so delete-then-insert
|
|
130
|
-
const deleteStmt = db.prepare('DELETE FROM knowledge_fts WHERE id = ?');
|
|
131
|
-
const insertStmt = db.prepare('INSERT INTO knowledge_fts (id, title, tags, content, category) VALUES (?, ?, ?, ?, ?)');
|
|
132
|
-
const txn = db.transaction(() => {
|
|
133
|
-
deleteStmt.run(doc.id);
|
|
134
|
-
insertStmt.run(doc.id, doc.title, doc.tags, doc.content, doc.category);
|
|
135
|
-
});
|
|
136
|
-
txn();
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Remove a document from the FTS5 index by its ID.
|
|
140
|
-
*
|
|
141
|
-
* @param id - The document identifier to remove
|
|
142
|
-
*/
|
|
143
|
-
removeDocument(id) {
|
|
144
|
-
const db = this.getDb();
|
|
145
|
-
db.prepare('DELETE FROM knowledge_fts WHERE id = ?').run(id);
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Search the FTS5 index using a MATCH query with BM25 ranking.
|
|
149
|
-
*
|
|
150
|
-
* @param query - The search query string (FTS5 MATCH syntax)
|
|
151
|
-
* @param options - Optional search parameters
|
|
152
|
-
* @param options.category - Filter results by category
|
|
153
|
-
* @param options.limit - Maximum number of results (default 10)
|
|
154
|
-
* @returns Array of matching documents sorted by relevance
|
|
155
|
-
*/
|
|
156
|
-
search(query, options) {
|
|
157
|
-
if (!query || query.trim().length === 0) {
|
|
158
|
-
return [];
|
|
159
|
-
}
|
|
160
|
-
const db = this.getDb();
|
|
161
|
-
const limit = options?.limit ?? 10;
|
|
162
|
-
// Sanitize query via phrase-quote tokenization. See
|
|
163
|
-
// {@link toFts5Phrase} for the full design rationale — short version:
|
|
164
|
-
// the previous regex-strip sanitizer left commas, hyphens, colons, and
|
|
165
|
-
// FTS5 keywords intact, causing 44 silent agent-recall failures per day
|
|
166
|
-
// (F-FTS5 / WI-E triage). Phrase-quoting neutralizes ALL operator
|
|
167
|
-
// characters because FTS5 does not parse operators inside `"..."`
|
|
168
|
-
// phrases. Each token round-trips through unicode61 at index AND
|
|
169
|
-
// query time, so recall is preserved for hyphenated identifiers like
|
|
170
|
-
// `team-leader`.
|
|
171
|
-
const sanitized = toFts5Phrase(query);
|
|
172
|
-
if (sanitized.length === 0) {
|
|
173
|
-
return [];
|
|
174
|
-
}
|
|
175
|
-
try {
|
|
176
|
-
if (options?.category) {
|
|
177
|
-
const stmt = db.prepare(`
|
|
178
|
-
SELECT id, title, tags, content, category, rank
|
|
179
|
-
FROM knowledge_fts
|
|
180
|
-
WHERE knowledge_fts MATCH ?
|
|
181
|
-
AND category = ?
|
|
182
|
-
ORDER BY rank
|
|
183
|
-
LIMIT ?
|
|
184
|
-
`);
|
|
185
|
-
return stmt.all(sanitized, options.category, limit);
|
|
186
|
-
}
|
|
187
|
-
const stmt = db.prepare(`
|
|
188
|
-
SELECT id, title, tags, content, category, rank
|
|
189
|
-
FROM knowledge_fts
|
|
190
|
-
WHERE knowledge_fts MATCH ?
|
|
191
|
-
ORDER BY rank
|
|
192
|
-
LIMIT ?
|
|
193
|
-
`);
|
|
194
|
-
return stmt.all(sanitized, limit);
|
|
195
|
-
}
|
|
196
|
-
catch (err) {
|
|
197
|
-
this.logger.warn('FTS5 search query failed, returning empty results', {
|
|
198
|
-
query: sanitized,
|
|
199
|
-
error: err instanceof Error ? err.message : String(err),
|
|
200
|
-
});
|
|
201
|
-
return [];
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Rebuild the entire FTS5 index from scratch.
|
|
206
|
-
* Drops all existing rows and reinserts the provided documents in a single transaction.
|
|
207
|
-
*
|
|
208
|
-
* @param documents - The complete set of documents to index
|
|
209
|
-
*/
|
|
210
|
-
rebuildIndex(documents) {
|
|
211
|
-
const db = this.getDb();
|
|
212
|
-
const deleteAll = db.prepare('DELETE FROM knowledge_fts');
|
|
213
|
-
const insertStmt = db.prepare('INSERT INTO knowledge_fts (id, title, tags, content, category) VALUES (?, ?, ?, ?, ?)');
|
|
214
|
-
const txn = db.transaction(() => {
|
|
215
|
-
deleteAll.run();
|
|
216
|
-
for (const doc of documents) {
|
|
217
|
-
insertStmt.run(doc.id, doc.title, doc.tags, doc.content, doc.category);
|
|
218
|
-
}
|
|
219
|
-
});
|
|
220
|
-
txn();
|
|
221
|
-
this.logger.info('FTS5 index rebuilt', { documentCount: documents.length });
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* Close the database connection and release resources.
|
|
225
|
-
*/
|
|
226
|
-
close() {
|
|
227
|
-
if (this.db) {
|
|
228
|
-
try {
|
|
229
|
-
this.db.close();
|
|
230
|
-
this.logger.debug('FTS5 index database closed', { path: this.dbPath });
|
|
231
|
-
}
|
|
232
|
-
catch (err) {
|
|
233
|
-
this.logger.warn('Error closing FTS5 database', {
|
|
234
|
-
error: err instanceof Error ? err.message : String(err),
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
this.db = null;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
//# sourceMappingURL=fts5-index.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fts5-index.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/knowledge/fts5-index.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* FTS5 Query Sanitizer
|
|
3
|
-
*
|
|
4
|
-
* Pure helper that converts an arbitrary input string into a safe SQLite FTS5
|
|
5
|
-
* MATCH query via phrase-quote tokenization. Used by
|
|
6
|
-
* {@link Fts5IndexService.search} so that programmatically constructed
|
|
7
|
-
* agent-context strings never accidentally parse as FTS5 operators.
|
|
8
|
-
*
|
|
9
|
-
* **Why this helper exists.** SQLite FTS5 has a rich query grammar with
|
|
10
|
-
* column filters (`column:term`), set-column lists (`{c1, c2}: term`),
|
|
11
|
-
* phrase syntax (`"phrase"`), boolean operators (`AND`, `OR`, `NOT`),
|
|
12
|
-
* proximity (`NEAR(...)`), prefix (`term*`), and grouping (`(...)`). When
|
|
13
|
-
* arbitrary user / agent-context text is concatenated into a MATCH query,
|
|
14
|
-
* these operators trigger:
|
|
15
|
-
*
|
|
16
|
-
* - **commas** are parsed as column-list separators →
|
|
17
|
-
* `fts5: syntax error near ","` (e.g. `"foo, bar"` blows up)
|
|
18
|
-
* - **hyphens inside identifiers** like `team-leader` parse as `team`
|
|
19
|
-
* followed by column filter `-leader` → `no such column: leader`
|
|
20
|
-
* - **colons** parse as column filter operator → `no such column: ...`
|
|
21
|
-
* - **bare AND / OR / NOT** in mixed-case input parse as keywords
|
|
22
|
-
*
|
|
23
|
-
* The previous regex-strip sanitizer at `Fts5IndexService.search` only
|
|
24
|
-
* removed `' " * ( ) { } [ ] ^ ~ \\` — it left commas, hyphens, colons, and
|
|
25
|
-
* all FTS5 keywords intact. Result: 44 silent search failures per day
|
|
26
|
-
* (22 comma + 22 hyphen) for agent recall on 2026-05-07 alone.
|
|
27
|
-
*
|
|
28
|
-
* **Approach (Kai's WI-E F-FTS5 triage recommendation).** Split tokens on
|
|
29
|
-
* **whitespace + comma only** — NOT on word boundaries — then wrap each
|
|
30
|
-
* non-empty token in double quotes for FTS5 phrase syntax. Phrases are
|
|
31
|
-
* **literal** — no operator parsing happens inside the quotes — so any
|
|
32
|
-
* residual operator-like content (hyphens, colons, asterisks, AND/OR/NOT
|
|
33
|
-
* keywords) is neutralized. Tokens are joined with whitespace, which FTS5
|
|
34
|
-
* treats as implicit AND.
|
|
35
|
-
*
|
|
36
|
-
* **Why split on whitespace+comma instead of word boundaries.** A token like
|
|
37
|
-
* `team-leader` wrapped as the phrase `"team-leader"` is parsed by FTS5's
|
|
38
|
-
* MATCH parser as a single phrase node, then internally the
|
|
39
|
-
* `unicode61` tokenizer (used at index time) splits the phrase into
|
|
40
|
-
* adjacent tokens `team` + `leader`. The MATCH operation thus requires
|
|
41
|
-
* those tokens to appear adjacent in the document — which matches docs
|
|
42
|
-
* that were indexed with `team-leader` exactly. Splitting on word
|
|
43
|
-
* boundaries at query-time would produce `"team" "leader"` (loose AND),
|
|
44
|
-
* matching docs with `team` and `leader` anywhere — looser than the
|
|
45
|
-
* caller intended. **Kai's approach preserves precision for hyphenated
|
|
46
|
-
* identifiers without losing the comma/colon-safety win.**
|
|
47
|
-
*
|
|
48
|
-
* **Trade-off (intentional).** This sanitizer DROPS FTS5 operator support:
|
|
49
|
-
* `AND`, `OR`, `NOT`, `NEAR(...)`, column-filter prefixes, and prefix
|
|
50
|
-
* wildcards (`term*`) all become literal phrases. All callers on this
|
|
51
|
-
* path are auto-generated agent-context strings, not user-typed search
|
|
52
|
-
* queries — they don't need operator support. If a future caller needs
|
|
53
|
-
* the full FTS5 grammar, expose a separate `searchRaw()` API rather than
|
|
54
|
-
* loosening this sanitizer.
|
|
55
|
-
*
|
|
56
|
-
* @module services/knowledge/fts5-query-sanitizer
|
|
57
|
-
*/
|
|
58
|
-
/**
|
|
59
|
-
* Convert an arbitrary input string into a safe FTS5 MATCH query via
|
|
60
|
-
* phrase-quote tokenization.
|
|
61
|
-
*
|
|
62
|
-
* The result is one of:
|
|
63
|
-
* - `''` — when the input is empty / whitespace-only / only contains
|
|
64
|
-
* delimiter characters. Callers MUST check for empty and skip the
|
|
65
|
-
* MATCH query (return empty results).
|
|
66
|
-
* - `'"tok1" "tok2" ..."'` — a sequence of double-quoted phrases joined
|
|
67
|
-
* by whitespace (implicit AND in FTS5).
|
|
68
|
-
*
|
|
69
|
-
* Pre-existing double quotes inside a token are escaped per FTS5 phrase
|
|
70
|
-
* syntax (`"` → `""`). This is defensive — auto-generated context
|
|
71
|
-
* strings rarely contain quotes — but it makes the helper safely
|
|
72
|
-
* reusable beyond the current call site.
|
|
73
|
-
*
|
|
74
|
-
* @param input - Raw query string from user input or agent-context concat.
|
|
75
|
-
* @returns Safe FTS5 MATCH expression, or `''` if no tokens remain.
|
|
76
|
-
*
|
|
77
|
-
* @example
|
|
78
|
-
* ```typescript
|
|
79
|
-
* toFts5Phrase('developer session startup');
|
|
80
|
-
* // → '"developer" "session" "startup"'
|
|
81
|
-
*
|
|
82
|
-
* toFts5Phrase('developer session startup, recent tasks, unfinished work');
|
|
83
|
-
* // → '"developer" "session" "startup" "recent" "tasks" "unfinished" "work"'
|
|
84
|
-
* // (comma fix — was: "syntax error near ',''")
|
|
85
|
-
*
|
|
86
|
-
* toFts5Phrase('team-leader session startup');
|
|
87
|
-
* // → '"team-leader" "session" "startup"'
|
|
88
|
-
* // (hyphen fix — was: "no such column: leader". The phrase `"team-leader"`
|
|
89
|
-
* // matches docs indexed with `team-leader` exactly, since the unicode61
|
|
90
|
-
* // tokenizer splits the phrase content the same way at both index and
|
|
91
|
-
* // query time.)
|
|
92
|
-
*
|
|
93
|
-
* toFts5Phrase('say "hello" world');
|
|
94
|
-
* // → '"say" """hello""" "world"' (quotes escaped as "")
|
|
95
|
-
*
|
|
96
|
-
* toFts5Phrase(' , '); // → ''
|
|
97
|
-
* toFts5Phrase('***'); // → '"***"' (literal phrase, FTS5 strips
|
|
98
|
-
* // non-word chars at tokenization → no match)
|
|
99
|
-
* ```
|
|
100
|
-
*/
|
|
101
|
-
export declare function toFts5Phrase(input: string): string;
|
|
102
|
-
//# sourceMappingURL=fts5-query-sanitizer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fts5-query-sanitizer.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/knowledge/fts5-query-sanitizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAiBlD"}
|