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,298 @@
|
|
|
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 { LoggerService } from '../core/logger.service.js';
|
|
20
|
+
import { SAFE_RESTART } from '../../constants.js';
|
|
21
|
+
import { InFlightTurnTracker } from './in-flight-turn-tracker.service.js';
|
|
22
|
+
/**
|
|
23
|
+
* Resolve the drain timeout from the environment.
|
|
24
|
+
*
|
|
25
|
+
* @param env - Environment (defaults to process.env)
|
|
26
|
+
* @returns Timeout in ms; 0 disables the wait. Invalid or negative values fall back to the default.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* resolveRestartDrainMs({ CREWLY_RESTART_DRAIN_MS: '0' }); // 0
|
|
31
|
+
* resolveRestartDrainMs({}); // 120000
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export function resolveRestartDrainMs(env = process.env) {
|
|
35
|
+
const raw = env[SAFE_RESTART.DRAIN_ENV_VAR];
|
|
36
|
+
if (raw === undefined || raw.trim() === '')
|
|
37
|
+
return SAFE_RESTART.DRAIN_TIMEOUT_MS;
|
|
38
|
+
const parsed = Number(raw);
|
|
39
|
+
if (!Number.isFinite(parsed) || parsed < 0)
|
|
40
|
+
return SAFE_RESTART.DRAIN_TIMEOUT_MS;
|
|
41
|
+
return Math.floor(parsed);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Process-wide safe-restart state. Singleton.
|
|
45
|
+
*/
|
|
46
|
+
export class RestartDrainService {
|
|
47
|
+
tracker;
|
|
48
|
+
static instance = null;
|
|
49
|
+
logger;
|
|
50
|
+
paused = false;
|
|
51
|
+
pauseReason = null;
|
|
52
|
+
draining = false;
|
|
53
|
+
skipRequested = false;
|
|
54
|
+
wakeSleeper = null;
|
|
55
|
+
queueCounter = null;
|
|
56
|
+
shutdownHandler = null;
|
|
57
|
+
constructor(tracker) {
|
|
58
|
+
this.tracker = tracker;
|
|
59
|
+
this.logger = LoggerService.getInstance().createComponentLogger('RestartDrain');
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get the singleton instance.
|
|
63
|
+
*
|
|
64
|
+
* @returns The service
|
|
65
|
+
*/
|
|
66
|
+
static getInstance() {
|
|
67
|
+
if (!RestartDrainService.instance) {
|
|
68
|
+
RestartDrainService.instance = new RestartDrainService(InFlightTurnTracker.getInstance());
|
|
69
|
+
}
|
|
70
|
+
return RestartDrainService.instance;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Reset the singleton (tests only).
|
|
74
|
+
*/
|
|
75
|
+
static resetInstance() {
|
|
76
|
+
RestartDrainService.instance = null;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Whether deliveries into agent PTYs are paused (shutdown in progress).
|
|
80
|
+
*
|
|
81
|
+
* @returns True while paused
|
|
82
|
+
*/
|
|
83
|
+
isDeliveryPaused() {
|
|
84
|
+
return this.paused;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Whether the drain wait is running right now.
|
|
88
|
+
*
|
|
89
|
+
* @returns True during the wait
|
|
90
|
+
*/
|
|
91
|
+
isDraining() {
|
|
92
|
+
return this.draining;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Stop writing new messages into agent PTYs. Idempotent; never undone in
|
|
96
|
+
* this process (the next boot starts unpaused).
|
|
97
|
+
*
|
|
98
|
+
* @param reason - Why (for logs)
|
|
99
|
+
*/
|
|
100
|
+
pauseDelivery(reason) {
|
|
101
|
+
if (this.paused)
|
|
102
|
+
return;
|
|
103
|
+
this.paused = true;
|
|
104
|
+
this.pauseReason = reason;
|
|
105
|
+
this.logger.info('Agent message delivery paused for shutdown; new messages stay queued', { reason });
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Ask a running drain to stop waiting (second signal, supervisor escalation).
|
|
109
|
+
*
|
|
110
|
+
* @param reason - Why (for logs)
|
|
111
|
+
* @returns True if a drain was running and will now end
|
|
112
|
+
*/
|
|
113
|
+
requestSkip(reason) {
|
|
114
|
+
if (!this.draining)
|
|
115
|
+
return false;
|
|
116
|
+
if (!this.skipRequested) {
|
|
117
|
+
this.logger.warn('Drain skipped on request; in-flight turns will be resumed after restart', { reason });
|
|
118
|
+
}
|
|
119
|
+
this.skipRequested = true;
|
|
120
|
+
this.wakeSleeper?.();
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Register the counter used for `queued` in readiness.
|
|
125
|
+
*
|
|
126
|
+
* @param counter - Returns the number of messages on the persistent queues
|
|
127
|
+
*/
|
|
128
|
+
setQueueCounter(counter) {
|
|
129
|
+
this.queueCounter = counter;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Register the server's graceful-shutdown entry point.
|
|
133
|
+
*
|
|
134
|
+
* @param handler - Runs the drained shutdown and exits the process
|
|
135
|
+
*/
|
|
136
|
+
setShutdownHandler(handler) {
|
|
137
|
+
this.shutdownHandler = handler;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Run the server's graceful (drained) shutdown, if one is registered.
|
|
141
|
+
*
|
|
142
|
+
* @param request - Reason and exit code
|
|
143
|
+
* @returns True if a handler was registered and has been started
|
|
144
|
+
*/
|
|
145
|
+
requestGracefulShutdown(request) {
|
|
146
|
+
if (!this.shutdownHandler)
|
|
147
|
+
return false;
|
|
148
|
+
void this.shutdownHandler(request).catch((error) => {
|
|
149
|
+
this.logger.error('Graceful shutdown handler failed', {
|
|
150
|
+
reason: request.reason,
|
|
151
|
+
error: error instanceof Error ? error.message : String(error),
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Current restart readiness.
|
|
158
|
+
*
|
|
159
|
+
* @returns Busy agents, queued count, and whether a restart is safe now
|
|
160
|
+
*/
|
|
161
|
+
getReadiness() {
|
|
162
|
+
const busy = this.tracker.getMidTurn();
|
|
163
|
+
let queued = 0;
|
|
164
|
+
try {
|
|
165
|
+
queued = this.queueCounter ? this.queueCounter() : 0;
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
queued = 0;
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
safe: busy.length === 0,
|
|
172
|
+
busyAgents: busy.map(toBusyAgent),
|
|
173
|
+
queued,
|
|
174
|
+
draining: this.draining,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Wait until no agent is mid-turn, the timeout passes, or a skip arrives.
|
|
179
|
+
* Pauses delivery first (idempotent) so the set of turns can only shrink.
|
|
180
|
+
*
|
|
181
|
+
* @param options - Timeout and test hooks
|
|
182
|
+
* @returns How it ended and the turns still in flight
|
|
183
|
+
*/
|
|
184
|
+
async drain(options) {
|
|
185
|
+
const now = options.now ?? Date.now;
|
|
186
|
+
const pollMs = options.pollMs ?? SAFE_RESTART.DRAIN_POLL_INTERVAL_MS;
|
|
187
|
+
const logIntervalMs = options.logIntervalMs ?? SAFE_RESTART.DRAIN_LOG_INTERVAL_MS;
|
|
188
|
+
const sleep = options.sleep ?? null;
|
|
189
|
+
const start = now();
|
|
190
|
+
this.pauseDelivery(this.pauseReason ?? 'drain');
|
|
191
|
+
if (options.timeoutMs <= 0) {
|
|
192
|
+
const remaining = this.tracker.getMidTurn(now());
|
|
193
|
+
this.logger.info('Restart drain disabled; not waiting for agents', {
|
|
194
|
+
envVar: SAFE_RESTART.DRAIN_ENV_VAR,
|
|
195
|
+
inFlight: remaining.map(describeTurn),
|
|
196
|
+
});
|
|
197
|
+
return { outcome: 'disabled', waitedMs: 0, remaining };
|
|
198
|
+
}
|
|
199
|
+
this.draining = true;
|
|
200
|
+
let lastLogAt = -Infinity;
|
|
201
|
+
let lastLoggedKey = '';
|
|
202
|
+
try {
|
|
203
|
+
for (;;) {
|
|
204
|
+
const t = now();
|
|
205
|
+
const busy = this.tracker.getMidTurn(t);
|
|
206
|
+
const waitedMs = t - start;
|
|
207
|
+
if (busy.length === 0) {
|
|
208
|
+
this.logger.info('Restart drain complete: no agent is mid-turn', { waitedMs });
|
|
209
|
+
return { outcome: 'drained', waitedMs, remaining: [] };
|
|
210
|
+
}
|
|
211
|
+
if (this.skipRequested) {
|
|
212
|
+
this.logger.warn('Restart drain skipped; these turns will be resumed after restart', {
|
|
213
|
+
waitedMs,
|
|
214
|
+
interrupted: busy.map(describeTurn),
|
|
215
|
+
});
|
|
216
|
+
return { outcome: 'skipped', waitedMs, remaining: busy };
|
|
217
|
+
}
|
|
218
|
+
if (waitedMs >= options.timeoutMs) {
|
|
219
|
+
this.logger.warn('Restart drain timed out; these turns will be resumed after restart', {
|
|
220
|
+
waitedMs,
|
|
221
|
+
timeoutMs: options.timeoutMs,
|
|
222
|
+
interrupted: busy.map(describeTurn),
|
|
223
|
+
});
|
|
224
|
+
return { outcome: 'timed-out', waitedMs, remaining: busy };
|
|
225
|
+
}
|
|
226
|
+
const key = busy.map((b) => b.sessionName).join(',');
|
|
227
|
+
if (key !== lastLoggedKey || t - lastLogAt >= logIntervalMs) {
|
|
228
|
+
this.logger.info('Restart drain: waiting for agents to finish their current turn', {
|
|
229
|
+
waitingOn: busy.map(describeTurn),
|
|
230
|
+
waitedMs,
|
|
231
|
+
timeoutMs: options.timeoutMs,
|
|
232
|
+
hint: 'send the signal again to stop waiting',
|
|
233
|
+
});
|
|
234
|
+
lastLoggedKey = key;
|
|
235
|
+
lastLogAt = t;
|
|
236
|
+
}
|
|
237
|
+
await this.sleepUnlessSkipped(sleep, Math.min(pollMs, options.timeoutMs - waitedMs));
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
finally {
|
|
241
|
+
this.draining = false;
|
|
242
|
+
this.wakeSleeper = null;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Sleep, but wake early when a skip is requested.
|
|
247
|
+
*
|
|
248
|
+
* @param sleep - Injected sleep (tests), or null for a cancellable timer
|
|
249
|
+
* @param ms - Duration
|
|
250
|
+
*/
|
|
251
|
+
async sleepUnlessSkipped(sleep, ms) {
|
|
252
|
+
if (this.skipRequested)
|
|
253
|
+
return;
|
|
254
|
+
let timer = null;
|
|
255
|
+
const wait = sleep
|
|
256
|
+
? sleep(Math.max(0, ms))
|
|
257
|
+
: new Promise((resolve) => {
|
|
258
|
+
timer = setTimeout(resolve, Math.max(0, ms));
|
|
259
|
+
});
|
|
260
|
+
try {
|
|
261
|
+
await Promise.race([
|
|
262
|
+
wait,
|
|
263
|
+
new Promise((resolve) => {
|
|
264
|
+
this.wakeSleeper = resolve;
|
|
265
|
+
}),
|
|
266
|
+
]);
|
|
267
|
+
}
|
|
268
|
+
finally {
|
|
269
|
+
// A skip must not leave the poll timer holding the process open.
|
|
270
|
+
if (timer)
|
|
271
|
+
clearTimeout(timer);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Map an in-flight turn to the readiness shape.
|
|
277
|
+
*
|
|
278
|
+
* @param turn - Open turn
|
|
279
|
+
* @returns Busy-agent entry
|
|
280
|
+
*/
|
|
281
|
+
function toBusyAgent(turn) {
|
|
282
|
+
const newest = turn.messages[turn.messages.length - 1];
|
|
283
|
+
return {
|
|
284
|
+
session: turn.sessionName,
|
|
285
|
+
since: new Date(turn.since).toISOString(),
|
|
286
|
+
messagePreview: newest?.preview ?? '',
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Compact log description of a turn.
|
|
291
|
+
*
|
|
292
|
+
* @param turn - Open turn
|
|
293
|
+
* @returns Session, age and preview
|
|
294
|
+
*/
|
|
295
|
+
function describeTurn(turn) {
|
|
296
|
+
return toBusyAgent(turn);
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=restart-drain.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart-drain.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/restart/restart-drain.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,aAAa,EAAmB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAqB,MAAM,qCAAqC,CAAC;AA2D7F;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACzE,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;IAC5C,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,YAAY,CAAC,gBAAgB,CAAC;IACjF,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,YAAY,CAAC,gBAAgB,CAAC;IACjF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,mBAAmB;IAWM;IAV7B,MAAM,CAAC,QAAQ,GAA+B,IAAI,CAAC;IAC1C,MAAM,CAAkB;IACjC,MAAM,GAAG,KAAK,CAAC;IACf,WAAW,GAAkB,IAAI,CAAC;IAClC,QAAQ,GAAG,KAAK,CAAC;IACjB,aAAa,GAAG,KAAK,CAAC;IACtB,WAAW,GAAwB,IAAI,CAAC;IACxC,YAAY,GAA0B,IAAI,CAAC;IAC3C,eAAe,GAAiE,IAAI,CAAC;IAE7F,YAAqC,OAA4B;QAA5B,YAAO,GAAP,OAAO,CAAqB;QAChE,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;IACjF,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,WAAW;QACjB,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAC;YACnC,mBAAmB,CAAC,QAAQ,GAAG,IAAI,mBAAmB,CAAC,mBAAmB,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3F,CAAC;QACD,OAAO,mBAAmB,CAAC,QAAQ,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa;QACnB,mBAAmB,CAAC,QAAQ,GAAG,IAAI,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACH,gBAAgB;QACf,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAED;;;;OAIG;IACH,UAAU;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,MAAc;QAC3B,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sEAAsE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACtG,CAAC;IAED;;;;;OAKG;IACH,WAAW,CAAC,MAAc;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yEAAyE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACzG,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;OAIG;IACH,eAAe,CAAC,OAA8B;QAC7C,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,OAAqE;QACvF,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;IAChC,CAAC;IAED;;;;;OAKG;IACH,uBAAuB,CAAC,OAAgC;QACvD,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO,KAAK,CAAC;QACxC,KAAK,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YAC3D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE;gBACrD,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC7D,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;OAIG;IACH,YAAY;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACvC,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,CAAC;YACJ,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACR,MAAM,GAAG,CAAC,CAAC;QACZ,CAAC;QACD,OAAO;YACN,IAAI,EAAE,IAAI,CAAC,MAAM,KAAK,CAAC;YACvB,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;YACjC,MAAM;YACN,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACvB,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,CAAC,OAAqB;QAChC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;QACpC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,YAAY,CAAC,sBAAsB,CAAC;QACrE,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,YAAY,CAAC,qBAAqB,CAAC;QAClF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC;QACpC,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC;QAEpB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,CAAC;QAEhD,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gDAAgD,EAAE;gBAClE,MAAM,EAAE,YAAY,CAAC,aAAa;gBAClC,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;aACrC,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC;QACxD,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,SAAS,GAAG,CAAC,QAAQ,CAAC;QAC1B,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC;YACJ,SAAS,CAAC;gBACT,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACxC,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC;gBAC3B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8CAA8C,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAC/E,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;gBACxD,CAAC;gBACD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;oBACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kEAAkE,EAAE;wBACpF,QAAQ;wBACR,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC;qBACnC,CAAC,CAAC;oBACH,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;gBAC1D,CAAC;gBACD,IAAI,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;oBACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oEAAoE,EAAE;wBACtF,QAAQ;wBACR,SAAS,EAAE,OAAO,CAAC,SAAS;wBAC5B,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC;qBACnC,CAAC,CAAC;oBACH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;gBAC5D,CAAC;gBACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACrD,IAAI,GAAG,KAAK,aAAa,IAAI,CAAC,GAAG,SAAS,IAAI,aAAa,EAAE,CAAC;oBAC7D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gEAAgE,EAAE;wBAClF,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC;wBACjC,QAAQ;wBACR,SAAS,EAAE,OAAO,CAAC,SAAS;wBAC5B,IAAI,EAAE,uCAAuC;qBAC7C,CAAC,CAAC;oBACH,aAAa,GAAG,GAAG,CAAC;oBACpB,SAAS,GAAG,CAAC,CAAC;gBACf,CAAC;gBACD,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC;YACtF,CAAC;QACF,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACzB,CAAC;IACF,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,kBAAkB,CAAC,KAA6C,EAAE,EAAU;QACzF,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO;QAC/B,IAAI,KAAK,GAAyC,IAAI,CAAC;QACvD,MAAM,IAAI,GAAG,KAAK;YACjB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxB,CAAC,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAC/B,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC;YACJ,MAAM,OAAO,CAAC,IAAI,CAAC;gBAClB,IAAI;gBACJ,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;oBAC7B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;gBAC5B,CAAC,CAAC;aACF,CAAC,CAAC;QACJ,CAAC;gBAAS,CAAC;YACV,iEAAiE;YACjE,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACF,CAAC;;AAGF;;;;;GAKG;AACH,SAAS,WAAW,CAAC,IAAkB;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvD,OAAO;QACN,OAAO,EAAE,IAAI,CAAC,WAAW;QACzB,KAAK,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE;QACzC,cAAc,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE;KACrC,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,YAAY,CAAC,IAAkB;IACvC,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turn probe for PTY agent sessions.
|
|
3
|
+
*
|
|
4
|
+
* Decides whether an agent is mid-turn from two signals the codebase already
|
|
5
|
+
* trusts:
|
|
6
|
+
* - the "esc to interrupt" status bar (`containsBusyStatusBar`), which Claude
|
|
7
|
+
* Code and Codex show for the whole of a turn — thinking, streaming, and
|
|
8
|
+
* while a tool runs — and remove when the turn ends;
|
|
9
|
+
* - the PtyActivityTracker's last meaningful output time, which catches
|
|
10
|
+
* runtimes without that bar (Gemini) and the gap between two tool calls.
|
|
11
|
+
*
|
|
12
|
+
* A session is resting only when both agree: no status bar and a quiet PTY.
|
|
13
|
+
* A missing session or an exited runtime is 'gone' — there is nothing left to
|
|
14
|
+
* wait for.
|
|
15
|
+
*
|
|
16
|
+
* @module services/restart/turn-probe
|
|
17
|
+
*/
|
|
18
|
+
import type { TurnProbe } from './in-flight-turn-tracker.service.js';
|
|
19
|
+
/** The session-backend calls the probe needs. */
|
|
20
|
+
export interface ProbeSessionBackend {
|
|
21
|
+
sessionExists(name: string): boolean;
|
|
22
|
+
captureOutput(name: string, lines?: number): string;
|
|
23
|
+
isChildProcessAlive?(name: string): boolean;
|
|
24
|
+
}
|
|
25
|
+
/** Dependencies of the PTY turn probe. */
|
|
26
|
+
export interface PtyTurnProbeDeps {
|
|
27
|
+
/** Current session backend, or null when none is running */
|
|
28
|
+
getBackend: () => ProbeSessionBackend | null;
|
|
29
|
+
/** Ms since the session last produced meaningful output, or null if never */
|
|
30
|
+
getIdleTimeMs: (sessionName: string) => number | null;
|
|
31
|
+
/** Quiet period that counts as "resting" (defaults to SAFE_RESTART.TURN_QUIET_MS) */
|
|
32
|
+
quietMs?: number;
|
|
33
|
+
/** Trailing lines to inspect (defaults to SAFE_RESTART.PROBE_TAIL_LINES) */
|
|
34
|
+
tailLines?: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Create a probe that inspects a PTY session.
|
|
38
|
+
*
|
|
39
|
+
* @param deps - Backend and activity accessors
|
|
40
|
+
* @returns A TurnProbe
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const probe = createPtyTurnProbe({
|
|
45
|
+
* getBackend: () => getSessionBackendSync(),
|
|
46
|
+
* getIdleTimeMs: (s) => tracker.hasActivity(s) ? tracker.getIdleTimeMs(s) : null,
|
|
47
|
+
* });
|
|
48
|
+
* probe('ella-1234'); // 'busy' | 'idle' | 'gone'
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare function createPtyTurnProbe(deps: PtyTurnProbeDeps): TurnProbe;
|
|
52
|
+
//# sourceMappingURL=turn-probe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-probe.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/restart/turn-probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAErE,iDAAiD;AACjD,MAAM,WAAW,mBAAmB;IACnC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACrC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACpD,mBAAmB,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5C;AAED,0CAA0C;AAC1C,MAAM,WAAW,gBAAgB;IAChC,4DAA4D;IAC5D,UAAU,EAAE,MAAM,mBAAmB,GAAG,IAAI,CAAC;IAC7C,6EAA6E;IAC7E,aAAa,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACtD,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS,CAwBpE"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turn probe for PTY agent sessions.
|
|
3
|
+
*
|
|
4
|
+
* Decides whether an agent is mid-turn from two signals the codebase already
|
|
5
|
+
* trusts:
|
|
6
|
+
* - the "esc to interrupt" status bar (`containsBusyStatusBar`), which Claude
|
|
7
|
+
* Code and Codex show for the whole of a turn — thinking, streaming, and
|
|
8
|
+
* while a tool runs — and remove when the turn ends;
|
|
9
|
+
* - the PtyActivityTracker's last meaningful output time, which catches
|
|
10
|
+
* runtimes without that bar (Gemini) and the gap between two tool calls.
|
|
11
|
+
*
|
|
12
|
+
* A session is resting only when both agree: no status bar and a quiet PTY.
|
|
13
|
+
* A missing session or an exited runtime is 'gone' — there is nothing left to
|
|
14
|
+
* wait for.
|
|
15
|
+
*
|
|
16
|
+
* @module services/restart/turn-probe
|
|
17
|
+
*/
|
|
18
|
+
import { containsBusyStatusBar, stripAnsiCodes } from '../../utils/terminal-string-ops.js';
|
|
19
|
+
import { SAFE_RESTART } from '../../constants.js';
|
|
20
|
+
/**
|
|
21
|
+
* Create a probe that inspects a PTY session.
|
|
22
|
+
*
|
|
23
|
+
* @param deps - Backend and activity accessors
|
|
24
|
+
* @returns A TurnProbe
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* const probe = createPtyTurnProbe({
|
|
29
|
+
* getBackend: () => getSessionBackendSync(),
|
|
30
|
+
* getIdleTimeMs: (s) => tracker.hasActivity(s) ? tracker.getIdleTimeMs(s) : null,
|
|
31
|
+
* });
|
|
32
|
+
* probe('ella-1234'); // 'busy' | 'idle' | 'gone'
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export function createPtyTurnProbe(deps) {
|
|
36
|
+
const quietMs = deps.quietMs ?? SAFE_RESTART.TURN_QUIET_MS;
|
|
37
|
+
const tailLines = deps.tailLines ?? SAFE_RESTART.PROBE_TAIL_LINES;
|
|
38
|
+
return (sessionName) => {
|
|
39
|
+
const backend = deps.getBackend();
|
|
40
|
+
if (!backend || !backend.sessionExists(sessionName))
|
|
41
|
+
return 'gone';
|
|
42
|
+
if (backend.isChildProcessAlive?.(sessionName) === false)
|
|
43
|
+
return 'gone';
|
|
44
|
+
// Capture generously, then look only at the last non-empty lines: the
|
|
45
|
+
// status bar sits at the bottom of the TUI, and older screens in the
|
|
46
|
+
// scrollback must not count.
|
|
47
|
+
const raw = backend.captureOutput(sessionName, tailLines * 4) ?? '';
|
|
48
|
+
const tail = stripAnsiCodes(raw)
|
|
49
|
+
.split('\n')
|
|
50
|
+
.filter((line) => line.trim().length > 0)
|
|
51
|
+
.slice(-tailLines)
|
|
52
|
+
.join('\n');
|
|
53
|
+
if (containsBusyStatusBar(tail))
|
|
54
|
+
return 'busy';
|
|
55
|
+
const idleMs = deps.getIdleTimeMs(sessionName);
|
|
56
|
+
if (idleMs !== null && idleMs < quietMs)
|
|
57
|
+
return 'busy';
|
|
58
|
+
return 'idle';
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=turn-probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-probe.js","sourceRoot":"","sources":["../../../../../../backend/src/services/restart/turn-probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAsBlD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAsB;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,YAAY,CAAC,aAAa,CAAC;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,YAAY,CAAC,gBAAgB,CAAC;IAElE,OAAO,CAAC,WAAmB,EAAE,EAAE;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC;YAAE,OAAO,MAAM,CAAC;QACnE,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC,WAAW,CAAC,KAAK,KAAK;YAAE,OAAO,MAAM,CAAC;QAExE,sEAAsE;QACtE,qEAAqE;QACrE,6BAA6B;QAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,WAAW,EAAE,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACpE,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC;aAC9B,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;aACxC,KAAK,CAAC,CAAC,SAAS,CAAC;aACjB,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,IAAI,qBAAqB,CAAC,IAAI,CAAC;YAAE,OAAO,MAAM,CAAC;QAE/C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,GAAG,OAAO;YAAE,OAAO,MAAM,CAAC;QACvD,OAAO,MAAM,CAAC;IACf,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* node-pty install-state helpers (spawn-helper exec bit, native dirs).
|
|
3
|
+
*
|
|
4
|
+
* Crewly depends on node-pty's prebuilt binaries (`prebuilds/<platform>-<arch>/`)
|
|
5
|
+
* so `npm i -g crewly` works without a C/C++ toolchain (#778). On Unix the
|
|
6
|
+
* PTY fork goes through a small `spawn-helper` executable next to `pty.node`;
|
|
7
|
+
* if it loses its exec bit (node-pty 1.1.0's npm tarball shipped it as 0644,
|
|
8
|
+
* microsoft/node-pty#850/#919, and some package managers / copy steps still
|
|
9
|
+
* drop the mode) every spawn fails with a bare `posix_spawnp failed.` — which
|
|
10
|
+
* Crewly's retry loop would otherwise misreport as a process-table spike.
|
|
11
|
+
*
|
|
12
|
+
* Dependency-free (node builtins only): imported by the backend at spawn time
|
|
13
|
+
* and by the CLI's postinstall script, where no other dependency is guaranteed.
|
|
14
|
+
*
|
|
15
|
+
* @module services/session/pty/node-pty-install.utils
|
|
16
|
+
*/
|
|
17
|
+
/** File name of node-pty's Unix fork helper. */
|
|
18
|
+
export declare const SPAWN_HELPER_NAME = "spawn-helper";
|
|
19
|
+
/**
|
|
20
|
+
* Directories node-pty's `loadNativeModule` searches for `pty.node`, in its
|
|
21
|
+
* lookup order (compiled build first, prebuild last). `spawn-helper` is read
|
|
22
|
+
* from whichever directory `pty.node` loaded from.
|
|
23
|
+
*
|
|
24
|
+
* @param packageDir - The node-pty package directory
|
|
25
|
+
* @param platform - Platform tag (defaults to the current one)
|
|
26
|
+
* @param arch - Arch tag (defaults to the current one)
|
|
27
|
+
* @returns Absolute candidate directories
|
|
28
|
+
*/
|
|
29
|
+
export declare function nodePtyNativeDirs(packageDir: string, platform?: string, arch?: string): string[];
|
|
30
|
+
/** Result of {@link ensureSpawnHelperExecutable}. */
|
|
31
|
+
export interface SpawnHelperFixResult {
|
|
32
|
+
/** Helpers that were not executable and were chmod'ed to 0755. */
|
|
33
|
+
fixed: string[];
|
|
34
|
+
/** Helpers that are not executable and could not be fixed (e.g. read-only install). */
|
|
35
|
+
failed: Array<{
|
|
36
|
+
path: string;
|
|
37
|
+
error: string;
|
|
38
|
+
}>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Make sure every `spawn-helper` node-pty may use is executable.
|
|
42
|
+
*
|
|
43
|
+
* No-op on Windows (ConPTY has no helper) and for directories without one
|
|
44
|
+
* (Linux prebuilds do not ship a helper).
|
|
45
|
+
*
|
|
46
|
+
* @param packageDir - The node-pty package directory
|
|
47
|
+
* @param platform - Platform tag (defaults to the current one)
|
|
48
|
+
* @param arch - Arch tag (defaults to the current one)
|
|
49
|
+
* @param chmod - chmod implementation (injectable for tests)
|
|
50
|
+
* @returns Which helpers were fixed and which could not be
|
|
51
|
+
*/
|
|
52
|
+
export declare function ensureSpawnHelperExecutable(packageDir: string, platform?: string, arch?: string, chmod?: (file: string, mode: number) => void): SpawnHelperFixResult;
|
|
53
|
+
/**
|
|
54
|
+
* Locate the node-pty package directory through a resolver.
|
|
55
|
+
*
|
|
56
|
+
* @param resolve - A `require.resolve`-compatible function anchored where node-pty is installed
|
|
57
|
+
* @returns The package directory, or null when node-pty cannot be resolved
|
|
58
|
+
*/
|
|
59
|
+
export declare function resolveNodePtyDir(resolve: (request: string) => string): string | null;
|
|
60
|
+
/**
|
|
61
|
+
* Locate the node-pty copy this process has ALREADY loaded, from the CJS
|
|
62
|
+
* module cache (Node records CJS modules there even when they were reached
|
|
63
|
+
* through an ESM `import`). Unlike resolving, this does not depend on where
|
|
64
|
+
* the entry script lives — `process.argv[1]` may be outside the package.
|
|
65
|
+
*
|
|
66
|
+
* @param cache - `require.cache` (shared across all `createRequire` instances)
|
|
67
|
+
* @returns The loaded package directory, or null when node-pty is not in the cache
|
|
68
|
+
*/
|
|
69
|
+
export declare function findLoadedNodePtyDir(cache: Record<string, unknown> | undefined): string | null;
|
|
70
|
+
//# sourceMappingURL=node-pty-install.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-pty-install.utils.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/session/pty/node-pty-install.utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,gDAAgD;AAChD,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAEhD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAChC,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,MAAyB,EACnC,IAAI,GAAE,MAAqB,GACzB,MAAM,EAAE,CAMV;AAED,qDAAqD;AACrD,MAAM,WAAW,oBAAoB;IACpC,kEAAkE;IAClE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,uFAAuF;IACvF,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CAC1C,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,MAAyB,EACnC,IAAI,GAAE,MAAqB,EAC3B,KAAK,GAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAmB,GACxD,oBAAoB,CAoBtB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,GAAG,IAAI,CAMrF;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAK9F"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* node-pty install-state helpers (spawn-helper exec bit, native dirs).
|
|
3
|
+
*
|
|
4
|
+
* Crewly depends on node-pty's prebuilt binaries (`prebuilds/<platform>-<arch>/`)
|
|
5
|
+
* so `npm i -g crewly` works without a C/C++ toolchain (#778). On Unix the
|
|
6
|
+
* PTY fork goes through a small `spawn-helper` executable next to `pty.node`;
|
|
7
|
+
* if it loses its exec bit (node-pty 1.1.0's npm tarball shipped it as 0644,
|
|
8
|
+
* microsoft/node-pty#850/#919, and some package managers / copy steps still
|
|
9
|
+
* drop the mode) every spawn fails with a bare `posix_spawnp failed.` — which
|
|
10
|
+
* Crewly's retry loop would otherwise misreport as a process-table spike.
|
|
11
|
+
*
|
|
12
|
+
* Dependency-free (node builtins only): imported by the backend at spawn time
|
|
13
|
+
* and by the CLI's postinstall script, where no other dependency is guaranteed.
|
|
14
|
+
*
|
|
15
|
+
* @module services/session/pty/node-pty-install.utils
|
|
16
|
+
*/
|
|
17
|
+
import * as fs from 'fs';
|
|
18
|
+
import * as path from 'path';
|
|
19
|
+
/** File name of node-pty's Unix fork helper. */
|
|
20
|
+
export const SPAWN_HELPER_NAME = 'spawn-helper';
|
|
21
|
+
/**
|
|
22
|
+
* Directories node-pty's `loadNativeModule` searches for `pty.node`, in its
|
|
23
|
+
* lookup order (compiled build first, prebuild last). `spawn-helper` is read
|
|
24
|
+
* from whichever directory `pty.node` loaded from.
|
|
25
|
+
*
|
|
26
|
+
* @param packageDir - The node-pty package directory
|
|
27
|
+
* @param platform - Platform tag (defaults to the current one)
|
|
28
|
+
* @param arch - Arch tag (defaults to the current one)
|
|
29
|
+
* @returns Absolute candidate directories
|
|
30
|
+
*/
|
|
31
|
+
export function nodePtyNativeDirs(packageDir, platform = process.platform, arch = process.arch) {
|
|
32
|
+
return [
|
|
33
|
+
path.join(packageDir, 'build', 'Release'),
|
|
34
|
+
path.join(packageDir, 'build', 'Debug'),
|
|
35
|
+
path.join(packageDir, 'prebuilds', `${platform}-${arch}`),
|
|
36
|
+
];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Make sure every `spawn-helper` node-pty may use is executable.
|
|
40
|
+
*
|
|
41
|
+
* No-op on Windows (ConPTY has no helper) and for directories without one
|
|
42
|
+
* (Linux prebuilds do not ship a helper).
|
|
43
|
+
*
|
|
44
|
+
* @param packageDir - The node-pty package directory
|
|
45
|
+
* @param platform - Platform tag (defaults to the current one)
|
|
46
|
+
* @param arch - Arch tag (defaults to the current one)
|
|
47
|
+
* @param chmod - chmod implementation (injectable for tests)
|
|
48
|
+
* @returns Which helpers were fixed and which could not be
|
|
49
|
+
*/
|
|
50
|
+
export function ensureSpawnHelperExecutable(packageDir, platform = process.platform, arch = process.arch, chmod = fs.chmodSync) {
|
|
51
|
+
const result = { fixed: [], failed: [] };
|
|
52
|
+
if (platform === 'win32')
|
|
53
|
+
return result;
|
|
54
|
+
for (const dir of nodePtyNativeDirs(packageDir, platform, arch)) {
|
|
55
|
+
const helper = path.join(dir, SPAWN_HELPER_NAME);
|
|
56
|
+
if (!fs.existsSync(helper))
|
|
57
|
+
continue;
|
|
58
|
+
try {
|
|
59
|
+
fs.accessSync(helper, fs.constants.X_OK);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// not executable — fix below
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
chmod(helper, 0o755);
|
|
67
|
+
result.fixed.push(helper);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
result.failed.push({ path: helper, error: error instanceof Error ? error.message : String(error) });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Locate the node-pty package directory through a resolver.
|
|
77
|
+
*
|
|
78
|
+
* @param resolve - A `require.resolve`-compatible function anchored where node-pty is installed
|
|
79
|
+
* @returns The package directory, or null when node-pty cannot be resolved
|
|
80
|
+
*/
|
|
81
|
+
export function resolveNodePtyDir(resolve) {
|
|
82
|
+
try {
|
|
83
|
+
return path.dirname(resolve('node-pty/package.json'));
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Locate the node-pty copy this process has ALREADY loaded, from the CJS
|
|
91
|
+
* module cache (Node records CJS modules there even when they were reached
|
|
92
|
+
* through an ESM `import`). Unlike resolving, this does not depend on where
|
|
93
|
+
* the entry script lives — `process.argv[1]` may be outside the package.
|
|
94
|
+
*
|
|
95
|
+
* @param cache - `require.cache` (shared across all `createRequire` instances)
|
|
96
|
+
* @returns The loaded package directory, or null when node-pty is not in the cache
|
|
97
|
+
*/
|
|
98
|
+
export function findLoadedNodePtyDir(cache) {
|
|
99
|
+
if (!cache)
|
|
100
|
+
return null;
|
|
101
|
+
const suffix = path.join('node-pty', 'lib', 'index.js');
|
|
102
|
+
const entry = Object.keys(cache).find((key) => key.endsWith(path.sep + suffix));
|
|
103
|
+
return entry ? path.dirname(path.dirname(entry)) : null;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=node-pty-install.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-pty-install.utils.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/session/pty/node-pty-install.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,8 @@ declare class PtySpawnExhaustedError extends Error {
|
|
|
34
34
|
platform: string;
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
|
+
/** Test affordance: forget the once-per-process spawn-helper check. */
|
|
38
|
+
export declare function _resetSpawnHelperCheckForTesting(): void;
|
|
37
39
|
export { PtySpawnExhaustedError };
|
|
38
40
|
/**
|
|
39
41
|
* PTY Session implementation using node-pty.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pty-session.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/session/pty/pty-session.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAEhC,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"pty-session.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/session/pty/pty-session.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAEhC,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAoBhF,wBAAgB,0BAA0B,CACzC,IAAI,EAAE,OAAO,GAAG,CAAC,KAAK,GACpB,MAAM,IAAI,CAMZ;AAsED;;;;;;GAMG;AACH,cAAM,sBAAuB,SAAQ,KAAK;aAGxB,WAAW,EAAE;QAC5B,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KACjB;gBARD,OAAO,EAAE,MAAM,EACC,WAAW,EAAE;QAC5B,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KACjB;CAKF;AA4CD,uEAAuE;AACvE,wBAAgB,gCAAgC,IAAI,IAAI,CAEvD;AAgED,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAElC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,UAAW,YAAW,QAAQ;aAsDzB,IAAI,EAAE,MAAM;aACZ,GAAG,EAAE,MAAM;IAtD5B;;OAEG;IACH,OAAO,CAAC,UAAU,CAAW;IAE7B;;OAEG;IACH,OAAO,CAAC,aAAa,CAA0C;IAE/D;;OAEG;IACH,OAAO,CAAC,aAAa,CAA0C;IAE/D;;OAEG;IACH,OAAO,CAAC,MAAM,CAAS;IAEvB;;;;OAIG;IACH,OAAO,CAAC,SAAS,CAAS;IAE1B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAkB;IAEhC;;;;;;;;;;;;;;;;;;;OAmBG;gBAEc,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EAC3B,OAAO,EAAE,cAAc;IAqExB;;OAEG;IACH,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;IAepD;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;IAepD;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOzB;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAqBxC;;;;;;;;;;;;;OAaG;IACH,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAkB3B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,QAAQ,IAAI,IAAI;IAqBhB;;;;;;;;;;;;;OAaG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IA+ChC;;;;OAIG;IACH,QAAQ,IAAI,OAAO;IAInB;;;;;;;;OAQG;IACH,mBAAmB,IAAI,OAAO;IAgB9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA6C1B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,WAAW;CAanB"}
|