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,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task History Seeder
|
|
3
|
+
*
|
|
4
|
+
* Seeds the project task-history ledger with synthetic "declared"
|
|
5
|
+
* entries when a team member registers. Solves the cold-start problem
|
|
6
|
+
* for capability routing: on day-0, no real tasks have run yet, but
|
|
7
|
+
* the team config can still declare what capabilities each member
|
|
8
|
+
* holds, and the orchestrator's `recall(capability)` query finds them.
|
|
9
|
+
*
|
|
10
|
+
* The convention: a `TeamMember.capabilities` entry counts as a
|
|
11
|
+
* canonical capability when it contains a `:` separator (e.g.
|
|
12
|
+
* `gmail:read`, `oauth:gmail`). Free-form strings without `:` are
|
|
13
|
+
* ignored — they aren't part of the routing vocabulary.
|
|
14
|
+
*
|
|
15
|
+
* @module services/memory/task-history-seeder
|
|
16
|
+
*/
|
|
17
|
+
import { IProjectMemoryService } from './project-memory.service.js';
|
|
18
|
+
export interface SeedDeclaredCapabilitiesArgs {
|
|
19
|
+
projectPath: string;
|
|
20
|
+
member: {
|
|
21
|
+
sessionName: string;
|
|
22
|
+
role: string;
|
|
23
|
+
teamId?: string;
|
|
24
|
+
capabilities?: string[];
|
|
25
|
+
};
|
|
26
|
+
projectMemory: IProjectMemoryService;
|
|
27
|
+
/** Optional clock for tests; defaults to Date.now() */
|
|
28
|
+
now?: () => Date;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Filter a free-form `capabilities[]` array down to the entries that
|
|
32
|
+
* look like canonical capability strings. Exported for unit testing.
|
|
33
|
+
*/
|
|
34
|
+
export declare function pickCanonicalCapabilities(raw: readonly string[] | undefined): string[];
|
|
35
|
+
/**
|
|
36
|
+
* Emit a single synthetic `outcome: 'declared'` entry capturing every
|
|
37
|
+
* canonical capability the member declares. One entry per registration,
|
|
38
|
+
* keyed `th-declared-<sessionName>` so re-registration dedups cleanly
|
|
39
|
+
* (the entry is overwritten in place when the same id arrives — see
|
|
40
|
+
* ProjectMemoryService.addTaskHistory).
|
|
41
|
+
*
|
|
42
|
+
* No-op if the member has no canonical capabilities to declare.
|
|
43
|
+
*
|
|
44
|
+
* @returns The entry id if one was written, or null when skipped.
|
|
45
|
+
*/
|
|
46
|
+
export declare function seedDeclaredCapabilities(args: SeedDeclaredCapabilitiesArgs): Promise<string | null>;
|
|
47
|
+
//# sourceMappingURL=task-history-seeder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-history-seeder.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/memory/task-history-seeder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAMpE,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IACF,aAAa,EAAE,qBAAqB,CAAC;IACrC,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,EAAE,CAYtF;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,4BAA4B,GACjC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsCxB"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task History Seeder
|
|
3
|
+
*
|
|
4
|
+
* Seeds the project task-history ledger with synthetic "declared"
|
|
5
|
+
* entries when a team member registers. Solves the cold-start problem
|
|
6
|
+
* for capability routing: on day-0, no real tasks have run yet, but
|
|
7
|
+
* the team config can still declare what capabilities each member
|
|
8
|
+
* holds, and the orchestrator's `recall(capability)` query finds them.
|
|
9
|
+
*
|
|
10
|
+
* The convention: a `TeamMember.capabilities` entry counts as a
|
|
11
|
+
* canonical capability when it contains a `:` separator (e.g.
|
|
12
|
+
* `gmail:read`, `oauth:gmail`). Free-form strings without `:` are
|
|
13
|
+
* ignored — they aren't part of the routing vocabulary.
|
|
14
|
+
*
|
|
15
|
+
* @module services/memory/task-history-seeder
|
|
16
|
+
*/
|
|
17
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
18
|
+
const logger = LoggerService.getInstance().createComponentLogger('TaskHistorySeeder');
|
|
19
|
+
/**
|
|
20
|
+
* Filter a free-form `capabilities[]` array down to the entries that
|
|
21
|
+
* look like canonical capability strings. Exported for unit testing.
|
|
22
|
+
*/
|
|
23
|
+
export function pickCanonicalCapabilities(raw) {
|
|
24
|
+
if (!raw || raw.length === 0)
|
|
25
|
+
return [];
|
|
26
|
+
const seen = new Set();
|
|
27
|
+
for (const c of raw) {
|
|
28
|
+
if (typeof c !== 'string')
|
|
29
|
+
continue;
|
|
30
|
+
const trimmed = c.trim();
|
|
31
|
+
if (!trimmed.includes(':'))
|
|
32
|
+
continue;
|
|
33
|
+
const [left, right] = trimmed.split(':', 2);
|
|
34
|
+
if (!left || !right)
|
|
35
|
+
continue;
|
|
36
|
+
seen.add(trimmed);
|
|
37
|
+
}
|
|
38
|
+
return [...seen];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Emit a single synthetic `outcome: 'declared'` entry capturing every
|
|
42
|
+
* canonical capability the member declares. One entry per registration,
|
|
43
|
+
* keyed `th-declared-<sessionName>` so re-registration dedups cleanly
|
|
44
|
+
* (the entry is overwritten in place when the same id arrives — see
|
|
45
|
+
* ProjectMemoryService.addTaskHistory).
|
|
46
|
+
*
|
|
47
|
+
* No-op if the member has no canonical capabilities to declare.
|
|
48
|
+
*
|
|
49
|
+
* @returns The entry id if one was written, or null when skipped.
|
|
50
|
+
*/
|
|
51
|
+
export async function seedDeclaredCapabilities(args) {
|
|
52
|
+
const canonical = pickCanonicalCapabilities(args.member.capabilities);
|
|
53
|
+
if (canonical.length === 0) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
const now = (args.now ?? (() => new Date()))().toISOString();
|
|
57
|
+
const entry = {
|
|
58
|
+
id: `th-declared-${args.member.sessionName}`,
|
|
59
|
+
completedAt: now,
|
|
60
|
+
agent: {
|
|
61
|
+
sessionName: args.member.sessionName,
|
|
62
|
+
role: args.member.role,
|
|
63
|
+
teamId: args.member.teamId,
|
|
64
|
+
},
|
|
65
|
+
task: {
|
|
66
|
+
description: 'Self-declared capabilities at register_self',
|
|
67
|
+
outcome: 'declared',
|
|
68
|
+
},
|
|
69
|
+
capabilities: canonical,
|
|
70
|
+
toolsUsed: [],
|
|
71
|
+
};
|
|
72
|
+
try {
|
|
73
|
+
await args.projectMemory.addTaskHistory(args.projectPath, entry);
|
|
74
|
+
logger.info('Seeded declared capabilities', {
|
|
75
|
+
sessionName: args.member.sessionName,
|
|
76
|
+
count: canonical.length,
|
|
77
|
+
});
|
|
78
|
+
return entry.id;
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
// Non-fatal — registration must succeed even if memory write fails.
|
|
82
|
+
logger.warn('Failed to seed declared capabilities (non-fatal)', {
|
|
83
|
+
sessionName: args.member.sessionName,
|
|
84
|
+
error: err instanceof Error ? err.message : String(err),
|
|
85
|
+
});
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=task-history-seeder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-history-seeder.js","sourceRoot":"","sources":["../../../../../../backend/src/services/memory/task-history-seeder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;AAetF;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAkC;IAC1E,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,SAAS;QACpC,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QACrC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;YAAE,SAAS;QAC9B,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AACnB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,IAAkC;IAElC,MAAM,SAAS,GAAG,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACtE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7D,MAAM,KAAK,GAAqB;QAC9B,EAAE,EAAE,eAAe,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;QAC5C,WAAW,EAAE,GAAG;QAChB,KAAK,EAAE;YACL,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;SAC3B;QACD,IAAI,EAAE;YACJ,WAAW,EAAE,6CAA6C;YAC1D,OAAO,EAAE,UAAU;SACpB;QACD,YAAY,EAAE,SAAS;QACvB,SAAS,EAAE,EAAE;KACd,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;YAC1C,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,KAAK,EAAE,SAAS,CAAC,MAAM;SACxB,CAAC,CAAC;QACH,OAAO,KAAK,CAAC,EAAE,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,oEAAoE;QACpE,MAAM,CAAC,IAAI,CAAC,kDAAkD,EAAE;YAC9D,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task History Subscriber
|
|
3
|
+
*
|
|
4
|
+
* Listens on the in-process EventBus for `task:done_by_worker`,
|
|
5
|
+
* `task:rejected`, and `task:cancelled` and writes a {@link
|
|
6
|
+
* TaskHistoryEntry} into the originating project's `ProjectMemory`.
|
|
7
|
+
*
|
|
8
|
+
* This is the load-bearing write path behind "who in my team has done
|
|
9
|
+
* X?" — the orchestrator queries the resulting ledger via
|
|
10
|
+
* `recall_memory({ capability: '<canonical-cap>' })` before delegating
|
|
11
|
+
* external-access work.
|
|
12
|
+
*
|
|
13
|
+
* @module services/memory/task-history.subscriber
|
|
14
|
+
*/
|
|
15
|
+
import { EventBusService, type InProcessUnsubscribe } from '../event-bus/event-bus.service.js';
|
|
16
|
+
import { TaskPoolService } from '../task-pool/task-pool.service.js';
|
|
17
|
+
import { IProjectMemoryService } from './project-memory.service.js';
|
|
18
|
+
import { AgentEvent } from '../../types/event-bus.types.js';
|
|
19
|
+
import { CapabilityInferenceService } from './capability-inference.js';
|
|
20
|
+
export interface TaskHistorySubscriberDeps {
|
|
21
|
+
/** Bus to listen on */
|
|
22
|
+
eventBus: EventBusService;
|
|
23
|
+
/** Memory service that owns the ledger */
|
|
24
|
+
projectMemoryService: IProjectMemoryService;
|
|
25
|
+
/** Pool service used to resolve the WorkItem from id (description, type, etc.) */
|
|
26
|
+
taskPoolService: TaskPoolService;
|
|
27
|
+
/** Optional override for capability inference (tests pass a stub) */
|
|
28
|
+
capabilityInference?: CapabilityInferenceService;
|
|
29
|
+
/**
|
|
30
|
+
* Optional override for the project path resolver. Production uses the
|
|
31
|
+
* WorkItem's `metadata.projectPath`; tests can substitute a fixed path.
|
|
32
|
+
*/
|
|
33
|
+
resolveProjectPath?: (event: AgentEvent) => string | null;
|
|
34
|
+
}
|
|
35
|
+
export declare class TaskHistorySubscriber {
|
|
36
|
+
private readonly logger;
|
|
37
|
+
private readonly eventBus;
|
|
38
|
+
private readonly projectMemory;
|
|
39
|
+
private readonly taskPool;
|
|
40
|
+
private readonly inference;
|
|
41
|
+
private readonly resolveProjectPath;
|
|
42
|
+
private unsubscribeFn;
|
|
43
|
+
constructor(deps: TaskHistorySubscriberDeps);
|
|
44
|
+
/**
|
|
45
|
+
* Attach the in-process handler. Returns a detach function. Idempotent —
|
|
46
|
+
* calling start() twice without intervening stop() returns the first
|
|
47
|
+
* detach function (the second start is a no-op).
|
|
48
|
+
*/
|
|
49
|
+
start(): InProcessUnsubscribe;
|
|
50
|
+
/**
|
|
51
|
+
* Detach the handler. Safe to call multiple times.
|
|
52
|
+
*/
|
|
53
|
+
stop(): void;
|
|
54
|
+
/**
|
|
55
|
+
* Handle one event. Public for unit testing — production flow goes
|
|
56
|
+
* through the bus.
|
|
57
|
+
*/
|
|
58
|
+
handle(event: AgentEvent): Promise<void>;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Default resolver: lift `metadata.projectPath` off the WorkItem. The
|
|
62
|
+
* subscriber prefers the event's own projectPath if present, then falls
|
|
63
|
+
* back to the WorkItem's. Returns null when neither is set.
|
|
64
|
+
*
|
|
65
|
+
* Exported for unit testing.
|
|
66
|
+
*/
|
|
67
|
+
export declare function defaultResolveProjectPath(event: AgentEvent): string | null;
|
|
68
|
+
/**
|
|
69
|
+
* Extract the tool names invoked during the task from the WorkItem's
|
|
70
|
+
* metadata. Tries `metadata.toolsUsed` (canonical), `metadata.tools`
|
|
71
|
+
* (legacy), and an empty list as a last resort.
|
|
72
|
+
*
|
|
73
|
+
* Exported for unit testing.
|
|
74
|
+
*/
|
|
75
|
+
export declare function extractToolsUsed(workItem: Record<string, unknown>): string[];
|
|
76
|
+
//# sourceMappingURL=task-history.subscriber.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-history.subscriber.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/memory/task-history.subscriber.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EACL,eAAe,EACf,KAAK,oBAAoB,EAC1B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAKpE,OAAO,EACL,UAAU,EAEX,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,0BAA0B,EAE3B,MAAM,2BAA2B,CAAC;AA6BnC,MAAM,WAAW,yBAAyB;IACxC,uBAAuB;IACvB,QAAQ,EAAE,eAAe,CAAC;IAC1B,0CAA0C;IAC1C,oBAAoB,EAAE,qBAAqB,CAAC;IAC5C,kFAAkF;IAClF,eAAe,EAAE,eAAe,CAAC;IACjC,qEAAqE;IACrE,mBAAmB,CAAC,EAAE,0BAA0B,CAAC;IACjD;;;OAGG;IACH,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,GAAG,IAAI,CAAC;CAC3D;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAErB;IACF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwB;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAuC;IAC1E,OAAO,CAAC,aAAa,CAAqC;gBAE9C,IAAI,EAAE,yBAAyB;IAQ3C;;;;OAIG;IACH,KAAK,IAAI,oBAAoB;IAe7B;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;;OAGG;IACG,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAoF/C;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAQ1E;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAY5E"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task History Subscriber
|
|
3
|
+
*
|
|
4
|
+
* Listens on the in-process EventBus for `task:done_by_worker`,
|
|
5
|
+
* `task:rejected`, and `task:cancelled` and writes a {@link
|
|
6
|
+
* TaskHistoryEntry} into the originating project's `ProjectMemory`.
|
|
7
|
+
*
|
|
8
|
+
* This is the load-bearing write path behind "who in my team has done
|
|
9
|
+
* X?" — the orchestrator queries the resulting ledger via
|
|
10
|
+
* `recall_memory({ capability: '<canonical-cap>' })` before delegating
|
|
11
|
+
* external-access work.
|
|
12
|
+
*
|
|
13
|
+
* @module services/memory/task-history.subscriber
|
|
14
|
+
*/
|
|
15
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
16
|
+
import { inferCapabilities, } from './capability-inference.js';
|
|
17
|
+
/** Event types we record. Symmetric across success/failure/cancellation. */
|
|
18
|
+
const RECORDED_EVENT_TYPES = [
|
|
19
|
+
'task:done_by_worker',
|
|
20
|
+
'task:rejected',
|
|
21
|
+
'task:cancelled',
|
|
22
|
+
];
|
|
23
|
+
/**
|
|
24
|
+
* Map task pool event types → TaskOutcome. Done-by-worker is the
|
|
25
|
+
* success path; rejected is verifier-driven failure; cancelled is
|
|
26
|
+
* lifecycle abandonment (which we record as `partial` so the
|
|
27
|
+
* capability-index can still surface "the agent attempted this kind
|
|
28
|
+
* of work" without misleading on success rates).
|
|
29
|
+
*/
|
|
30
|
+
function eventTypeToOutcome(eventType) {
|
|
31
|
+
switch (eventType) {
|
|
32
|
+
case 'task:done_by_worker':
|
|
33
|
+
return 'success';
|
|
34
|
+
case 'task:rejected':
|
|
35
|
+
return 'failure';
|
|
36
|
+
case 'task:cancelled':
|
|
37
|
+
return 'partial';
|
|
38
|
+
default:
|
|
39
|
+
return 'partial';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export class TaskHistorySubscriber {
|
|
43
|
+
logger = LoggerService.getInstance().createComponentLogger('TaskHistorySubscriber');
|
|
44
|
+
eventBus;
|
|
45
|
+
projectMemory;
|
|
46
|
+
taskPool;
|
|
47
|
+
inference;
|
|
48
|
+
resolveProjectPath;
|
|
49
|
+
unsubscribeFn = null;
|
|
50
|
+
constructor(deps) {
|
|
51
|
+
this.eventBus = deps.eventBus;
|
|
52
|
+
this.projectMemory = deps.projectMemoryService;
|
|
53
|
+
this.taskPool = deps.taskPoolService;
|
|
54
|
+
this.inference = deps.capabilityInference ?? { infer: inferCapabilities };
|
|
55
|
+
this.resolveProjectPath = deps.resolveProjectPath ?? defaultResolveProjectPath;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Attach the in-process handler. Returns a detach function. Idempotent —
|
|
59
|
+
* calling start() twice without intervening stop() returns the first
|
|
60
|
+
* detach function (the second start is a no-op).
|
|
61
|
+
*/
|
|
62
|
+
start() {
|
|
63
|
+
if (this.unsubscribeFn) {
|
|
64
|
+
this.logger.debug('start() called while already attached — returning existing detach');
|
|
65
|
+
return this.unsubscribeFn;
|
|
66
|
+
}
|
|
67
|
+
this.unsubscribeFn = this.eventBus.onInProcess([...RECORDED_EVENT_TYPES], (event) => this.handle(event));
|
|
68
|
+
this.logger.info('TaskHistorySubscriber attached', {
|
|
69
|
+
types: RECORDED_EVENT_TYPES,
|
|
70
|
+
});
|
|
71
|
+
return this.unsubscribeFn;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Detach the handler. Safe to call multiple times.
|
|
75
|
+
*/
|
|
76
|
+
stop() {
|
|
77
|
+
if (this.unsubscribeFn) {
|
|
78
|
+
this.unsubscribeFn();
|
|
79
|
+
this.unsubscribeFn = null;
|
|
80
|
+
this.logger.info('TaskHistorySubscriber detached');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Handle one event. Public for unit testing — production flow goes
|
|
85
|
+
* through the bus.
|
|
86
|
+
*/
|
|
87
|
+
async handle(event) {
|
|
88
|
+
try {
|
|
89
|
+
const workItemId = event.workItemId;
|
|
90
|
+
if (!workItemId) {
|
|
91
|
+
this.logger.debug('Event has no workItemId — skipping', {
|
|
92
|
+
eventId: event.id,
|
|
93
|
+
type: event.type,
|
|
94
|
+
});
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const workItem = await this.taskPool.findWorkItem(workItemId);
|
|
98
|
+
if (!workItem) {
|
|
99
|
+
this.logger.debug('WorkItem not found in pool — skipping', { workItemId });
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const projectPath = this.resolveProjectPath(event);
|
|
103
|
+
if (!projectPath) {
|
|
104
|
+
this.logger.debug('No projectPath resolvable — skipping', {
|
|
105
|
+
workItemId,
|
|
106
|
+
eventId: event.id,
|
|
107
|
+
});
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const sessionName = event.sessionName ||
|
|
111
|
+
workItem.target ||
|
|
112
|
+
workItem.owner ||
|
|
113
|
+
'';
|
|
114
|
+
if (!sessionName) {
|
|
115
|
+
this.logger.debug('No session attributable — skipping', { workItemId });
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const role = workItem.metadata?.['role'] ?? 'unknown';
|
|
119
|
+
const teamId = workItem.metadata?.['teamId'] ||
|
|
120
|
+
event.teamId ||
|
|
121
|
+
undefined;
|
|
122
|
+
const description = workItem.title ||
|
|
123
|
+
workItem.briefMarkdown?.slice(0, 200) ||
|
|
124
|
+
'(no description)';
|
|
125
|
+
// Cast through unknown: WorkItem is a richer typed shape, but the
|
|
126
|
+
// helpers only need free-form metadata access. Avoids importing
|
|
127
|
+
// WorkItem's type just to widen it.
|
|
128
|
+
const workItemAsRecord = workItem;
|
|
129
|
+
const toolsUsed = extractToolsUsed(workItemAsRecord);
|
|
130
|
+
const capabilities = this.inference.infer(toolsUsed, workItemAsRecord);
|
|
131
|
+
const entry = {
|
|
132
|
+
id: `th-${workItemId}`,
|
|
133
|
+
completedAt: event.timestamp || new Date().toISOString(),
|
|
134
|
+
agent: { sessionName, role, teamId },
|
|
135
|
+
task: {
|
|
136
|
+
description,
|
|
137
|
+
outcome: eventTypeToOutcome(event.type),
|
|
138
|
+
},
|
|
139
|
+
capabilities,
|
|
140
|
+
toolsUsed,
|
|
141
|
+
taskId: workItemId,
|
|
142
|
+
};
|
|
143
|
+
await this.projectMemory.addTaskHistory(projectPath, entry);
|
|
144
|
+
this.logger.info('Task history recorded', {
|
|
145
|
+
workItemId,
|
|
146
|
+
sessionName,
|
|
147
|
+
outcome: entry.task.outcome,
|
|
148
|
+
capCount: capabilities.length,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
// Subscribers MUST swallow exceptions — a memory-write failure
|
|
153
|
+
// cannot back out the upstream task completion.
|
|
154
|
+
this.logger.warn('Failed to record task history (non-fatal)', {
|
|
155
|
+
eventId: event.id,
|
|
156
|
+
eventType: event.type,
|
|
157
|
+
error: err instanceof Error ? err.message : String(err),
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Default resolver: lift `metadata.projectPath` off the WorkItem. The
|
|
164
|
+
* subscriber prefers the event's own projectPath if present, then falls
|
|
165
|
+
* back to the WorkItem's. Returns null when neither is set.
|
|
166
|
+
*
|
|
167
|
+
* Exported for unit testing.
|
|
168
|
+
*/
|
|
169
|
+
export function defaultResolveProjectPath(event) {
|
|
170
|
+
// AgentEvent doesn't have a typed projectPath field, but task-pool
|
|
171
|
+
// events sometimes ride one as a free-form attribute. Be defensive.
|
|
172
|
+
const eventPath = event['projectPath'];
|
|
173
|
+
if (typeof eventPath === 'string' && eventPath.length > 0) {
|
|
174
|
+
return eventPath;
|
|
175
|
+
}
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Extract the tool names invoked during the task from the WorkItem's
|
|
180
|
+
* metadata. Tries `metadata.toolsUsed` (canonical), `metadata.tools`
|
|
181
|
+
* (legacy), and an empty list as a last resort.
|
|
182
|
+
*
|
|
183
|
+
* Exported for unit testing.
|
|
184
|
+
*/
|
|
185
|
+
export function extractToolsUsed(workItem) {
|
|
186
|
+
const metadata = workItem['metadata'];
|
|
187
|
+
if (!metadata)
|
|
188
|
+
return [];
|
|
189
|
+
const canonical = metadata['toolsUsed'];
|
|
190
|
+
if (Array.isArray(canonical)) {
|
|
191
|
+
return canonical.filter((t) => typeof t === 'string');
|
|
192
|
+
}
|
|
193
|
+
const legacy = metadata['tools'];
|
|
194
|
+
if (Array.isArray(legacy)) {
|
|
195
|
+
return legacy.filter((t) => typeof t === 'string');
|
|
196
|
+
}
|
|
197
|
+
return [];
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=task-history.subscriber.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-history.subscriber.js","sourceRoot":"","sources":["../../../../../../backend/src/services/memory/task-history.subscriber.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,6 @@
|
|
|
19
19
|
* @module services/messaging/message-replay
|
|
20
20
|
*/
|
|
21
21
|
import type { MessageQueueService } from './message-queue.service.js';
|
|
22
|
-
import type { ChatService } from '../chat/chat.service.js';
|
|
23
22
|
import type { ChatMessage } from '../../types/chat.types.js';
|
|
24
23
|
/**
|
|
25
24
|
* Result of a replay scan, containing details about what was found and replayed.
|
|
@@ -56,16 +55,15 @@ export interface ReplayResult {
|
|
|
56
55
|
export declare class MessageReplayService {
|
|
57
56
|
private logger;
|
|
58
57
|
private messageQueueService;
|
|
59
|
-
private
|
|
58
|
+
private chatV2;
|
|
60
59
|
private crewlyHome;
|
|
61
60
|
/**
|
|
62
61
|
* Create a new MessageReplayService.
|
|
63
62
|
*
|
|
64
63
|
* @param messageQueueService - The message queue to enqueue replayed messages into
|
|
65
|
-
* @param chatService - The chat service to scan for unreplied messages
|
|
66
64
|
* @param crewlyHome - Path to the crewly home directory (e.g. ~/.crewly)
|
|
67
65
|
*/
|
|
68
|
-
constructor(messageQueueService: MessageQueueService,
|
|
66
|
+
constructor(messageQueueService: MessageQueueService, crewlyHome: string);
|
|
69
67
|
/**
|
|
70
68
|
* Scan chat history for unreplied user messages and replay them into the queue.
|
|
71
69
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-replay.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/message-replay.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"message-replay.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/message-replay.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAQtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAO7D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,aAAa,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,gBAAgB,EAAE,MAAM,CAAC;IACzB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;OAKG;gBAED,mBAAmB,EAAE,mBAAmB,EACxC,UAAU,EAAE,MAAM;IAQpB;;;;;;;OAOG;IACG,qBAAqB,IAAI,OAAO,CAAC,YAAY,CAAC;IAgLpD;;;;;OAKG;IACG,yBAAyB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAWzD;;;;;;;OAOG;IACH,yBAAyB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;IAqBjE;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;CAiB3B"}
|
|
@@ -19,6 +19,8 @@
|
|
|
19
19
|
* @module services/messaging/message-replay
|
|
20
20
|
*/
|
|
21
21
|
import { LoggerService } from '../core/logger.service.js';
|
|
22
|
+
import { getChatV2Service } from '../chat-v2/chat-v2.singleton.js';
|
|
23
|
+
import { SYSTEM_PRINCIPAL, v2MessageToLegacy, v2ChannelToLegacy, } from '../chat-v2/legacy-dto.utils.js';
|
|
22
24
|
import { MESSAGE_REPLAY_CONSTANTS, MESSAGE_SOURCES } from '../../constants.js';
|
|
23
25
|
import { safeReadJson } from '../../utils/file-io.utils.js';
|
|
24
26
|
import { ThreadStatusQueueService } from './thread-status-queue.service.js';
|
|
@@ -44,19 +46,18 @@ import path from 'path';
|
|
|
44
46
|
export class MessageReplayService {
|
|
45
47
|
logger;
|
|
46
48
|
messageQueueService;
|
|
47
|
-
|
|
49
|
+
chatV2;
|
|
48
50
|
crewlyHome;
|
|
49
51
|
/**
|
|
50
52
|
* Create a new MessageReplayService.
|
|
51
53
|
*
|
|
52
54
|
* @param messageQueueService - The message queue to enqueue replayed messages into
|
|
53
|
-
* @param chatService - The chat service to scan for unreplied messages
|
|
54
55
|
* @param crewlyHome - Path to the crewly home directory (e.g. ~/.crewly)
|
|
55
56
|
*/
|
|
56
|
-
constructor(messageQueueService,
|
|
57
|
+
constructor(messageQueueService, crewlyHome) {
|
|
57
58
|
this.logger = LoggerService.getInstance().createComponentLogger('MessageReplay');
|
|
58
59
|
this.messageQueueService = messageQueueService;
|
|
59
|
-
this.
|
|
60
|
+
this.chatV2 = getChatV2Service();
|
|
60
61
|
this.crewlyHome = crewlyHome;
|
|
61
62
|
}
|
|
62
63
|
/**
|
|
@@ -100,10 +101,11 @@ export class MessageReplayService {
|
|
|
100
101
|
offlineDurationMs,
|
|
101
102
|
replayWindowStart,
|
|
102
103
|
});
|
|
103
|
-
// Step 2: Get all active conversations
|
|
104
|
-
const conversations =
|
|
105
|
-
|
|
106
|
-
|
|
104
|
+
// Step 2: Get all active conversations (chat-v2 channels)
|
|
105
|
+
const conversations = this.chatV2
|
|
106
|
+
.listChannels({ principal: SYSTEM_PRINCIPAL })
|
|
107
|
+
.filter((c) => !c.archivedAt)
|
|
108
|
+
.map((c) => v2ChannelToLegacy(c, this.chatV2.countChannelMessages(c.id, SYSTEM_PRINCIPAL)));
|
|
107
109
|
if (conversations.length === 0) {
|
|
108
110
|
this.logger.debug('No active conversations found, skipping replay');
|
|
109
111
|
return result;
|
|
@@ -114,11 +116,19 @@ export class MessageReplayService {
|
|
|
114
116
|
// Step 4: Scan each conversation for unreplied user messages
|
|
115
117
|
const unrepliedMessages = [];
|
|
116
118
|
for (const conversation of conversations) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
119
|
+
// Pull recent message page from chat-v2 then DTO-convert + filter
|
|
120
|
+
// by replayWindowStart locally (chat-v2's cursor pagination is
|
|
121
|
+
// by seq/created_at, but the legacy filter used an ISO date).
|
|
122
|
+
const v2Messages = this.chatV2.listMessages({
|
|
123
|
+
channelId: conversation.id,
|
|
124
|
+
principal: SYSTEM_PRINCIPAL,
|
|
120
125
|
limit: 100,
|
|
121
|
-
|
|
126
|
+
direction: 'forward',
|
|
127
|
+
}).messages;
|
|
128
|
+
const cutoffMs = new Date(replayWindowStart).getTime();
|
|
129
|
+
const messages = v2Messages
|
|
130
|
+
.filter((m) => m.createdAt >= cutoffMs)
|
|
131
|
+
.map(v2MessageToLegacy);
|
|
122
132
|
// Find user messages that have no orchestrator reply after them
|
|
123
133
|
const userMessages = this.findUnrepliedUserMessages(messages);
|
|
124
134
|
for (const msg of userMessages) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-replay.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/message-replay.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,aAAa,EAAwB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"message-replay.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/message-replay.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue-processor.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/queue-processor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAGlF,OAAO,EASL,KAAK,WAAW,EACjB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAoBjF;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,cAAc,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,eAAe,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,aAAa,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,WAAW,EAAE,WAAW,CAAC;IACzB,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,eAAe,EAAE,OAAO,gCAAgC,EAAE,aAAa,CAAC;CACzE;AAED,qBAAa,qBAAsB,SAAQ,YAAY;IACrD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,cAAc,CAAwB;IAC9C,OAAO,CAAC,wBAAwB,CAA2B;IAC3D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,kBAAkB,CAA8C;IACxE,gFAAgF;IAChF,OAAO,CAAC,oBAAoB,CAAS;IAErC;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB,CAAkC;IAE7D,wDAAwD;IACxD,OAAO,CAAC,iBAAiB,CAA+C;IAExE,8DAA8D;IAC9D,OAAO,CAAC,sBAAsB,CAA+C;IAE7E;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB,CAA2C;IAErE,yEAAyE;IACzE,OAAO,CAAC,iBAAiB,CAAyC;IAElE;;;;OAIG;IACH,OAAO,CAAC,cAAc,CAAsF;gBAG1G,YAAY,EAAE,mBAAmB,EACjC,cAAc,EAAE,qBAAqB,EACrC,wBAAwB,EAAE,wBAAwB;IASpD;;;;OAIG;IACH,oBAAoB,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI;IAI7D;;;;;;;OAOG;IACH,iBAAiB,CAAC,MAAM,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAIpG;;;OAGG;IACH,KAAK,IAAI,IAAI;IAeb;;OAEG;IACH,IAAI,IAAI,IAAI;IAmBZ;;;;OAIG;IACH,SAAS,IAAI,OAAO;IAIpB;;;;OAIG;IACH,mBAAmB,IAAI,OAAO;IAI9B;;OAEG;IACH,OAAO,CAAC,iBAAiB,CAIvB;IAEF;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAe3B;;;OAGG;YACW,WAAW;
|
|
1
|
+
{"version":3,"file":"queue-processor.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/queue-processor.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { EventEmitter } from 'events';
|
|
17
17
|
import { LoggerService } from '../core/logger.service.js';
|
|
18
|
-
import {
|
|
18
|
+
import { getChatV2Service } from '../chat-v2/chat-v2.singleton.js';
|
|
19
19
|
import { getTerminalGateway } from '../../websocket/terminal.gateway.js';
|
|
20
20
|
import { MESSAGE_QUEUE_CONSTANTS, ORCHESTRATOR_SESSION_NAME, CHAT_ROUTING_CONSTANTS, EVENT_DELIVERY_CONSTANTS, RUNTIME_TYPES, ORCHESTRATOR_HEARTBEAT_CONSTANTS, MESSAGE_SOURCES, } from '../../constants.js';
|
|
21
21
|
import { PtyActivityTrackerService } from '../agent/pty-activity-tracker.service.js';
|
|
@@ -346,8 +346,18 @@ export class QueueProcessorService extends EventEmitter {
|
|
|
346
346
|
// Notify user in conversation
|
|
347
347
|
if (message.source !== MESSAGE_SOURCES.SYSTEM_EVENT) {
|
|
348
348
|
try {
|
|
349
|
-
const
|
|
350
|
-
|
|
349
|
+
const chatV2 = getChatV2Service();
|
|
350
|
+
const channel = chatV2.ensureChannelForLegacyConversation({
|
|
351
|
+
conversationId: message.conversationId,
|
|
352
|
+
agentSession: 'crewly-orc',
|
|
353
|
+
});
|
|
354
|
+
chatV2.recordTurn({
|
|
355
|
+
channelId: channel.id,
|
|
356
|
+
senderType: 'system',
|
|
357
|
+
senderId: 'system',
|
|
358
|
+
content: `Message delivery failed: ${errorMsg} Please try again later.`,
|
|
359
|
+
metadata: { source: 'system' },
|
|
360
|
+
});
|
|
351
361
|
}
|
|
352
362
|
catch (sysErr) {
|
|
353
363
|
this.logger.warn('Failed to send max-retry failure system message', {
|
|
@@ -525,8 +535,18 @@ export class QueueProcessorService extends EventEmitter {
|
|
|
525
535
|
// (skip for system events — no user conversation to notify)
|
|
526
536
|
if (!isSystemEvent) {
|
|
527
537
|
try {
|
|
528
|
-
const
|
|
529
|
-
|
|
538
|
+
const chatV2 = getChatV2Service();
|
|
539
|
+
const channel = chatV2.ensureChannelForLegacyConversation({
|
|
540
|
+
conversationId: message.conversationId,
|
|
541
|
+
agentSession: 'crewly-orc',
|
|
542
|
+
});
|
|
543
|
+
chatV2.recordTurn({
|
|
544
|
+
channelId: channel.id,
|
|
545
|
+
senderType: 'system',
|
|
546
|
+
senderId: 'system',
|
|
547
|
+
content: `Failed to deliver message to orchestrator: ${errorMsg}. Please try again.`,
|
|
548
|
+
metadata: { source: 'system' },
|
|
549
|
+
});
|
|
530
550
|
}
|
|
531
551
|
catch (sysErr) {
|
|
532
552
|
this.logger.warn('Failed to send delivery-failure system message', {
|