crewly 1.6.1 → 1.6.3
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/roles/orchestrator/prompt.md +16 -0
- package/config/skills/agent/core/get-my-active-work/SKILL.md +101 -0
- package/config/skills/agent/core/get-my-active-work/execute.sh +122 -0
- package/config/skills/agent/core/record-learning/SKILL.md +29 -0
- package/config/skills/agent/core/reply-channel/SKILL.md +41 -0
- package/config/skills/agent/core/reply-channel/execute.sh +165 -0
- package/config/skills/agent/core/reply-channel/execute.test.sh +148 -0
- package/config/skills/agent/remote-browser/execute.sh +296 -14
- package/config/skills/agent/remote-browser/execute.test.sh +482 -0
- package/config/skills/orchestrator/send-message/SKILL.md +30 -7
- package/config/skills/orchestrator/team-health-scan/SKILL.md +98 -0
- package/config/skills/orchestrator/team-health-scan/execute.sh +44 -0
- package/config/skills/registry.json +62 -1
- package/config/slack-app-manifest.json +2 -1
- package/config/sops/developer/git-workflow.md +38 -3
- package/dist/backend/backend/src/constants.d.ts +69 -1
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +69 -2
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/active-work/active-work.controller.d.ts +53 -0
- package/dist/backend/backend/src/controllers/active-work/active-work.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/active-work/active-work.controller.js +92 -0
- package/dist/backend/backend/src/controllers/active-work/active-work.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.js +18 -1
- package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts +68 -0
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.js +233 -5
- package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.js +10 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.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 +8 -3
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts +132 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +401 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.d.ts +29 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.js +39 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/chat-v2/index.d.ts +8 -0
- package/dist/backend/backend/src/controllers/chat-v2/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/chat-v2/index.js +8 -0
- package/dist/backend/backend/src/controllers/chat-v2/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.d.ts +13 -13
- package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.js +74 -234
- package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js +76 -15
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/request/request.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/request/request.controller.js +4 -6
- package/dist/backend/backend/src/controllers/request/request.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/tasks.controller.d.ts +43 -0
- package/dist/backend/backend/src/controllers/task-management/tasks.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/tasks.controller.js +200 -72
- package/dist/backend/backend/src/controllers/task-management/tasks.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +49 -0
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team-health/team-health.controller.d.ts +59 -0
- package/dist/backend/backend/src/controllers/team-health/team-health.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/team-health/team-health.controller.js +127 -0
- package/dist/backend/backend/src/controllers/team-health/team-health.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/team-health/team-health.routes.d.ts +13 -0
- package/dist/backend/backend/src/controllers/team-health/team-health.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/team-health/team-health.routes.js +20 -0
- package/dist/backend/backend/src/controllers/team-health/team-health.routes.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts +9 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +233 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +40 -6
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/active-work-briefing.service.d.ts +498 -0
- package/dist/backend/backend/src/services/agent/active-work-briefing.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/active-work-briefing.service.js +759 -0
- package/dist/backend/backend/src/services/agent/active-work-briefing.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +25 -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 +221 -58
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +9 -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 +35 -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/types.d.ts +8 -2
- 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 +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js.map +1 -1
- package/dist/backend/backend/src/services/agent/tmux-command.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/tmux-command.service.js +2 -1
- package/dist/backend/backend/src/services/agent/tmux-command.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/tmux.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/tmux.service.js +2 -1
- package/dist/backend/backend/src/services/agent/tmux.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts +148 -3
- 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 +241 -2
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js +13 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/role-boundary.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/role-boundary.module.js +26 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/role-boundary.module.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.d.ts +79 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.js +118 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.js.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts +161 -0
- 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 +382 -2
- 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 +105 -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 +232 -13
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +178 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +254 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts +134 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.js +232 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.d.ts +25 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.js +23 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +254 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +467 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.d.ts +27 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.js +57 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.d.ts +43 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.js +54 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/config.d.ts +100 -0
- package/dist/backend/backend/src/services/chat-v2/config.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/config.js +174 -0
- package/dist/backend/backend/src/services/chat-v2/config.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/index.d.ts +11 -0
- package/dist/backend/backend/src/services/chat-v2/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/index.js +12 -0
- package/dist/backend/backend/src/services/chat-v2/index.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts +114 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js +194 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.d.ts +100 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.js +351 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +132 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +281 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/types.d.ts +295 -0
- package/dist/backend/backend/src/services/chat-v2/types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/types.js +61 -0
- package/dist/backend/backend/src/services/chat-v2/types.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.d.ts +113 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.js +179 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.d.ts +131 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.js +227 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.js.map +1 -0
- package/dist/backend/backend/src/services/core/config.service.js +3 -3
- package/dist/backend/backend/src/services/core/config.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.d.ts +22 -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 +57 -0
- package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts +69 -1
- 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 +118 -0
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts +275 -0
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +736 -0
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -0
- package/dist/backend/backend/src/services/knowledge/fts5-index.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/knowledge/fts5-index.service.js +18 -2
- package/dist/backend/backend/src/services/knowledge/fts5-index.service.js.map +1 -1
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts +49 -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 +123 -29
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js.map +1 -1
- package/dist/backend/backend/src/services/knowledge/learnings-index.service.d.ts +159 -0
- package/dist/backend/backend/src/services/knowledge/learnings-index.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/knowledge/learnings-index.service.js +304 -0
- package/dist/backend/backend/src/services/knowledge/learnings-index.service.js.map +1 -0
- 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 +24 -4
- package/dist/backend/backend/src/services/knowledge/vector-store.service.js.map +1 -1
- package/dist/backend/backend/src/services/memory/auto-learning.subscriber.d.ts +174 -0
- package/dist/backend/backend/src/services/memory/auto-learning.subscriber.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/auto-learning.subscriber.js +375 -0
- package/dist/backend/backend/src/services/memory/auto-learning.subscriber.js.map +1 -0
- package/dist/backend/backend/src/services/memory/learning-format.validator.d.ts +97 -0
- package/dist/backend/backend/src/services/memory/learning-format.validator.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/learning-format.validator.js +209 -0
- package/dist/backend/backend/src/services/memory/learning-format.validator.js.map +1 -0
- package/dist/backend/backend/src/services/memory/vector-store.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/memory/vector-store.service.js +19 -4
- package/dist/backend/backend/src/services/memory/vector-store.service.js.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.d.ts +16 -5
- package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.js +32 -5
- package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.js.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding.service.d.ts +157 -0
- package/dist/backend/backend/src/services/onboarding/onboarding.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding.service.js +229 -0
- package/dist/backend/backend/src/services/onboarding/onboarding.service.js.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding.types.d.ts +141 -0
- package/dist/backend/backend/src/services/onboarding/onboarding.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding.types.js +18 -0
- package/dist/backend/backend/src/services/onboarding/onboarding.types.js.map +1 -0
- package/dist/backend/backend/src/services/pr-review/pr-review.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/pr-review/pr-review.service.js +1 -1
- package/dist/backend/backend/src/services/pr-review/pr-review.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/cross-machine-message.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/cross-machine-message.service.js +17 -1
- package/dist/backend/backend/src/services/slack/cross-machine-message.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +39 -1
- 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 +158 -26
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +248 -6
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js +531 -51
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/team-health/index.d.ts +16 -0
- package/dist/backend/backend/src/services/team-health/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/index.js +16 -0
- package/dist/backend/backend/src/services/team-health/index.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.d.ts +52 -0
- package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.js +161 -0
- package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.d.ts +53 -0
- package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.js +88 -0
- package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/stale-trigger-detector.d.ts +44 -0
- package/dist/backend/backend/src/services/team-health/stale-trigger-detector.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/stale-trigger-detector.js +83 -0
- package/dist/backend/backend/src/services/team-health/stale-trigger-detector.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-alert-router.d.ts +92 -0
- package/dist/backend/backend/src/services/team-health/team-health-alert-router.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-alert-router.js +328 -0
- package/dist/backend/backend/src/services/team-health/team-health-alert-router.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-config.d.ts +41 -0
- package/dist/backend/backend/src/services/team-health/team-health-config.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-config.js +213 -0
- package/dist/backend/backend/src/services/team-health/team-health-config.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-detector.d.ts +46 -0
- package/dist/backend/backend/src/services/team-health/team-health-detector.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-detector.js +347 -0
- package/dist/backend/backend/src/services/team-health/team-health-detector.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-types.d.ts +154 -0
- package/dist/backend/backend/src/services/team-health/team-health-types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-types.js +94 -0
- package/dist/backend/backend/src/services/team-health/team-health-types.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.d.ts +111 -0
- package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.js +226 -0
- package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.js.map +1 -0
- package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts +148 -0
- package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/mission-reminder.service.js +545 -0
- package/dist/backend/backend/src/services/v3/mission-reminder.service.js.map +1 -0
- package/dist/backend/backend/src/services/v3/request-sla.subscriber.d.ts +499 -0
- package/dist/backend/backend/src/services/v3/request-sla.subscriber.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/request-sla.subscriber.js +1105 -0
- package/dist/backend/backend/src/services/v3/request-sla.subscriber.js.map +1 -0
- package/dist/backend/backend/src/services/v3/request.service.d.ts +22 -0
- package/dist/backend/backend/src/services/v3/request.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/request.service.js +71 -0
- package/dist/backend/backend/src/services/v3/request.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/v3-data.service.d.ts +1 -0
- package/dist/backend/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/v3-data.service.js +22 -6
- package/dist/backend/backend/src/services/v3/v3-data.service.js.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.d.ts +19 -1
- package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.js +43 -0
- package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
- package/dist/backend/backend/src/types/index.d.ts +22 -1
- 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/review-reason.types.d.ts +63 -0
- package/dist/backend/backend/src/types/review-reason.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/review-reason.types.js +50 -0
- package/dist/backend/backend/src/types/review-reason.types.js.map +1 -0
- package/dist/backend/backend/src/types/slack.types.d.ts +4 -1
- 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/backend/src/types/v2/mission.types.d.ts +18 -0
- package/dist/backend/backend/src/types/v2/mission.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/mission.types.js +1 -0
- package/dist/backend/backend/src/types/v2/mission.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/work-item.types.js +25 -1
- package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
- package/dist/backend/backend/src/utils/team.utils.d.ts +38 -0
- package/dist/backend/backend/src/utils/team.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/team.utils.js +45 -0
- package/dist/backend/backend/src/utils/team.utils.js.map +1 -0
- package/dist/backend/backend/src/websocket/chat-v2.gateway.d.ts +195 -0
- package/dist/backend/backend/src/websocket/chat-v2.gateway.d.ts.map +1 -0
- package/dist/backend/backend/src/websocket/chat-v2.gateway.js +401 -0
- package/dist/backend/backend/src/websocket/chat-v2.gateway.js.map +1 -0
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts +37 -2
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -1
- package/dist/backend/backend/src/websocket/terminal.gateway.js +106 -5
- package/dist/backend/backend/src/websocket/terminal.gateway.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +69 -1
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +69 -2
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/core/config.service.js +3 -3
- package/dist/cli/backend/src/services/core/config.service.js.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.d.ts +22 -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 +57 -0
- package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/cli/backend/src/services/knowledge/fts5-index.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/knowledge/fts5-index.service.js +18 -2
- package/dist/cli/backend/src/services/knowledge/fts5-index.service.js.map +1 -1
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts +49 -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 +123 -29
- 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.map +1 -1
- package/dist/cli/backend/src/services/knowledge/vector-store.service.js +24 -4
- package/dist/cli/backend/src/services/knowledge/vector-store.service.js.map +1 -1
- package/dist/cli/backend/src/types/index.d.ts +22 -1
- 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/v2/work-item.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/work-item.types.js +25 -1
- package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
- package/frontend/dist/assets/{index-70356616.js → index-7a4e7df5.js} +328 -326
- package/frontend/dist/assets/index-b7e59b2b.css +33 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +2 -1
- package/config/skills/orchestrator/recall/SKILL.md +0 -47
- package/config/skills/orchestrator/recall/execute.sh +0 -13
- package/config/skills/orchestrator/record-learning/SKILL.md +0 -47
- package/config/skills/orchestrator/record-learning/execute.sh +0 -13
- package/config/skills/orchestrator/remember/SKILL.md +0 -55
- package/config/skills/orchestrator/remember/execute.sh +0 -15
- package/frontend/dist/assets/index-6aaa0630.css +0 -33
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-db.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/chat-v2/sqlite/chat-db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MessageStore — CRUD for `chat_messages` plus the server-side
|
|
3
|
+
* sequence assigner described in tech-spec §4.
|
|
4
|
+
*
|
|
5
|
+
* Key properties:
|
|
6
|
+
* - Every insert assigns `seq = MAX(seq)+1` for the channel inside a
|
|
7
|
+
* transaction that also bumps `chat_channels.last_message_at`.
|
|
8
|
+
* - Concurrent writes serialize through the SQLite write lock; the
|
|
9
|
+
* `UNIQUE(channel_id, seq)` constraint is a belt-and-braces guard.
|
|
10
|
+
* - `clientMessageId` is an optional idempotency key stored in
|
|
11
|
+
* `metadata.clientMessageId`; duplicate inserts surface the
|
|
12
|
+
* persisted row instead of erroring.
|
|
13
|
+
*
|
|
14
|
+
* @module services/chat-v2/sqlite/message.store
|
|
15
|
+
*/
|
|
16
|
+
import { type ChatContentType, type ChatMessageCursorPayload, type ChatMessageRow, type ChatSenderType } from '../types.js';
|
|
17
|
+
import type { ChatDatabase } from './chat-db.js';
|
|
18
|
+
/**
|
|
19
|
+
* Encode a pagination cursor to an opaque base64url string.
|
|
20
|
+
*
|
|
21
|
+
* @param payload - Cursor fields
|
|
22
|
+
* @returns Opaque base64url-encoded JSON string
|
|
23
|
+
*/
|
|
24
|
+
export declare function encodeCursor(payload: ChatMessageCursorPayload): string;
|
|
25
|
+
/**
|
|
26
|
+
* Decode an opaque pagination cursor.
|
|
27
|
+
*
|
|
28
|
+
* @param cursor - The cursor string (or null/undefined)
|
|
29
|
+
* @returns The decoded payload, or null if input is missing
|
|
30
|
+
* @throws {ChatError} `invalid_cursor` (400) if the cursor fails to parse or
|
|
31
|
+
* doesn't contain the expected fields.
|
|
32
|
+
*/
|
|
33
|
+
export declare function decodeCursor(cursor: string | null | undefined): ChatMessageCursorPayload | null;
|
|
34
|
+
/** Options for inserting a message. */
|
|
35
|
+
export interface MessageInsertInput {
|
|
36
|
+
channelId: string;
|
|
37
|
+
senderType: ChatSenderType;
|
|
38
|
+
senderId: string;
|
|
39
|
+
content: string;
|
|
40
|
+
contentType?: ChatContentType;
|
|
41
|
+
/** Optional metadata object. Will be JSON-stringified. */
|
|
42
|
+
metadata?: Record<string, unknown>;
|
|
43
|
+
/** Stable client id for idempotent retries; folded into metadata. */
|
|
44
|
+
clientMessageId?: string;
|
|
45
|
+
/**
|
|
46
|
+
* Phase A (SEALED §3.2) — array of mention IDs (member or team)
|
|
47
|
+
* referenced inline in `content`. Stored as a JSON-encoded string in
|
|
48
|
+
* the `mentions` column. Empty array or omitted → null in storage.
|
|
49
|
+
*/
|
|
50
|
+
mentions?: string[];
|
|
51
|
+
/**
|
|
52
|
+
* Phase A (SEALED §3.2) — Slack-style thread root. When set, this
|
|
53
|
+
* message is a reply within the thread rooted at `threadId`. Omitted
|
|
54
|
+
* for top-level channel messages.
|
|
55
|
+
*/
|
|
56
|
+
threadId?: string;
|
|
57
|
+
/** Override the insert clock (tests). */
|
|
58
|
+
nowMs?: number;
|
|
59
|
+
/** Override the generated id (tests / deterministic callers). */
|
|
60
|
+
id?: string;
|
|
61
|
+
}
|
|
62
|
+
/** Result of inserting a message — includes whether this was a dedupe hit. */
|
|
63
|
+
export interface MessageInsertResult {
|
|
64
|
+
row: ChatMessageRow;
|
|
65
|
+
/** True when the returned row pre-existed under the given clientMessageId. */
|
|
66
|
+
deduped: boolean;
|
|
67
|
+
}
|
|
68
|
+
/** Options for listing messages with cursor pagination. */
|
|
69
|
+
export interface MessageListOptions {
|
|
70
|
+
cursor?: string | null;
|
|
71
|
+
/** 1..100, default 50. */
|
|
72
|
+
limit?: number;
|
|
73
|
+
/** `backward` (default) loads older; `forward` loads newer. */
|
|
74
|
+
direction?: 'backward' | 'forward';
|
|
75
|
+
}
|
|
76
|
+
/** SQLite-backed store for chat messages. */
|
|
77
|
+
export declare class MessageStore {
|
|
78
|
+
private readonly db;
|
|
79
|
+
/** Cap on a single page size. */
|
|
80
|
+
static readonly MAX_LIMIT = 100;
|
|
81
|
+
/** Default page size when caller didn't specify. */
|
|
82
|
+
static readonly DEFAULT_LIMIT = 50;
|
|
83
|
+
constructor(db: ChatDatabase);
|
|
84
|
+
/**
|
|
85
|
+
* Insert a message into the channel.
|
|
86
|
+
*
|
|
87
|
+
* Performs sequence assignment (`MAX(seq)+1`) and idempotency dedupe in a
|
|
88
|
+
* single transaction. If a row with the same `(channel_id, clientMessageId)`
|
|
89
|
+
* already exists, returns it with `deduped=true` instead of inserting.
|
|
90
|
+
*
|
|
91
|
+
* Also updates the parent channel's `last_message_at`.
|
|
92
|
+
*
|
|
93
|
+
* @param input - Insert payload
|
|
94
|
+
* @returns The persisted row plus a dedupe flag
|
|
95
|
+
* @throws {ChatError} `channel_not_found` (404) if the channel is missing
|
|
96
|
+
* (or archived and we want to refuse).
|
|
97
|
+
*/
|
|
98
|
+
insert(input: MessageInsertInput): MessageInsertResult;
|
|
99
|
+
/**
|
|
100
|
+
* Look up a message by its id.
|
|
101
|
+
*
|
|
102
|
+
* @param id - The message id
|
|
103
|
+
* @returns The row, or null
|
|
104
|
+
*/
|
|
105
|
+
getById(id: string): ChatMessageRow | null;
|
|
106
|
+
/**
|
|
107
|
+
* List messages for a channel with cursor pagination.
|
|
108
|
+
*
|
|
109
|
+
* @param channelId - The channel id to read
|
|
110
|
+
* @param options - Listing options (cursor, limit, direction)
|
|
111
|
+
* @returns An ordered array of rows and cursors for next/prev pages
|
|
112
|
+
*/
|
|
113
|
+
listByChannel(channelId: string, options?: MessageListOptions): {
|
|
114
|
+
rows: ChatMessageRow[];
|
|
115
|
+
nextCursor: string | null;
|
|
116
|
+
prevCursor: string | null;
|
|
117
|
+
};
|
|
118
|
+
/** Execute the paginated SELECT for one page of messages. */
|
|
119
|
+
private queryPage;
|
|
120
|
+
/** Compute next/prev cursors based on the page result. */
|
|
121
|
+
private buildCursors;
|
|
122
|
+
/**
|
|
123
|
+
* Return the current `MAX(seq)` for a channel, or 0 when empty.
|
|
124
|
+
*
|
|
125
|
+
* @param channelId - The channel id
|
|
126
|
+
* @returns The largest seq, or 0
|
|
127
|
+
*/
|
|
128
|
+
getLastSeq(channelId: string): number;
|
|
129
|
+
/** Count messages for a channel. Used by tests and metrics. */
|
|
130
|
+
count(channelId: string): number;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=message.store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.store.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/chat-v2/sqlite/message.store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAoBjD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,wBAAwB,GAAG,MAAM,CAGtE;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,wBAAwB,GAAG,IAAI,CAqB/F;AAMD,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,cAAc,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,8EAA8E;AAC9E,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,cAAc,CAAC;IACpB,8EAA8E;IAC9E,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,2DAA2D;AAC3D,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,SAAS,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CACpC;AAMD,6CAA6C;AAC7C,qBAAa,YAAY;IAMX,OAAO,CAAC,QAAQ,CAAC,EAAE;IAL/B,iCAAiC;IACjC,MAAM,CAAC,QAAQ,CAAC,SAAS,OAAO;IAChC,oDAAoD;IACpD,MAAM,CAAC,QAAQ,CAAC,aAAa,MAAM;gBAEN,EAAE,EAAE,YAAY;IAE7C;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,mBAAmB;IA4GtD;;;;;OAKG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAW1C;;;;;;OAMG;IACH,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,kBAAkB,GAC3B;QACD,IAAI,EAAE,cAAc,EAAE,CAAC;QACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B;IAoBD,6DAA6D;IAC7D,OAAO,CAAC,SAAS;IAmDjB,0DAA0D;IAC1D,OAAO,CAAC,YAAY;IAiCpB;;;;;OAKG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAWrC,+DAA+D;IAC/D,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CAMjC"}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MessageStore — CRUD for `chat_messages` plus the server-side
|
|
3
|
+
* sequence assigner described in tech-spec §4.
|
|
4
|
+
*
|
|
5
|
+
* Key properties:
|
|
6
|
+
* - Every insert assigns `seq = MAX(seq)+1` for the channel inside a
|
|
7
|
+
* transaction that also bumps `chat_channels.last_message_at`.
|
|
8
|
+
* - Concurrent writes serialize through the SQLite write lock; the
|
|
9
|
+
* `UNIQUE(channel_id, seq)` constraint is a belt-and-braces guard.
|
|
10
|
+
* - `clientMessageId` is an optional idempotency key stored in
|
|
11
|
+
* `metadata.clientMessageId`; duplicate inserts surface the
|
|
12
|
+
* persisted row instead of erroring.
|
|
13
|
+
*
|
|
14
|
+
* @module services/chat-v2/sqlite/message.store
|
|
15
|
+
*/
|
|
16
|
+
import { randomUUID } from 'crypto';
|
|
17
|
+
import { CHAT_ERROR_CODES, ChatError, } from '../types.js';
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Constants — shared SELECT column list, single source of truth
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
/**
|
|
22
|
+
* Canonical column list for `chat_messages` SELECTs. Including all Phase A
|
|
23
|
+
* columns (mentions / thread_id) here keeps every read path in this store
|
|
24
|
+
* mapping to a fully-populated `ChatMessageRow`.
|
|
25
|
+
*/
|
|
26
|
+
const MESSAGE_SELECT_COLUMNS = `
|
|
27
|
+
id, channel_id, seq, sender_type, sender_id, content, content_type,
|
|
28
|
+
created_at, metadata, mentions, thread_id
|
|
29
|
+
`;
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// Cursor helpers
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
/**
|
|
34
|
+
* Encode a pagination cursor to an opaque base64url string.
|
|
35
|
+
*
|
|
36
|
+
* @param payload - Cursor fields
|
|
37
|
+
* @returns Opaque base64url-encoded JSON string
|
|
38
|
+
*/
|
|
39
|
+
export function encodeCursor(payload) {
|
|
40
|
+
const json = JSON.stringify(payload);
|
|
41
|
+
return Buffer.from(json, 'utf-8').toString('base64url');
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Decode an opaque pagination cursor.
|
|
45
|
+
*
|
|
46
|
+
* @param cursor - The cursor string (or null/undefined)
|
|
47
|
+
* @returns The decoded payload, or null if input is missing
|
|
48
|
+
* @throws {ChatError} `invalid_cursor` (400) if the cursor fails to parse or
|
|
49
|
+
* doesn't contain the expected fields.
|
|
50
|
+
*/
|
|
51
|
+
export function decodeCursor(cursor) {
|
|
52
|
+
if (!cursor)
|
|
53
|
+
return null;
|
|
54
|
+
try {
|
|
55
|
+
const json = Buffer.from(cursor, 'base64url').toString('utf-8');
|
|
56
|
+
const parsed = JSON.parse(json);
|
|
57
|
+
if (typeof parsed.seq !== 'number' ||
|
|
58
|
+
!Number.isFinite(parsed.seq) ||
|
|
59
|
+
typeof parsed.channelId !== 'string' ||
|
|
60
|
+
parsed.channelId.length === 0) {
|
|
61
|
+
throw new Error('missing required fields');
|
|
62
|
+
}
|
|
63
|
+
return { seq: parsed.seq, channelId: parsed.channelId };
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
throw new ChatError(CHAT_ERROR_CODES.INVALID_CURSOR, 400, `Cursor failed to parse: ${err instanceof Error ? err.message : String(err)}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
// Store
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
72
|
+
/** SQLite-backed store for chat messages. */
|
|
73
|
+
export class MessageStore {
|
|
74
|
+
db;
|
|
75
|
+
/** Cap on a single page size. */
|
|
76
|
+
static MAX_LIMIT = 100;
|
|
77
|
+
/** Default page size when caller didn't specify. */
|
|
78
|
+
static DEFAULT_LIMIT = 50;
|
|
79
|
+
constructor(db) {
|
|
80
|
+
this.db = db;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Insert a message into the channel.
|
|
84
|
+
*
|
|
85
|
+
* Performs sequence assignment (`MAX(seq)+1`) and idempotency dedupe in a
|
|
86
|
+
* single transaction. If a row with the same `(channel_id, clientMessageId)`
|
|
87
|
+
* already exists, returns it with `deduped=true` instead of inserting.
|
|
88
|
+
*
|
|
89
|
+
* Also updates the parent channel's `last_message_at`.
|
|
90
|
+
*
|
|
91
|
+
* @param input - Insert payload
|
|
92
|
+
* @returns The persisted row plus a dedupe flag
|
|
93
|
+
* @throws {ChatError} `channel_not_found` (404) if the channel is missing
|
|
94
|
+
* (or archived and we want to refuse).
|
|
95
|
+
*/
|
|
96
|
+
insert(input) {
|
|
97
|
+
const id = input.id ?? randomUUID();
|
|
98
|
+
const createdAt = input.nowMs ?? Date.now();
|
|
99
|
+
const contentType = input.contentType ?? 'markdown';
|
|
100
|
+
const metadataObj = {
|
|
101
|
+
...(input.metadata ?? {}),
|
|
102
|
+
...(input.clientMessageId ? { clientMessageId: input.clientMessageId } : {}),
|
|
103
|
+
};
|
|
104
|
+
const metadataHasKeys = Object.keys(metadataObj).length > 0;
|
|
105
|
+
const metadataJson = metadataHasKeys ? JSON.stringify(metadataObj) : null;
|
|
106
|
+
// Phase A: serialize mentions to JSON. Treat null/empty as DB-null so
|
|
107
|
+
// legacy rows and "no mentions" share a representation; the read-side
|
|
108
|
+
// mapper translates DB-null back to [].
|
|
109
|
+
const mentionsJson = input.mentions && input.mentions.length > 0 ? JSON.stringify(input.mentions) : null;
|
|
110
|
+
const threadId = input.threadId ?? null;
|
|
111
|
+
const txn = this.db.transaction(() => {
|
|
112
|
+
// Dedupe check — same clientMessageId + channel → return existing row.
|
|
113
|
+
if (input.clientMessageId) {
|
|
114
|
+
const existing = this.db
|
|
115
|
+
.prepare(`SELECT ${MESSAGE_SELECT_COLUMNS}
|
|
116
|
+
FROM chat_messages
|
|
117
|
+
WHERE channel_id = ?
|
|
118
|
+
AND json_extract(metadata, '$.clientMessageId') = ?
|
|
119
|
+
LIMIT 1`)
|
|
120
|
+
.get(input.channelId, input.clientMessageId);
|
|
121
|
+
if (existing) {
|
|
122
|
+
return { row: existing, deduped: true };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Channel existence check — FK catches it too but we want a typed error
|
|
126
|
+
// with a sensible status code.
|
|
127
|
+
const channel = this.db
|
|
128
|
+
.prepare('SELECT id, archived_at FROM chat_channels WHERE id = ?')
|
|
129
|
+
.get(input.channelId);
|
|
130
|
+
if (!channel) {
|
|
131
|
+
throw new ChatError(CHAT_ERROR_CODES.CHANNEL_NOT_FOUND, 404, `Channel ${input.channelId} not found`);
|
|
132
|
+
}
|
|
133
|
+
if (channel.archived_at) {
|
|
134
|
+
throw new ChatError(CHAT_ERROR_CODES.CHANNEL_ARCHIVED, 404, `Channel ${input.channelId} is archived`);
|
|
135
|
+
}
|
|
136
|
+
// Sequence assignment + insert.
|
|
137
|
+
const seqRow = this.db
|
|
138
|
+
.prepare(`SELECT COALESCE(MAX(seq), 0) + 1 AS next_seq
|
|
139
|
+
FROM chat_messages
|
|
140
|
+
WHERE channel_id = ?`)
|
|
141
|
+
.get(input.channelId);
|
|
142
|
+
this.db
|
|
143
|
+
.prepare(`INSERT INTO chat_messages
|
|
144
|
+
(id, channel_id, seq, sender_type, sender_id, content, content_type,
|
|
145
|
+
created_at, metadata, mentions, thread_id)
|
|
146
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
147
|
+
.run(id, input.channelId, seqRow.next_seq, input.senderType, input.senderId, input.content, contentType, createdAt, metadataJson, mentionsJson, threadId);
|
|
148
|
+
// Touch last_message_at on the parent channel.
|
|
149
|
+
this.db
|
|
150
|
+
.prepare(`UPDATE chat_channels
|
|
151
|
+
SET last_message_at = ?
|
|
152
|
+
WHERE id = ?
|
|
153
|
+
AND (last_message_at IS NULL OR last_message_at < ?)`)
|
|
154
|
+
.run(createdAt, input.channelId, createdAt);
|
|
155
|
+
const row = this.db
|
|
156
|
+
.prepare(`SELECT ${MESSAGE_SELECT_COLUMNS}
|
|
157
|
+
FROM chat_messages
|
|
158
|
+
WHERE id = ?`)
|
|
159
|
+
.get(id);
|
|
160
|
+
return { row, deduped: false };
|
|
161
|
+
});
|
|
162
|
+
return txn();
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Look up a message by its id.
|
|
166
|
+
*
|
|
167
|
+
* @param id - The message id
|
|
168
|
+
* @returns The row, or null
|
|
169
|
+
*/
|
|
170
|
+
getById(id) {
|
|
171
|
+
const row = this.db
|
|
172
|
+
.prepare(`SELECT ${MESSAGE_SELECT_COLUMNS}
|
|
173
|
+
FROM chat_messages
|
|
174
|
+
WHERE id = ?`)
|
|
175
|
+
.get(id);
|
|
176
|
+
return row ?? null;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* List messages for a channel with cursor pagination.
|
|
180
|
+
*
|
|
181
|
+
* @param channelId - The channel id to read
|
|
182
|
+
* @param options - Listing options (cursor, limit, direction)
|
|
183
|
+
* @returns An ordered array of rows and cursors for next/prev pages
|
|
184
|
+
*/
|
|
185
|
+
listByChannel(channelId, options) {
|
|
186
|
+
const direction = options?.direction ?? 'backward';
|
|
187
|
+
const rawLimit = options?.limit ?? MessageStore.DEFAULT_LIMIT;
|
|
188
|
+
const limit = Math.max(1, Math.min(rawLimit, MessageStore.MAX_LIMIT));
|
|
189
|
+
const decoded = decodeCursor(options?.cursor);
|
|
190
|
+
if (decoded && decoded.channelId !== channelId) {
|
|
191
|
+
throw new ChatError(CHAT_ERROR_CODES.INVALID_CURSOR, 400, 'Cursor belongs to a different channel');
|
|
192
|
+
}
|
|
193
|
+
const rows = this.queryPage(channelId, decoded?.seq ?? null, direction, limit);
|
|
194
|
+
const cursors = this.buildCursors(channelId, rows, direction, limit);
|
|
195
|
+
return { rows, ...cursors };
|
|
196
|
+
}
|
|
197
|
+
/** Execute the paginated SELECT for one page of messages. */
|
|
198
|
+
queryPage(channelId, fromSeq, direction, limit) {
|
|
199
|
+
const cols = MESSAGE_SELECT_COLUMNS;
|
|
200
|
+
if (direction === 'backward') {
|
|
201
|
+
// Loading older: newest-first, seq < cursor.
|
|
202
|
+
if (fromSeq === null) {
|
|
203
|
+
return this.db
|
|
204
|
+
.prepare(`SELECT ${cols} FROM chat_messages
|
|
205
|
+
WHERE channel_id = ?
|
|
206
|
+
ORDER BY seq DESC
|
|
207
|
+
LIMIT ?`)
|
|
208
|
+
.all(channelId, limit);
|
|
209
|
+
}
|
|
210
|
+
return this.db
|
|
211
|
+
.prepare(`SELECT ${cols} FROM chat_messages
|
|
212
|
+
WHERE channel_id = ? AND seq < ?
|
|
213
|
+
ORDER BY seq DESC
|
|
214
|
+
LIMIT ?`)
|
|
215
|
+
.all(channelId, fromSeq, limit);
|
|
216
|
+
}
|
|
217
|
+
// Forward: oldest-first, seq > cursor.
|
|
218
|
+
if (fromSeq === null) {
|
|
219
|
+
return this.db
|
|
220
|
+
.prepare(`SELECT ${cols} FROM chat_messages
|
|
221
|
+
WHERE channel_id = ?
|
|
222
|
+
ORDER BY seq ASC
|
|
223
|
+
LIMIT ?`)
|
|
224
|
+
.all(channelId, limit);
|
|
225
|
+
}
|
|
226
|
+
return this.db
|
|
227
|
+
.prepare(`SELECT ${cols} FROM chat_messages
|
|
228
|
+
WHERE channel_id = ? AND seq > ?
|
|
229
|
+
ORDER BY seq ASC
|
|
230
|
+
LIMIT ?`)
|
|
231
|
+
.all(channelId, fromSeq, limit);
|
|
232
|
+
}
|
|
233
|
+
/** Compute next/prev cursors based on the page result. */
|
|
234
|
+
buildCursors(channelId, rows, direction, limit) {
|
|
235
|
+
// `nextCursor` continues in the current direction; `prevCursor` goes back.
|
|
236
|
+
if (rows.length === 0) {
|
|
237
|
+
return { nextCursor: null, prevCursor: null };
|
|
238
|
+
}
|
|
239
|
+
const isLastPage = rows.length < limit;
|
|
240
|
+
if (direction === 'backward') {
|
|
241
|
+
// rows ordered newest → oldest; the last element has the smallest seq.
|
|
242
|
+
const oldest = rows[rows.length - 1];
|
|
243
|
+
const newest = rows[0];
|
|
244
|
+
return {
|
|
245
|
+
nextCursor: isLastPage
|
|
246
|
+
? null
|
|
247
|
+
: encodeCursor({ seq: oldest.seq, channelId }),
|
|
248
|
+
prevCursor: encodeCursor({ seq: newest.seq, channelId }),
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
// forward: rows ordered oldest → newest; the last element has the largest seq.
|
|
252
|
+
const newest = rows[rows.length - 1];
|
|
253
|
+
const oldest = rows[0];
|
|
254
|
+
return {
|
|
255
|
+
nextCursor: isLastPage ? null : encodeCursor({ seq: newest.seq, channelId }),
|
|
256
|
+
prevCursor: encodeCursor({ seq: oldest.seq, channelId }),
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Return the current `MAX(seq)` for a channel, or 0 when empty.
|
|
261
|
+
*
|
|
262
|
+
* @param channelId - The channel id
|
|
263
|
+
* @returns The largest seq, or 0
|
|
264
|
+
*/
|
|
265
|
+
getLastSeq(channelId) {
|
|
266
|
+
const row = this.db
|
|
267
|
+
.prepare(`SELECT COALESCE(MAX(seq), 0) AS last_seq
|
|
268
|
+
FROM chat_messages
|
|
269
|
+
WHERE channel_id = ?`)
|
|
270
|
+
.get(channelId);
|
|
271
|
+
return row.last_seq;
|
|
272
|
+
}
|
|
273
|
+
/** Count messages for a channel. Used by tests and metrics. */
|
|
274
|
+
count(channelId) {
|
|
275
|
+
const row = this.db
|
|
276
|
+
.prepare('SELECT COUNT(*) AS n FROM chat_messages WHERE channel_id = ?')
|
|
277
|
+
.get(channelId);
|
|
278
|
+
return row.n;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=message.store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.store.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/chat-v2/sqlite/message.store.ts"],"names":[],"mappings":"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"}
|