crewly 1.6.1 → 1.6.2
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/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/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 +46 -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 +193 -57
- 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 +7 -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 +15 -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 +7 -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 +15 -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,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat V2 — Internal types and wire-format DTOs.
|
|
3
|
+
*
|
|
4
|
+
* The shapes here back the Chat MVP Phase 1 spec
|
|
5
|
+
* (`.crewly/specs/chat-mvp-phase1-tech-spec-2026-04-24.md` §21).
|
|
6
|
+
* They are deliberately isolated from the existing `types/chat.types.ts`,
|
|
7
|
+
* which belongs to the legacy orchestrator chat pipe.
|
|
8
|
+
*
|
|
9
|
+
* @module services/chat-v2/types
|
|
10
|
+
*/
|
|
11
|
+
/** Who authored a message. Server-assigned; never accepted from request body. */
|
|
12
|
+
export type ChatSenderType = 'user' | 'agent' | 'system';
|
|
13
|
+
/** What kind of content a message carries. */
|
|
14
|
+
export type ChatContentType = 'text' | 'markdown' | 'image_ref' | 'system_note';
|
|
15
|
+
/** Agent presence snapshot categories. */
|
|
16
|
+
export type ChatAgentPresenceStatus = 'online' | 'busy' | 'offline' | 'starting';
|
|
17
|
+
/**
|
|
18
|
+
* Channel type — Phase B Slack-like team-chat addition (SEALED design 2026-04-25 §3.1).
|
|
19
|
+
*
|
|
20
|
+
* - `dm`: 1:1 user↔agent direct message channel. Matches the Phase 1 / Week 2
|
|
21
|
+
* contract; existing rows default to this. `agent_session` field is the
|
|
22
|
+
* 1:1 binding key.
|
|
23
|
+
* - `channel`: public team-scoped channel (`#general`, `#proj-<name>`, etc.)
|
|
24
|
+
* where multiple agents may participate. The `agent_session` field on
|
|
25
|
+
* channel-typed rows is left empty (no 1:1 binding).
|
|
26
|
+
*
|
|
27
|
+
* The wire-protocol vocabulary intentionally stays narrow at BE; FE adds
|
|
28
|
+
* `idle` / `inactive` UI states via `@crewly/chat-ui`'s `ChatPresenceStatus`
|
|
29
|
+
* union (the translation lives at the boundary, not here).
|
|
30
|
+
*/
|
|
31
|
+
export type ChatChannelType = 'dm' | 'channel';
|
|
32
|
+
/** Mention target kind — Phase B addition (SEALED design §7.1 chip pattern). */
|
|
33
|
+
export type ChatMentionKind = 'team' | 'agent';
|
|
34
|
+
/** Enum values exposed as readonly tuples for runtime validation. */
|
|
35
|
+
export declare const CHAT_SENDER_TYPES: readonly ChatSenderType[];
|
|
36
|
+
export declare const CHAT_CONTENT_TYPES: readonly ChatContentType[];
|
|
37
|
+
/** Phase B — channel-type tuple for runtime validation in CreateChannelInput. */
|
|
38
|
+
export declare const CHAT_CHANNEL_TYPES: readonly ChatChannelType[];
|
|
39
|
+
/** Phase B — mention-kind tuple for runtime validation in mention parsing. */
|
|
40
|
+
export declare const CHAT_MENTION_KINDS: readonly ChatMentionKind[];
|
|
41
|
+
/** Row shape of `chat_channels`. Timestamps are ms-since-epoch UTC. */
|
|
42
|
+
export interface ChatChannelRow {
|
|
43
|
+
id: string;
|
|
44
|
+
/**
|
|
45
|
+
* 1:1 binding to the agent's session for `type='dm'` rows. For
|
|
46
|
+
* `type='channel'` rows, holds an empty string (`''`) — the row is
|
|
47
|
+
* not bound to a single agent. Phase B SEALED design §3.1.
|
|
48
|
+
*/
|
|
49
|
+
agent_session: string;
|
|
50
|
+
owner_user_id: string;
|
|
51
|
+
name: string;
|
|
52
|
+
purpose: string | null;
|
|
53
|
+
created_at: number;
|
|
54
|
+
archived_at: number | null;
|
|
55
|
+
last_message_at: number | null;
|
|
56
|
+
/**
|
|
57
|
+
* Phase B addition (SEALED §3.1). `'dm'` for the existing 1:1 channels
|
|
58
|
+
* (default — preserves backwards-compat); `'channel'` for new
|
|
59
|
+
* team-scoped surfaces. NOT NULL after migration; existing rows
|
|
60
|
+
* backfill to `'dm'`.
|
|
61
|
+
*/
|
|
62
|
+
type: ChatChannelType;
|
|
63
|
+
/**
|
|
64
|
+
* Phase B addition (SEALED §3.1). Links a channel to a Crewly team
|
|
65
|
+
* workspace. Required for `type='channel'`; null/empty for `type='dm'`
|
|
66
|
+
* (which is user↔agent, not team-scoped).
|
|
67
|
+
*/
|
|
68
|
+
team_id: string | null;
|
|
69
|
+
/**
|
|
70
|
+
* Phase B addition (SEALED §3.1). Optional link to a specific
|
|
71
|
+
* project for project-scoped channels (e.g. `#proj-<name>`). Null
|
|
72
|
+
* for team-general channels and DMs.
|
|
73
|
+
*/
|
|
74
|
+
project_id: string | null;
|
|
75
|
+
/**
|
|
76
|
+
* Phase B addition (SEALED §3.1). For `type='dm'` rows, optionally
|
|
77
|
+
* holds the target member-ID being DM'd (distinct from
|
|
78
|
+
* `agent_session` which is the wire-level session binding). For
|
|
79
|
+
* `type='channel'` rows, always null.
|
|
80
|
+
*/
|
|
81
|
+
target_member_id: string | null;
|
|
82
|
+
}
|
|
83
|
+
/** Row shape of `chat_messages`. */
|
|
84
|
+
export interface ChatMessageRow {
|
|
85
|
+
id: string;
|
|
86
|
+
channel_id: string;
|
|
87
|
+
seq: number;
|
|
88
|
+
sender_type: ChatSenderType;
|
|
89
|
+
sender_id: string;
|
|
90
|
+
content: string;
|
|
91
|
+
content_type: ChatContentType;
|
|
92
|
+
created_at: number;
|
|
93
|
+
/** JSON blob (string) or null. Bounded at 2KB at insert time. */
|
|
94
|
+
metadata: string | null;
|
|
95
|
+
/**
|
|
96
|
+
* Phase B addition (SEALED §3.2). JSON-encoded array of mention IDs
|
|
97
|
+
* referenced inline in `content` (member IDs and/or team IDs). Stored
|
|
98
|
+
* as JSON string in SQLite (no native JSON column); empty array when
|
|
99
|
+
* no mentions. Bounded at 1KB at insert time. Null on legacy rows;
|
|
100
|
+
* service layer treats null as `[]`.
|
|
101
|
+
*/
|
|
102
|
+
mentions: string | null;
|
|
103
|
+
/**
|
|
104
|
+
* Phase B addition (SEALED §3.2). Optional Slack-style threading
|
|
105
|
+
* within a channel — when set, this message is a reply within the
|
|
106
|
+
* thread rooted at `thread_id`. Null for top-level messages.
|
|
107
|
+
*/
|
|
108
|
+
thread_id: string | null;
|
|
109
|
+
}
|
|
110
|
+
/** Row shape of `chat_attachments`. */
|
|
111
|
+
export interface ChatAttachmentRow {
|
|
112
|
+
id: string;
|
|
113
|
+
message_id: string;
|
|
114
|
+
kind: 'image';
|
|
115
|
+
mime_type: string;
|
|
116
|
+
size_bytes: number;
|
|
117
|
+
local_path: string;
|
|
118
|
+
original_name: string | null;
|
|
119
|
+
created_at: number;
|
|
120
|
+
}
|
|
121
|
+
/** Outbound channel shape for `GET /channels` / `POST /channels`. */
|
|
122
|
+
export interface ChatChannelDTO {
|
|
123
|
+
id: string;
|
|
124
|
+
/**
|
|
125
|
+
* Wire-level session binding for `type='dm'` channels. Empty string
|
|
126
|
+
* for `type='channel'` rows.
|
|
127
|
+
*/
|
|
128
|
+
agentSession: string;
|
|
129
|
+
name: string;
|
|
130
|
+
purpose?: string;
|
|
131
|
+
createdAt: number;
|
|
132
|
+
archivedAt?: number | null;
|
|
133
|
+
lastMessageAt?: number | null;
|
|
134
|
+
/**
|
|
135
|
+
* Agent-presence summary. Populated for `type='dm'` channels (the
|
|
136
|
+
* agent on the other side of the DM). For `type='channel'` rows,
|
|
137
|
+
* `status: 'offline'` and `lastSeenAt: null` until the FE wires
|
|
138
|
+
* per-member presence in Phase C.
|
|
139
|
+
*/
|
|
140
|
+
agentPresence: {
|
|
141
|
+
status: ChatAgentPresenceStatus;
|
|
142
|
+
lastSeenAt: number | null;
|
|
143
|
+
};
|
|
144
|
+
/** Pending entries in the offline queue for this channel. */
|
|
145
|
+
queuedCount?: number;
|
|
146
|
+
/**
|
|
147
|
+
* Phase B (SEALED §3.1) — `'dm'` (existing default) or `'channel'`
|
|
148
|
+
* (new team-scoped surfaces). Required field on the wire from Phase B
|
|
149
|
+
* onward; legacy callers that omit it are treated as `'dm'`.
|
|
150
|
+
*/
|
|
151
|
+
type: ChatChannelType;
|
|
152
|
+
/** Phase B — team workspace ID. Required when `type='channel'`. */
|
|
153
|
+
teamId?: string;
|
|
154
|
+
/** Phase B — project link. Optional even when `type='channel'`. */
|
|
155
|
+
projectId?: string;
|
|
156
|
+
/**
|
|
157
|
+
* Phase B — for `type='dm'`, the target member's ID. Optional in
|
|
158
|
+
* Week-2 contract because `agentSession` already disambiguates.
|
|
159
|
+
* Provided when the FE wants to render a member-level handle
|
|
160
|
+
* (`@Sam`) rather than the session ID.
|
|
161
|
+
*/
|
|
162
|
+
targetMemberId?: string;
|
|
163
|
+
}
|
|
164
|
+
/** Outbound message shape for `GET /messages` / `POST /messages` / WS `message` frame. */
|
|
165
|
+
export interface ChatMessageDTO {
|
|
166
|
+
id: string;
|
|
167
|
+
channelId: string;
|
|
168
|
+
seq: number;
|
|
169
|
+
senderType: ChatSenderType;
|
|
170
|
+
senderId: string;
|
|
171
|
+
content: string;
|
|
172
|
+
contentType: ChatContentType;
|
|
173
|
+
createdAt: number;
|
|
174
|
+
attachments: ChatAttachmentDTO[];
|
|
175
|
+
metadata?: Record<string, unknown>;
|
|
176
|
+
/**
|
|
177
|
+
* Phase B (SEALED §3.2) — array of mention IDs referenced inline in
|
|
178
|
+
* `content`. Each entry is either a member ID or a team ID; the
|
|
179
|
+
* `kind` discrimination is left to consumers via a separate lookup
|
|
180
|
+
* (we do not embed `MentionTarget` shape in the wire to keep DTOs
|
|
181
|
+
* shallow). Empty array when no mentions; never null on the wire.
|
|
182
|
+
*/
|
|
183
|
+
mentions: string[];
|
|
184
|
+
/**
|
|
185
|
+
* Phase B (SEALED §3.2) — optional Slack-style thread root. When
|
|
186
|
+
* present, this message is a reply within the thread; consumers
|
|
187
|
+
* group by `threadId` to render the thread sub-pane.
|
|
188
|
+
*/
|
|
189
|
+
threadId?: string;
|
|
190
|
+
}
|
|
191
|
+
/** Outbound attachment shape — image only in Phase 1. */
|
|
192
|
+
export interface ChatAttachmentDTO {
|
|
193
|
+
id: string;
|
|
194
|
+
mimeType: string;
|
|
195
|
+
sizeBytes: number;
|
|
196
|
+
/** Relative path used by clients, e.g. `/api/chat/attachments/<id>`. */
|
|
197
|
+
url: string;
|
|
198
|
+
originalName?: string;
|
|
199
|
+
}
|
|
200
|
+
/** Opaque cursor payload before base64url encoding. */
|
|
201
|
+
export interface ChatMessageCursorPayload {
|
|
202
|
+
seq: number;
|
|
203
|
+
channelId: string;
|
|
204
|
+
}
|
|
205
|
+
/** Response envelope for `GET /channels/:id/messages`. */
|
|
206
|
+
export interface ChatMessageListResult {
|
|
207
|
+
messages: ChatMessageDTO[];
|
|
208
|
+
nextCursor: string | null;
|
|
209
|
+
prevCursor: string | null;
|
|
210
|
+
channelId: string;
|
|
211
|
+
}
|
|
212
|
+
/** Body of `POST /channels`. */
|
|
213
|
+
export interface CreateChannelInput {
|
|
214
|
+
/**
|
|
215
|
+
* Wire-level session binding. Required when `type='dm'` (default);
|
|
216
|
+
* ignored when `type='channel'` (server stores empty string).
|
|
217
|
+
*/
|
|
218
|
+
agentSession?: string;
|
|
219
|
+
name: string;
|
|
220
|
+
purpose?: string;
|
|
221
|
+
/**
|
|
222
|
+
* Phase B addition (SEALED §3.1). `'dm'` (default — preserves
|
|
223
|
+
* Week-2 contract for callers that omit this field) or `'channel'`.
|
|
224
|
+
* Service layer rejects `type='channel'` requests that omit `teamId`.
|
|
225
|
+
*/
|
|
226
|
+
type?: ChatChannelType;
|
|
227
|
+
/** Phase B — required when `type='channel'`. */
|
|
228
|
+
teamId?: string;
|
|
229
|
+
/** Phase B — optional even when `type='channel'`. */
|
|
230
|
+
projectId?: string;
|
|
231
|
+
/** Phase B — optional for `type='dm'`. */
|
|
232
|
+
targetMemberId?: string;
|
|
233
|
+
}
|
|
234
|
+
/** Body of `POST /channels/:id/messages`. */
|
|
235
|
+
export interface SendMessageInput {
|
|
236
|
+
content: string;
|
|
237
|
+
contentType?: ChatContentType;
|
|
238
|
+
clientMessageId?: string;
|
|
239
|
+
/** Pre-uploaded attachment refs; Phase 1 is `{ attachmentId }` shape. */
|
|
240
|
+
attachments?: Array<{
|
|
241
|
+
attachmentId: string;
|
|
242
|
+
}>;
|
|
243
|
+
/**
|
|
244
|
+
* Phase B (SEALED §3.2) — mention IDs (member or team) referenced
|
|
245
|
+
* inline in `content`. The FE composer parses chips into this
|
|
246
|
+
* shape before send; the BE persists as JSON and emits with the
|
|
247
|
+
* outbound message DTO. Empty array or omitted = no mentions.
|
|
248
|
+
*/
|
|
249
|
+
mentions?: string[];
|
|
250
|
+
/**
|
|
251
|
+
* Phase B (SEALED §3.2) — Slack-style thread reply root. When set,
|
|
252
|
+
* the new message is a reply within the thread. Omit for top-level
|
|
253
|
+
* channel messages.
|
|
254
|
+
*/
|
|
255
|
+
threadId?: string;
|
|
256
|
+
}
|
|
257
|
+
/** Principal passed down from auth middleware. */
|
|
258
|
+
export interface ChatPrincipal {
|
|
259
|
+
userId: string;
|
|
260
|
+
/** When an agent (not a user) is acting. Phase 1 is usually undefined. */
|
|
261
|
+
agentSession?: string;
|
|
262
|
+
/** Origin — `portal` for Cloud Pro service-token requests. */
|
|
263
|
+
source?: 'portal' | 'oss';
|
|
264
|
+
}
|
|
265
|
+
/** Canonical error-code strings. */
|
|
266
|
+
export declare const CHAT_ERROR_CODES: {
|
|
267
|
+
readonly VALIDATION: "validation_error";
|
|
268
|
+
readonly NOT_FOUND: "not_found";
|
|
269
|
+
readonly CHANNEL_NOT_FOUND: "channel_not_found";
|
|
270
|
+
readonly AGENT_NOT_FOUND: "agent_not_found";
|
|
271
|
+
readonly FORBIDDEN: "forbidden";
|
|
272
|
+
/**
|
|
273
|
+
* F2b (#333) — caller is authenticated but is not a member of the
|
|
274
|
+
* `teamId` they tried to bind a `type='channel'` channel to. Distinct
|
|
275
|
+
* from FORBIDDEN so the FE can surface a tenant-specific message
|
|
276
|
+
* instead of a generic 403.
|
|
277
|
+
*/
|
|
278
|
+
readonly FORBIDDEN_TEAM: "forbidden_team";
|
|
279
|
+
readonly AGENT_ALREADY_BOUND: "agent_already_bound";
|
|
280
|
+
readonly PAYLOAD_TOO_LARGE: "payload_too_large";
|
|
281
|
+
readonly RATE_LIMITED: "rate_limited";
|
|
282
|
+
readonly INVALID_CURSOR: "invalid_cursor";
|
|
283
|
+
readonly CHANNEL_ARCHIVED: "channel_archived";
|
|
284
|
+
readonly ATTACHMENT_NOT_FOUND: "attachment_not_found";
|
|
285
|
+
readonly INTERNAL: "internal_error";
|
|
286
|
+
};
|
|
287
|
+
export type ChatErrorCode = (typeof CHAT_ERROR_CODES)[keyof typeof CHAT_ERROR_CODES];
|
|
288
|
+
/** Structured error thrown by stores/service; controller maps to HTTP. */
|
|
289
|
+
export declare class ChatError extends Error {
|
|
290
|
+
readonly code: ChatErrorCode;
|
|
291
|
+
readonly httpStatus: number;
|
|
292
|
+
readonly details?: Record<string, unknown> | undefined;
|
|
293
|
+
constructor(code: ChatErrorCode, httpStatus: number, message: string, details?: Record<string, unknown> | undefined);
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat V2 — Internal types and wire-format DTOs.
|
|
3
|
+
*
|
|
4
|
+
* The shapes here back the Chat MVP Phase 1 spec
|
|
5
|
+
* (`.crewly/specs/chat-mvp-phase1-tech-spec-2026-04-24.md` §21).
|
|
6
|
+
* They are deliberately isolated from the existing `types/chat.types.ts`,
|
|
7
|
+
* which belongs to the legacy orchestrator chat pipe.
|
|
8
|
+
*
|
|
9
|
+
* @module services/chat-v2/types
|
|
10
|
+
*/
|
|
11
|
+
/** Enum values exposed as readonly tuples for runtime validation. */
|
|
12
|
+
export const CHAT_SENDER_TYPES = ['user', 'agent', 'system'];
|
|
13
|
+
export const CHAT_CONTENT_TYPES = [
|
|
14
|
+
'text',
|
|
15
|
+
'markdown',
|
|
16
|
+
'image_ref',
|
|
17
|
+
'system_note',
|
|
18
|
+
];
|
|
19
|
+
/** Phase B — channel-type tuple for runtime validation in CreateChannelInput. */
|
|
20
|
+
export const CHAT_CHANNEL_TYPES = ['dm', 'channel'];
|
|
21
|
+
/** Phase B — mention-kind tuple for runtime validation in mention parsing. */
|
|
22
|
+
export const CHAT_MENTION_KINDS = ['team', 'agent'];
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Error codes — stable strings; `@crewly/chat-ui` switches UI state on them
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
/** Canonical error-code strings. */
|
|
27
|
+
export const CHAT_ERROR_CODES = {
|
|
28
|
+
VALIDATION: 'validation_error',
|
|
29
|
+
NOT_FOUND: 'not_found',
|
|
30
|
+
CHANNEL_NOT_FOUND: 'channel_not_found',
|
|
31
|
+
AGENT_NOT_FOUND: 'agent_not_found',
|
|
32
|
+
FORBIDDEN: 'forbidden',
|
|
33
|
+
/**
|
|
34
|
+
* F2b (#333) — caller is authenticated but is not a member of the
|
|
35
|
+
* `teamId` they tried to bind a `type='channel'` channel to. Distinct
|
|
36
|
+
* from FORBIDDEN so the FE can surface a tenant-specific message
|
|
37
|
+
* instead of a generic 403.
|
|
38
|
+
*/
|
|
39
|
+
FORBIDDEN_TEAM: 'forbidden_team',
|
|
40
|
+
AGENT_ALREADY_BOUND: 'agent_already_bound',
|
|
41
|
+
PAYLOAD_TOO_LARGE: 'payload_too_large',
|
|
42
|
+
RATE_LIMITED: 'rate_limited',
|
|
43
|
+
INVALID_CURSOR: 'invalid_cursor',
|
|
44
|
+
CHANNEL_ARCHIVED: 'channel_archived',
|
|
45
|
+
ATTACHMENT_NOT_FOUND: 'attachment_not_found',
|
|
46
|
+
INTERNAL: 'internal_error',
|
|
47
|
+
};
|
|
48
|
+
/** Structured error thrown by stores/service; controller maps to HTTP. */
|
|
49
|
+
export class ChatError extends Error {
|
|
50
|
+
code;
|
|
51
|
+
httpStatus;
|
|
52
|
+
details;
|
|
53
|
+
constructor(code, httpStatus, message, details) {
|
|
54
|
+
super(message);
|
|
55
|
+
this.code = code;
|
|
56
|
+
this.httpStatus = httpStatus;
|
|
57
|
+
this.details = details;
|
|
58
|
+
this.name = 'ChatError';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAkCH,qEAAqE;AACrE,MAAM,CAAC,MAAM,iBAAiB,GAA8B,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AACxF,MAAM,CAAC,MAAM,kBAAkB,GAA+B;IAC5D,MAAM;IACN,UAAU;IACV,WAAW;IACX,aAAa;CACd,CAAC;AAEF,iFAAiF;AACjF,MAAM,CAAC,MAAM,kBAAkB,GAA+B,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAEhF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,kBAAkB,GAA+B,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AA2PhF,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAE9E,oCAAoC;AACpC,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,UAAU,EAAE,kBAAkB;IAC9B,SAAS,EAAE,WAAW;IACtB,iBAAiB,EAAE,mBAAmB;IACtC,eAAe,EAAE,iBAAiB;IAClC,SAAS,EAAE,WAAW;IACtB;;;;;OAKG;IACH,cAAc,EAAE,gBAAgB;IAChC,mBAAmB,EAAE,qBAAqB;IAC1C,iBAAiB,EAAE,mBAAmB;IACtC,YAAY,EAAE,cAAc;IAC5B,cAAc,EAAE,gBAAgB;IAChC,gBAAgB,EAAE,kBAAkB;IACpC,oBAAoB,EAAE,sBAAsB;IAC5C,QAAQ,EAAE,gBAAgB;CAClB,CAAC;AAIX,0EAA0E;AAC1E,MAAM,OAAO,SAAU,SAAQ,KAAK;IAEhB;IACA;IAEA;IAJlB,YACkB,IAAmB,EACnB,UAAkB,EAClC,OAAe,EACC,OAAiC;QAEjD,KAAK,CAAC,OAAO,CAAC,CAAC;QALC,SAAI,GAAJ,IAAI,CAAe;QACnB,eAAU,GAAV,UAAU,CAAQ;QAElB,YAAO,GAAP,OAAO,CAA0B;QAGjD,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud Event Inbound Bridge — autonomy_v1.f1
|
|
3
|
+
*
|
|
4
|
+
* Receives `'event'` MessageType inbound from the Cloud Relay (via the
|
|
5
|
+
* existing CloudSyncService poll → `'message'` event-emitter hop) and
|
|
6
|
+
* re-publishes the carried AgentEvent onto the local EventBusService with
|
|
7
|
+
* `source = 'remote'` and `originDeviceId` stamped from the wire envelope.
|
|
8
|
+
*
|
|
9
|
+
* Compose-at-boundary discipline (per Arch verdict 2026-04-28 N1):
|
|
10
|
+
* - CloudSyncService stays a transport — it polls Cloud, dedupes by
|
|
11
|
+
* `processedMessageIds`, emits an in-process `'message'` event.
|
|
12
|
+
* - This service is the AgentEvent translator. It owns the bridge between
|
|
13
|
+
* the cloud message vocabulary (`MessageType` + `EventMessagePayload`)
|
|
14
|
+
* and the local event-bus vocabulary (`AgentEvent`). It does NOT touch
|
|
15
|
+
* the poll loop or the cloud transport.
|
|
16
|
+
*
|
|
17
|
+
* Mirrors the BRIDGE-1 ↔ EventBus separation pattern: CloudSync EMITS,
|
|
18
|
+
* downstream LISTENS. Same shape as PR #347 (BrandOnboarding ⊥
|
|
19
|
+
* OnboardingService) and PR #348 (StatusBadge ⊥ RequestStatusPill) where
|
|
20
|
+
* two parallel modules share a single narrow artifact.
|
|
21
|
+
*
|
|
22
|
+
* Idempotency:
|
|
23
|
+
* The local LRU at CloudSyncService blocks at-least-once cloud-message-id
|
|
24
|
+
* re-delivery upstream. The recent-publish suppression in EventBusService
|
|
25
|
+
* (post-M2 fix: `${type}:${sessionName}:${event.id}`) catches any
|
|
26
|
+
* duplicate that slips through to the publish boundary. The TriggerEngine
|
|
27
|
+
* per-trigger dedup `${triggerId}:${event.id}` (Slice 3) is the third
|
|
28
|
+
* layer at the trigger fire boundary.
|
|
29
|
+
*
|
|
30
|
+
* Unknown peer event types (Arch Q4):
|
|
31
|
+
* The closed `EVENT_TYPES` enum stays closed. Bridge accepts any string
|
|
32
|
+
* at the wire boundary via `RemoteEventType = string` and casts to
|
|
33
|
+
* `EventType` at the local re-publish boundary so the rest of the
|
|
34
|
+
* pipeline sees a stable type. A debug log names any unrecognised type
|
|
35
|
+
* so ops can audit drift.
|
|
36
|
+
*
|
|
37
|
+
* @module services/cloud/cloud-event-bridge.service
|
|
38
|
+
*/
|
|
39
|
+
import { type ComponentLogger } from '../core/logger.service.js';
|
|
40
|
+
import type { EventBusService } from '../event-bus/event-bus.service.js';
|
|
41
|
+
import { type IncomingMessage } from './cloud-sync.types.js';
|
|
42
|
+
/**
|
|
43
|
+
* Minimum shape this bridge needs from the upstream cloud transport.
|
|
44
|
+
* Defined locally rather than importing the full {@link CloudSyncService}
|
|
45
|
+
* type so the bridge is unit-testable with a tiny mock and isn't coupled
|
|
46
|
+
* to the whole transport surface.
|
|
47
|
+
*/
|
|
48
|
+
export interface CloudMessageEmitter {
|
|
49
|
+
on(eventName: 'message', listener: (msg: IncomingMessage) => void): this;
|
|
50
|
+
off(eventName: 'message', listener: (msg: IncomingMessage) => void): this;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Constructor dependencies for the inbound bridge.
|
|
54
|
+
*/
|
|
55
|
+
export interface CloudEventInboundBridgeDeps {
|
|
56
|
+
/** Cloud transport that emits 'message' events (CloudSyncService in prod). */
|
|
57
|
+
cloudSync: CloudMessageEmitter;
|
|
58
|
+
/** Local event bus the bridge publishes onto. */
|
|
59
|
+
eventBus: EventBusService;
|
|
60
|
+
/** Optional logger override (test isolation). */
|
|
61
|
+
logger?: ComponentLogger;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Bridges inbound cross-machine events from Cloud Relay → local EventBus.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* const bridge = new CloudEventInboundBridge({
|
|
69
|
+
* cloudSync: CloudSyncService.getInstance(),
|
|
70
|
+
* eventBus: EventBusService.getInstance(),
|
|
71
|
+
* });
|
|
72
|
+
* bridge.start();
|
|
73
|
+
* // ... later
|
|
74
|
+
* bridge.stop();
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export declare class CloudEventInboundBridge {
|
|
78
|
+
private readonly logger;
|
|
79
|
+
private readonly cloudSync;
|
|
80
|
+
private readonly eventBus;
|
|
81
|
+
/**
|
|
82
|
+
* Bound listener kept so {@link stop} can detach it cleanly. Without
|
|
83
|
+
* this, repeated start/stop cycles (dev reloads, tests) would leak
|
|
84
|
+
* additional listeners.
|
|
85
|
+
*/
|
|
86
|
+
private listener;
|
|
87
|
+
/** Whether the bridge is currently subscribed. */
|
|
88
|
+
private running;
|
|
89
|
+
/**
|
|
90
|
+
* Construct the bridge. Subscription does NOT start until
|
|
91
|
+
* {@link start} is called explicitly so callers control lifecycle.
|
|
92
|
+
*/
|
|
93
|
+
constructor(deps: CloudEventInboundBridgeDeps);
|
|
94
|
+
/**
|
|
95
|
+
* Subscribe to the cloud transport's `'message'` event. Idempotent — a
|
|
96
|
+
* second `start()` call is a no-op.
|
|
97
|
+
*/
|
|
98
|
+
start(): void;
|
|
99
|
+
/**
|
|
100
|
+
* Detach the cloud transport listener. Safe to call when not running.
|
|
101
|
+
*/
|
|
102
|
+
stop(): void;
|
|
103
|
+
/**
|
|
104
|
+
* Process a single inbound cloud message. Filters on `type === 'event'`,
|
|
105
|
+
* validates the payload shape, then re-publishes the carried AgentEvent
|
|
106
|
+
* onto the local EventBus with `source = 'remote'` + `originDeviceId`.
|
|
107
|
+
*
|
|
108
|
+
* Public for unit tests only; production code should drive the bridge
|
|
109
|
+
* via the cloud transport's `'message'` event.
|
|
110
|
+
*/
|
|
111
|
+
handle(msg: IncomingMessage): void;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=cloud-event-bridge.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-event-bridge.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/cloud-event-bridge.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAOzE,OAAO,EAEN,KAAK,eAAe,EACpB,MAAM,uBAAuB,CAAC;AAE/B;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IACnC,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI,CAAC;IACzE,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI,CAAC;CAC1E;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC3C,8EAA8E;IAC9E,SAAS,EAAE,mBAAmB,CAAC;IAC/B,iDAAiD;IACjD,QAAQ,EAAE,eAAe,CAAC;IAC1B,iDAAiD;IACjD,MAAM,CAAC,EAAE,eAAe,CAAC;CACzB;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,uBAAuB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAE3C;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAiD;IAEjE,kDAAkD;IAClD,OAAO,CAAC,OAAO,CAAS;IAExB;;;OAGG;gBACS,IAAI,EAAE,2BAA2B;IAQ7C;;;OAGG;IACH,KAAK,IAAI,IAAI;IAoBb;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;;;;;;OAOG;IACI,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;CAwDzC"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud Event Inbound Bridge — autonomy_v1.f1
|
|
3
|
+
*
|
|
4
|
+
* Receives `'event'` MessageType inbound from the Cloud Relay (via the
|
|
5
|
+
* existing CloudSyncService poll → `'message'` event-emitter hop) and
|
|
6
|
+
* re-publishes the carried AgentEvent onto the local EventBusService with
|
|
7
|
+
* `source = 'remote'` and `originDeviceId` stamped from the wire envelope.
|
|
8
|
+
*
|
|
9
|
+
* Compose-at-boundary discipline (per Arch verdict 2026-04-28 N1):
|
|
10
|
+
* - CloudSyncService stays a transport — it polls Cloud, dedupes by
|
|
11
|
+
* `processedMessageIds`, emits an in-process `'message'` event.
|
|
12
|
+
* - This service is the AgentEvent translator. It owns the bridge between
|
|
13
|
+
* the cloud message vocabulary (`MessageType` + `EventMessagePayload`)
|
|
14
|
+
* and the local event-bus vocabulary (`AgentEvent`). It does NOT touch
|
|
15
|
+
* the poll loop or the cloud transport.
|
|
16
|
+
*
|
|
17
|
+
* Mirrors the BRIDGE-1 ↔ EventBus separation pattern: CloudSync EMITS,
|
|
18
|
+
* downstream LISTENS. Same shape as PR #347 (BrandOnboarding ⊥
|
|
19
|
+
* OnboardingService) and PR #348 (StatusBadge ⊥ RequestStatusPill) where
|
|
20
|
+
* two parallel modules share a single narrow artifact.
|
|
21
|
+
*
|
|
22
|
+
* Idempotency:
|
|
23
|
+
* The local LRU at CloudSyncService blocks at-least-once cloud-message-id
|
|
24
|
+
* re-delivery upstream. The recent-publish suppression in EventBusService
|
|
25
|
+
* (post-M2 fix: `${type}:${sessionName}:${event.id}`) catches any
|
|
26
|
+
* duplicate that slips through to the publish boundary. The TriggerEngine
|
|
27
|
+
* per-trigger dedup `${triggerId}:${event.id}` (Slice 3) is the third
|
|
28
|
+
* layer at the trigger fire boundary.
|
|
29
|
+
*
|
|
30
|
+
* Unknown peer event types (Arch Q4):
|
|
31
|
+
* The closed `EVENT_TYPES` enum stays closed. Bridge accepts any string
|
|
32
|
+
* at the wire boundary via `RemoteEventType = string` and casts to
|
|
33
|
+
* `EventType` at the local re-publish boundary so the rest of the
|
|
34
|
+
* pipeline sees a stable type. A debug log names any unrecognised type
|
|
35
|
+
* so ops can audit drift.
|
|
36
|
+
*
|
|
37
|
+
* @module services/cloud/cloud-event-bridge.service
|
|
38
|
+
*/
|
|
39
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
40
|
+
import { formatError } from '../../utils/format-error.js';
|
|
41
|
+
import { EVENT_TYPES } from '../../types/event-bus.types.js';
|
|
42
|
+
import { isEventMessagePayload, } from './cloud-sync.types.js';
|
|
43
|
+
/**
|
|
44
|
+
* Bridges inbound cross-machine events from Cloud Relay → local EventBus.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* const bridge = new CloudEventInboundBridge({
|
|
49
|
+
* cloudSync: CloudSyncService.getInstance(),
|
|
50
|
+
* eventBus: EventBusService.getInstance(),
|
|
51
|
+
* });
|
|
52
|
+
* bridge.start();
|
|
53
|
+
* // ... later
|
|
54
|
+
* bridge.stop();
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export class CloudEventInboundBridge {
|
|
58
|
+
logger;
|
|
59
|
+
cloudSync;
|
|
60
|
+
eventBus;
|
|
61
|
+
/**
|
|
62
|
+
* Bound listener kept so {@link stop} can detach it cleanly. Without
|
|
63
|
+
* this, repeated start/stop cycles (dev reloads, tests) would leak
|
|
64
|
+
* additional listeners.
|
|
65
|
+
*/
|
|
66
|
+
listener = null;
|
|
67
|
+
/** Whether the bridge is currently subscribed. */
|
|
68
|
+
running = false;
|
|
69
|
+
/**
|
|
70
|
+
* Construct the bridge. Subscription does NOT start until
|
|
71
|
+
* {@link start} is called explicitly so callers control lifecycle.
|
|
72
|
+
*/
|
|
73
|
+
constructor(deps) {
|
|
74
|
+
this.cloudSync = deps.cloudSync;
|
|
75
|
+
this.eventBus = deps.eventBus;
|
|
76
|
+
this.logger =
|
|
77
|
+
deps.logger ??
|
|
78
|
+
LoggerService.getInstance().createComponentLogger('CloudEventInboundBridge');
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Subscribe to the cloud transport's `'message'` event. Idempotent — a
|
|
82
|
+
* second `start()` call is a no-op.
|
|
83
|
+
*/
|
|
84
|
+
start() {
|
|
85
|
+
if (this.running)
|
|
86
|
+
return;
|
|
87
|
+
this.listener = (msg) => {
|
|
88
|
+
try {
|
|
89
|
+
this.handle(msg);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
// Defensive — handle() already swallows known failure modes,
|
|
93
|
+
// but a thrown error here MUST NOT poison other 'message'
|
|
94
|
+
// listeners on the cloud transport.
|
|
95
|
+
this.logger.error('CloudEventInboundBridge handler threw', {
|
|
96
|
+
error: formatError(err),
|
|
97
|
+
messageId: msg?.id,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
this.cloudSync.on('message', this.listener);
|
|
102
|
+
this.running = true;
|
|
103
|
+
this.logger.info('CloudEventInboundBridge started — listening for `event` MessageType');
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Detach the cloud transport listener. Safe to call when not running.
|
|
107
|
+
*/
|
|
108
|
+
stop() {
|
|
109
|
+
if (this.listener) {
|
|
110
|
+
this.cloudSync.off('message', this.listener);
|
|
111
|
+
this.listener = null;
|
|
112
|
+
}
|
|
113
|
+
this.running = false;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Process a single inbound cloud message. Filters on `type === 'event'`,
|
|
117
|
+
* validates the payload shape, then re-publishes the carried AgentEvent
|
|
118
|
+
* onto the local EventBus with `source = 'remote'` + `originDeviceId`.
|
|
119
|
+
*
|
|
120
|
+
* Public for unit tests only; production code should drive the bridge
|
|
121
|
+
* via the cloud transport's `'message'` event.
|
|
122
|
+
*/
|
|
123
|
+
handle(msg) {
|
|
124
|
+
// Wrong type — leave it for the consumer that actually owns it
|
|
125
|
+
// (CrossMachineMessageRouter, browser command handler, etc).
|
|
126
|
+
if (msg.type !== 'event') {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (!isEventMessagePayload(msg.payload)) {
|
|
130
|
+
this.logger.warn('Dropping malformed cross-machine event payload', {
|
|
131
|
+
messageId: msg.id,
|
|
132
|
+
from: msg.from,
|
|
133
|
+
});
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const { event: wireEvent, originDeviceId, originDeviceName } = msg.payload;
|
|
137
|
+
const remoteType = wireEvent.type;
|
|
138
|
+
// Per Arch Q4: log when a peer ships a type we don't know locally.
|
|
139
|
+
// We still re-publish — closed-enum sync would create a deployment-
|
|
140
|
+
// ordering constraint we explicitly rejected.
|
|
141
|
+
if (!isKnownEventType(remoteType)) {
|
|
142
|
+
this.logger.debug('Cross-machine event with unknown-to-local event type — accepting via RemoteEventType boundary', {
|
|
143
|
+
messageId: msg.id,
|
|
144
|
+
eventId: wireEvent.id,
|
|
145
|
+
unknownType: remoteType,
|
|
146
|
+
originDeviceId,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
// Build the AgentEvent. Wire payload may carry extra fields the
|
|
150
|
+
// origin device knew about (e.g. workItemId, missionId, requestId)
|
|
151
|
+
// — pass them through unchanged. Our bridge only stamps the two
|
|
152
|
+
// origin-tag fields.
|
|
153
|
+
const agentEvent = {
|
|
154
|
+
...wireEvent,
|
|
155
|
+
// Cast at the boundary per Arch Q4. Closed `EVENT_TYPES` enum
|
|
156
|
+
// stays closed; downstream consumers see a stable EventType.
|
|
157
|
+
type: remoteType,
|
|
158
|
+
source: 'remote',
|
|
159
|
+
originDeviceId,
|
|
160
|
+
};
|
|
161
|
+
this.logger.info('Re-publishing cross-machine event onto local EventBus', {
|
|
162
|
+
messageId: msg.id,
|
|
163
|
+
eventId: agentEvent.id,
|
|
164
|
+
eventType: agentEvent.type,
|
|
165
|
+
originDeviceId,
|
|
166
|
+
originDeviceName,
|
|
167
|
+
});
|
|
168
|
+
this.eventBus.publish(agentEvent);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Internal helper — true when the wire event-type matches the closed
|
|
173
|
+
* `EVENT_TYPES` enum. Used only for the debug-log breadcrumb; does NOT
|
|
174
|
+
* gate re-publish (per Arch Q4).
|
|
175
|
+
*/
|
|
176
|
+
function isKnownEventType(value) {
|
|
177
|
+
return EVENT_TYPES.includes(value);
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=cloud-event-bridge.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-event-bridge.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/cloud-event-bridge.service.ts"],"names":[],"mappings":"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"}
|