crewly 1.6.5 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/constants.ts +2 -0
- package/config/roles/auditor/prompt.md +24 -0
- package/config/roles/developer/prompt.md +2 -1
- package/config/roles/orchestrator/prompt.md +118 -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 +13 -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/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +27 -0
- package/dist/backend/backend/src/controllers/team/team.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 +201 -37
- 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 +45 -3
- 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 +219 -7
- 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/crewly-agent/crewly-agent-external-runtime.service.d.ts +44 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +179 -10
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/in-process-runtime-registry.d.ts +6 -6
- package/dist/backend/backend/src/services/agent/crewly-agent/in-process-runtime-registry.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/in-process-runtime-registry.js +3 -3
- package/dist/backend/backend/src/services/agent/crewly-agent/in-process-runtime-registry.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts +7 -1
- 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.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/agent/runtime-service.factory.js +4 -4
- package/dist/backend/backend/src/services/agent/runtime-service.factory.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/mcp-server.d.ts.map +1 -1
- package/dist/backend/backend/src/services/mcp-server.js +5 -0
- package/dist/backend/backend/src/services/mcp-server.js.map +1 -1
- package/dist/backend/backend/src/services/mcp-tool-definitions.d.ts +4 -0
- package/dist/backend/backend/src/services/mcp-tool-definitions.d.ts.map +1 -1
- package/dist/backend/backend/src/services/mcp-tool-definitions.js +12 -1
- package/dist/backend/backend/src/services/mcp-tool-definitions.js.map +1 -1
- package/dist/backend/backend/src/services/memory/capability-inference.d.ts +73 -0
- package/dist/backend/backend/src/services/memory/capability-inference.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/capability-inference.js +115 -0
- package/dist/backend/backend/src/services/memory/capability-inference.js.map +1 -0
- package/dist/backend/backend/src/services/memory/memory.service.d.ts +22 -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 +81 -3
- package/dist/backend/backend/src/services/memory/memory.service.js.map +1 -1
- package/dist/backend/backend/src/services/memory/project-memory.service.d.ts +25 -1
- package/dist/backend/backend/src/services/memory/project-memory.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/memory/project-memory.service.js +43 -0
- package/dist/backend/backend/src/services/memory/project-memory.service.js.map +1 -1
- package/dist/backend/backend/src/services/memory/task-history-seeder.d.ts +47 -0
- package/dist/backend/backend/src/services/memory/task-history-seeder.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/task-history-seeder.js +89 -0
- package/dist/backend/backend/src/services/memory/task-history-seeder.js.map +1 -0
- package/dist/backend/backend/src/services/memory/task-history.subscriber.d.ts +76 -0
- package/dist/backend/backend/src/services/memory/task-history.subscriber.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/task-history.subscriber.js +199 -0
- package/dist/backend/backend/src/services/memory/task-history.subscriber.js.map +1 -0
- 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/memory.types.d.ts +94 -1
- package/dist/backend/backend/src/types/memory.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/memory.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/backend/config/constants.d.ts +2 -0
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +2 -0
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/backend/config/index.d.ts +1 -0
- package/dist/backend/config/index.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +13 -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/mcp-server.d.ts.map +1 -1
- package/dist/cli/backend/src/services/mcp-server.js +5 -0
- package/dist/cli/backend/src/services/mcp-server.js.map +1 -1
- package/dist/cli/backend/src/services/mcp-tool-definitions.d.ts +4 -0
- package/dist/cli/backend/src/services/mcp-tool-definitions.d.ts.map +1 -1
- package/dist/cli/backend/src/services/mcp-tool-definitions.js +12 -1
- package/dist/cli/backend/src/services/mcp-tool-definitions.js.map +1 -1
- package/dist/cli/backend/src/services/memory/memory.service.d.ts +22 -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 +81 -3
- package/dist/cli/backend/src/services/memory/memory.service.js.map +1 -1
- package/dist/cli/backend/src/services/memory/project-memory.service.d.ts +25 -1
- package/dist/cli/backend/src/services/memory/project-memory.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/memory/project-memory.service.js +43 -0
- package/dist/cli/backend/src/services/memory/project-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/memory.types.d.ts +94 -1
- package/dist/cli/backend/src/types/memory.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/memory.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/dist/cli/config/constants.d.ts +2 -0
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +2 -0
- package/dist/cli/config/constants.js.map +1 -1
- package/dist/cli/config/index.d.ts +1 -0
- package/dist/cli/config/index.d.ts.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,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider factories backing the chat-v2 controller's `/agents` and
|
|
3
|
+
* `/presence/:agentId` endpoints.
|
|
4
|
+
*
|
|
5
|
+
* These are intentionally kept separate from the controller + service so
|
|
6
|
+
* tests can inject a fixture (`IAgentDirectoryProvider` / `IAgentPresenceProvider`
|
|
7
|
+
* stubs) without spinning up StorageService or the orchestrator-status
|
|
8
|
+
* helper. The production wiring in `api.routes.ts` instantiates them
|
|
9
|
+
* once per request stack and passes them as `ChatV2ControllerDeps`.
|
|
10
|
+
*
|
|
11
|
+
* Why a thin adapter layer over StorageService.getTeams + isAgentActive?
|
|
12
|
+
* - StorageService.getTeams returns the full `Team[]` shape including
|
|
13
|
+
* fields the directory doesn't need (templates, hierarchy graphs,
|
|
14
|
+
* project bindings). The controller's `IAgentDirectoryProvider`
|
|
15
|
+
* contract is intentionally narrow so the route handler stays
|
|
16
|
+
* decoupled from the storage shape.
|
|
17
|
+
* - `isAgentActive` returns a boolean only; the controller's wire DTO
|
|
18
|
+
* wants a `status` union + `lastSeenAt`. We do that mapping here.
|
|
19
|
+
*
|
|
20
|
+
* @module services/chat-v2/chat-v2.providers
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Build the production `IAgentDirectoryProvider`. Flattens
|
|
24
|
+
* `StorageService.getTeams()` into the narrow controller-facing shape,
|
|
25
|
+
* filtering out members without a `sessionName` (incomplete team
|
|
26
|
+
* entries, deleted-but-not-purged rows).
|
|
27
|
+
*
|
|
28
|
+
* Also prepends a synthetic Orchestrator Team so the user can DM the
|
|
29
|
+
* orchestrator from /agents without setting up a regular team. This
|
|
30
|
+
* mirrors team.controller's `buildOrchestratorTeam` virtual-team
|
|
31
|
+
* synthesis on the /api/teams endpoint.
|
|
32
|
+
*
|
|
33
|
+
* @param storage - The StorageService instance (or a fixture stub)
|
|
34
|
+
* @param opts.resolveOrchestratorStatus - Optional override for the
|
|
35
|
+
* orchestrator's stored status. Defaults to a lazy import of
|
|
36
|
+
* `StorageService.getOrchestratorStatus()` so tests can inject a stub.
|
|
37
|
+
* Returning null skips the virtual-team prepend entirely.
|
|
38
|
+
* @returns Provider satisfying {@link IAgentDirectoryProvider}
|
|
39
|
+
*/
|
|
40
|
+
export function createOssAgentDirectoryProvider(storage, opts = {}) {
|
|
41
|
+
const resolveOrc = opts.resolveOrchestratorStatus ??
|
|
42
|
+
(async () => {
|
|
43
|
+
try {
|
|
44
|
+
// `StorageService.getInstance` is exposed via the same module
|
|
45
|
+
// path used by every other caller (e.g. team.controller). Lazy
|
|
46
|
+
// import keeps the test-only dep optional and avoids a circular
|
|
47
|
+
// resolution when the chat-v2 module loads at boot time.
|
|
48
|
+
const mod = await import('../core/storage.service.js');
|
|
49
|
+
const status = await mod.StorageService.getInstance().getOrchestratorStatus();
|
|
50
|
+
if (!status)
|
|
51
|
+
return null;
|
|
52
|
+
return {
|
|
53
|
+
agentStatus: status.agentStatus,
|
|
54
|
+
workingStatus: status.workingStatus,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
async getTeams() {
|
|
63
|
+
const teams = await storage.getTeams();
|
|
64
|
+
const flat = teams.map((t) => ({
|
|
65
|
+
id: t.id,
|
|
66
|
+
name: t.name,
|
|
67
|
+
members: t.members
|
|
68
|
+
.filter((m) => typeof m.sessionName === 'string' && m.sessionName.length > 0)
|
|
69
|
+
.map((m) => ({
|
|
70
|
+
sessionName: m.sessionName,
|
|
71
|
+
name: m.name,
|
|
72
|
+
role: m.role,
|
|
73
|
+
agentStatus: m.agentStatus,
|
|
74
|
+
workingStatus: m.workingStatus,
|
|
75
|
+
avatar: m.avatar,
|
|
76
|
+
})),
|
|
77
|
+
}));
|
|
78
|
+
const orcStatus = await resolveOrc();
|
|
79
|
+
if (orcStatus) {
|
|
80
|
+
flat.unshift({
|
|
81
|
+
id: 'orchestrator',
|
|
82
|
+
name: 'Orchestrator Team',
|
|
83
|
+
members: [
|
|
84
|
+
{
|
|
85
|
+
sessionName: 'crewly-orc',
|
|
86
|
+
name: 'Orchestrator',
|
|
87
|
+
role: 'orchestrator',
|
|
88
|
+
agentStatus: orcStatus.agentStatus,
|
|
89
|
+
workingStatus: orcStatus.workingStatus,
|
|
90
|
+
avatar: undefined,
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return flat;
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Map the stored `(agentStatus, workingStatus, isActive)` tuple to the
|
|
101
|
+
* presence wire status. The chat-ui client expects the closed set:
|
|
102
|
+
* - `online` : agent is up and idle (ready for a new message)
|
|
103
|
+
* - `busy` : agent is up and working on something
|
|
104
|
+
* - `starting` : agent is registered but session not yet alive
|
|
105
|
+
* - `offline` : everything else (inactive, suspended, crash, …)
|
|
106
|
+
*
|
|
107
|
+
* Single source of truth — exported for tests + presence-aware UI bits.
|
|
108
|
+
*
|
|
109
|
+
* @param isActive - True when the PTY/in-process session is alive
|
|
110
|
+
* @param agentStatus - Stored `agentStatus` from team file
|
|
111
|
+
* @param workingStatus - Stored `workingStatus` from team file
|
|
112
|
+
* @returns Wire-level presence status
|
|
113
|
+
*/
|
|
114
|
+
export function resolvePresenceStatus(isActive, agentStatus, workingStatus) {
|
|
115
|
+
if (!isActive) {
|
|
116
|
+
if (agentStatus === 'starting')
|
|
117
|
+
return 'starting';
|
|
118
|
+
return 'offline';
|
|
119
|
+
}
|
|
120
|
+
if (workingStatus === 'in_progress')
|
|
121
|
+
return 'busy';
|
|
122
|
+
return 'online';
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Build the production `IAgentPresenceProvider`. Uses
|
|
126
|
+
* {@link IsAgentActiveFn} (defaulting to `isAgentActive` from
|
|
127
|
+
* orchestrator-status) for liveness and falls back to the stored
|
|
128
|
+
* agentStatus/workingStatus for unknown sessions.
|
|
129
|
+
*
|
|
130
|
+
* @param storage - StorageService for member lookups
|
|
131
|
+
* @param opts.isAgentActive - Optional override (tests pass a stub)
|
|
132
|
+
* @param opts.now - Optional clock override (tests freeze the
|
|
133
|
+
* `lastSeenAt` timestamp)
|
|
134
|
+
* @returns Provider satisfying {@link IAgentPresenceProvider}
|
|
135
|
+
*/
|
|
136
|
+
export function createOssAgentPresenceProvider(storage, opts = {}) {
|
|
137
|
+
const isActiveFn = opts.isAgentActive ??
|
|
138
|
+
(async (sessionName) => {
|
|
139
|
+
const { isAgentActive } = await import('../orchestrator/orchestrator-status.service.js');
|
|
140
|
+
return isAgentActive(sessionName);
|
|
141
|
+
});
|
|
142
|
+
const now = opts.now ?? Date.now;
|
|
143
|
+
return {
|
|
144
|
+
async getPresence(agentSession) {
|
|
145
|
+
let agentStatus = 'inactive';
|
|
146
|
+
let workingStatus = 'idle';
|
|
147
|
+
try {
|
|
148
|
+
const teams = await storage.getTeams();
|
|
149
|
+
for (const team of teams) {
|
|
150
|
+
const member = team.members.find((m) => m.sessionName === agentSession);
|
|
151
|
+
if (member) {
|
|
152
|
+
agentStatus = member.agentStatus;
|
|
153
|
+
workingStatus = member.workingStatus;
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// Storage failure — treat as offline below. Don't throw; the
|
|
160
|
+
// /presence endpoint should degrade gracefully when the team
|
|
161
|
+
// file is being rewritten under us.
|
|
162
|
+
}
|
|
163
|
+
let active = false;
|
|
164
|
+
try {
|
|
165
|
+
active = await isActiveFn(agentSession);
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
active = false;
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
agentSession,
|
|
172
|
+
status: resolvePresenceStatus(active, agentStatus, workingStatus),
|
|
173
|
+
// Only stamp `lastSeenAt` when we have a positive liveness signal.
|
|
174
|
+
// The chat-ui surface treats null as "never seen" / "unknown" and
|
|
175
|
+
// hides the timestamp; offline agents would otherwise show a
|
|
176
|
+
// misleading "last seen just now".
|
|
177
|
+
lastSeenAt: active ? now() : null,
|
|
178
|
+
};
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=chat-v2.providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-v2.providers.js","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/chat-v2.providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,188 @@
|
|
|
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 type { EventEmitter } from 'events';
|
|
36
|
+
import { type ComponentLogger } from '../core/logger.service.js';
|
|
37
|
+
import { type ChatChannelDTO, type ChatMessageDTO } from './types.js';
|
|
38
|
+
import type { ChatV2Service } from './chat-v2.service.js';
|
|
39
|
+
import type { IAgentDirectoryProvider, IAgentPresenceProvider } from '../../controllers/chat-v2/chat-v2.controller.js';
|
|
40
|
+
/**
|
|
41
|
+
* Wire frame produced by {@link ChatV2Gateway.broadcast} — duplicated here
|
|
42
|
+
* as `unknown`-typed in the relay payload so this module doesn't have to
|
|
43
|
+
* pull in the WebSocket layer's types. We only forward; we do not inspect.
|
|
44
|
+
*/
|
|
45
|
+
type GatewayWireEvent = unknown;
|
|
46
|
+
/**
|
|
47
|
+
* Minimal CloudSyncService surface the adapter depends on. Declared
|
|
48
|
+
* narrowly so tests can stub a fake sync without spinning up the real
|
|
49
|
+
* polling loop / fetch lifecycle.
|
|
50
|
+
*/
|
|
51
|
+
export interface ICloudSyncLike extends EventEmitter {
|
|
52
|
+
sendMessage(toDeviceId: string, type: 'chat_response' | 'chat_event', payload: unknown): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Optional queueId-direct send. When present, the adapter prefers it
|
|
55
|
+
* for chat_response routing — Portal's queueId may not yet be in the
|
|
56
|
+
* 30s device-poll cache, and the production relay routes by queueId
|
|
57
|
+
* anyway. Methods without this fall back to sendMessage (stub-friendly).
|
|
58
|
+
*/
|
|
59
|
+
sendToPeerQueueId?(peerQueueId: string, type: 'chat_response' | 'chat_event', payload: unknown): Promise<void>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Minimal ChatV2Gateway surface the adapter depends on — only the
|
|
63
|
+
* `onBroadcast` listener registration.
|
|
64
|
+
*/
|
|
65
|
+
export interface IChatV2GatewayLike {
|
|
66
|
+
onBroadcast(listener: (channelId: string, event: GatewayWireEvent) => void): () => void;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Minimal ChatV2DispatcherService surface. Required for the
|
|
70
|
+
* `sendMessage` RPC method — when Portal sends a user message via the
|
|
71
|
+
* relay, the adapter persists it (via ChatV2Service) AND fires the
|
|
72
|
+
* dispatcher so the bound agent's PTY actually receives a
|
|
73
|
+
* `[CHAT:<id>]` prompt. The HTTP controller does the same thing for
|
|
74
|
+
* local /agents traffic; this brings the relay path to parity.
|
|
75
|
+
*/
|
|
76
|
+
export interface IChatV2DispatcherLike {
|
|
77
|
+
dispatchMessage(channel: ChatChannelDTO, message: ChatMessageDTO): Promise<unknown>;
|
|
78
|
+
}
|
|
79
|
+
/** Constructor options for {@link ChatV2RelayAdapter}. */
|
|
80
|
+
export interface ChatV2RelayAdapterOptions {
|
|
81
|
+
/** The chat service to dispatch RPC calls against. */
|
|
82
|
+
service: ChatV2Service;
|
|
83
|
+
/** The gateway whose broadcasts we mirror to the relay. */
|
|
84
|
+
gateway: IChatV2GatewayLike;
|
|
85
|
+
/** Cloud sync — used both to listen for chat_request and to send replies. */
|
|
86
|
+
cloudSync: ICloudSyncLike;
|
|
87
|
+
/**
|
|
88
|
+
* Optional ChatV2 dispatcher — fired after a Portal-sourced user
|
|
89
|
+
* `sendMessage` RPC so the bound agent's PTY receives the
|
|
90
|
+
* `[CHAT:<id>]` prompt (mirrors the HTTP controller's post-ack path).
|
|
91
|
+
* When omitted (REST-only tests), Portal messages persist but agents
|
|
92
|
+
* don't react — verify carefully before relying on this fallback.
|
|
93
|
+
*/
|
|
94
|
+
dispatcher?: IChatV2DispatcherLike;
|
|
95
|
+
/** Directory provider — backs the `listAgents` RPC method. */
|
|
96
|
+
directory?: IAgentDirectoryProvider;
|
|
97
|
+
/** Presence provider — backs the `getAgentPresence` RPC method. */
|
|
98
|
+
presence?: IAgentPresenceProvider;
|
|
99
|
+
/**
|
|
100
|
+
* Idle TTL for Portal device registration (defaults to 10 min). A
|
|
101
|
+
* Portal device that sits silent longer than this stops receiving
|
|
102
|
+
* forwarded chat_events; the next chat_request re-registers it.
|
|
103
|
+
* Override only in tests.
|
|
104
|
+
*/
|
|
105
|
+
portalIdleTtlMs?: number;
|
|
106
|
+
/** Optional logger override (defaults to a fresh component logger). */
|
|
107
|
+
logger?: ComponentLogger;
|
|
108
|
+
/** Optional clock for tests. */
|
|
109
|
+
now?: () => number;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Wraps a ChatV2Service so it can be driven over the Cloud relay queue
|
|
113
|
+
* from Cloud Portal. Single instance per running OSS process; instantiated
|
|
114
|
+
* by `index.ts` once both the gateway and the cloud sync are ready.
|
|
115
|
+
*/
|
|
116
|
+
export declare class ChatV2RelayAdapter {
|
|
117
|
+
private readonly service;
|
|
118
|
+
private readonly gateway;
|
|
119
|
+
private readonly cloudSync;
|
|
120
|
+
private readonly dispatcher?;
|
|
121
|
+
private readonly directory?;
|
|
122
|
+
private readonly presence?;
|
|
123
|
+
private readonly portalIdleTtlMs;
|
|
124
|
+
private readonly logger;
|
|
125
|
+
private readonly now;
|
|
126
|
+
/** deviceId → last-seen ms timestamp; used for the portal-idle-TTL filter. */
|
|
127
|
+
private readonly knownPortals;
|
|
128
|
+
/** Cached unsubscribe hooks so {@link stop} can detach cleanly. */
|
|
129
|
+
private unsubscribeMessage;
|
|
130
|
+
private unsubscribeBroadcast;
|
|
131
|
+
constructor(options: ChatV2RelayAdapterOptions);
|
|
132
|
+
/**
|
|
133
|
+
* Wire the adapter to the cloud-sync inbound stream and the gateway's
|
|
134
|
+
* broadcast hook. Idempotent — calling twice is a logged no-op so the
|
|
135
|
+
* server bootstrap can be safe under partial restart sequences.
|
|
136
|
+
*/
|
|
137
|
+
start(): void;
|
|
138
|
+
/** Detach all listeners. Safe to call during shutdown. */
|
|
139
|
+
stop(): void;
|
|
140
|
+
/**
|
|
141
|
+
* Number of currently-tracked Portal devices. Exposed for tests and
|
|
142
|
+
* future observability dashboards (e.g. `/api/cloud/status`).
|
|
143
|
+
*/
|
|
144
|
+
knownPortalCount(): number;
|
|
145
|
+
/**
|
|
146
|
+
* Wrap {@link dispatchRpc} with the request-envelope unwrap and reply
|
|
147
|
+
* round-trip. Always resolves; any error is mapped to a structured
|
|
148
|
+
* `chat_response` so Portal never hangs on a missing reply.
|
|
149
|
+
*
|
|
150
|
+
* @param msg - Raw IncomingMessage from CloudSyncService
|
|
151
|
+
*/
|
|
152
|
+
private handleRequest;
|
|
153
|
+
/**
|
|
154
|
+
* Dispatch one of the closed-set RPC methods. Each branch maps to the
|
|
155
|
+
* equivalent ChatV2Service / directory / presence call.
|
|
156
|
+
*
|
|
157
|
+
* Auth model: the originating Portal device shares an account with this
|
|
158
|
+
* OSS (the relay's `userId` check guarantees it), so we build a
|
|
159
|
+
* `ChatPrincipal` from the OSS's local owner id. Portal cannot
|
|
160
|
+
* impersonate other users — that's enforced at the relay layer.
|
|
161
|
+
*
|
|
162
|
+
* @param method - One of {@link CHAT_RPC_METHODS}
|
|
163
|
+
* @param params - Method-specific args
|
|
164
|
+
* @param fromDevice - The originating Portal device id (for audit)
|
|
165
|
+
* @returns The method-specific result (any JSON-serializable value)
|
|
166
|
+
*/
|
|
167
|
+
private dispatchRpc;
|
|
168
|
+
/**
|
|
169
|
+
* Fan a gateway broadcast out to every currently-known Portal device.
|
|
170
|
+
* Drops expired (idle > TTL) entries inline so the set self-cleans.
|
|
171
|
+
*
|
|
172
|
+
* @param channelId - The channel whose timeline changed
|
|
173
|
+
* @param event - The gateway wire event (typed `unknown` here so this
|
|
174
|
+
* module doesn't import the WS layer's types)
|
|
175
|
+
*/
|
|
176
|
+
private handleBroadcast;
|
|
177
|
+
/** Evict Portal device entries whose last-seen is older than the TTL. */
|
|
178
|
+
private pruneExpiredPortals;
|
|
179
|
+
private buildPrincipal;
|
|
180
|
+
private requireString;
|
|
181
|
+
private optionalString;
|
|
182
|
+
private optionalNumber;
|
|
183
|
+
private serializeChannel;
|
|
184
|
+
private serializeMessage;
|
|
185
|
+
private errorEnvelope;
|
|
186
|
+
}
|
|
187
|
+
export {};
|
|
188
|
+
//# sourceMappingURL=chat-v2.relay-adapter.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-v2.relay-adapter.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/chat-v2.relay-adapter.service.ts"],"names":[],"mappings":"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"}
|