crewly 1.6.5 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/roles/auditor/prompt.md +24 -0
- package/config/roles/developer/prompt.md +2 -1
- package/config/roles/orchestrator/prompt.md +74 -2
- package/config/roles/team-leader/prompt.md +6 -0
- package/config/skills/agent/core/create-request/SKILL.md +1 -1
- package/config/skills/agent/core/create-request/execute.sh +29 -2
- package/config/skills/agent/core/create-request/execute.test.sh +168 -0
- package/config/skills/agent/core/report-status/SKILL.md +8 -1
- package/config/skills/agent/core/report-status/execute.sh +23 -1
- package/config/skills/orchestrator/heartbeat/execute.sh +48 -6
- package/config/sops/common/mid-flight-milestone-surface.md +128 -0
- package/config/sops/common/owner-facing-communication.md +46 -2
- package/config/sops/developer/git-workflow.md +33 -0
- package/dist/backend/backend/src/constants.d.ts +12 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +12 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.js +2 -2
- package/dist/backend/backend/src/controllers/browser/browser.controller.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 +6 -0
- 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 +73 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +128 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.d.ts +3 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.js +8 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/session/session.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/session/session.controller.js +50 -8
- package/dist/backend/backend/src/controllers/session/session.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +215 -94
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +1 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +185 -36
- 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 +11 -1
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +42 -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 +218 -6
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +61 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +117 -9
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts +33 -0
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.js +108 -4
- package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +1 -1
- 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 +40 -2
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat/chat.service.d.ts +48 -331
- package/dist/backend/backend/src/services/chat/chat.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat/chat.service.js +261 -712
- package/dist/backend/backend/src/services/chat/chat.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +82 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +120 -2
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.providers.d.ts +114 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.providers.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.providers.js +182 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.providers.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.relay-adapter.service.d.ts +188 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.relay-adapter.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.relay-adapter.service.js +434 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.relay-adapter.service.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +401 -5
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +619 -3
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/legacy-dto.utils.d.ts +93 -0
- package/dist/backend/backend/src/services/chat-v2/legacy-dto.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/legacy-dto.utils.js +138 -0
- package/dist/backend/backend/src/services/chat-v2/legacy-dto.utils.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts +46 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js +75 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.d.ts +10 -2
- package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.js +178 -10
- package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +37 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +71 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/types.d.ts +33 -1
- package/dist/backend/backend/src/services/chat-v2/types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/types.js +1 -1
- package/dist/backend/backend/src/services/chat-v2/types.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts +22 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.js +71 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +102 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js +61 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/device-auto-discovery.service.d.ts +21 -3
- package/dist/backend/backend/src/services/cloud/device-auto-discovery.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/device-auto-discovery.service.js +47 -13
- package/dist/backend/backend/src/services/cloud/device-auto-discovery.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/system-health.util.d.ts +25 -4
- package/dist/backend/backend/src/services/core/system-health.util.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/system-health.util.js +30 -5
- package/dist/backend/backend/src/services/core/system-health.util.js.map +1 -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 +22 -11
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
- package/dist/backend/backend/src/services/memory/memory.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/memory/memory.service.js +35 -3
- package/dist/backend/backend/src/services/memory/memory.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/message-replay.service.d.ts +2 -4
- package/dist/backend/backend/src/services/messaging/message-replay.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/message-replay.service.js +22 -12
- package/dist/backend/backend/src/services/messaging/message-replay.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js +25 -5
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.js +13 -3
- package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.js.map +1 -1
- package/dist/backend/backend/src/services/notification/milestone-notification.subscriber.d.ts +99 -0
- package/dist/backend/backend/src/services/notification/milestone-notification.subscriber.d.ts.map +1 -0
- package/dist/backend/backend/src/services/notification/milestone-notification.subscriber.js +225 -0
- package/dist/backend/backend/src/services/notification/milestone-notification.subscriber.js.map +1 -0
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +39 -18
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +60 -32
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +134 -0
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +416 -13
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js +73 -7
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
- package/dist/backend/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/session-handoff.service.js +30 -4
- package/dist/backend/backend/src/services/session/session-handoff.service.js.map +1 -1
- package/dist/backend/backend/src/services/skill/skill-executor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/skill/skill-executor.service.js +13 -1
- package/dist/backend/backend/src/services/skill/skill-executor.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/notify-reconciliation.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/notify-reconciliation.service.js +9 -6
- package/dist/backend/backend/src/services/slack/notify-reconciliation.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +21 -2
- 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 +120 -46
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.js +49 -0
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +33 -2
- 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 +160 -8
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/cascade-request-status.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/cascade-request-status.js +55 -2
- package/dist/backend/backend/src/services/v3/cascade-request-status.js.map +1 -1
- package/dist/backend/backend/src/services/v3/mission-executor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/mission-executor.service.js +9 -1
- package/dist/backend/backend/src/services/v3/mission-executor.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/request-decompose.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/request-decompose.subscriber.js +28 -3
- package/dist/backend/backend/src/services/v3/request-decompose.subscriber.js.map +1 -1
- package/dist/backend/backend/src/services/v3/request-sla.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/request-sla.subscriber.js +5 -2
- package/dist/backend/backend/src/services/v3/request-sla.subscriber.js.map +1 -1
- package/dist/backend/backend/src/services/v3/request-status-update.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/request-status-update.subscriber.js +57 -15
- package/dist/backend/backend/src/services/v3/request-status-update.subscriber.js.map +1 -1
- package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts +39 -0
- package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/trigger-engine.service.js +81 -0
- package/dist/backend/backend/src/services/v3/trigger-engine.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +17 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +22 -3
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.d.ts +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.js +26 -10
- package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.js +68 -5
- package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/team-identifier-resolver.d.ts +44 -0
- package/dist/backend/backend/src/services/workflow/team-identifier-resolver.d.ts.map +1 -0
- package/dist/backend/backend/src/services/workflow/team-identifier-resolver.js +57 -0
- package/dist/backend/backend/src/services/workflow/team-identifier-resolver.js.map +1 -0
- package/dist/backend/backend/src/types/credential.types.d.ts +17 -1
- package/dist/backend/backend/src/types/credential.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/credential.types.js +15 -5
- package/dist/backend/backend/src/types/credential.types.js.map +1 -1
- package/dist/backend/backend/src/types/cron-task.types.d.ts +17 -0
- package/dist/backend/backend/src/types/cron-task.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.d.ts +1 -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 +12 -0
- package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
- package/dist/backend/backend/src/types/intent-task.types.d.ts +10 -13
- package/dist/backend/backend/src/types/intent-task.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/intent-task.types.js +4 -1
- package/dist/backend/backend/src/types/intent-task.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/work-item.types.d.ts +23 -0
- 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.map +1 -1
- package/dist/backend/backend/src/utils/team.utils.d.ts +3 -1
- package/dist/backend/backend/src/utils/team.utils.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/team.utils.js +26 -5
- package/dist/backend/backend/src/utils/team.utils.js.map +1 -1
- package/dist/backend/backend/src/websocket/chat-v2.gateway.d.ts +23 -0
- package/dist/backend/backend/src/websocket/chat-v2.gateway.d.ts.map +1 -1
- package/dist/backend/backend/src/websocket/chat-v2.gateway.js +56 -7
- package/dist/backend/backend/src/websocket/chat-v2.gateway.js.map +1 -1
- package/dist/backend/backend/src/websocket/chat.gateway.d.ts +19 -4
- package/dist/backend/backend/src/websocket/chat.gateway.d.ts.map +1 -1
- package/dist/backend/backend/src/websocket/chat.gateway.js +78 -63
- package/dist/backend/backend/src/websocket/chat.gateway.js.map +1 -1
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -1
- package/dist/backend/backend/src/websocket/terminal.gateway.js +10 -2
- package/dist/backend/backend/src/websocket/terminal.gateway.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +12 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +12 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/event-bus/event-bus.service.js +22 -11
- package/dist/cli/backend/src/services/event-bus/event-bus.service.js.map +1 -1
- package/dist/cli/backend/src/services/memory/memory.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/memory/memory.service.js +35 -3
- package/dist/cli/backend/src/services/memory/memory.service.js.map +1 -1
- package/dist/cli/backend/src/services/skill/skill-executor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/skill/skill-executor.service.js +13 -1
- package/dist/cli/backend/src/services/skill/skill-executor.service.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +33 -2
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js +160 -8
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/types/credential.types.d.ts +17 -1
- package/dist/cli/backend/src/types/credential.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/credential.types.js +15 -5
- package/dist/cli/backend/src/types/credential.types.js.map +1 -1
- package/dist/cli/backend/src/types/event-bus.types.d.ts +1 -1
- package/dist/cli/backend/src/types/event-bus.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/event-bus.types.js +12 -0
- package/dist/cli/backend/src/types/event-bus.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/work-item.types.d.ts +23 -0
- 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.map +1 -1
- package/dist/cli/cli/src/commands/start.js +73 -12
- package/dist/cli/cli/src/commands/start.js.map +1 -1
- package/frontend/dist/assets/index-b279da34.js +4926 -0
- package/frontend/dist/assets/{index-b7e59b2b.css → index-c07e04c0.css} +2 -2
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/frontend/dist/assets/index-698305f3.js +0 -5228
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChatV2RelayAdapter — bridge between the local chat-v2 service and the
|
|
3
|
+
* Cloud relay queue.
|
|
4
|
+
*
|
|
5
|
+
* Two responsibilities:
|
|
6
|
+
*
|
|
7
|
+
* 1. **Inbound RPC** — when a `chat_request` message lands on the local
|
|
8
|
+
* inbound queue, dispatch the named method against ChatV2Service (with
|
|
9
|
+
* the supplied `directory` / `presence` providers for the OSS-only
|
|
10
|
+
* methods), then return a `chat_response` to the originating device.
|
|
11
|
+
*
|
|
12
|
+
* 2. **Outbound events** — register an `onBroadcast` listener on
|
|
13
|
+
* {@link ChatV2Gateway} so every local broadcast (user message + agent
|
|
14
|
+
* reply) is also forwarded as a `chat_event` to all *known Portal
|
|
15
|
+
* devices* (devices that have issued a `chat_request` to this OSS
|
|
16
|
+
* recently). That keeps Portal UI in lockstep with the local one
|
|
17
|
+
* without any additional polling on Portal beyond its existing
|
|
18
|
+
* `/queue/poll` loop.
|
|
19
|
+
*
|
|
20
|
+
* Design notes:
|
|
21
|
+
* - Closed-set method dispatch via the {@link CHAT_RPC_METHODS} table;
|
|
22
|
+
* unknown methods produce `unsupported_method` errors so Portal sees
|
|
23
|
+
* a structured response rather than a hang.
|
|
24
|
+
* - Portal-device tracking is in-memory with an idle TTL (10 min).
|
|
25
|
+
* A Portal that sits silent for >TTL stops receiving chat_events;
|
|
26
|
+
* its next chat_request re-registers it. Survives across local OSS
|
|
27
|
+
* restarts via re-registration on the first chat_request, no
|
|
28
|
+
* persistence required.
|
|
29
|
+
* - Errors from ChatV2Service (ChatError) propagate verbatim via the
|
|
30
|
+
* response envelope so Portal can render the same error UX as the
|
|
31
|
+
* local OSS UI does on the REST surface.
|
|
32
|
+
*
|
|
33
|
+
* @module services/chat-v2/chat-v2.relay-adapter.service
|
|
34
|
+
*/
|
|
35
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
36
|
+
import { formatError } from '../../utils/format-error.js';
|
|
37
|
+
import { CHAT_RPC_METHODS, isChatRequestPayload, } from '../cloud/cloud-sync.types.js';
|
|
38
|
+
import { ChatError, CHAT_ERROR_CODES, } from './types.js';
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Defaults
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
/** Portal heartbeat — if a Portal hasn't issued any chat_request within this window, drop it. */
|
|
43
|
+
const DEFAULT_PORTAL_IDLE_TTL_MS = 10 * 60 * 1000;
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Implementation
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
/**
|
|
48
|
+
* Wraps a ChatV2Service so it can be driven over the Cloud relay queue
|
|
49
|
+
* from Cloud Portal. Single instance per running OSS process; instantiated
|
|
50
|
+
* by `index.ts` once both the gateway and the cloud sync are ready.
|
|
51
|
+
*/
|
|
52
|
+
export class ChatV2RelayAdapter {
|
|
53
|
+
service;
|
|
54
|
+
gateway;
|
|
55
|
+
cloudSync;
|
|
56
|
+
dispatcher;
|
|
57
|
+
directory;
|
|
58
|
+
presence;
|
|
59
|
+
portalIdleTtlMs;
|
|
60
|
+
logger;
|
|
61
|
+
now;
|
|
62
|
+
/** deviceId → last-seen ms timestamp; used for the portal-idle-TTL filter. */
|
|
63
|
+
knownPortals = new Map();
|
|
64
|
+
/** Cached unsubscribe hooks so {@link stop} can detach cleanly. */
|
|
65
|
+
unsubscribeMessage = null;
|
|
66
|
+
unsubscribeBroadcast = null;
|
|
67
|
+
constructor(options) {
|
|
68
|
+
this.service = options.service;
|
|
69
|
+
this.gateway = options.gateway;
|
|
70
|
+
this.cloudSync = options.cloudSync;
|
|
71
|
+
this.dispatcher = options.dispatcher;
|
|
72
|
+
this.directory = options.directory;
|
|
73
|
+
this.presence = options.presence;
|
|
74
|
+
this.portalIdleTtlMs = options.portalIdleTtlMs ?? DEFAULT_PORTAL_IDLE_TTL_MS;
|
|
75
|
+
this.logger =
|
|
76
|
+
options.logger ??
|
|
77
|
+
LoggerService.getInstance().createComponentLogger('ChatV2RelayAdapter');
|
|
78
|
+
this.now = options.now ?? Date.now;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Wire the adapter to the cloud-sync inbound stream and the gateway's
|
|
82
|
+
* broadcast hook. Idempotent — calling twice is a logged no-op so the
|
|
83
|
+
* server bootstrap can be safe under partial restart sequences.
|
|
84
|
+
*/
|
|
85
|
+
start() {
|
|
86
|
+
if (this.unsubscribeMessage || this.unsubscribeBroadcast) {
|
|
87
|
+
this.logger.warn('ChatV2RelayAdapter.start called twice — ignoring');
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const messageHandler = (msg) => {
|
|
91
|
+
if (msg.type !== 'chat_request')
|
|
92
|
+
return;
|
|
93
|
+
// Fire-and-forget; errors are caught inside handleRequest.
|
|
94
|
+
void this.handleRequest(msg);
|
|
95
|
+
};
|
|
96
|
+
this.cloudSync.on('message', messageHandler);
|
|
97
|
+
this.unsubscribeMessage = () => {
|
|
98
|
+
this.cloudSync.off('message', messageHandler);
|
|
99
|
+
};
|
|
100
|
+
this.unsubscribeBroadcast = this.gateway.onBroadcast((channelId, event) => this.handleBroadcast(channelId, event));
|
|
101
|
+
this.logger.info('ChatV2RelayAdapter started', {
|
|
102
|
+
portalIdleTtlMs: this.portalIdleTtlMs,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/** Detach all listeners. Safe to call during shutdown. */
|
|
106
|
+
stop() {
|
|
107
|
+
if (this.unsubscribeMessage) {
|
|
108
|
+
this.unsubscribeMessage();
|
|
109
|
+
this.unsubscribeMessage = null;
|
|
110
|
+
}
|
|
111
|
+
if (this.unsubscribeBroadcast) {
|
|
112
|
+
this.unsubscribeBroadcast();
|
|
113
|
+
this.unsubscribeBroadcast = null;
|
|
114
|
+
}
|
|
115
|
+
this.knownPortals.clear();
|
|
116
|
+
this.logger.info('ChatV2RelayAdapter stopped');
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Number of currently-tracked Portal devices. Exposed for tests and
|
|
120
|
+
* future observability dashboards (e.g. `/api/cloud/status`).
|
|
121
|
+
*/
|
|
122
|
+
knownPortalCount() {
|
|
123
|
+
this.pruneExpiredPortals();
|
|
124
|
+
return this.knownPortals.size;
|
|
125
|
+
}
|
|
126
|
+
// -------------------------------------------------------------------------
|
|
127
|
+
// Inbound request handling
|
|
128
|
+
// -------------------------------------------------------------------------
|
|
129
|
+
/**
|
|
130
|
+
* Wrap {@link dispatchRpc} with the request-envelope unwrap and reply
|
|
131
|
+
* round-trip. Always resolves; any error is mapped to a structured
|
|
132
|
+
* `chat_response` so Portal never hangs on a missing reply.
|
|
133
|
+
*
|
|
134
|
+
* @param msg - Raw IncomingMessage from CloudSyncService
|
|
135
|
+
*/
|
|
136
|
+
async handleRequest(msg) {
|
|
137
|
+
// The production relay's `/queue/poll` response only returns
|
|
138
|
+
// `{id, payload, createdAt}` — sender info is dropped. To route the
|
|
139
|
+
// `chat_response` back to Portal, we fall back to `msg.fromDeviceName`
|
|
140
|
+
// (preserved verbatim from the sender's wrapper), where Portal stamps
|
|
141
|
+
// its own queueId. See `relay-chat-client.ts:sendOverRelay`.
|
|
142
|
+
const fromDevice = msg.from || msg.fromDeviceName || '';
|
|
143
|
+
if (!fromDevice) {
|
|
144
|
+
this.logger.warn('chat_request missing sender id (from + fromDeviceName both empty) — dropping', {
|
|
145
|
+
msgId: msg.id,
|
|
146
|
+
});
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (!isChatRequestPayload(msg.payload)) {
|
|
150
|
+
this.logger.warn('chat_request payload failed validation — dropping', {
|
|
151
|
+
fromDevice,
|
|
152
|
+
});
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const req = msg.payload;
|
|
156
|
+
// Register the sender as a known Portal so future broadcasts fan to it.
|
|
157
|
+
this.knownPortals.set(fromDevice, this.now());
|
|
158
|
+
let response;
|
|
159
|
+
try {
|
|
160
|
+
const result = await this.dispatchRpc(req.method, req.params, fromDevice);
|
|
161
|
+
response = { id: req.id, result };
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
response = {
|
|
165
|
+
id: req.id,
|
|
166
|
+
error: this.errorEnvelope(err),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
// Prefer the queueId-direct path when available — Portal's deviceId
|
|
171
|
+
// == its relay queueId, and that bypasses CloudSyncService's stale
|
|
172
|
+
// 30s device cache (Portal may have registered moments ago, faster
|
|
173
|
+
// than the poll cadence).
|
|
174
|
+
if (typeof this.cloudSync.sendToPeerQueueId === 'function') {
|
|
175
|
+
await this.cloudSync.sendToPeerQueueId(fromDevice, 'chat_response', response);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
await this.cloudSync.sendMessage(fromDevice, 'chat_response', response);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
// If we can't reply, log it — Portal will retry the request on
|
|
183
|
+
// timeout. We can't surface the failure any other way (the
|
|
184
|
+
// originator is the relay, not a connected socket here).
|
|
185
|
+
this.logger.warn('Failed to send chat_response — Portal will retry on timeout', {
|
|
186
|
+
fromDevice,
|
|
187
|
+
method: req.method,
|
|
188
|
+
requestId: req.id,
|
|
189
|
+
error: formatError(err),
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Dispatch one of the closed-set RPC methods. Each branch maps to the
|
|
195
|
+
* equivalent ChatV2Service / directory / presence call.
|
|
196
|
+
*
|
|
197
|
+
* Auth model: the originating Portal device shares an account with this
|
|
198
|
+
* OSS (the relay's `userId` check guarantees it), so we build a
|
|
199
|
+
* `ChatPrincipal` from the OSS's local owner id. Portal cannot
|
|
200
|
+
* impersonate other users — that's enforced at the relay layer.
|
|
201
|
+
*
|
|
202
|
+
* @param method - One of {@link CHAT_RPC_METHODS}
|
|
203
|
+
* @param params - Method-specific args
|
|
204
|
+
* @param fromDevice - The originating Portal device id (for audit)
|
|
205
|
+
* @returns The method-specific result (any JSON-serializable value)
|
|
206
|
+
*/
|
|
207
|
+
async dispatchRpc(method, params, fromDevice) {
|
|
208
|
+
if (!CHAT_RPC_METHODS.includes(method)) {
|
|
209
|
+
throw new ChatError(CHAT_ERROR_CODES.VALIDATION, 400, `unsupported_method: ${method}`);
|
|
210
|
+
}
|
|
211
|
+
const principal = this.buildPrincipal();
|
|
212
|
+
const p = params ?? {};
|
|
213
|
+
switch (method) {
|
|
214
|
+
case 'listAgents': {
|
|
215
|
+
if (!this.directory) {
|
|
216
|
+
throw new ChatError(CHAT_ERROR_CODES.INTERNAL, 503, 'directory_unavailable');
|
|
217
|
+
}
|
|
218
|
+
const teams = await this.directory.getTeams();
|
|
219
|
+
const agents = [];
|
|
220
|
+
for (const team of teams) {
|
|
221
|
+
for (const member of team.members) {
|
|
222
|
+
agents.push({
|
|
223
|
+
agentSession: member.sessionName,
|
|
224
|
+
name: member.name,
|
|
225
|
+
role: member.role,
|
|
226
|
+
teamId: team.id,
|
|
227
|
+
teamName: team.name,
|
|
228
|
+
agentStatus: member.agentStatus,
|
|
229
|
+
workingStatus: member.workingStatus,
|
|
230
|
+
avatar: member.avatar,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return { agents };
|
|
235
|
+
}
|
|
236
|
+
case 'getAgentPresence': {
|
|
237
|
+
if (!this.presence) {
|
|
238
|
+
throw new ChatError(CHAT_ERROR_CODES.INTERNAL, 503, 'presence_unavailable');
|
|
239
|
+
}
|
|
240
|
+
const agentId = this.requireString(p, 'agentId');
|
|
241
|
+
return this.presence.getPresence(agentId);
|
|
242
|
+
}
|
|
243
|
+
case 'listChannels': {
|
|
244
|
+
const channels = this.service.listChannels({
|
|
245
|
+
principal,
|
|
246
|
+
includeArchived: p['includeArchived'] === true,
|
|
247
|
+
limit: this.optionalNumber(p, 'limit'),
|
|
248
|
+
type: p['type'],
|
|
249
|
+
teamId: this.optionalString(p, 'teamId'),
|
|
250
|
+
});
|
|
251
|
+
return { channels, nextCursor: null };
|
|
252
|
+
}
|
|
253
|
+
case 'ensureDmChannel': {
|
|
254
|
+
const result = this.service.ensureDmChannel({
|
|
255
|
+
agentSession: this.requireString(p, 'agentSession'),
|
|
256
|
+
name: this.optionalString(p, 'name'),
|
|
257
|
+
purpose: this.optionalString(p, 'purpose'),
|
|
258
|
+
principal,
|
|
259
|
+
});
|
|
260
|
+
return this.serializeChannel(result.channel);
|
|
261
|
+
}
|
|
262
|
+
case 'createChannel': {
|
|
263
|
+
const channel = this.service.createChannel({
|
|
264
|
+
agentSession: this.optionalString(p, 'agentSession'),
|
|
265
|
+
name: this.requireString(p, 'name'),
|
|
266
|
+
purpose: this.optionalString(p, 'purpose'),
|
|
267
|
+
principal,
|
|
268
|
+
type: p['type'],
|
|
269
|
+
teamId: this.optionalString(p, 'teamId'),
|
|
270
|
+
projectId: this.optionalString(p, 'projectId'),
|
|
271
|
+
targetMemberId: this.optionalString(p, 'targetMemberId'),
|
|
272
|
+
});
|
|
273
|
+
return this.serializeChannel(channel);
|
|
274
|
+
}
|
|
275
|
+
case 'createHuddle': {
|
|
276
|
+
const rawMembers = Array.isArray(p['memberSessions'])
|
|
277
|
+
? p['memberSessions'].filter((m) => typeof m === 'string')
|
|
278
|
+
: [];
|
|
279
|
+
const channel = this.service.createHuddle({
|
|
280
|
+
name: this.requireString(p, 'name'),
|
|
281
|
+
purpose: this.optionalString(p, 'purpose'),
|
|
282
|
+
memberSessions: rawMembers,
|
|
283
|
+
principal,
|
|
284
|
+
});
|
|
285
|
+
return this.serializeChannel(channel);
|
|
286
|
+
}
|
|
287
|
+
case 'listHuddleMembers': {
|
|
288
|
+
const members = this.service.listHuddleMembers(this.requireString(p, 'channelId'), principal);
|
|
289
|
+
return { members };
|
|
290
|
+
}
|
|
291
|
+
case 'listMessages': {
|
|
292
|
+
const result = this.service.listMessages({
|
|
293
|
+
channelId: this.requireString(p, 'channelId'),
|
|
294
|
+
principal,
|
|
295
|
+
cursor: this.optionalString(p, 'cursor') ?? null,
|
|
296
|
+
limit: this.optionalNumber(p, 'limit'),
|
|
297
|
+
direction: p['direction'] === 'forward' ? 'forward' : 'backward',
|
|
298
|
+
});
|
|
299
|
+
return result;
|
|
300
|
+
}
|
|
301
|
+
case 'sendMessage': {
|
|
302
|
+
const message = this.service.sendMessage({
|
|
303
|
+
channelId: this.requireString(p, 'channelId'),
|
|
304
|
+
principal,
|
|
305
|
+
content: this.requireString(p, 'content'),
|
|
306
|
+
contentType: p['contentType'],
|
|
307
|
+
clientMessageId: this.optionalString(p, 'clientMessageId'),
|
|
308
|
+
attachments: [],
|
|
309
|
+
mentions: Array.isArray(p['mentions'])
|
|
310
|
+
? p['mentions']
|
|
311
|
+
: undefined,
|
|
312
|
+
threadId: this.optionalString(p, 'threadId'),
|
|
313
|
+
});
|
|
314
|
+
// Fire-and-forget dispatch: mirror the HTTP controller's post-ack
|
|
315
|
+
// path so the bound agent's PTY receives a `[CHAT:<id>]` prompt.
|
|
316
|
+
// Without this, Portal-sent user messages persist but agents
|
|
317
|
+
// never react — the user sees nothing back.
|
|
318
|
+
if (this.dispatcher && message.senderType === 'user') {
|
|
319
|
+
try {
|
|
320
|
+
const channel = this.service.getChannel(message.channelId, principal);
|
|
321
|
+
void this.dispatcher
|
|
322
|
+
.dispatchMessage(channel, message)
|
|
323
|
+
.catch((err) => {
|
|
324
|
+
this.logger.warn('Portal-relay dispatch threw (non-fatal)', {
|
|
325
|
+
channelId: message.channelId,
|
|
326
|
+
error: formatError(err),
|
|
327
|
+
});
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
catch (err) {
|
|
331
|
+
this.logger.warn('Portal-relay dispatch — getChannel failed (non-fatal)', {
|
|
332
|
+
channelId: message.channelId,
|
|
333
|
+
error: formatError(err),
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return this.serializeMessage(message, fromDevice);
|
|
338
|
+
}
|
|
339
|
+
default: {
|
|
340
|
+
// Unreachable given CHAT_RPC_METHODS check above, but TypeScript
|
|
341
|
+
// exhaustiveness check needs the explicit throw.
|
|
342
|
+
throw new ChatError(CHAT_ERROR_CODES.INTERNAL, 500, `unhandled_method: ${method}`);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// -------------------------------------------------------------------------
|
|
347
|
+
// Outbound event handling
|
|
348
|
+
// -------------------------------------------------------------------------
|
|
349
|
+
/**
|
|
350
|
+
* Fan a gateway broadcast out to every currently-known Portal device.
|
|
351
|
+
* Drops expired (idle > TTL) entries inline so the set self-cleans.
|
|
352
|
+
*
|
|
353
|
+
* @param channelId - The channel whose timeline changed
|
|
354
|
+
* @param event - The gateway wire event (typed `unknown` here so this
|
|
355
|
+
* module doesn't import the WS layer's types)
|
|
356
|
+
*/
|
|
357
|
+
handleBroadcast(channelId, event) {
|
|
358
|
+
this.pruneExpiredPortals();
|
|
359
|
+
if (this.knownPortals.size === 0)
|
|
360
|
+
return;
|
|
361
|
+
const payload = { channelId, event };
|
|
362
|
+
// Prefer queueId-direct path for the same reason as `handleRequest`
|
|
363
|
+
// — Portal queueIds may not be in the 30s device-poll cache.
|
|
364
|
+
const send = typeof this.cloudSync.sendToPeerQueueId === 'function'
|
|
365
|
+
? this.cloudSync.sendToPeerQueueId.bind(this.cloudSync)
|
|
366
|
+
: this.cloudSync.sendMessage.bind(this.cloudSync);
|
|
367
|
+
for (const deviceId of this.knownPortals.keys()) {
|
|
368
|
+
// Fire-and-forget — log on failure but keep going.
|
|
369
|
+
send(deviceId, 'chat_event', payload).catch((err) => {
|
|
370
|
+
this.logger.warn('Failed to forward chat_event to Portal', {
|
|
371
|
+
deviceId,
|
|
372
|
+
channelId,
|
|
373
|
+
error: formatError(err),
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
/** Evict Portal device entries whose last-seen is older than the TTL. */
|
|
379
|
+
pruneExpiredPortals() {
|
|
380
|
+
const cutoff = this.now() - this.portalIdleTtlMs;
|
|
381
|
+
for (const [deviceId, lastSeen] of this.knownPortals.entries()) {
|
|
382
|
+
if (lastSeen < cutoff) {
|
|
383
|
+
this.knownPortals.delete(deviceId);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
// -------------------------------------------------------------------------
|
|
388
|
+
// Helpers
|
|
389
|
+
// -------------------------------------------------------------------------
|
|
390
|
+
buildPrincipal() {
|
|
391
|
+
// Mirror the dev-anonymous principal used by the REST surface when no
|
|
392
|
+
// JWT secret is configured. In production OSS, this will be the
|
|
393
|
+
// logged-in user's id; for now (single-user OSS) it's the stable
|
|
394
|
+
// dev fallback that owns every chat-v2 channel.
|
|
395
|
+
return { userId: 'dev-user-001', source: 'oss' };
|
|
396
|
+
}
|
|
397
|
+
requireString(params, key) {
|
|
398
|
+
const v = params[key];
|
|
399
|
+
if (typeof v !== 'string' || v.length === 0) {
|
|
400
|
+
throw new ChatError(CHAT_ERROR_CODES.VALIDATION, 400, `${key} is required`);
|
|
401
|
+
}
|
|
402
|
+
return v;
|
|
403
|
+
}
|
|
404
|
+
optionalString(params, key) {
|
|
405
|
+
const v = params[key];
|
|
406
|
+
return typeof v === 'string' && v.length > 0 ? v : undefined;
|
|
407
|
+
}
|
|
408
|
+
optionalNumber(params, key) {
|
|
409
|
+
const v = params[key];
|
|
410
|
+
return typeof v === 'number' && Number.isFinite(v) ? v : undefined;
|
|
411
|
+
}
|
|
412
|
+
serializeChannel(channel) {
|
|
413
|
+
// No transformation today, but we keep the indirection so future wire
|
|
414
|
+
// shape divergences (e.g. omitting server-internal fields) live here.
|
|
415
|
+
return channel;
|
|
416
|
+
}
|
|
417
|
+
serializeMessage(message, _fromDevice) {
|
|
418
|
+
return message;
|
|
419
|
+
}
|
|
420
|
+
errorEnvelope(err) {
|
|
421
|
+
if (err instanceof ChatError) {
|
|
422
|
+
return {
|
|
423
|
+
code: err.code,
|
|
424
|
+
message: err.message,
|
|
425
|
+
details: err.details,
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
return {
|
|
429
|
+
code: 'internal_error',
|
|
430
|
+
message: err instanceof Error ? err.message : String(err),
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
//# sourceMappingURL=chat-v2.relay-adapter.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-v2.relay-adapter.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/chat-v2.relay-adapter.service.ts"],"names":[],"mappings":"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"}
|