crewly 1.20.106 → 1.20.108
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/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 +199 -2
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +190 -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/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 +3 -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/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/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 +42 -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 +148 -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 +271 -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 +443 -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 +383 -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 +175 -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 +199 -2
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +190 -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 +42 -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 +148 -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 +271 -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 +443 -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 +383 -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 +175 -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-488339c1.js → index-f7b99e81.js} +222 -222
- package/frontend/dist/index.html +1 -1
- package/package.json +4 -4
|
@@ -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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"}
|