crewly 1.20.105 → 1.20.107
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/README.md +22 -12
- package/config/constants.ts +43 -0
- package/config/index.ts +2 -0
- package/config/skills/_common/lib.sh +55 -2
- package/config/skills/_common/lib.test.sh +58 -1
- package/config/skills/_common/task-pool-body-shape.test.sh +60 -0
- package/config/skills/agent/core/cancel-followup/execute.sh +18 -3
- package/config/skills/agent/core/cancel-followup/execute.test.sh +73 -0
- package/config/skills/agent/core/complete-task/execute.sh +1 -1
- package/config/skills/agent/core/create-intent-tasks/execute.sh +1 -1
- package/config/skills/agent/core/create-task/SKILL.md +1 -0
- package/config/skills/agent/core/create-task/execute.sh +10 -0
- package/config/skills/agent/core/decompose-intent/execute.sh +1 -1
- package/config/skills/agent/core/handoff-task/execute.sh +1 -1
- package/config/skills/agent/core/list-my-followups/SKILL.md +1 -1
- package/config/skills/agent/core/list-my-followups/execute.sh +25 -3
- package/config/skills/agent/core/list-my-followups/execute.test.sh +72 -0
- package/config/skills/agent/core/poll-tasks/execute.sh +3 -3
- package/config/skills/agent/core/reply-channel/SKILL.md +1 -1
- package/config/skills/agent/core/report-progress/execute.sh +1 -1
- package/config/skills/agent/core/report-status/execute.sh +1 -1
- package/config/skills/agent/core/slack-post/SKILL.md +1 -1
- package/config/skills/agent/core/todo-add/SKILL.md +64 -0
- package/config/skills/agent/core/todo-add/execute.sh +84 -0
- package/config/skills/agent/core/todo-add/execute.test.sh +76 -0
- package/config/skills/agent/core/todo-lists/SKILL.md +58 -0
- package/config/skills/agent/core/todo-lists/execute.sh +70 -0
- package/config/skills/agent/core/todo-lists/execute.test.sh +77 -0
- package/config/skills/agent/core/todo-tasks/SKILL.md +59 -0
- package/config/skills/agent/core/todo-tasks/execute.sh +78 -0
- package/config/skills/agent/core/todo-tasks/execute.test.sh +74 -0
- package/config/skills/agent/core/todo-update/SKILL.md +63 -0
- package/config/skills/agent/core/todo-update/execute.sh +115 -0
- package/config/skills/agent/core/todo-update/execute.test.sh +82 -0
- package/config/skills/agent/core/update-intent-task/execute.sh +1 -1
- package/config/skills/agent/marketing/brand-onboarding/execute.sh +1 -1
- package/config/skills/agent/marketing/submit-for-approval/execute.sh +1 -1
- package/config/skills/agent/remote-browser/SOP-google-flow-video.md +1 -1
- package/config/skills/agent/remote-browser/execute.sh +33 -1
- package/config/skills/agent/remote-browser/execute.test.sh +62 -0
- package/config/skills/agent/screenshot-compare/execute.sh +1 -1
- package/config/skills/agent/transcribe-audio/SKILL.md +1 -1
- package/config/skills/agent/transcribe-audio/execute.sh +1 -1
- package/config/skills/agent/transcribe-audio/instructions.md +1 -1
- package/config/skills/orchestrator/delegate-task/SKILL.md +1 -1
- package/config/skills/orchestrator/get-tasks/SKILL.md +7 -1
- package/config/skills/orchestrator/get-tasks/execute.sh +51 -28
- package/config/skills/orchestrator/get-tasks/execute.test.sh +67 -0
- package/config/skills/orchestrator/heartbeat/execute.sh +2 -2
- package/config/skills/orchestrator/list-missions/execute.sh +1 -1
- package/config/skills/orchestrator/list-missions/execute.test.sh +38 -11
- package/config/skills/team-leader/decompose-goal/SKILL.md +1 -0
- package/config/skills/team-leader/decompose-goal/execute.sh +17 -2
- package/config/skills/team-leader/delegate-task/SKILL.md +1 -0
- package/config/skills/team-leader/delegate-task/execute.sh +6 -2
- package/dist/backend/backend/src/constants.d.ts +264 -2
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +255 -3
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts +33 -0
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.js +176 -9
- 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 +38 -35
- 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 +10 -45
- 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 +40 -89
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.d.ts +51 -0
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.js +223 -0
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.d.ts +25 -0
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js +42 -0
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/session/session.controller.d.ts +2 -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 +21 -0
- 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 +51 -3
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/restart-readiness.controller.d.ts +23 -0
- package/dist/backend/backend/src/controllers/system/restart-readiness.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/system/restart-readiness.controller.js +35 -0
- package/dist/backend/backend/src/controllers/system/restart-readiness.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/system/system.controller.d.ts +5 -3
- package/dist/backend/backend/src/controllers/system/system.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/system.controller.js +27 -6
- package/dist/backend/backend/src/controllers/system/system.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/system.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/system.routes.js +3 -0
- package/dist/backend/backend/src/controllers/system/system.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +29 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.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 +86 -6
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/tickets/tickets.controller.d.ts +41 -0
- package/dist/backend/backend/src/controllers/tickets/tickets.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/tickets/tickets.controller.js +135 -0
- package/dist/backend/backend/src/controllers/tickets/tickets.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/tickets/tickets.routes.d.ts +18 -0
- package/dist/backend/backend/src/controllers/tickets/tickets.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/tickets/tickets.routes.js +25 -0
- package/dist/backend/backend/src/controllers/tickets/tickets.routes.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts +70 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +352 -71
- 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 +6 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/scripts/leaked-stub-teams.lib.d.ts +128 -0
- package/dist/backend/backend/src/scripts/leaked-stub-teams.lib.d.ts.map +1 -0
- package/dist/backend/backend/src/scripts/leaked-stub-teams.lib.js +200 -0
- package/dist/backend/backend/src/scripts/leaked-stub-teams.lib.js.map +1 -0
- package/dist/backend/backend/src/services/agent/active-work-briefing.service.d.ts +2 -2
- package/dist/backend/backend/src/services/agent/active-work-briefing.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/active-work-briefing.service.js +3 -1
- package/dist/backend/backend/src/services/agent/active-work-briefing.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +4 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +61 -4
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts +30 -0
- package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/claude-runtime.service.js +62 -1
- package/dist/backend/backend/src/services/agent/claude-runtime.service.js.map +1 -1
- 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 +2 -1
- 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/types.d.ts +0 -2
- package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js +0 -2
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js.map +1 -1
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts +65 -1
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.js +113 -10
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/restore-filter.d.ts +12 -0
- package/dist/backend/backend/src/services/agent/restore-filter.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/restore-filter.js +19 -0
- package/dist/backend/backend/src/services/agent/restore-filter.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +3 -2
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-startup-blocked.error.d.ts +28 -0
- package/dist/backend/backend/src/services/agent/runtime-startup-blocked.error.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/runtime-startup-blocked.error.js +34 -0
- package/dist/backend/backend/src/services/agent/runtime-startup-blocked.error.js.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts +57 -5
- package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js +98 -18
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +12 -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 +25 -4
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts +2 -1
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js +5 -1
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-session.service.d.ts +38 -0
- package/dist/backend/backend/src/services/browser/browser-session.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-session.service.js +34 -0
- package/dist/backend/backend/src/services/browser/browser-session.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +6 -0
- 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 +5 -0
- 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.relay-adapter.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.relay-adapter.service.js +7 -2
- package/dist/backend/backend/src/services/chat-v2/chat-v2.relay-adapter.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +23 -1
- 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 +58 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/owner-inbound.utils.d.ts +63 -0
- package/dist/backend/backend/src/services/chat-v2/owner-inbound.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/owner-inbound.utils.js +72 -0
- package/dist/backend/backend/src/services/chat-v2/owner-inbound.utils.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +10 -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 +15 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +6 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
- package/dist/backend/backend/src/services/connector/connector-access.service.d.ts +2 -2
- package/dist/backend/backend/src/services/connector/connector-access.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/connector/connector-access.service.js +2 -2
- package/dist/backend/backend/src/services/connector/connector-access.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/retry.util.d.ts +5 -0
- package/dist/backend/backend/src/services/core/retry.util.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/retry.util.js +2 -2
- package/dist/backend/backend/src/services/core/retry.util.js.map +1 -1
- package/dist/backend/backend/src/services/factory.service.js +3 -3
- package/dist/backend/backend/src/services/factory.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/google-chat-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/google-chat-initializer.js +24 -1
- package/dist/backend/backend/src/services/messaging/google-chat-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts +9 -0
- 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 +55 -0
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +7 -0
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +12 -0
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/thread-status-queue.service.d.ts +36 -1
- package/dist/backend/backend/src/services/messaging/thread-status-queue.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/thread-status-queue.service.js +90 -2
- package/dist/backend/backend/src/services/messaging/thread-status-queue.service.js.map +1 -1
- package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.d.ts +250 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.js +367 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.js.map +1 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts +116 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js +220 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/commitment-approval-guard.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/commitment-approval-guard.js +22 -16
- package/dist/backend/backend/src/services/orchestrator/commitment-approval-guard.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/onboarding/materialize-team.js +11 -1
- package/dist/backend/backend/src/services/orchestrator/onboarding/materialize-team.js.map +1 -1
- 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 +9 -9
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
- package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +189 -0
- package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js +246 -0
- package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -0
- package/dist/backend/backend/src/services/restart/interrupted-turns.d.ts +153 -0
- package/dist/backend/backend/src/services/restart/interrupted-turns.d.ts.map +1 -0
- package/dist/backend/backend/src/services/restart/interrupted-turns.js +279 -0
- package/dist/backend/backend/src/services/restart/interrupted-turns.js.map +1 -0
- package/dist/backend/backend/src/services/restart/restart-drain.service.d.ts +176 -0
- package/dist/backend/backend/src/services/restart/restart-drain.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/restart/restart-drain.service.js +298 -0
- package/dist/backend/backend/src/services/restart/restart-drain.service.js.map +1 -0
- package/dist/backend/backend/src/services/restart/turn-probe.d.ts +52 -0
- package/dist/backend/backend/src/services/restart/turn-probe.d.ts.map +1 -0
- package/dist/backend/backend/src/services/restart/turn-probe.js +61 -0
- package/dist/backend/backend/src/services/restart/turn-probe.js.map +1 -0
- package/dist/backend/backend/src/services/session/pty/node-pty-install.utils.d.ts +70 -0
- package/dist/backend/backend/src/services/session/pty/node-pty-install.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/services/session/pty/node-pty-install.utils.js +105 -0
- package/dist/backend/backend/src/services/session/pty/node-pty-install.utils.js.map +1 -0
- package/dist/backend/backend/src/services/session/pty/pty-session.d.ts +2 -0
- package/dist/backend/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session.js +53 -1
- package/dist/backend/backend/src/services/session/pty/pty-session.js.map +1 -1
- package/dist/backend/backend/src/services/session/session-binding.d.ts +125 -0
- package/dist/backend/backend/src/services/session/session-binding.d.ts.map +1 -0
- package/dist/backend/backend/src/services/session/session-binding.js +183 -0
- package/dist/backend/backend/src/services/session/session-binding.js.map +1 -0
- 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 +19 -0
- package/dist/backend/backend/src/services/session/session-handoff.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts +10 -0
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js +37 -1
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.d.ts +4 -3
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.js +4 -3
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts +72 -7
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js +185 -23
- package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +4 -45
- 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 +57 -190
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-source-preference.service.d.ts +59 -0
- package/dist/backend/backend/src/services/slack/slack-source-preference.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-source-preference.service.js +69 -0
- package/dist/backend/backend/src/services/slack/slack-source-preference.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +18 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +64 -3
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts +33 -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 +129 -4
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/pool-archive-migration.d.ts +108 -0
- package/dist/backend/backend/src/services/task-pool/pool-archive-migration.d.ts.map +1 -0
- package/dist/backend/backend/src/services/task-pool/pool-archive-migration.js +193 -0
- package/dist/backend/backend/src/services/task-pool/pool-archive-migration.js.map +1 -0
- package/dist/backend/backend/src/services/task-pool/pool-storage.d.ts +15 -0
- package/dist/backend/backend/src/services/task-pool/pool-storage.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/pool-storage.js +30 -0
- package/dist/backend/backend/src/services/task-pool/pool-storage.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +41 -1
- 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 +55 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/telegram/telegram-orchestrator-bridge.d.ts +7 -0
- package/dist/backend/backend/src/services/telegram/telegram-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/telegram/telegram-orchestrator-bridge.js +32 -1
- package/dist/backend/backend/src/services/telegram/telegram-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +4 -3
- package/dist/backend/backend/src/services/v3/agent-auto-claim.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 +12 -0
- package/dist/backend/backend/src/services/v3/request-decompose.subscriber.js.map +1 -1
- package/dist/backend/backend/src/services/v3/request.service.d.ts +7 -0
- package/dist/backend/backend/src/services/v3/request.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/request.service.js +17 -0
- package/dist/backend/backend/src/services/v3/request.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/ticket-channel-hooks.d.ts +279 -0
- package/dist/backend/backend/src/services/v3/ticket-channel-hooks.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/ticket-channel-hooks.js +458 -0
- package/dist/backend/backend/src/services/v3/ticket-channel-hooks.js.map +1 -0
- package/dist/backend/backend/src/services/v3/ticket-intake.service.d.ts +376 -0
- package/dist/backend/backend/src/services/v3/ticket-intake.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/ticket-intake.service.js +566 -0
- package/dist/backend/backend/src/services/v3/ticket-intake.service.js.map +1 -0
- package/dist/backend/backend/src/services/v3/tl-auto-verify.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js +3 -3
- package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts +28 -4
- 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 +40 -10
- 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 +1 -0
- 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 +3 -3
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
- package/dist/backend/backend/src/types/slack.types.d.ts +29 -0
- package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/slack.types.js.map +1 -1
- package/dist/backend/backend/src/types/thread-status.types.d.ts +26 -0
- package/dist/backend/backend/src/types/thread-status.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/thread-status.types.js +17 -0
- package/dist/backend/backend/src/types/thread-status.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/index.d.ts +3 -2
- package/dist/backend/backend/src/types/v2/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/index.js +1 -1
- package/dist/backend/backend/src/types/v2/index.js.map +1 -1
- package/dist/backend/backend/src/types/v2/request.types.d.ts +39 -3
- package/dist/backend/backend/src/types/v2/request.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/request.types.js +11 -2
- package/dist/backend/backend/src/types/v2/request.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/ticket.types.d.ts +173 -0
- package/dist/backend/backend/src/types/v2/ticket.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/v2/ticket.types.js +203 -0
- package/dist/backend/backend/src/types/v2/ticket.types.js.map +1 -0
- package/dist/backend/backend/src/utils/agent-caller.utils.d.ts +26 -0
- package/dist/backend/backend/src/utils/agent-caller.utils.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/agent-caller.utils.js +40 -3
- package/dist/backend/backend/src/utils/agent-caller.utils.js.map +1 -1
- package/dist/backend/backend/src/utils/gemini-auth-settings.d.ts +62 -0
- package/dist/backend/backend/src/utils/gemini-auth-settings.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/gemini-auth-settings.js +104 -0
- package/dist/backend/backend/src/utils/gemini-auth-settings.js.map +1 -0
- package/dist/backend/backend/src/utils/local-api-url.utils.d.ts +56 -0
- package/dist/backend/backend/src/utils/local-api-url.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/local-api-url.utils.js +80 -0
- package/dist/backend/backend/src/utils/local-api-url.utils.js.map +1 -0
- package/dist/backend/build-info.json +2 -2
- package/dist/backend/config/constants.d.ts +40 -0
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +41 -0
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/backend/config/index.d.ts +4 -2
- package/dist/backend/config/index.d.ts.map +1 -1
- package/dist/backend/config/index.js +2 -2
- package/dist/backend/config/index.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +264 -2
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +255 -3
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/active-work-briefing.service.d.ts +2 -2
- package/dist/cli/backend/src/services/agent/active-work-briefing.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/active-work-briefing.service.js +3 -1
- package/dist/cli/backend/src/services/agent/active-work-briefing.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +4 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +61 -4
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/claude-runtime.service.d.ts +30 -0
- package/dist/cli/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/claude-runtime.service.js +62 -1
- package/dist/cli/backend/src/services/agent/claude-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +2 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/types.d.ts +0 -2
- package/dist/cli/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/types.js +0 -2
- package/dist/cli/backend/src/services/agent/crewly-agent/types.js.map +1 -1
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts +65 -1
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.js +113 -10
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +3 -2
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.d.ts +28 -0
- package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.js +34 -0
- package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +6 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +5 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +23 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +58 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +10 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +15 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +7 -0
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +12 -0
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts +36 -1
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js +90 -2
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js.map +1 -1
- package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +189 -0
- package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js +246 -0
- package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -0
- package/dist/cli/backend/src/services/restart/restart-drain.service.d.ts +176 -0
- package/dist/cli/backend/src/services/restart/restart-drain.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/restart/restart-drain.service.js +298 -0
- package/dist/cli/backend/src/services/restart/restart-drain.service.js.map +1 -0
- package/dist/cli/backend/src/services/session/pty/node-pty-install.utils.d.ts +70 -0
- package/dist/cli/backend/src/services/session/pty/node-pty-install.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/pty/node-pty-install.utils.js +105 -0
- package/dist/cli/backend/src/services/session/pty/node-pty-install.utils.js.map +1 -0
- package/dist/cli/backend/src/services/session/pty/pty-session.d.ts +2 -0
- package/dist/cli/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
- package/dist/cli/backend/src/services/session/pty/pty-session.js +53 -1
- package/dist/cli/backend/src/services/session/pty/pty-session.js.map +1 -1
- package/dist/cli/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/session/session-handoff.service.js +19 -0
- package/dist/cli/backend/src/services/session/session-handoff.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts +10 -0
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js +37 -1
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +4 -45
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +57 -190
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +18 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +64 -3
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts +33 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.js +129 -4
- package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/pool-storage.d.ts +15 -0
- package/dist/cli/backend/src/services/task-pool/pool-storage.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/pool-storage.js +30 -0
- package/dist/cli/backend/src/services/task-pool/pool-storage.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +41 -1
- 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 +55 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/services/v3/request.service.d.ts +7 -0
- package/dist/cli/backend/src/services/v3/request.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/request.service.js +17 -0
- package/dist/cli/backend/src/services/v3/request.service.js.map +1 -1
- package/dist/cli/backend/src/services/v3/ticket-channel-hooks.d.ts +279 -0
- package/dist/cli/backend/src/services/v3/ticket-channel-hooks.d.ts.map +1 -0
- package/dist/cli/backend/src/services/v3/ticket-channel-hooks.js +458 -0
- package/dist/cli/backend/src/services/v3/ticket-channel-hooks.js.map +1 -0
- package/dist/cli/backend/src/services/v3/ticket-intake.service.d.ts +376 -0
- package/dist/cli/backend/src/services/v3/ticket-intake.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/v3/ticket-intake.service.js +566 -0
- package/dist/cli/backend/src/services/v3/ticket-intake.service.js.map +1 -0
- package/dist/cli/backend/src/types/slack.types.d.ts +29 -0
- package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/slack.types.js.map +1 -1
- package/dist/cli/backend/src/types/thread-status.types.d.ts +26 -0
- package/dist/cli/backend/src/types/thread-status.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/thread-status.types.js +17 -0
- package/dist/cli/backend/src/types/thread-status.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/index.d.ts +3 -2
- package/dist/cli/backend/src/types/v2/index.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/index.js +1 -1
- package/dist/cli/backend/src/types/v2/index.js.map +1 -1
- package/dist/cli/backend/src/types/v2/request.types.d.ts +39 -3
- package/dist/cli/backend/src/types/v2/request.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/request.types.js +11 -2
- package/dist/cli/backend/src/types/v2/request.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/ticket.types.d.ts +173 -0
- package/dist/cli/backend/src/types/v2/ticket.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/v2/ticket.types.js +203 -0
- package/dist/cli/backend/src/types/v2/ticket.types.js.map +1 -0
- package/dist/cli/backend/src/utils/gemini-auth-settings.d.ts +62 -0
- package/dist/cli/backend/src/utils/gemini-auth-settings.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/gemini-auth-settings.js +104 -0
- package/dist/cli/backend/src/utils/gemini-auth-settings.js.map +1 -0
- package/dist/cli/backend/src/utils/local-api-url.utils.d.ts +56 -0
- package/dist/cli/backend/src/utils/local-api-url.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/local-api-url.utils.js +80 -0
- package/dist/cli/backend/src/utils/local-api-url.utils.js.map +1 -0
- package/dist/cli/cli/src/commands/doctor.d.ts +73 -2
- package/dist/cli/cli/src/commands/doctor.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/doctor.js +250 -8
- package/dist/cli/cli/src/commands/doctor.js.map +1 -1
- package/dist/cli/cli/src/commands/install.js +2 -0
- package/dist/cli/cli/src/commands/install.js.map +1 -1
- package/dist/cli/cli/src/commands/onboard.d.ts +68 -0
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +149 -18
- package/dist/cli/cli/src/commands/onboard.js.map +1 -1
- package/dist/cli/cli/src/commands/service.d.ts +6 -0
- package/dist/cli/cli/src/commands/service.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/service.js +152 -50
- package/dist/cli/cli/src/commands/service.js.map +1 -1
- package/dist/cli/cli/src/commands/start.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/start.js +25 -80
- package/dist/cli/cli/src/commands/start.js.map +1 -1
- package/dist/cli/cli/src/commands/status.d.ts +17 -1
- package/dist/cli/cli/src/commands/status.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/status.js +133 -68
- package/dist/cli/cli/src/commands/status.js.map +1 -1
- package/dist/cli/cli/src/commands/stop.d.ts +28 -1
- package/dist/cli/cli/src/commands/stop.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/stop.js +260 -100
- package/dist/cli/cli/src/commands/stop.js.map +1 -1
- package/dist/cli/cli/src/index.js +3 -2
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/scripts/ensure-node-pty.d.ts +68 -0
- package/dist/cli/cli/src/scripts/ensure-node-pty.d.ts.map +1 -0
- package/dist/cli/cli/src/scripts/ensure-node-pty.js +167 -0
- package/dist/cli/cli/src/scripts/ensure-node-pty.js.map +1 -0
- package/dist/cli/cli/src/utils/backend-status.d.ts +175 -0
- package/dist/cli/cli/src/utils/backend-status.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/backend-status.js +322 -0
- package/dist/cli/cli/src/utils/backend-status.js.map +1 -0
- package/dist/cli/cli/src/utils/marketplace.d.ts +31 -2
- package/dist/cli/cli/src/utils/marketplace.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/marketplace.js +78 -20
- package/dist/cli/cli/src/utils/marketplace.js.map +1 -1
- package/dist/cli/cli/src/utils/native-toolchain.d.ts +53 -8
- package/dist/cli/cli/src/utils/native-toolchain.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/native-toolchain.js +107 -15
- package/dist/cli/cli/src/utils/native-toolchain.js.map +1 -1
- package/dist/cli/cli/src/utils/process-cleanup.d.ts +38 -6
- package/dist/cli/cli/src/utils/process-cleanup.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/process-cleanup.js +83 -53
- package/dist/cli/cli/src/utils/process-cleanup.js.map +1 -1
- package/dist/cli/cli/src/utils/runtime-auth.d.ts +130 -0
- package/dist/cli/cli/src/utils/runtime-auth.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/runtime-auth.js +248 -0
- package/dist/cli/cli/src/utils/runtime-auth.js.map +1 -0
- package/dist/cli/cli/src/utils/safe-shutdown.d.ts +137 -0
- package/dist/cli/cli/src/utils/safe-shutdown.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/safe-shutdown.js +236 -0
- package/dist/cli/cli/src/utils/safe-shutdown.js.map +1 -0
- package/dist/cli/config/constants.d.ts +40 -0
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +41 -0
- package/dist/cli/config/constants.js.map +1 -1
- package/dist/cli/config/index.d.ts +4 -2
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js +2 -2
- package/dist/cli/config/index.js.map +1 -1
- package/frontend/dist/assets/{index-1fd45a2a.js → index-f7b99e81.js} +262 -262
- package/frontend/dist/index.html +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interrupted Turns — persist on shutdown, resume on boot.
|
|
3
|
+
*
|
|
4
|
+
* When the restart drain gives up (timeout, second signal, drain disabled),
|
|
5
|
+
* the turns still in flight are written to `<CREWLY_HOME>/interrupted-turns.json`.
|
|
6
|
+
* On the next boot those sessions count as having work in hand (so
|
|
7
|
+
* auto-restore brings them back), and once each agent is up its message is
|
|
8
|
+
* re-delivered with a short notice through the normal delivery path:
|
|
9
|
+
* - messages that came through the message queue are re-enqueued with their
|
|
10
|
+
* original source, conversation and Slack thread, so replies still route;
|
|
11
|
+
* - anything else goes through `sendMessageToAgent`, whose registration gate
|
|
12
|
+
* holds the text until the agent has registered.
|
|
13
|
+
*
|
|
14
|
+
* Scheduler / status pings ([SYSTEM] markers) are not persisted: their
|
|
15
|
+
* producers fire again after a restart, and replaying a stale ping is noise.
|
|
16
|
+
*
|
|
17
|
+
* @module services/restart/interrupted-turns
|
|
18
|
+
*/
|
|
19
|
+
import { type MessageSource } from '../../constants.js';
|
|
20
|
+
import type { InFlightTurn } from './in-flight-turn-tracker.service.js';
|
|
21
|
+
/** One interrupted message, as stored on disk. */
|
|
22
|
+
export interface InterruptedTurnEntry {
|
|
23
|
+
/** Agent session that was mid-turn */
|
|
24
|
+
sessionName: string;
|
|
25
|
+
/** Epoch ms the message was delivered */
|
|
26
|
+
deliveredAt: number;
|
|
27
|
+
/** Exactly what had been written into the PTY */
|
|
28
|
+
text: string;
|
|
29
|
+
/** One-line preview */
|
|
30
|
+
preview: string;
|
|
31
|
+
/** Queue metadata, present when the message came through the message queue */
|
|
32
|
+
messageId?: string;
|
|
33
|
+
source?: string;
|
|
34
|
+
conversationId?: string;
|
|
35
|
+
originalContent?: string;
|
|
36
|
+
sourceMetadata?: Record<string, string | number | boolean>;
|
|
37
|
+
}
|
|
38
|
+
/** Outcome of loading the file. */
|
|
39
|
+
export interface LoadedInterruptedTurns {
|
|
40
|
+
/** Entries young enough to resume */
|
|
41
|
+
fresh: InterruptedTurnEntry[];
|
|
42
|
+
/** Number of entries dropped for age or shape */
|
|
43
|
+
dropped: number;
|
|
44
|
+
}
|
|
45
|
+
/** Input for a message-queue re-enqueue. */
|
|
46
|
+
export interface ResumeEnqueueInput {
|
|
47
|
+
content: string;
|
|
48
|
+
conversationId: string;
|
|
49
|
+
source: MessageSource;
|
|
50
|
+
sourceMetadata?: Record<string, string | number | boolean>;
|
|
51
|
+
targetSession?: string;
|
|
52
|
+
}
|
|
53
|
+
/** Dependencies of {@link resumeInterruptedTurns}. */
|
|
54
|
+
export interface ResumeDeps {
|
|
55
|
+
/** Orchestrator session name */
|
|
56
|
+
orchestratorSession: string;
|
|
57
|
+
/** Whether the session is running now (PTY exists or in-process runtime registered) */
|
|
58
|
+
isSessionRunning: (sessionName: string) => boolean;
|
|
59
|
+
/** Enqueue on the persistent message queue */
|
|
60
|
+
enqueue: (input: ResumeEnqueueInput) => void;
|
|
61
|
+
/** Direct delivery (registration-gated) */
|
|
62
|
+
sendMessageToAgent: (sessionName: string, text: string) => Promise<{
|
|
63
|
+
success: boolean;
|
|
64
|
+
error?: string;
|
|
65
|
+
queued?: boolean;
|
|
66
|
+
}>;
|
|
67
|
+
/** Resolves true once the orchestrator is registered and active */
|
|
68
|
+
waitForOrchestratorActive: () => Promise<boolean>;
|
|
69
|
+
/** Called after each entry is handled (delivered, skipped or failed) */
|
|
70
|
+
onEntryHandled?: (entry: InterruptedTurnEntry, remaining: InterruptedTurnEntry[]) => void;
|
|
71
|
+
/** Logger */
|
|
72
|
+
logger: {
|
|
73
|
+
info: (msg: string, meta?: Record<string, unknown>) => void;
|
|
74
|
+
warn: (msg: string, meta?: Record<string, unknown>) => void;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/** Summary of a resume pass. */
|
|
78
|
+
export interface ResumeSummary {
|
|
79
|
+
redelivered: number;
|
|
80
|
+
skipped: number;
|
|
81
|
+
failed: number;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Default location of the interrupted-turns file.
|
|
85
|
+
*
|
|
86
|
+
* @param crewlyHome - CREWLY_HOME directory
|
|
87
|
+
* @returns Absolute file path
|
|
88
|
+
*/
|
|
89
|
+
export declare function interruptedTurnsPath(crewlyHome: string): string;
|
|
90
|
+
/**
|
|
91
|
+
* Flatten in-flight turns into storable entries, dropping [SYSTEM] pings.
|
|
92
|
+
*
|
|
93
|
+
* @param turns - Turns still in flight when the drain ended
|
|
94
|
+
* @returns Entries to persist
|
|
95
|
+
*/
|
|
96
|
+
export declare function toInterruptedEntries(turns: readonly InFlightTurn[]): InterruptedTurnEntry[];
|
|
97
|
+
/**
|
|
98
|
+
* Write entries atomically (write-then-rename), or remove the file when empty.
|
|
99
|
+
*
|
|
100
|
+
* @param filePath - File path
|
|
101
|
+
* @param entries - Entries to store
|
|
102
|
+
* @param reason - Why they were interrupted
|
|
103
|
+
*/
|
|
104
|
+
export declare function writeInterruptedTurns(filePath: string, entries: readonly InterruptedTurnEntry[], reason?: string): void;
|
|
105
|
+
/**
|
|
106
|
+
* Persist interrupted turns at shutdown, merged with any entries a previous
|
|
107
|
+
* boot had not resumed yet (so a quick second restart cannot drop them).
|
|
108
|
+
*
|
|
109
|
+
* @param filePath - File path
|
|
110
|
+
* @param turns - Turns still in flight
|
|
111
|
+
* @param reason - Drain outcome / signal
|
|
112
|
+
* @returns Number of entries now on disk
|
|
113
|
+
*/
|
|
114
|
+
export declare function saveInterruptedTurns(filePath: string, turns: readonly InFlightTurn[], reason?: string): number;
|
|
115
|
+
/**
|
|
116
|
+
* Load entries worth resuming.
|
|
117
|
+
*
|
|
118
|
+
* @param filePath - File path
|
|
119
|
+
* @param now - Current time (ms)
|
|
120
|
+
* @param maxAgeMs - Older entries are dropped
|
|
121
|
+
* @returns Fresh entries and the number dropped
|
|
122
|
+
*/
|
|
123
|
+
export declare function loadInterruptedTurns(filePath: string, now?: number, maxAgeMs?: number): LoadedInterruptedTurns;
|
|
124
|
+
/**
|
|
125
|
+
* Remove the file (missing file is fine).
|
|
126
|
+
*
|
|
127
|
+
* @param filePath - File path
|
|
128
|
+
*/
|
|
129
|
+
export declare function clearInterruptedTurns(filePath: string): void;
|
|
130
|
+
/**
|
|
131
|
+
* Prefix a message with the resume notice, without stacking notices when a
|
|
132
|
+
* resumed message is itself interrupted again.
|
|
133
|
+
*
|
|
134
|
+
* @param original - The message to resume
|
|
135
|
+
* @returns Notice + original
|
|
136
|
+
*/
|
|
137
|
+
export declare function buildResumeMessage(original: string): string;
|
|
138
|
+
/**
|
|
139
|
+
* Re-deliver interrupted messages, one at a time.
|
|
140
|
+
*
|
|
141
|
+
* @param entries - Fresh entries from loadInterruptedTurns
|
|
142
|
+
* @param deps - Delivery hooks
|
|
143
|
+
* @returns Counts of redelivered / skipped / failed
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* ```typescript
|
|
147
|
+
* const { fresh } = loadInterruptedTurns(file);
|
|
148
|
+
* await resumeInterruptedTurns(fresh, deps);
|
|
149
|
+
* clearInterruptedTurns(file);
|
|
150
|
+
* ```
|
|
151
|
+
*/
|
|
152
|
+
export declare function resumeInterruptedTurns(entries: readonly InterruptedTurnEntry[], deps: ResumeDeps): Promise<ResumeSummary>;
|
|
153
|
+
//# sourceMappingURL=interrupted-turns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interrupted-turns.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/restart/interrupted-turns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interrupted Turns — persist on shutdown, resume on boot.
|
|
3
|
+
*
|
|
4
|
+
* When the restart drain gives up (timeout, second signal, drain disabled),
|
|
5
|
+
* the turns still in flight are written to `<CREWLY_HOME>/interrupted-turns.json`.
|
|
6
|
+
* On the next boot those sessions count as having work in hand (so
|
|
7
|
+
* auto-restore brings them back), and once each agent is up its message is
|
|
8
|
+
* re-delivered with a short notice through the normal delivery path:
|
|
9
|
+
* - messages that came through the message queue are re-enqueued with their
|
|
10
|
+
* original source, conversation and Slack thread, so replies still route;
|
|
11
|
+
* - anything else goes through `sendMessageToAgent`, whose registration gate
|
|
12
|
+
* holds the text until the agent has registered.
|
|
13
|
+
*
|
|
14
|
+
* Scheduler / status pings ([SYSTEM] markers) are not persisted: their
|
|
15
|
+
* producers fire again after a restart, and replaying a stale ping is noise.
|
|
16
|
+
*
|
|
17
|
+
* @module services/restart/interrupted-turns
|
|
18
|
+
*/
|
|
19
|
+
import { readFileSync, writeFileSync, renameSync, mkdirSync, unlinkSync } from 'fs';
|
|
20
|
+
import * as path from 'path';
|
|
21
|
+
import { SAFE_RESTART, MESSAGE_SOURCES } from '../../constants.js';
|
|
22
|
+
const SOURCE_VALUES = new Set(Object.values(MESSAGE_SOURCES));
|
|
23
|
+
/**
|
|
24
|
+
* Default location of the interrupted-turns file.
|
|
25
|
+
*
|
|
26
|
+
* @param crewlyHome - CREWLY_HOME directory
|
|
27
|
+
* @returns Absolute file path
|
|
28
|
+
*/
|
|
29
|
+
export function interruptedTurnsPath(crewlyHome) {
|
|
30
|
+
return path.join(crewlyHome, SAFE_RESTART.INTERRUPTED_TURNS_FILE);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Flatten in-flight turns into storable entries, dropping [SYSTEM] pings.
|
|
34
|
+
*
|
|
35
|
+
* @param turns - Turns still in flight when the drain ended
|
|
36
|
+
* @returns Entries to persist
|
|
37
|
+
*/
|
|
38
|
+
export function toInterruptedEntries(turns) {
|
|
39
|
+
const out = [];
|
|
40
|
+
for (const turn of turns) {
|
|
41
|
+
for (const m of turn.messages) {
|
|
42
|
+
if (m.systemEvent)
|
|
43
|
+
continue;
|
|
44
|
+
out.push({
|
|
45
|
+
sessionName: turn.sessionName,
|
|
46
|
+
deliveredAt: m.deliveredAt,
|
|
47
|
+
text: m.text,
|
|
48
|
+
preview: m.preview,
|
|
49
|
+
...(m.messageId ? { messageId: m.messageId } : {}),
|
|
50
|
+
...(m.source ? { source: m.source } : {}),
|
|
51
|
+
...(m.conversationId ? { conversationId: m.conversationId } : {}),
|
|
52
|
+
...(m.originalContent !== undefined ? { originalContent: m.originalContent } : {}),
|
|
53
|
+
...(m.sourceMetadata ? { sourceMetadata: m.sourceMetadata } : {}),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Read the file without filtering. Missing or unreadable file → [].
|
|
61
|
+
*
|
|
62
|
+
* @param filePath - File path
|
|
63
|
+
* @returns Stored entries
|
|
64
|
+
*/
|
|
65
|
+
function readEntries(filePath) {
|
|
66
|
+
try {
|
|
67
|
+
const parsed = JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
68
|
+
return Array.isArray(parsed.turns) ? parsed.turns : [];
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Write entries atomically (write-then-rename), or remove the file when empty.
|
|
76
|
+
*
|
|
77
|
+
* @param filePath - File path
|
|
78
|
+
* @param entries - Entries to store
|
|
79
|
+
* @param reason - Why they were interrupted
|
|
80
|
+
*/
|
|
81
|
+
export function writeInterruptedTurns(filePath, entries, reason) {
|
|
82
|
+
if (entries.length === 0) {
|
|
83
|
+
clearInterruptedTurns(filePath);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const body = {
|
|
87
|
+
version: 1,
|
|
88
|
+
savedAt: new Date().toISOString(),
|
|
89
|
+
...(reason ? { reason } : {}),
|
|
90
|
+
turns: [...entries],
|
|
91
|
+
};
|
|
92
|
+
mkdirSync(path.dirname(filePath), { recursive: true });
|
|
93
|
+
const tmp = `${filePath}.tmp`;
|
|
94
|
+
writeFileSync(tmp, JSON.stringify(body, null, 2), 'utf-8');
|
|
95
|
+
renameSync(tmp, filePath);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Persist interrupted turns at shutdown, merged with any entries a previous
|
|
99
|
+
* boot had not resumed yet (so a quick second restart cannot drop them).
|
|
100
|
+
*
|
|
101
|
+
* @param filePath - File path
|
|
102
|
+
* @param turns - Turns still in flight
|
|
103
|
+
* @param reason - Drain outcome / signal
|
|
104
|
+
* @returns Number of entries now on disk
|
|
105
|
+
*/
|
|
106
|
+
export function saveInterruptedTurns(filePath, turns, reason) {
|
|
107
|
+
const incoming = toInterruptedEntries(turns);
|
|
108
|
+
const existing = readEntries(filePath);
|
|
109
|
+
const key = (e) => `${e.sessionName}\u0000${e.deliveredAt}\u0000${e.text}`;
|
|
110
|
+
const seen = new Set();
|
|
111
|
+
const merged = [];
|
|
112
|
+
for (const e of [...existing, ...incoming]) {
|
|
113
|
+
const k = key(e);
|
|
114
|
+
if (seen.has(k))
|
|
115
|
+
continue;
|
|
116
|
+
seen.add(k);
|
|
117
|
+
merged.push(e);
|
|
118
|
+
}
|
|
119
|
+
if (merged.length === 0)
|
|
120
|
+
return 0;
|
|
121
|
+
writeInterruptedTurns(filePath, merged, reason);
|
|
122
|
+
return merged.length;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Load entries worth resuming.
|
|
126
|
+
*
|
|
127
|
+
* @param filePath - File path
|
|
128
|
+
* @param now - Current time (ms)
|
|
129
|
+
* @param maxAgeMs - Older entries are dropped
|
|
130
|
+
* @returns Fresh entries and the number dropped
|
|
131
|
+
*/
|
|
132
|
+
export function loadInterruptedTurns(filePath, now = Date.now(), maxAgeMs = SAFE_RESTART.INTERRUPTED_TURN_MAX_AGE_MS) {
|
|
133
|
+
const all = readEntries(filePath);
|
|
134
|
+
const fresh = [];
|
|
135
|
+
let dropped = 0;
|
|
136
|
+
for (const e of all) {
|
|
137
|
+
const valid = e &&
|
|
138
|
+
typeof e.sessionName === 'string' &&
|
|
139
|
+
e.sessionName.length > 0 &&
|
|
140
|
+
typeof e.text === 'string' &&
|
|
141
|
+
typeof e.deliveredAt === 'number' &&
|
|
142
|
+
now - e.deliveredAt <= maxAgeMs;
|
|
143
|
+
if (valid)
|
|
144
|
+
fresh.push(e);
|
|
145
|
+
else
|
|
146
|
+
dropped += 1;
|
|
147
|
+
}
|
|
148
|
+
return { fresh, dropped };
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Remove the file (missing file is fine).
|
|
152
|
+
*
|
|
153
|
+
* @param filePath - File path
|
|
154
|
+
*/
|
|
155
|
+
export function clearInterruptedTurns(filePath) {
|
|
156
|
+
try {
|
|
157
|
+
unlinkSync(filePath);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// Already gone.
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Prefix a message with the resume notice, without stacking notices when a
|
|
165
|
+
* resumed message is itself interrupted again.
|
|
166
|
+
*
|
|
167
|
+
* @param original - The message to resume
|
|
168
|
+
* @returns Notice + original
|
|
169
|
+
*/
|
|
170
|
+
export function buildResumeMessage(original) {
|
|
171
|
+
let body = original;
|
|
172
|
+
while (body.startsWith(SAFE_RESTART.RESUME_NOTICE)) {
|
|
173
|
+
body = body.slice(SAFE_RESTART.RESUME_NOTICE.length).replace(/^\s+/, '');
|
|
174
|
+
}
|
|
175
|
+
return `${SAFE_RESTART.RESUME_NOTICE}\n${body}`;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Whether an entry carries enough queue metadata to be re-enqueued.
|
|
179
|
+
*
|
|
180
|
+
* @param entry - Stored entry
|
|
181
|
+
* @returns True for message-queue deliveries with a known source
|
|
182
|
+
*/
|
|
183
|
+
function isQueueEntry(entry) {
|
|
184
|
+
return (typeof entry.source === 'string' &&
|
|
185
|
+
SOURCE_VALUES.has(entry.source) &&
|
|
186
|
+
entry.source !== MESSAGE_SOURCES.SYSTEM_EVENT &&
|
|
187
|
+
typeof entry.conversationId === 'string' &&
|
|
188
|
+
entry.conversationId.length > 0 &&
|
|
189
|
+
typeof entry.originalContent === 'string');
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Re-deliver interrupted messages, one at a time.
|
|
193
|
+
*
|
|
194
|
+
* @param entries - Fresh entries from loadInterruptedTurns
|
|
195
|
+
* @param deps - Delivery hooks
|
|
196
|
+
* @returns Counts of redelivered / skipped / failed
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
* ```typescript
|
|
200
|
+
* const { fresh } = loadInterruptedTurns(file);
|
|
201
|
+
* await resumeInterruptedTurns(fresh, deps);
|
|
202
|
+
* clearInterruptedTurns(file);
|
|
203
|
+
* ```
|
|
204
|
+
*/
|
|
205
|
+
export async function resumeInterruptedTurns(entries, deps) {
|
|
206
|
+
const summary = { redelivered: 0, skipped: 0, failed: 0 };
|
|
207
|
+
const remaining = [...entries];
|
|
208
|
+
let orcReady = null;
|
|
209
|
+
for (const entry of entries) {
|
|
210
|
+
const isOrc = entry.sessionName === deps.orchestratorSession;
|
|
211
|
+
try {
|
|
212
|
+
if (!isOrc && !deps.isSessionRunning(entry.sessionName)) {
|
|
213
|
+
summary.skipped += 1;
|
|
214
|
+
deps.logger.warn('Interrupted turn not resumed: agent is not running after restart', {
|
|
215
|
+
sessionName: entry.sessionName,
|
|
216
|
+
messagePreview: entry.preview,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
else if (isQueueEntry(entry)) {
|
|
220
|
+
deps.enqueue({
|
|
221
|
+
content: buildResumeMessage(entry.originalContent),
|
|
222
|
+
conversationId: entry.conversationId,
|
|
223
|
+
source: entry.source,
|
|
224
|
+
...(entry.sourceMetadata ? { sourceMetadata: entry.sourceMetadata } : {}),
|
|
225
|
+
...(isOrc ? {} : { targetSession: entry.sessionName }),
|
|
226
|
+
});
|
|
227
|
+
summary.redelivered += 1;
|
|
228
|
+
deps.logger.info('Interrupted turn re-enqueued with its original source', {
|
|
229
|
+
sessionName: entry.sessionName,
|
|
230
|
+
source: entry.source,
|
|
231
|
+
messagePreview: entry.preview,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
if (isOrc) {
|
|
236
|
+
if (orcReady === null)
|
|
237
|
+
orcReady = await deps.waitForOrchestratorActive();
|
|
238
|
+
if (!orcReady) {
|
|
239
|
+
summary.failed += 1;
|
|
240
|
+
deps.logger.warn('Interrupted turn not resumed: orchestrator never became active', {
|
|
241
|
+
messagePreview: entry.preview,
|
|
242
|
+
});
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
const result = await deps.sendMessageToAgent(entry.sessionName, buildResumeMessage(entry.text));
|
|
247
|
+
if (result.success) {
|
|
248
|
+
summary.redelivered += 1;
|
|
249
|
+
deps.logger.info('Interrupted turn re-delivered', {
|
|
250
|
+
sessionName: entry.sessionName,
|
|
251
|
+
queuedUntilRegistered: result.queued === true,
|
|
252
|
+
messagePreview: entry.preview,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
summary.failed += 1;
|
|
257
|
+
deps.logger.warn('Interrupted turn re-delivery failed', {
|
|
258
|
+
sessionName: entry.sessionName,
|
|
259
|
+
error: result.error,
|
|
260
|
+
messagePreview: entry.preview,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
summary.failed += 1;
|
|
267
|
+
deps.logger.warn('Interrupted turn re-delivery threw', {
|
|
268
|
+
sessionName: entry.sessionName,
|
|
269
|
+
error: error instanceof Error ? error.message : String(error),
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
finally {
|
|
273
|
+
remaining.splice(remaining.indexOf(entry), 1);
|
|
274
|
+
deps.onEntryHandled?.(entry, [...remaining]);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return summary;
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=interrupted-turns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interrupted-turns.js","sourceRoot":"","sources":["../../../../../../backend/src/services/restart/interrupted-turns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Restart Drain Service
|
|
3
|
+
*
|
|
4
|
+
* Owns the "safe restart" state of the process:
|
|
5
|
+
* - a delivery pause: once shutdown starts, nothing new is written into an
|
|
6
|
+
* agent's PTY — messages stay on the persistent queues instead;
|
|
7
|
+
* - the drain: wait until no agent is mid-turn, capped by a timeout, and
|
|
8
|
+
* interruptible by a second signal;
|
|
9
|
+
* - restart readiness for operators (`GET /api/system/restart-readiness`);
|
|
10
|
+
* - a hook through which the REST restart endpoint asks the server for the
|
|
11
|
+
* same graceful, drained shutdown a SIGTERM gets.
|
|
12
|
+
*
|
|
13
|
+
* "Queue empty" is not "safe to restart": a delivered message is off the
|
|
14
|
+
* queue while the agent is still working on it (2026-09-24, Ella). Readiness
|
|
15
|
+
* therefore reports in-flight turns, not queue depth.
|
|
16
|
+
*
|
|
17
|
+
* @module services/restart/restart-drain
|
|
18
|
+
*/
|
|
19
|
+
import { type InFlightTurn } from './in-flight-turn-tracker.service.js';
|
|
20
|
+
/** How a drain ended. */
|
|
21
|
+
export type DrainOutcome = 'drained' | 'timed-out' | 'skipped' | 'disabled';
|
|
22
|
+
/** Result of a drain. */
|
|
23
|
+
export interface DrainResult {
|
|
24
|
+
/** How it ended */
|
|
25
|
+
outcome: DrainOutcome;
|
|
26
|
+
/** Time spent waiting (ms) */
|
|
27
|
+
waitedMs: number;
|
|
28
|
+
/** Turns still in flight when the drain ended (to be persisted and resumed) */
|
|
29
|
+
remaining: InFlightTurn[];
|
|
30
|
+
}
|
|
31
|
+
/** Options for {@link RestartDrainService.drain}. */
|
|
32
|
+
export interface DrainOptions {
|
|
33
|
+
/** Maximum wait (ms); 0 skips the wait */
|
|
34
|
+
timeoutMs: number;
|
|
35
|
+
/** Re-check interval (ms) */
|
|
36
|
+
pollMs?: number;
|
|
37
|
+
/** Interval for the repeated "still waiting" log line (ms) */
|
|
38
|
+
logIntervalMs?: number;
|
|
39
|
+
/** Clock (tests) */
|
|
40
|
+
now?: () => number;
|
|
41
|
+
/** Sleep (tests) */
|
|
42
|
+
sleep?: (ms: number) => Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
/** One agent the readiness endpoint reports as busy. */
|
|
45
|
+
export interface BusyAgent {
|
|
46
|
+
/** Agent session name */
|
|
47
|
+
session: string;
|
|
48
|
+
/** ISO time of the oldest open delivery */
|
|
49
|
+
since: string;
|
|
50
|
+
/** Preview of the most recent open delivery */
|
|
51
|
+
messagePreview: string;
|
|
52
|
+
}
|
|
53
|
+
/** Body of `GET /api/system/restart-readiness`. */
|
|
54
|
+
export interface RestartReadiness {
|
|
55
|
+
/** True when no agent is mid-turn */
|
|
56
|
+
safe: boolean;
|
|
57
|
+
/** Agents mid-turn */
|
|
58
|
+
busyAgents: BusyAgent[];
|
|
59
|
+
/** Messages waiting on the persistent queues (they survive a restart) */
|
|
60
|
+
queued: number;
|
|
61
|
+
/** True when a shutdown drain is already running */
|
|
62
|
+
draining: boolean;
|
|
63
|
+
}
|
|
64
|
+
/** Options for a graceful shutdown requested through the service. */
|
|
65
|
+
export interface GracefulShutdownRequest {
|
|
66
|
+
/** Why (for logs) */
|
|
67
|
+
reason: string;
|
|
68
|
+
/** Process exit code at the end of shutdown */
|
|
69
|
+
exitCode?: number;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Resolve the drain timeout from the environment.
|
|
73
|
+
*
|
|
74
|
+
* @param env - Environment (defaults to process.env)
|
|
75
|
+
* @returns Timeout in ms; 0 disables the wait. Invalid or negative values fall back to the default.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* resolveRestartDrainMs({ CREWLY_RESTART_DRAIN_MS: '0' }); // 0
|
|
80
|
+
* resolveRestartDrainMs({}); // 120000
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export declare function resolveRestartDrainMs(env?: NodeJS.ProcessEnv): number;
|
|
84
|
+
/**
|
|
85
|
+
* Process-wide safe-restart state. Singleton.
|
|
86
|
+
*/
|
|
87
|
+
export declare class RestartDrainService {
|
|
88
|
+
private readonly tracker;
|
|
89
|
+
private static instance;
|
|
90
|
+
private readonly logger;
|
|
91
|
+
private paused;
|
|
92
|
+
private pauseReason;
|
|
93
|
+
private draining;
|
|
94
|
+
private skipRequested;
|
|
95
|
+
private wakeSleeper;
|
|
96
|
+
private queueCounter;
|
|
97
|
+
private shutdownHandler;
|
|
98
|
+
private constructor();
|
|
99
|
+
/**
|
|
100
|
+
* Get the singleton instance.
|
|
101
|
+
*
|
|
102
|
+
* @returns The service
|
|
103
|
+
*/
|
|
104
|
+
static getInstance(): RestartDrainService;
|
|
105
|
+
/**
|
|
106
|
+
* Reset the singleton (tests only).
|
|
107
|
+
*/
|
|
108
|
+
static resetInstance(): void;
|
|
109
|
+
/**
|
|
110
|
+
* Whether deliveries into agent PTYs are paused (shutdown in progress).
|
|
111
|
+
*
|
|
112
|
+
* @returns True while paused
|
|
113
|
+
*/
|
|
114
|
+
isDeliveryPaused(): boolean;
|
|
115
|
+
/**
|
|
116
|
+
* Whether the drain wait is running right now.
|
|
117
|
+
*
|
|
118
|
+
* @returns True during the wait
|
|
119
|
+
*/
|
|
120
|
+
isDraining(): boolean;
|
|
121
|
+
/**
|
|
122
|
+
* Stop writing new messages into agent PTYs. Idempotent; never undone in
|
|
123
|
+
* this process (the next boot starts unpaused).
|
|
124
|
+
*
|
|
125
|
+
* @param reason - Why (for logs)
|
|
126
|
+
*/
|
|
127
|
+
pauseDelivery(reason: string): void;
|
|
128
|
+
/**
|
|
129
|
+
* Ask a running drain to stop waiting (second signal, supervisor escalation).
|
|
130
|
+
*
|
|
131
|
+
* @param reason - Why (for logs)
|
|
132
|
+
* @returns True if a drain was running and will now end
|
|
133
|
+
*/
|
|
134
|
+
requestSkip(reason: string): boolean;
|
|
135
|
+
/**
|
|
136
|
+
* Register the counter used for `queued` in readiness.
|
|
137
|
+
*
|
|
138
|
+
* @param counter - Returns the number of messages on the persistent queues
|
|
139
|
+
*/
|
|
140
|
+
setQueueCounter(counter: (() => number) | null): void;
|
|
141
|
+
/**
|
|
142
|
+
* Register the server's graceful-shutdown entry point.
|
|
143
|
+
*
|
|
144
|
+
* @param handler - Runs the drained shutdown and exits the process
|
|
145
|
+
*/
|
|
146
|
+
setShutdownHandler(handler: ((request: GracefulShutdownRequest) => Promise<void>) | null): void;
|
|
147
|
+
/**
|
|
148
|
+
* Run the server's graceful (drained) shutdown, if one is registered.
|
|
149
|
+
*
|
|
150
|
+
* @param request - Reason and exit code
|
|
151
|
+
* @returns True if a handler was registered and has been started
|
|
152
|
+
*/
|
|
153
|
+
requestGracefulShutdown(request: GracefulShutdownRequest): boolean;
|
|
154
|
+
/**
|
|
155
|
+
* Current restart readiness.
|
|
156
|
+
*
|
|
157
|
+
* @returns Busy agents, queued count, and whether a restart is safe now
|
|
158
|
+
*/
|
|
159
|
+
getReadiness(): RestartReadiness;
|
|
160
|
+
/**
|
|
161
|
+
* Wait until no agent is mid-turn, the timeout passes, or a skip arrives.
|
|
162
|
+
* Pauses delivery first (idempotent) so the set of turns can only shrink.
|
|
163
|
+
*
|
|
164
|
+
* @param options - Timeout and test hooks
|
|
165
|
+
* @returns How it ended and the turns still in flight
|
|
166
|
+
*/
|
|
167
|
+
drain(options: DrainOptions): Promise<DrainResult>;
|
|
168
|
+
/**
|
|
169
|
+
* Sleep, but wake early when a skip is requested.
|
|
170
|
+
*
|
|
171
|
+
* @param sleep - Injected sleep (tests), or null for a cancellable timer
|
|
172
|
+
* @param ms - Duration
|
|
173
|
+
*/
|
|
174
|
+
private sleepUnlessSkipped;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=restart-drain.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart-drain.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/restart/restart-drain.service.ts"],"names":[],"mappings":"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"}
|