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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CrewlyAgentExternalRuntimeService } from './crewly-agent/crewly-agent-external-runtime.service.js';
|
|
2
2
|
import { StorageService } from '../core/storage.service.js';
|
|
3
3
|
import { CREWLY_CONSTANTS, RuntimeType } from '../../constants.js';
|
|
4
4
|
export interface OrchestratorConfig {
|
|
@@ -116,6 +116,33 @@ export declare class AgentRegistrationService {
|
|
|
116
116
|
* @param conversationId - Chat conversation to route the response to
|
|
117
117
|
*/
|
|
118
118
|
private routeInProcessResponseToChat;
|
|
119
|
+
/**
|
|
120
|
+
* Auto-route an in-process agent's text response back to Slack.
|
|
121
|
+
*
|
|
122
|
+
* Mirrors the post-send side effects of POST /slack/send so that the
|
|
123
|
+
* Slack reply, thread-status bookkeeping, and V3 SLA cascade all stay in
|
|
124
|
+
* sync. Used as a finish-event hook for the in-process Crewly Agent
|
|
125
|
+
* runtime when:
|
|
126
|
+
* 1. The inbound message carried a `[SLACK:channelId:threadTs]` marker
|
|
127
|
+
* 2. The agent produced text output (`result.text` non-empty)
|
|
128
|
+
* 3. The agent did NOT explicitly call the `reply_slack` tool
|
|
129
|
+
*
|
|
130
|
+
* Without this hook, AI SDK agents that finish with `toolCalls=0,
|
|
131
|
+
* finishReason=stop` would drop their reply on the floor — unlike the
|
|
132
|
+
* claude-code PTY path, the in-process runtime has no stdout stream the
|
|
133
|
+
* SlackBridge can tail.
|
|
134
|
+
*
|
|
135
|
+
* Best-effort: a Slack-not-connected condition or a downstream
|
|
136
|
+
* bookkeeping failure is logged and swallowed; never throws. The chat
|
|
137
|
+
* route (`routeInProcessResponseToChat`) handles persistence to the chat
|
|
138
|
+
* service separately.
|
|
139
|
+
*
|
|
140
|
+
* @param sessionName - Agent session that produced the response
|
|
141
|
+
* @param text - Response text from the agent
|
|
142
|
+
* @param slackContext - Slack channel + thread metadata captured from the
|
|
143
|
+
* inbound `[SLACK:channelId:threadTs]` marker
|
|
144
|
+
*/
|
|
145
|
+
private routeInProcessResponseToSlack;
|
|
119
146
|
/**
|
|
120
147
|
* Find the project root by looking for package.json
|
|
121
148
|
*/
|
|
@@ -149,9 +176,9 @@ export declare class AgentRegistrationService {
|
|
|
149
176
|
* Used by the terminal controller for force-delivery to in-process agents.
|
|
150
177
|
*
|
|
151
178
|
* @param sessionName - Session name to look up
|
|
152
|
-
* @returns The
|
|
179
|
+
* @returns The CrewlyAgentExternalRuntimeService if it exists, undefined otherwise
|
|
153
180
|
*/
|
|
154
|
-
getInProcessRuntime(sessionName: string):
|
|
181
|
+
getInProcessRuntime(sessionName: string): CrewlyAgentExternalRuntimeService | undefined;
|
|
155
182
|
/**
|
|
156
183
|
* Check if an in-process Crewly Agent runtime is active and ready for a given session.
|
|
157
184
|
*
|
|
@@ -172,6 +199,21 @@ export declare class AgentRegistrationService {
|
|
|
172
199
|
* Returns true if successful, false if failed.
|
|
173
200
|
*/
|
|
174
201
|
private updateAgentStatusSafe;
|
|
202
|
+
/**
|
|
203
|
+
* Role aliases — common synonyms users naturally type in team configs
|
|
204
|
+
* mapped to the canonical directory name under `config/roles/`. Without
|
|
205
|
+
* these, a team-config role like `"tech-lead"` would fall through to a
|
|
206
|
+
* non-existent directory and trigger the ENOENT fallback path on every
|
|
207
|
+
* agent registration (Steve 2026-05-15 dogfood: CE team config used
|
|
208
|
+
* `role: "tech-lead"` while the canonical directory is `team-leader`,
|
|
209
|
+
* producing a steady drip of "Could not load prompt from config" warns
|
|
210
|
+
* for every member-start with no actionable resolution short of editing
|
|
211
|
+
* user data).
|
|
212
|
+
*
|
|
213
|
+
* Keep keys lowercased + dash-normalized (matches the post-normalization
|
|
214
|
+
* shape used by `getPromptFileForRole`).
|
|
215
|
+
*/
|
|
216
|
+
private static readonly ROLE_DIR_ALIASES;
|
|
175
217
|
/**
|
|
176
218
|
* Get prompt file path for a specific role
|
|
177
219
|
* Uses the unified config/roles/{role}/prompt.md structure
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-registration.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/agent-registration.service.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"agent-registration.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/agent-registration.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,6 +23,7 @@ import { PromptAssemblyService } from '../ai/prompt-modules/prompt-assembly.serv
|
|
|
23
23
|
import { stripAnsiCodes } from '../../utils/terminal-output.utils.js';
|
|
24
24
|
import { isPromptLine, containsSpinnerOrWorkingIndicator, containsProcessingIndicator, containsBusyStatusBar, containsRewindMode, extractChatPrefix, stripTuiLineBorders, matchTuiPromptLine, } from '../../utils/terminal-string-ops.js';
|
|
25
25
|
import { PtyActivityTrackerService } from './pty-activity-tracker.service.js';
|
|
26
|
+
import { synthesizeSlackConversationId } from '../chat-v2/legacy-dto.utils.js';
|
|
26
27
|
/**
|
|
27
28
|
* Error thrown when an agent role cannot be resolved to a valid value.
|
|
28
29
|
*
|
|
@@ -247,7 +248,10 @@ export class AgentRegistrationService {
|
|
|
247
248
|
* @param conversationId - Chat conversation to route the response to
|
|
248
249
|
*/
|
|
249
250
|
routeInProcessResponseToChat(sessionName, text, conversationId) {
|
|
250
|
-
//
|
|
251
|
+
// LEGACY PATH — chatGateway.processNotifyMessage → ChatService
|
|
252
|
+
// (JSON files in ~/.crewly/chat/). Kept until Phase 5 data
|
|
253
|
+
// migration retires the JSON store; until then the legacy file
|
|
254
|
+
// is what the frontend chat-v1 readers consume.
|
|
251
255
|
import('../../websocket/chat.gateway.js')
|
|
252
256
|
.then(({ getChatGateway }) => {
|
|
253
257
|
const chatGateway = getChatGateway();
|
|
@@ -261,7 +265,7 @@ export class AgentRegistrationService {
|
|
|
261
265
|
})
|
|
262
266
|
.then((chatMessage) => {
|
|
263
267
|
if (chatMessage) {
|
|
264
|
-
this.logger.debug('Routed in-process agent response to chat', {
|
|
268
|
+
this.logger.debug('Routed in-process agent response to chat (legacy)', {
|
|
265
269
|
sessionName, conversationId,
|
|
266
270
|
messageId: typeof chatMessage === 'object' ? chatMessage.id : undefined,
|
|
267
271
|
});
|
|
@@ -273,6 +277,167 @@ export class AgentRegistrationService {
|
|
|
273
277
|
error: err instanceof Error ? err.message : String(err),
|
|
274
278
|
});
|
|
275
279
|
});
|
|
280
|
+
// Phase 6β of unified-chat-message-store spec: the explicit
|
|
281
|
+
// chat-v2 recordTurn call that lived here during Phases 2-3
|
|
282
|
+
// was removed because `ChatService` is now a thin façade over
|
|
283
|
+
// `ChatV2Service` — the `processNotifyMessage` call above
|
|
284
|
+
// already writes through to chat-v2 internally. Keeping both
|
|
285
|
+
// paths would produce duplicate rows.
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Auto-route an in-process agent's text response back to Slack.
|
|
289
|
+
*
|
|
290
|
+
* Mirrors the post-send side effects of POST /slack/send so that the
|
|
291
|
+
* Slack reply, thread-status bookkeeping, and V3 SLA cascade all stay in
|
|
292
|
+
* sync. Used as a finish-event hook for the in-process Crewly Agent
|
|
293
|
+
* runtime when:
|
|
294
|
+
* 1. The inbound message carried a `[SLACK:channelId:threadTs]` marker
|
|
295
|
+
* 2. The agent produced text output (`result.text` non-empty)
|
|
296
|
+
* 3. The agent did NOT explicitly call the `reply_slack` tool
|
|
297
|
+
*
|
|
298
|
+
* Without this hook, AI SDK agents that finish with `toolCalls=0,
|
|
299
|
+
* finishReason=stop` would drop their reply on the floor — unlike the
|
|
300
|
+
* claude-code PTY path, the in-process runtime has no stdout stream the
|
|
301
|
+
* SlackBridge can tail.
|
|
302
|
+
*
|
|
303
|
+
* Best-effort: a Slack-not-connected condition or a downstream
|
|
304
|
+
* bookkeeping failure is logged and swallowed; never throws. The chat
|
|
305
|
+
* route (`routeInProcessResponseToChat`) handles persistence to the chat
|
|
306
|
+
* service separately.
|
|
307
|
+
*
|
|
308
|
+
* @param sessionName - Agent session that produced the response
|
|
309
|
+
* @param text - Response text from the agent
|
|
310
|
+
* @param slackContext - Slack channel + thread metadata captured from the
|
|
311
|
+
* inbound `[SLACK:channelId:threadTs]` marker
|
|
312
|
+
*/
|
|
313
|
+
routeInProcessResponseToSlack(sessionName, text, slackContext) {
|
|
314
|
+
// Lazy import to avoid module-load circular dependency between
|
|
315
|
+
// agent-registration ↔ slack ↔ messaging ↔ v3.
|
|
316
|
+
import('../slack/slack.service.js')
|
|
317
|
+
.then(async ({ getSlackService }) => {
|
|
318
|
+
const slack = getSlackService();
|
|
319
|
+
if (!slack.isConnected()) {
|
|
320
|
+
this.logger.warn('Slack not connected — cannot auto-route in-process agent response', {
|
|
321
|
+
sessionName,
|
|
322
|
+
channelId: slackContext.channelId,
|
|
323
|
+
threadTs: slackContext.threadTs,
|
|
324
|
+
textLength: text.length,
|
|
325
|
+
});
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
// Auto-prefix with the agent display name (mirrors reply_slack tool
|
|
329
|
+
// behavior) so the message is attributable in the Slack thread.
|
|
330
|
+
// Skip if the text already starts with `[` — the agent supplied its
|
|
331
|
+
// own prefix.
|
|
332
|
+
let cleanText = text;
|
|
333
|
+
if (sessionName && !cleanText.startsWith('[')) {
|
|
334
|
+
const parts = sessionName.split('-');
|
|
335
|
+
const namePart = parts.length >= 3 ? parts[2] : parts[parts.length - 1];
|
|
336
|
+
if (namePart) {
|
|
337
|
+
const capitalized = namePart.charAt(0).toUpperCase() + namePart.slice(1);
|
|
338
|
+
cleanText = `[${capitalized}] ${cleanText}`;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
await slack.sendMessage({
|
|
342
|
+
channelId: slackContext.channelId,
|
|
343
|
+
text: cleanText,
|
|
344
|
+
threadTs: slackContext.threadTs,
|
|
345
|
+
});
|
|
346
|
+
this.logger.info('Auto-routed in-process agent response to Slack', {
|
|
347
|
+
sessionName,
|
|
348
|
+
channelId: slackContext.channelId,
|
|
349
|
+
threadTs: slackContext.threadTs,
|
|
350
|
+
textLength: cleanText.length,
|
|
351
|
+
});
|
|
352
|
+
// Mirror /slack/send bookkeeping #3 — record `agent.action`
|
|
353
|
+
// with actionType='send_slack' so the auditor view and any
|
|
354
|
+
// V3 downstream analysis see the auto-routed reply. Without
|
|
355
|
+
// this entry the in-process auto-route is invisible in the
|
|
356
|
+
// behavior log (only `/slack/send`-originated replies show
|
|
357
|
+
// up). Follow-up #9 from PR #543 review.
|
|
358
|
+
try {
|
|
359
|
+
const { getAgentBehaviorLogService } = await import('../observability/agent-behavior-log.singleton.js');
|
|
360
|
+
getAgentBehaviorLogService()?.record({
|
|
361
|
+
type: 'agent.action',
|
|
362
|
+
agent: sessionName,
|
|
363
|
+
actionType: 'send_slack',
|
|
364
|
+
details: {
|
|
365
|
+
channelId: slackContext.channelId,
|
|
366
|
+
threadTs: slackContext.threadTs ?? null,
|
|
367
|
+
textLength: cleanText.length,
|
|
368
|
+
source: 'in_process_auto_route',
|
|
369
|
+
},
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
catch (err) {
|
|
373
|
+
this.logger.debug('Failed to record send_slack agent.action (non-fatal)', {
|
|
374
|
+
sessionName,
|
|
375
|
+
error: err instanceof Error ? err.message : String(err),
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
// Mirror /slack/send bookkeeping #1 — mark thread as
|
|
379
|
+
// replied_completed so the recovery loop on the next restart
|
|
380
|
+
// does not re-enqueue this inbound message. Without this, every
|
|
381
|
+
// backend restart would cause orc to re-reply.
|
|
382
|
+
//
|
|
383
|
+
// Race-protection: build the thread-status entry on the fly if
|
|
384
|
+
// it isn't tracked yet. The Slack listener's `trackInbound` is
|
|
385
|
+
// what normally populates the entry, but in a startup-race
|
|
386
|
+
// scenario the agent finish event can land before the listener
|
|
387
|
+
// has persisted the inbound. Without this fallback,
|
|
388
|
+
// `markReplied` short-circuits and the recovery loop on the
|
|
389
|
+
// next boot still re-fires the inbound (the exact bug
|
|
390
|
+
// /slack/send already guards against — keep parity).
|
|
391
|
+
if (slackContext.threadTs) {
|
|
392
|
+
try {
|
|
393
|
+
const { ThreadStatusQueueService } = await import('../messaging/thread-status-queue.service.js');
|
|
394
|
+
const tsq = ThreadStatusQueueService.getInstance();
|
|
395
|
+
const threadKey = `${slackContext.channelId}:${slackContext.threadTs}`;
|
|
396
|
+
if (!tsq.get(threadKey)) {
|
|
397
|
+
tsq.trackInbound({
|
|
398
|
+
threadKey,
|
|
399
|
+
conversationId: synthesizeSlackConversationId(slackContext.channelId, slackContext.threadTs),
|
|
400
|
+
source: 'slack',
|
|
401
|
+
messagePreview: '[in-process auto-route — no inbound recorded]',
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
tsq.markReplied(threadKey, 'replied_completed');
|
|
405
|
+
}
|
|
406
|
+
catch (err) {
|
|
407
|
+
this.logger.debug('Failed to update thread-status after auto-route (non-fatal)', {
|
|
408
|
+
sessionName,
|
|
409
|
+
error: err instanceof Error ? err.message : String(err),
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
// Mirror /slack/send bookkeeping #2 — fire the V3 SLA cascade so
|
|
414
|
+
// the matching Request transitions out of `queued`. Without
|
|
415
|
+
// this, requests whose acknowledgement came via this auto-route
|
|
416
|
+
// would never reach a terminal state.
|
|
417
|
+
if (slackContext.threadTs) {
|
|
418
|
+
try {
|
|
419
|
+
const { getRequestSlaSubscriber } = await import('../v3/request-sla.subscriber.js');
|
|
420
|
+
const sub = getRequestSlaSubscriber();
|
|
421
|
+
if (sub) {
|
|
422
|
+
await sub.markResolvedByThread(slackContext.threadTs);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
catch (err) {
|
|
426
|
+
this.logger.debug('Failed to fire SLA cascade after auto-route (non-fatal)', {
|
|
427
|
+
sessionName,
|
|
428
|
+
error: err instanceof Error ? err.message : String(err),
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
})
|
|
433
|
+
.catch((err) => {
|
|
434
|
+
this.logger.warn('Failed to auto-route in-process agent response to Slack', {
|
|
435
|
+
sessionName,
|
|
436
|
+
channelId: slackContext.channelId,
|
|
437
|
+
threadTs: slackContext.threadTs,
|
|
438
|
+
error: err instanceof Error ? err.message : String(err),
|
|
439
|
+
});
|
|
440
|
+
});
|
|
276
441
|
}
|
|
277
442
|
/**
|
|
278
443
|
* Find the project root by looking for package.json
|
|
@@ -398,7 +563,7 @@ export class AgentRegistrationService {
|
|
|
398
563
|
* Used by the terminal controller for force-delivery to in-process agents.
|
|
399
564
|
*
|
|
400
565
|
* @param sessionName - Session name to look up
|
|
401
|
-
* @returns The
|
|
566
|
+
* @returns The CrewlyAgentExternalRuntimeService if it exists, undefined otherwise
|
|
402
567
|
*/
|
|
403
568
|
getInProcessRuntime(sessionName) {
|
|
404
569
|
return this.inProcessRuntimes.get(sessionName);
|
|
@@ -441,6 +606,26 @@ export class AgentRegistrationService {
|
|
|
441
606
|
return false;
|
|
442
607
|
}
|
|
443
608
|
}
|
|
609
|
+
/**
|
|
610
|
+
* Role aliases — common synonyms users naturally type in team configs
|
|
611
|
+
* mapped to the canonical directory name under `config/roles/`. Without
|
|
612
|
+
* these, a team-config role like `"tech-lead"` would fall through to a
|
|
613
|
+
* non-existent directory and trigger the ENOENT fallback path on every
|
|
614
|
+
* agent registration (Steve 2026-05-15 dogfood: CE team config used
|
|
615
|
+
* `role: "tech-lead"` while the canonical directory is `team-leader`,
|
|
616
|
+
* producing a steady drip of "Could not load prompt from config" warns
|
|
617
|
+
* for every member-start with no actionable resolution short of editing
|
|
618
|
+
* user data).
|
|
619
|
+
*
|
|
620
|
+
* Keep keys lowercased + dash-normalized (matches the post-normalization
|
|
621
|
+
* shape used by `getPromptFileForRole`).
|
|
622
|
+
*/
|
|
623
|
+
static ROLE_DIR_ALIASES = new Map([
|
|
624
|
+
['tech-lead', 'team-leader'],
|
|
625
|
+
['techlead', 'team-leader'],
|
|
626
|
+
['tl', 'team-leader'],
|
|
627
|
+
['team-lead', 'team-leader'],
|
|
628
|
+
]);
|
|
444
629
|
/**
|
|
445
630
|
* Get prompt file path for a specific role
|
|
446
631
|
* Uses the unified config/roles/{role}/prompt.md structure
|
|
@@ -451,7 +636,10 @@ export class AgentRegistrationService {
|
|
|
451
636
|
// and trigger the silent fallback path that left agents with empty prompts (Bug #1).
|
|
452
637
|
validateAgentRole(role, 'getPromptFileForRole');
|
|
453
638
|
// Normalize role name to directory name format
|
|
454
|
-
const
|
|
639
|
+
const normalized = role.toLowerCase().replace(/\s+/g, '-');
|
|
640
|
+
// Resolve aliases (e.g. tech-lead → team-leader). Falls through for
|
|
641
|
+
// any role that already matches its directory name.
|
|
642
|
+
const roleName = AgentRegistrationService.ROLE_DIR_ALIASES.get(normalized) ?? normalized;
|
|
455
643
|
return path.join(process.cwd(), 'config', 'roles', roleName, 'prompt.md');
|
|
456
644
|
}
|
|
457
645
|
/**
|
|
@@ -1492,11 +1680,20 @@ export class AgentRegistrationService {
|
|
|
1492
1680
|
catch (error) {
|
|
1493
1681
|
// Fallback to inline prompt if file doesn't exist
|
|
1494
1682
|
const attemptedPath = await this.getPromptFileForRole(role);
|
|
1495
|
-
|
|
1683
|
+
// Distinguish "role prompt simply absent" (team-config uses a
|
|
1684
|
+
// custom role string, fallback covers it) from genuine read
|
|
1685
|
+
// failures (permission denied, corrupt file). ENOENT is a
|
|
1686
|
+
// common case — e.g. CE team config currently uses
|
|
1687
|
+
// `role: "tech-lead"` while the filesystem canonical is
|
|
1688
|
+
// `team-leader`. The fallback inline prompt is functionally
|
|
1689
|
+
// sufficient; ERROR-level noise just buries real issues.
|
|
1690
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
1691
|
+
const isMissingFile = /ENOENT/.test(msg);
|
|
1692
|
+
this.logger[isMissingFile ? 'warn' : 'error']('Could not load prompt from config, using fallback', {
|
|
1496
1693
|
role,
|
|
1497
1694
|
promptPath: attemptedPath,
|
|
1498
|
-
error:
|
|
1499
|
-
stack: error instanceof Error ? error.stack : undefined,
|
|
1695
|
+
error: msg,
|
|
1696
|
+
...(isMissingFile ? {} : { stack: error instanceof Error ? error.stack : undefined }),
|
|
1500
1697
|
});
|
|
1501
1698
|
const memberIdJson = memberId ? `,"teamMemberId":"${memberId}"` : '';
|
|
1502
1699
|
const skillsPath = path.join(this.projectRoot, 'config', 'skills', 'agent');
|
|
@@ -2497,6 +2694,21 @@ Loop until done, blocked, or explicitly reassigned:
|
|
|
2497
2694
|
sessionName, conversationId: incomingConversationId,
|
|
2498
2695
|
});
|
|
2499
2696
|
}
|
|
2697
|
+
// Auto-route to Slack when the message originated from Slack and the
|
|
2698
|
+
// agent finished with text-only output (toolCalls=0, finishReason=stop)
|
|
2699
|
+
// without explicitly invoking the reply_slack tool. Without this hook,
|
|
2700
|
+
// the in-process AI SDK runtime drops Slack replies silently — unlike
|
|
2701
|
+
// claude-code PTY where TerminalGateway tails stdout into SlackBridge,
|
|
2702
|
+
// the in-process runtime has no stream the bridge can listen to.
|
|
2703
|
+
//
|
|
2704
|
+
// Skipped when the agent already called reply_slack (which posts via
|
|
2705
|
+
// /slack/send) to prevent double-posting on the same thread.
|
|
2706
|
+
if (slackMetadata?.channelId && result.text && !agentAlreadyReplied) {
|
|
2707
|
+
this.routeInProcessResponseToSlack(sessionName, result.text, {
|
|
2708
|
+
channelId: slackMetadata.channelId,
|
|
2709
|
+
threadTs: slackMetadata.threadTs,
|
|
2710
|
+
});
|
|
2711
|
+
}
|
|
2500
2712
|
})
|
|
2501
2713
|
.catch(async (agentError) => {
|
|
2502
2714
|
const errMsg = agentError instanceof Error ? agentError.message : String(agentError);
|