@with-logic/elwood 0.2.0 → 0.2.2
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/CHANGELOG.md +571 -1
- package/CONTRIBUTING.md +3 -0
- package/README.md +6 -2
- package/dist/bridge/socket-release.d.ts +15 -0
- package/dist/bridge/socket-release.d.ts.map +1 -0
- package/dist/bridge/socket-release.js +22 -0
- package/dist/bridge/socket-release.js.map +1 -0
- package/dist/claude/composer/border.d.ts +12 -0
- package/dist/claude/composer/border.d.ts.map +1 -0
- package/dist/claude/composer/border.js +12 -0
- package/dist/claude/composer/border.js.map +1 -0
- package/dist/claude/composer/empty-input.d.ts +15 -0
- package/dist/claude/composer/empty-input.d.ts.map +1 -1
- package/dist/claude/composer/empty-input.js +30 -11
- package/dist/claude/composer/empty-input.js.map +1 -1
- package/dist/claude/composer/footer.d.ts +26 -2
- package/dist/claude/composer/footer.d.ts.map +1 -1
- package/dist/claude/composer/footer.js +29 -2
- package/dist/claude/composer/footer.js.map +1 -1
- package/dist/claude/composer/idle.d.ts +14 -0
- package/dist/claude/composer/idle.d.ts.map +1 -0
- package/dist/claude/composer/idle.js +17 -0
- package/dist/claude/composer/idle.js.map +1 -0
- package/dist/claude/composer/last.d.ts +2 -0
- package/dist/claude/composer/last.d.ts.map +1 -0
- package/dist/claude/composer/last.js +15 -0
- package/dist/claude/composer/last.js.map +1 -0
- package/dist/claude/composer/staged-input.d.ts.map +1 -1
- package/dist/claude/composer/staged-input.js +2 -1
- package/dist/claude/composer/staged-input.js.map +1 -1
- package/dist/claude/hooks/stop-failure.d.ts +15 -2
- package/dist/claude/hooks/stop-failure.d.ts.map +1 -1
- package/dist/claude/hooks/stop-failure.js +32 -9
- package/dist/claude/hooks/stop-failure.js.map +1 -1
- package/dist/claude/login/stages.d.ts.map +1 -1
- package/dist/claude/login/stages.js +2 -2
- package/dist/claude/login/stages.js.map +1 -1
- package/dist/claude/model-picker.d.ts +1 -1
- package/dist/claude/model-picker.d.ts.map +1 -1
- package/dist/claude/model-picker.js +27 -10
- package/dist/claude/model-picker.js.map +1 -1
- package/dist/claude/preflight.d.ts +1 -1
- package/dist/claude/preflight.d.ts.map +1 -1
- package/dist/claude/preflight.js +18 -12
- package/dist/claude/preflight.js.map +1 -1
- package/dist/claude/questions/navigation.d.ts.map +1 -1
- package/dist/claude/questions/navigation.js +1 -2
- package/dist/claude/questions/navigation.js.map +1 -1
- package/dist/claude/questions/screen.d.ts.map +1 -1
- package/dist/claude/questions/screen.js +10 -2
- package/dist/claude/questions/screen.js.map +1 -1
- package/dist/claude/screen-table.d.ts +8 -5
- package/dist/claude/screen-table.d.ts.map +1 -1
- package/dist/claude/screen-table.js +20 -12
- package/dist/claude/screen-table.js.map +1 -1
- package/dist/claude/session/bridge.d.ts +2 -1
- package/dist/claude/session/bridge.d.ts.map +1 -1
- package/dist/claude/session/bridge.js +3 -1
- package/dist/claude/session/bridge.js.map +1 -1
- package/dist/claude/session/build.d.ts.map +1 -1
- package/dist/claude/session/build.js +13 -11
- package/dist/claude/session/build.js.map +1 -1
- package/dist/claude/session/cleanup.d.ts +18 -0
- package/dist/claude/session/cleanup.d.ts.map +1 -0
- package/dist/claude/session/cleanup.js +10 -0
- package/dist/claude/session/cleanup.js.map +1 -0
- package/dist/claude/session/index.d.ts.map +1 -1
- package/dist/claude/session/index.js +27 -13
- package/dist/claude/session/index.js.map +1 -1
- package/dist/claude/session/instance.d.ts +7 -8
- package/dist/claude/session/instance.d.ts.map +1 -1
- package/dist/claude/session/instance.js +9 -13
- package/dist/claude/session/instance.js.map +1 -1
- package/dist/claude/session/resume.d.ts.map +1 -1
- package/dist/claude/session/resume.js +14 -5
- package/dist/claude/session/resume.js.map +1 -1
- package/dist/claude/session/transcript.js +2 -2
- package/dist/claude/session/transcript.js.map +1 -1
- package/dist/claude/simple.d.ts +1 -1
- package/dist/claude/simple.d.ts.map +1 -1
- package/dist/claude/simple.js +3 -3
- package/dist/claude/simple.js.map +1 -1
- package/dist/claude/startup-prompts.d.ts +2 -0
- package/dist/claude/startup-prompts.d.ts.map +1 -1
- package/dist/claude/startup-prompts.js +5 -1
- package/dist/claude/startup-prompts.js.map +1 -1
- package/dist/claude/transcript/cursor-io.d.ts +1 -1
- package/dist/claude/transcript/cursor-io.d.ts.map +1 -1
- package/dist/claude/transcript/cursor-io.js +1 -1
- package/dist/claude/transcript/cursor-io.js.map +1 -1
- package/dist/claude/transcript/cursor.d.ts +5 -3
- package/dist/claude/transcript/cursor.d.ts.map +1 -1
- package/dist/claude/transcript/cursor.js +18 -8
- package/dist/claude/transcript/cursor.js.map +1 -1
- package/dist/claude/transcript/drain-context.d.ts +4 -3
- package/dist/claude/transcript/drain-context.d.ts.map +1 -1
- package/dist/claude/transcript/drain-context.js.map +1 -1
- package/dist/claude/transcript/emit.d.ts +2 -1
- package/dist/claude/transcript/emit.d.ts.map +1 -1
- package/dist/claude/transcript/emit.js +1 -0
- package/dist/claude/transcript/emit.js.map +1 -1
- package/dist/claude/transcript/index.d.ts.map +1 -1
- package/dist/claude/transcript/index.js +2 -2
- package/dist/claude/transcript/index.js.map +1 -1
- package/dist/claude/transcript/warnings.d.ts +2 -1
- package/dist/claude/transcript/warnings.d.ts.map +1 -1
- package/dist/claude/transcript/warnings.js +3 -2
- package/dist/claude/transcript/warnings.js.map +1 -1
- package/dist/cli/config/effective.d.ts +2 -2
- package/dist/cli/config/effective.d.ts.map +1 -1
- package/dist/cli/config/effective.js +0 -2
- package/dist/cli/config/effective.js.map +1 -1
- package/dist/cli/interactive/spawn.d.ts +0 -2
- package/dist/cli/interactive/spawn.d.ts.map +1 -1
- package/dist/cli/interactive/spawn.js +27 -24
- package/dist/cli/interactive/spawn.js.map +1 -1
- package/dist/cli/lifecycle/index.d.ts.map +1 -1
- package/dist/cli/lifecycle/index.js +5 -3
- package/dist/cli/lifecycle/index.js.map +1 -1
- package/dist/cli/main-failure.d.ts.map +1 -1
- package/dist/cli/main-failure.js +5 -2
- package/dist/cli/main-failure.js.map +1 -1
- package/dist/cli/models/combined.d.ts.map +1 -1
- package/dist/cli/models/combined.js +3 -2
- package/dist/cli/models/combined.js.map +1 -1
- package/dist/cli/models/render.d.ts.map +1 -1
- package/dist/cli/models/render.js +2 -1
- package/dist/cli/models/render.js.map +1 -1
- package/dist/cli/output/cleanup-error.d.ts +22 -0
- package/dist/cli/output/cleanup-error.d.ts.map +1 -0
- package/dist/cli/output/cleanup-error.js +67 -0
- package/dist/cli/output/cleanup-error.js.map +1 -0
- package/dist/cli/output/types.d.ts +6 -2
- package/dist/cli/output/types.d.ts.map +1 -1
- package/dist/cli/request/agent-detect.d.ts +6 -2
- package/dist/cli/request/agent-detect.d.ts.map +1 -1
- package/dist/cli/request/agent-detect.js +14 -6
- package/dist/cli/request/agent-detect.js.map +1 -1
- package/dist/cli/request/finalize.d.ts +1 -1
- package/dist/cli/request/finalize.d.ts.map +1 -1
- package/dist/cli/request/finalize.js +4 -25
- package/dist/cli/request/finalize.js.map +1 -1
- package/dist/cli/request/index.d.ts.map +1 -1
- package/dist/cli/request/index.js +11 -5
- package/dist/cli/request/index.js.map +1 -1
- package/dist/cli/request/path-replacement.d.ts +27 -0
- package/dist/cli/request/path-replacement.d.ts.map +1 -0
- package/dist/cli/request/path-replacement.js +79 -0
- package/dist/cli/request/path-replacement.js.map +1 -0
- package/dist/cli/request/workspace.d.ts +8 -0
- package/dist/cli/request/workspace.d.ts.map +1 -0
- package/dist/cli/request/workspace.js +50 -0
- package/dist/cli/request/workspace.js.map +1 -0
- package/dist/cli/run/output.d.ts.map +1 -1
- package/dist/cli/run/output.js +2 -1
- package/dist/cli/run/output.js.map +1 -1
- package/dist/cli/run/subscribe.d.ts.map +1 -1
- package/dist/cli/run/subscribe.js +1 -1
- package/dist/cli/run/subscribe.js.map +1 -1
- package/dist/cli/session/index.d.ts +4 -4
- package/dist/cli/session/index.d.ts.map +1 -1
- package/dist/cli/session/index.js +5 -5
- package/dist/cli/session/index.js.map +1 -1
- package/dist/cli/session/launch.d.ts +2 -2
- package/dist/cli/session/launch.d.ts.map +1 -1
- package/dist/cli/session/launch.js +12 -3
- package/dist/cli/session/launch.js.map +1 -1
- package/dist/cli/session/turn-readers.d.ts +14 -0
- package/dist/cli/session/turn-readers.d.ts.map +1 -0
- package/dist/cli/session/turn-readers.js +13 -0
- package/dist/cli/session/turn-readers.js.map +1 -0
- package/dist/codex/config/default-model.d.ts +24 -0
- package/dist/codex/config/default-model.d.ts.map +1 -0
- package/dist/codex/config/default-model.js +133 -0
- package/dist/codex/config/default-model.js.map +1 -0
- package/dist/codex/config/home.d.ts +35 -0
- package/dist/codex/config/home.d.ts.map +1 -0
- package/dist/codex/config/home.js +122 -0
- package/dist/codex/config/home.js.map +1 -0
- package/dist/codex/config/lock.d.ts +17 -11
- package/dist/codex/config/lock.d.ts.map +1 -1
- package/dist/codex/config/lock.js +102 -11
- package/dist/codex/config/lock.js.map +1 -1
- package/dist/codex/config/read.d.ts +16 -0
- package/dist/codex/config/read.d.ts.map +1 -0
- package/dist/codex/config/read.js +75 -0
- package/dist/codex/config/read.js.map +1 -0
- package/dist/codex/config/restore.d.ts +17 -7
- package/dist/codex/config/restore.d.ts.map +1 -1
- package/dist/codex/config/restore.js +33 -20
- package/dist/codex/config/restore.js.map +1 -1
- package/dist/codex/config/transaction.d.ts +6 -4
- package/dist/codex/config/transaction.d.ts.map +1 -1
- package/dist/codex/config/transaction.js +4 -3
- package/dist/codex/config/transaction.js.map +1 -1
- package/dist/codex/images/clipboard-copies.d.ts +39 -0
- package/dist/codex/images/clipboard-copies.d.ts.map +1 -0
- package/dist/codex/images/clipboard-copies.js +91 -0
- package/dist/codex/images/clipboard-copies.js.map +1 -0
- package/dist/codex/model-picker.d.ts +1 -1
- package/dist/codex/model-picker.d.ts.map +1 -1
- package/dist/codex/model-picker.js +16 -6
- package/dist/codex/model-picker.js.map +1 -1
- package/dist/codex/preflight.d.ts +2 -2
- package/dist/codex/preflight.d.ts.map +1 -1
- package/dist/codex/preflight.js +28 -21
- package/dist/codex/preflight.js.map +1 -1
- package/dist/codex/pty.d.ts +25 -3
- package/dist/codex/pty.d.ts.map +1 -1
- package/dist/codex/pty.js +53 -7
- package/dist/codex/pty.js.map +1 -1
- package/dist/codex/questions/candidates.d.ts.map +1 -1
- package/dist/codex/questions/candidates.js +4 -5
- package/dist/codex/questions/candidates.js.map +1 -1
- package/dist/codex/questions/driver.js +2 -2
- package/dist/codex/questions/driver.js.map +1 -1
- package/dist/codex/questions/records.d.ts +1 -1
- package/dist/codex/questions/records.d.ts.map +1 -1
- package/dist/codex/questions/records.js +1 -3
- package/dist/codex/questions/records.js.map +1 -1
- package/dist/codex/screen/clearance.d.ts +6 -0
- package/dist/codex/screen/clearance.d.ts.map +1 -1
- package/dist/codex/screen/clearance.js +10 -0
- package/dist/codex/screen/clearance.js.map +1 -1
- package/dist/codex/screen-table.d.ts.map +1 -1
- package/dist/codex/screen-table.js +6 -2
- package/dist/codex/screen-table.js.map +1 -1
- package/dist/codex/session/bridge.d.ts +1 -0
- package/dist/codex/session/bridge.d.ts.map +1 -1
- package/dist/codex/session/bridge.js +3 -1
- package/dist/codex/session/bridge.js.map +1 -1
- package/dist/codex/session/build.d.ts.map +1 -1
- package/dist/codex/session/build.js +14 -12
- package/dist/codex/session/build.js.map +1 -1
- package/dist/codex/session/cleanup.d.ts +2 -2
- package/dist/codex/session/cleanup.d.ts.map +1 -1
- package/dist/codex/session/cleanup.js +8 -11
- package/dist/codex/session/cleanup.js.map +1 -1
- package/dist/codex/session/config-switch.d.ts +20 -0
- package/dist/codex/session/config-switch.d.ts.map +1 -0
- package/dist/codex/session/config-switch.js +42 -0
- package/dist/codex/session/config-switch.js.map +1 -0
- package/dist/codex/session/hooks.d.ts.map +1 -1
- package/dist/codex/session/hooks.js +7 -0
- package/dist/codex/session/hooks.js.map +1 -1
- package/dist/codex/session/index.d.ts.map +1 -1
- package/dist/codex/session/index.js +34 -16
- package/dist/codex/session/index.js.map +1 -1
- package/dist/codex/session/instance.d.ts +10 -12
- package/dist/codex/session/instance.d.ts.map +1 -1
- package/dist/codex/session/instance.js +42 -37
- package/dist/codex/session/instance.js.map +1 -1
- package/dist/codex/session/readiness.d.ts +11 -0
- package/dist/codex/session/readiness.d.ts.map +1 -0
- package/dist/codex/session/readiness.js +22 -0
- package/dist/codex/session/readiness.js.map +1 -0
- package/dist/codex/session/resume.d.ts.map +1 -1
- package/dist/codex/session/resume.js +9 -4
- package/dist/codex/session/resume.js.map +1 -1
- package/dist/codex/session/transcript.d.ts.map +1 -1
- package/dist/codex/session/transcript.js +12 -1
- package/dist/codex/session/transcript.js.map +1 -1
- package/dist/codex/session/turn-commit.d.ts +58 -0
- package/dist/codex/session/turn-commit.d.ts.map +1 -0
- package/dist/codex/session/turn-commit.js +97 -0
- package/dist/codex/session/turn-commit.js.map +1 -0
- package/dist/codex/session/warnings.d.ts +13 -6
- package/dist/codex/session/warnings.d.ts.map +1 -1
- package/dist/codex/session/warnings.js +36 -9
- package/dist/codex/session/warnings.js.map +1 -1
- package/dist/codex/startup-prompts.d.ts +3 -0
- package/dist/codex/startup-prompts.d.ts.map +1 -1
- package/dist/codex/startup-prompts.js +20 -13
- package/dist/codex/startup-prompts.js.map +1 -1
- package/dist/codex/startup-warnings.d.ts +2 -0
- package/dist/codex/startup-warnings.d.ts.map +1 -1
- package/dist/codex/startup-warnings.js +6 -0
- package/dist/codex/startup-warnings.js.map +1 -1
- package/dist/codex/transcript/payload.d.ts +8 -0
- package/dist/codex/transcript/payload.d.ts.map +1 -0
- package/dist/codex/transcript/payload.js +11 -0
- package/dist/codex/transcript/payload.js.map +1 -0
- package/dist/codex/transcript/rejection.d.ts +15 -0
- package/dist/codex/transcript/rejection.d.ts.map +1 -0
- package/dist/codex/transcript/rejection.js +44 -0
- package/dist/codex/transcript/rejection.js.map +1 -0
- package/dist/codex/transcript/turn-end.d.ts +8 -0
- package/dist/codex/transcript/turn-end.d.ts.map +1 -0
- package/dist/codex/transcript/turn-end.js +17 -0
- package/dist/codex/transcript/turn-end.js.map +1 -0
- package/dist/codex/transcript/watcher.d.ts +5 -2
- package/dist/codex/transcript/watcher.d.ts.map +1 -1
- package/dist/codex/transcript/watcher.js +11 -6
- package/dist/codex/transcript/watcher.js.map +1 -1
- package/dist/codex/trust-retry.d.ts +12 -0
- package/dist/codex/trust-retry.d.ts.map +1 -0
- package/dist/codex/trust-retry.js +12 -0
- package/dist/codex/trust-retry.js.map +1 -0
- package/dist/codex/update/skip-attempt.d.ts +2 -0
- package/dist/codex/update/skip-attempt.d.ts.map +1 -1
- package/dist/codex/update/skip-attempt.js +4 -0
- package/dist/codex/update/skip-attempt.js.map +1 -1
- package/dist/codex/update/tracker.d.ts +2 -0
- package/dist/codex/update/tracker.d.ts.map +1 -1
- package/dist/codex/update/tracker.js +4 -0
- package/dist/codex/update/tracker.js.map +1 -1
- package/dist/core/delay.d.ts +3 -2
- package/dist/core/delay.d.ts.map +1 -1
- package/dist/core/delay.js +3 -2
- package/dist/core/delay.js.map +1 -1
- package/dist/core/errors.d.ts +33 -4
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +51 -7
- package/dist/core/errors.js.map +1 -1
- package/dist/core/images/materialize.d.ts +13 -4
- package/dist/core/images/materialize.d.ts.map +1 -1
- package/dist/core/images/materialize.js +48 -11
- package/dist/core/images/materialize.js.map +1 -1
- package/dist/core/input/abort.d.ts +15 -0
- package/dist/core/input/abort.d.ts.map +1 -1
- package/dist/core/input/abort.js +18 -2
- package/dist/core/input/abort.js.map +1 -1
- package/dist/core/input/constants.d.ts +4 -1
- package/dist/core/input/constants.d.ts.map +1 -1
- package/dist/core/input/constants.js +4 -1
- package/dist/core/input/constants.js.map +1 -1
- package/dist/core/input/index.d.ts +1 -1
- package/dist/core/input/index.d.ts.map +1 -1
- package/dist/core/input/index.js +1 -1
- package/dist/core/input/index.js.map +1 -1
- package/dist/core/models/clearance.d.ts +38 -0
- package/dist/core/models/clearance.d.ts.map +1 -0
- package/dist/core/models/clearance.js +38 -0
- package/dist/core/models/clearance.js.map +1 -0
- package/dist/core/models/close-wait.d.ts +17 -0
- package/dist/core/models/close-wait.d.ts.map +1 -0
- package/dist/core/models/close-wait.js +44 -0
- package/dist/core/models/close-wait.js.map +1 -0
- package/dist/core/models/dialog-region.d.ts +18 -3
- package/dist/core/models/dialog-region.d.ts.map +1 -1
- package/dist/core/models/dialog-region.js +29 -40
- package/dist/core/models/dialog-region.js.map +1 -1
- package/dist/core/models/input.d.ts +10 -1
- package/dist/core/models/input.d.ts.map +1 -1
- package/dist/core/models/input.js +15 -2
- package/dist/core/models/input.js.map +1 -1
- package/dist/core/models/intervention.d.ts +2 -2
- package/dist/core/models/intervention.d.ts.map +1 -1
- package/dist/core/models/intervention.js +6 -3
- package/dist/core/models/intervention.js.map +1 -1
- package/dist/core/models/own-picker.d.ts +21 -0
- package/dist/core/models/own-picker.d.ts.map +1 -0
- package/dist/core/models/own-picker.js +21 -0
- package/dist/core/models/own-picker.js.map +1 -0
- package/dist/core/models/picker.d.ts +34 -4
- package/dist/core/models/picker.d.ts.map +1 -1
- package/dist/core/models/picker.js +50 -44
- package/dist/core/models/picker.js.map +1 -1
- package/dist/core/models/row-block.d.ts +66 -0
- package/dist/core/models/row-block.d.ts.map +1 -0
- package/dist/core/models/row-block.js +87 -0
- package/dist/core/models/row-block.js.map +1 -0
- package/dist/core/models/rows.d.ts +32 -3
- package/dist/core/models/rows.d.ts.map +1 -1
- package/dist/core/models/rows.js +48 -20
- package/dist/core/models/rows.js.map +1 -1
- package/dist/core/models/tui-screen.d.ts +6 -1
- package/dist/core/models/tui-screen.d.ts.map +1 -1
- package/dist/core/models/tui-screen.js +25 -10
- package/dist/core/models/tui-screen.js.map +1 -1
- package/dist/core/models/window.d.ts +49 -0
- package/dist/core/models/window.d.ts.map +1 -0
- package/dist/core/models/window.js +105 -0
- package/dist/core/models/window.js.map +1 -0
- package/dist/core/path-trust.d.ts +11 -0
- package/dist/core/path-trust.d.ts.map +1 -0
- package/dist/core/path-trust.js +21 -0
- package/dist/core/path-trust.js.map +1 -0
- package/dist/core/screen-facts.d.ts +3 -1
- package/dist/core/screen-facts.d.ts.map +1 -1
- package/dist/core/screen-facts.js +1 -0
- package/dist/core/screen-facts.js.map +1 -1
- package/dist/core/simple/boundary-signal.d.ts +41 -6
- package/dist/core/simple/boundary-signal.d.ts.map +1 -1
- package/dist/core/simple/boundary-signal.js +43 -3
- package/dist/core/simple/boundary-signal.js.map +1 -1
- package/dist/core/simple/close.d.ts +2 -1
- package/dist/core/simple/close.d.ts.map +1 -1
- package/dist/core/simple/close.js +10 -2
- package/dist/core/simple/close.js.map +1 -1
- package/dist/core/simple/turn-boundary.d.ts +2 -0
- package/dist/core/simple/turn-boundary.d.ts.map +1 -1
- package/dist/core/simple/turn-boundary.js +1 -1
- package/dist/core/simple/turn-boundary.js.map +1 -1
- package/dist/core/simple/turn-types.d.ts +9 -3
- package/dist/core/simple/turn-types.d.ts.map +1 -1
- package/dist/core/simple/turn-types.js +10 -2
- package/dist/core/simple/turn-types.js.map +1 -1
- package/dist/core/simple/turn.d.ts +2 -0
- package/dist/core/simple/turn.d.ts.map +1 -1
- package/dist/core/simple/turn.js +11 -5
- package/dist/core/simple/turn.js.map +1 -1
- package/dist/core/terminal-options.d.ts +17 -1
- package/dist/core/terminal-options.d.ts.map +1 -1
- package/dist/core/terminal-options.js +20 -8
- package/dist/core/terminal-options.js.map +1 -1
- package/dist/core/transcript/cursor-io.d.ts +8 -0
- package/dist/core/transcript/cursor-io.d.ts.map +1 -1
- package/dist/core/transcript/cursor-io.js +11 -5
- package/dist/core/transcript/cursor-io.js.map +1 -1
- package/dist/core/transcript/cursor.d.ts +28 -4
- package/dist/core/transcript/cursor.d.ts.map +1 -1
- package/dist/core/transcript/cursor.js +53 -7
- package/dist/core/transcript/cursor.js.map +1 -1
- package/dist/core/transcript/drain.d.ts +43 -0
- package/dist/core/transcript/drain.d.ts.map +1 -0
- package/dist/core/transcript/drain.js +67 -0
- package/dist/core/transcript/drain.js.map +1 -0
- package/dist/core/trust/abortable.d.ts +12 -0
- package/dist/core/trust/abortable.d.ts.map +1 -0
- package/dist/core/trust/abortable.js +48 -0
- package/dist/core/trust/abortable.js.map +1 -0
- package/dist/core/trust/allowlist.d.ts +2 -0
- package/dist/core/trust/allowlist.d.ts.map +1 -1
- package/dist/core/trust/allowlist.js +4 -1
- package/dist/core/trust/allowlist.js.map +1 -1
- package/dist/core/trust/blocking.d.ts +11 -0
- package/dist/core/trust/blocking.d.ts.map +1 -1
- package/dist/core/trust/blocking.js +5 -4
- package/dist/core/trust/blocking.js.map +1 -1
- package/dist/core/trust/copy.d.ts.map +1 -1
- package/dist/core/trust/copy.js +7 -1
- package/dist/core/trust/copy.js.map +1 -1
- package/dist/core/trust/deadline.d.ts +24 -0
- package/dist/core/trust/deadline.d.ts.map +1 -0
- package/dist/core/trust/deadline.js +56 -0
- package/dist/core/trust/deadline.js.map +1 -0
- package/dist/core/trust/dialog.d.ts +11 -2
- package/dist/core/trust/dialog.d.ts.map +1 -1
- package/dist/core/trust/dialog.js +12 -3
- package/dist/core/trust/dialog.js.map +1 -1
- package/dist/core/trust/options.d.ts +5 -1
- package/dist/core/trust/options.d.ts.map +1 -1
- package/dist/core/trust/options.js +8 -2
- package/dist/core/trust/options.js.map +1 -1
- package/dist/core/trust/prompts.d.ts +3 -0
- package/dist/core/trust/prompts.d.ts.map +1 -1
- package/dist/core/trust/prompts.js +2 -1
- package/dist/core/trust/prompts.js.map +1 -1
- package/dist/core/trust/responder.d.ts +10 -5
- package/dist/core/trust/responder.d.ts.map +1 -1
- package/dist/core/trust/responder.js +37 -33
- package/dist/core/trust/responder.js.map +1 -1
- package/dist/core/trust/step.d.ts +67 -0
- package/dist/core/trust/step.d.ts.map +1 -0
- package/dist/core/trust/step.js +45 -0
- package/dist/core/trust/step.js.map +1 -0
- package/dist/core/trust/types.d.ts +21 -1
- package/dist/core/trust/types.d.ts.map +1 -1
- package/dist/core/trust/types.js +25 -1
- package/dist/core/trust/types.js.map +1 -1
- package/dist/core/trust/view.d.ts +2 -0
- package/dist/core/trust/view.d.ts.map +1 -1
- package/dist/core/trust/view.js +3 -0
- package/dist/core/trust/view.js.map +1 -1
- package/dist/core/trust/write.d.ts +31 -6
- package/dist/core/trust/write.d.ts.map +1 -1
- package/dist/core/trust/write.js +95 -80
- package/dist/core/trust/write.js.map +1 -1
- package/dist/core/turn-state.d.ts +18 -4
- package/dist/core/turn-state.d.ts.map +1 -1
- package/dist/core/turn-state.js +47 -25
- package/dist/core/turn-state.js.map +1 -1
- package/dist/core/warnings/images.d.ts +22 -0
- package/dist/core/warnings/images.d.ts.map +1 -0
- package/dist/core/warnings/images.js +3 -0
- package/dist/core/warnings/images.js.map +1 -0
- package/dist/core/warnings/index.d.ts +3 -2
- package/dist/core/warnings/index.d.ts.map +1 -1
- package/dist/core/warnings/lifecycle.d.ts +35 -4
- package/dist/core/warnings/lifecycle.d.ts.map +1 -1
- package/dist/core/warnings/lifecycle.js +1 -1
- package/dist/core/warnings/update.d.ts +8 -4
- package/dist/core/warnings/update.d.ts.map +1 -1
- package/dist/core/warnings/update.js +21 -6
- package/dist/core/warnings/update.js.map +1 -1
- package/dist/pty/exit-latch.d.ts +28 -0
- package/dist/pty/exit-latch.d.ts.map +1 -0
- package/dist/pty/exit-latch.js +50 -0
- package/dist/pty/exit-latch.js.map +1 -0
- package/dist/runtime/exit-status.d.ts +7 -0
- package/dist/runtime/exit-status.d.ts.map +1 -0
- package/dist/runtime/exit-status.js +13 -0
- package/dist/runtime/exit-status.js.map +1 -0
- package/dist/runtime/home-guard/index.d.ts +45 -0
- package/dist/runtime/home-guard/index.d.ts.map +1 -0
- package/dist/runtime/home-guard/index.js +69 -0
- package/dist/runtime/home-guard/index.js.map +1 -0
- package/dist/runtime/loop-restore.d.ts +9 -9
- package/dist/runtime/loop-restore.d.ts.map +1 -1
- package/dist/runtime/loop-restore.js +10 -10
- package/dist/runtime/loop-restore.js.map +1 -1
- package/dist/runtime/probe/capped-buffer.d.ts +16 -0
- package/dist/runtime/probe/capped-buffer.d.ts.map +1 -0
- package/dist/runtime/probe/capped-buffer.js +38 -0
- package/dist/runtime/probe/capped-buffer.js.map +1 -0
- package/dist/runtime/probe/capture.d.ts +55 -0
- package/dist/runtime/probe/capture.d.ts.map +1 -0
- package/dist/runtime/probe/capture.js +71 -0
- package/dist/runtime/probe/capture.js.map +1 -0
- package/dist/runtime/{probe-cleanup.d.ts → probe/cleanup.d.ts} +2 -2
- package/dist/runtime/probe/cleanup.d.ts.map +1 -0
- package/dist/runtime/{probe-cleanup.js → probe/cleanup.js} +3 -3
- package/dist/runtime/probe/cleanup.js.map +1 -0
- package/dist/runtime/probe/directory-key.d.ts +26 -0
- package/dist/runtime/probe/directory-key.d.ts.map +1 -0
- package/dist/runtime/probe/directory-key.js +46 -0
- package/dist/runtime/probe/directory-key.js.map +1 -0
- package/dist/runtime/probe/index.d.ts +25 -0
- package/dist/runtime/probe/index.d.ts.map +1 -0
- package/dist/runtime/probe/index.js +153 -0
- package/dist/runtime/probe/index.js.map +1 -0
- package/dist/runtime/probe/lookup.d.ts +12 -0
- package/dist/runtime/probe/lookup.d.ts.map +1 -0
- package/dist/runtime/probe/lookup.js +29 -0
- package/dist/runtime/probe/lookup.js.map +1 -0
- package/dist/runtime/probe/named-pipes.d.ts +35 -0
- package/dist/runtime/probe/named-pipes.d.ts.map +1 -0
- package/dist/runtime/probe/named-pipes.js +167 -0
- package/dist/runtime/probe/named-pipes.js.map +1 -0
- package/dist/runtime/probe/private-directory.d.ts +14 -0
- package/dist/runtime/probe/private-directory.d.ts.map +1 -0
- package/dist/runtime/probe/private-directory.js +50 -0
- package/dist/runtime/probe/private-directory.js.map +1 -0
- package/dist/runtime/probe/results.d.ts +14 -0
- package/dist/runtime/probe/results.d.ts.map +1 -0
- package/dist/runtime/probe/results.js +38 -0
- package/dist/runtime/probe/results.js.map +1 -0
- package/dist/runtime/probe/slots.d.ts +17 -0
- package/dist/runtime/probe/slots.d.ts.map +1 -0
- package/dist/runtime/probe/slots.js +35 -0
- package/dist/runtime/probe/slots.js.map +1 -0
- package/dist/runtime/probe/start.d.ts +64 -0
- package/dist/runtime/probe/start.d.ts.map +1 -0
- package/dist/runtime/probe/start.js +80 -0
- package/dist/runtime/probe/start.js.map +1 -0
- package/dist/runtime/probe-cache.d.ts +19 -0
- package/dist/runtime/probe-cache.d.ts.map +1 -0
- package/dist/runtime/probe-cache.js +56 -0
- package/dist/runtime/probe-cache.js.map +1 -0
- package/dist/runtime/readiness/initial-ready.d.ts +31 -5
- package/dist/runtime/readiness/initial-ready.d.ts.map +1 -1
- package/dist/runtime/readiness/initial-ready.js +64 -18
- package/dist/runtime/readiness/initial-ready.js.map +1 -1
- package/dist/runtime/seams.d.ts +14 -2
- package/dist/runtime/seams.d.ts.map +1 -1
- package/dist/runtime/seams.js +2 -2
- package/dist/runtime/seams.js.map +1 -1
- package/dist/runtime/session/base.d.ts.map +1 -1
- package/dist/runtime/session/base.js +9 -6
- package/dist/runtime/session/base.js.map +1 -1
- package/dist/runtime/session/commands.d.ts +6 -4
- package/dist/runtime/session/commands.d.ts.map +1 -1
- package/dist/runtime/session/commands.js +5 -2
- package/dist/runtime/session/commands.js.map +1 -1
- package/dist/runtime/session/frames.d.ts +12 -2
- package/dist/runtime/session/frames.d.ts.map +1 -1
- package/dist/runtime/session/frames.js +10 -3
- package/dist/runtime/session/frames.js.map +1 -1
- package/dist/runtime/session/image-attach.js +7 -2
- package/dist/runtime/session/image-attach.js.map +1 -1
- package/dist/runtime/session/launch-directory.d.ts +33 -0
- package/dist/runtime/session/launch-directory.d.ts.map +1 -0
- package/dist/runtime/session/launch-directory.js +84 -0
- package/dist/runtime/session/launch-directory.js.map +1 -0
- package/dist/runtime/session/lifecycle.d.ts +3 -3
- package/dist/runtime/session/lifecycle.d.ts.map +1 -1
- package/dist/runtime/session/lifecycle.js +1 -5
- package/dist/runtime/session/lifecycle.js.map +1 -1
- package/dist/runtime/session/loops.d.ts +1 -1
- package/dist/runtime/session/loops.d.ts.map +1 -1
- package/dist/runtime/session/loops.js +6 -3
- package/dist/runtime/session/loops.js.map +1 -1
- package/dist/runtime/session/picker-cleanup.d.ts +6 -21
- package/dist/runtime/session/picker-cleanup.d.ts.map +1 -1
- package/dist/runtime/session/picker-cleanup.js +19 -31
- package/dist/runtime/session/picker-cleanup.js.map +1 -1
- package/dist/runtime/session/picker-hold.d.ts +24 -0
- package/dist/runtime/session/picker-hold.d.ts.map +1 -0
- package/dist/runtime/session/picker-hold.js +42 -0
- package/dist/runtime/session/picker-hold.js.map +1 -0
- package/dist/runtime/session/picker.d.ts +15 -13
- package/dist/runtime/session/picker.d.ts.map +1 -1
- package/dist/runtime/session/picker.js +49 -27
- package/dist/runtime/session/picker.js.map +1 -1
- package/dist/runtime/session/prepare-state.d.ts +6 -0
- package/dist/runtime/session/prepare-state.d.ts.map +1 -0
- package/dist/runtime/session/prepare-state.js +14 -0
- package/dist/runtime/session/prepare-state.js.map +1 -0
- package/dist/runtime/session/questions.d.ts +2 -2
- package/dist/runtime/session/questions.d.ts.map +1 -1
- package/dist/runtime/session/questions.js.map +1 -1
- package/dist/runtime/session/readiness.d.ts +14 -5
- package/dist/runtime/session/readiness.d.ts.map +1 -1
- package/dist/runtime/session/readiness.js +22 -6
- package/dist/runtime/session/readiness.js.map +1 -1
- package/dist/runtime/session/reap.d.ts +11 -7
- package/dist/runtime/session/reap.d.ts.map +1 -1
- package/dist/runtime/session/reap.js +16 -10
- package/dist/runtime/session/reap.js.map +1 -1
- package/dist/runtime/session/runtime-cleanup.d.ts +18 -0
- package/dist/runtime/session/runtime-cleanup.d.ts.map +1 -0
- package/dist/runtime/session/runtime-cleanup.js +18 -0
- package/dist/runtime/session/runtime-cleanup.js.map +1 -0
- package/dist/runtime/session/session-input.d.ts +32 -0
- package/dist/runtime/session/session-input.d.ts.map +1 -0
- package/dist/runtime/session/{picker-input.js → session-input.js} +35 -7
- package/dist/runtime/session/session-input.js.map +1 -0
- package/dist/runtime/session/shutdown-binding.d.ts +12 -1
- package/dist/runtime/session/shutdown-binding.d.ts.map +1 -1
- package/dist/runtime/session/shutdown-binding.js +33 -1
- package/dist/runtime/session/shutdown-binding.js.map +1 -1
- package/dist/runtime/session/shutdown-cleanup.d.ts +17 -0
- package/dist/runtime/session/shutdown-cleanup.d.ts.map +1 -0
- package/dist/runtime/session/shutdown-cleanup.js +49 -0
- package/dist/runtime/session/shutdown-cleanup.js.map +1 -0
- package/dist/runtime/session/shutdown.d.ts +3 -2
- package/dist/runtime/session/shutdown.d.ts.map +1 -1
- package/dist/runtime/session/shutdown.js +13 -24
- package/dist/runtime/session/shutdown.js.map +1 -1
- package/dist/runtime/shell-quote.d.ts +8 -0
- package/dist/runtime/shell-quote.d.ts.map +1 -0
- package/dist/runtime/shell-quote.js +10 -0
- package/dist/runtime/shell-quote.js.map +1 -0
- package/dist/runtime/shell.d.ts +36 -12
- package/dist/runtime/shell.d.ts.map +1 -1
- package/dist/runtime/shell.js +90 -14
- package/dist/runtime/shell.js.map +1 -1
- package/dist/runtime/shutdown/coalesce.d.ts +15 -0
- package/dist/runtime/shutdown/coalesce.d.ts.map +1 -0
- package/dist/runtime/shutdown/coalesce.js +42 -0
- package/dist/runtime/shutdown/coalesce.js.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/failures.d.ts +24 -0
- package/dist/runtime/shutdown/detached-sweep/failures.d.ts.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/failures.js +32 -0
- package/dist/runtime/shutdown/detached-sweep/failures.js.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/index.d.ts +55 -0
- package/dist/runtime/shutdown/detached-sweep/index.d.ts.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/index.js +129 -0
- package/dist/runtime/shutdown/detached-sweep/index.js.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/kill.d.ts +37 -0
- package/dist/runtime/shutdown/detached-sweep/kill.d.ts.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/kill.js +87 -0
- package/dist/runtime/shutdown/detached-sweep/kill.js.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/record.d.ts +67 -0
- package/dist/runtime/shutdown/detached-sweep/record.d.ts.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/record.js +111 -0
- package/dist/runtime/shutdown/detached-sweep/record.js.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/rounds.d.ts +78 -0
- package/dist/runtime/shutdown/detached-sweep/rounds.d.ts.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/rounds.js +116 -0
- package/dist/runtime/shutdown/detached-sweep/rounds.js.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/survivors.d.ts +40 -0
- package/dist/runtime/shutdown/detached-sweep/survivors.d.ts.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/survivors.js +112 -0
- package/dist/runtime/shutdown/detached-sweep/survivors.js.map +1 -0
- package/dist/runtime/shutdown/leader-group.d.ts +29 -0
- package/dist/runtime/shutdown/leader-group.d.ts.map +1 -0
- package/dist/runtime/shutdown/leader-group.js +35 -0
- package/dist/runtime/shutdown/leader-group.js.map +1 -0
- package/dist/runtime/shutdown/native-read-admission.d.ts +13 -0
- package/dist/runtime/shutdown/native-read-admission.d.ts.map +1 -0
- package/dist/runtime/shutdown/native-read-admission.js +64 -0
- package/dist/runtime/shutdown/native-read-admission.js.map +1 -0
- package/dist/runtime/shutdown/process-table.d.ts +80 -0
- package/dist/runtime/shutdown/process-table.d.ts.map +1 -0
- package/dist/runtime/shutdown/process-table.js +147 -0
- package/dist/runtime/shutdown/process-table.js.map +1 -0
- package/dist/runtime/shutdown/process-tree-ops.d.ts +39 -0
- package/dist/runtime/shutdown/process-tree-ops.d.ts.map +1 -0
- package/dist/runtime/shutdown/process-tree-ops.js +73 -0
- package/dist/runtime/shutdown/process-tree-ops.js.map +1 -0
- package/dist/runtime/shutdown/read-timeout.d.ts +4 -0
- package/dist/runtime/shutdown/read-timeout.d.ts.map +1 -0
- package/dist/runtime/shutdown/read-timeout.js +6 -0
- package/dist/runtime/shutdown/read-timeout.js.map +1 -0
- package/dist/runtime/shutdown/reap-queue.d.ts +10 -0
- package/dist/runtime/shutdown/reap-queue.d.ts.map +1 -0
- package/dist/runtime/shutdown/reap-queue.js +29 -0
- package/dist/runtime/shutdown/reap-queue.js.map +1 -0
- package/dist/runtime/shutdown/reap-tree.d.ts +42 -32
- package/dist/runtime/shutdown/reap-tree.d.ts.map +1 -1
- package/dist/runtime/shutdown/reap-tree.js +78 -71
- package/dist/runtime/shutdown/reap-tree.js.map +1 -1
- package/dist/runtime/shutdown/shared-daemon.d.ts +59 -0
- package/dist/runtime/shutdown/shared-daemon.d.ts.map +1 -0
- package/dist/runtime/shutdown/shared-daemon.js +139 -0
- package/dist/runtime/shutdown/shared-daemon.js.map +1 -0
- package/dist/runtime/shutdown/teardown.d.ts +15 -0
- package/dist/runtime/shutdown/teardown.d.ts.map +1 -1
- package/dist/runtime/shutdown/teardown.js +19 -6
- package/dist/runtime/shutdown/teardown.js.map +1 -1
- package/dist/runtime/shutdown/terminate.d.ts +21 -1
- package/dist/runtime/shutdown/terminate.d.ts.map +1 -1
- package/dist/runtime/shutdown/terminate.js +83 -56
- package/dist/runtime/shutdown/terminate.js.map +1 -1
- package/dist/runtime/startup/buffer.d.ts +26 -7
- package/dist/runtime/startup/buffer.d.ts.map +1 -1
- package/dist/runtime/startup/buffer.js +42 -19
- package/dist/runtime/startup/buffer.js.map +1 -1
- package/dist/runtime/startup/cleanup.d.ts +37 -11
- package/dist/runtime/startup/cleanup.d.ts.map +1 -1
- package/dist/runtime/startup/cleanup.js +55 -25
- package/dist/runtime/startup/cleanup.js.map +1 -1
- package/dist/runtime/startup/index.d.ts +13 -1
- package/dist/runtime/startup/index.d.ts.map +1 -1
- package/dist/runtime/startup/index.js +38 -6
- package/dist/runtime/startup/index.js.map +1 -1
- package/dist/runtime/stream-marker.d.ts +17 -0
- package/dist/runtime/stream-marker.d.ts.map +1 -0
- package/dist/runtime/stream-marker.js +35 -0
- package/dist/runtime/stream-marker.js.map +1 -0
- package/dist/runtime/update/acquire.d.ts +16 -0
- package/dist/runtime/update/acquire.d.ts.map +1 -0
- package/dist/runtime/update/acquire.js +62 -0
- package/dist/runtime/update/acquire.js.map +1 -0
- package/dist/runtime/update/completion.d.ts +12 -0
- package/dist/runtime/update/completion.d.ts.map +1 -0
- package/dist/runtime/update/completion.js +50 -0
- package/dist/runtime/update/completion.js.map +1 -0
- package/dist/runtime/update/lock.d.ts +1 -1
- package/dist/runtime/update/lock.d.ts.map +1 -1
- package/dist/runtime/update/lock.js +21 -38
- package/dist/runtime/update/lock.js.map +1 -1
- package/dist/runtime/update/once.d.ts +16 -13
- package/dist/runtime/update/once.d.ts.map +1 -1
- package/dist/runtime/update/once.js +41 -31
- package/dist/runtime/update/once.js.map +1 -1
- package/dist/runtime/update/owner.js +1 -1
- package/dist/runtime/update/retained-lease.js +1 -1
- package/dist/runtime/update/waiting.d.ts +14 -1
- package/dist/runtime/update/waiting.d.ts.map +1 -1
- package/dist/runtime/update/waiting.js +20 -12
- package/dist/runtime/update/waiting.js.map +1 -1
- package/dist/state/canonical-path.d.ts +5 -0
- package/dist/state/canonical-path.d.ts.map +1 -1
- package/dist/state/canonical-path.js +11 -5
- package/dist/state/canonical-path.js.map +1 -1
- package/dist/state/directories.d.ts +31 -1
- package/dist/state/directories.d.ts.map +1 -1
- package/dist/state/directories.js +75 -13
- package/dist/state/directories.js.map +1 -1
- package/dist/state/files.d.ts +3 -3
- package/dist/state/files.d.ts.map +1 -1
- package/dist/state/files.js +4 -10
- package/dist/state/files.js.map +1 -1
- package/dist/state/launch-ownership.d.ts +4 -2
- package/dist/state/launch-ownership.d.ts.map +1 -1
- package/dist/state/launch-ownership.js +18 -10
- package/dist/state/launch-ownership.js.map +1 -1
- package/dist/state/launch-publication.d.ts +7 -1
- package/dist/state/launch-publication.d.ts.map +1 -1
- package/dist/state/launch-publication.js +14 -2
- package/dist/state/launch-publication.js.map +1 -1
- package/dist/state/loop-store.d.ts +15 -4
- package/dist/state/loop-store.d.ts.map +1 -1
- package/dist/state/loop-store.js +13 -7
- package/dist/state/loop-store.js.map +1 -1
- package/dist/state/preparation/created-directories.d.ts +13 -0
- package/dist/state/preparation/created-directories.d.ts.map +1 -0
- package/dist/state/preparation/created-directories.js +45 -0
- package/dist/state/preparation/created-directories.js.map +1 -0
- package/dist/state/preparation/ignore-sync.d.ts +9 -0
- package/dist/state/preparation/ignore-sync.d.ts.map +1 -0
- package/dist/state/preparation/ignore-sync.js +47 -0
- package/dist/state/preparation/ignore-sync.js.map +1 -0
- package/dist/state/preparation/index.d.ts +25 -0
- package/dist/state/preparation/index.d.ts.map +1 -0
- package/dist/state/preparation/index.js +31 -0
- package/dist/state/preparation/index.js.map +1 -0
- package/dist/state/preparation/install-ignore.d.ts +6 -0
- package/dist/state/preparation/install-ignore.d.ts.map +1 -0
- package/dist/state/preparation/install-ignore.js +87 -0
- package/dist/state/preparation/install-ignore.js.map +1 -0
- package/dist/state/preparation/rollback-parent.d.ts +3 -0
- package/dist/state/preparation/rollback-parent.d.ts.map +1 -0
- package/dist/state/preparation/rollback-parent.js +18 -0
- package/dist/state/preparation/rollback-parent.js.map +1 -0
- package/dist/state/preparation/root-trust.d.ts +3 -0
- package/dist/state/preparation/root-trust.d.ts.map +1 -0
- package/dist/state/preparation/root-trust.js +70 -0
- package/dist/state/preparation/root-trust.js.map +1 -0
- package/dist/state/private-session.d.ts +5 -2
- package/dist/state/private-session.d.ts.map +1 -1
- package/dist/state/private-session.js +21 -9
- package/dist/state/private-session.js.map +1 -1
- package/dist/state/root.d.ts +25 -0
- package/dist/state/root.d.ts.map +1 -0
- package/dist/state/root.js +84 -0
- package/dist/state/root.js.map +1 -0
- package/dist/state/runtime-paths.d.ts +5 -4
- package/dist/state/runtime-paths.d.ts.map +1 -1
- package/dist/state/runtime-paths.js +5 -4
- package/dist/state/runtime-paths.js.map +1 -1
- package/dist/state/setup-failure.d.ts +3 -0
- package/dist/state/setup-failure.d.ts.map +1 -0
- package/dist/state/setup-failure.js +13 -0
- package/dist/state/setup-failure.js.map +1 -0
- package/dist/state/socket-home.d.ts +17 -12
- package/dist/state/socket-home.d.ts.map +1 -1
- package/dist/state/socket-home.js +31 -14
- package/dist/state/socket-home.js.map +1 -1
- package/dist/state/store.d.ts +1 -3
- package/dist/state/store.d.ts.map +1 -1
- package/dist/state/store.js +3 -18
- package/dist/state/store.js.map +1 -1
- package/dist/terminal/cursor.d.ts +1 -1
- package/dist/terminal/cursor.d.ts.map +1 -1
- package/dist/terminal/cursor.js +36 -1
- package/dist/terminal/cursor.js.map +1 -1
- package/dist/terminal/headless.d.ts +1 -1
- package/dist/terminal/headless.d.ts.map +1 -1
- package/dist/terminal/headless.js +1 -3
- package/dist/terminal/headless.js.map +1 -1
- package/docs/cli-behavior.md +1218 -28
- package/docs/cli.md +2 -0
- package/docs/codex/cli.md +4 -2
- package/docs/embedding.md +7 -0
- package/docs/performance/terminal-engines.md +88 -0
- package/docs/performance.md +120 -0
- package/package.json +4 -4
- package/prd/04-architecture.md +32 -0
- package/prd/05-api/5.1-starting-claude.md +17 -1
- package/prd/05-api/5.2-resuming-claude.md +5 -0
- package/prd/05-api/5.3-claude-session-api.md +267 -40
- package/prd/05-api/5.4-events.md +77 -10
- package/prd/05-api/5.5-starting-codex.md +3 -1
- package/prd/05-api/5.6-resuming-codex.md +4 -1
- package/prd/05-api/5.7-codex-session-api.md +87 -5
- package/prd/05-api/5.8-session-api.md +32 -1
- package/prd/06-claude-hook-bridge.md +2 -0
- package/prd/07a-codex-hook-bridge.md +5 -0
- package/prd/08-state.md +63 -7
- package/prd/09-lifecycle.md +126 -35
- package/prd/10-errors.md +11 -4
- package/prd/12-e2e.md +81 -0
- package/prd/12a-cli.md +63 -9
- package/prd/14-conformance.md +52 -35
- package/prd/16-maintainer-review.md +11 -0
- package/dist/claude/model-composer.d.ts +0 -2
- package/dist/claude/model-composer.d.ts.map +0 -1
- package/dist/claude/model-composer.js +0 -12
- package/dist/claude/model-composer.js.map +0 -1
- package/dist/claude/transcript/drain.d.ts +0 -33
- package/dist/claude/transcript/drain.d.ts.map +0 -1
- package/dist/claude/transcript/drain.js +0 -56
- package/dist/claude/transcript/drain.js.map +0 -1
- package/dist/codex/session/cli-exit.d.ts +0 -24
- package/dist/codex/session/cli-exit.d.ts.map +0 -1
- package/dist/codex/session/cli-exit.js +0 -43
- package/dist/codex/session/cli-exit.js.map +0 -1
- package/dist/codex/transcript/drain.d.ts +0 -30
- package/dist/codex/transcript/drain.d.ts.map +0 -1
- package/dist/codex/transcript/drain.js +0 -48
- package/dist/codex/transcript/drain.js.map +0 -1
- package/dist/runtime/probe-cleanup.d.ts.map +0 -1
- package/dist/runtime/probe-cleanup.js.map +0 -1
- package/dist/runtime/probe.d.ts +0 -11
- package/dist/runtime/probe.d.ts.map +0 -1
- package/dist/runtime/probe.js +0 -113
- package/dist/runtime/probe.js.map +0 -1
- package/dist/runtime/session/foreign-picker.d.ts +0 -8
- package/dist/runtime/session/foreign-picker.d.ts.map +0 -1
- package/dist/runtime/session/foreign-picker.js +0 -18
- package/dist/runtime/session/foreign-picker.js.map +0 -1
- package/dist/runtime/session/picker-input.d.ts +0 -17
- package/dist/runtime/session/picker-input.d.ts.map +0 -1
- package/dist/runtime/session/picker-input.js.map +0 -1
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/** Completion-aware acquisition of the global update lease (PRD §9.2, C-PERF-04). */
|
|
2
|
+
import { elwoodError } from "../../core/errors.js";
|
|
3
|
+
import { completionSnapshot, readCompletionGeneration } from "./completion.js";
|
|
4
|
+
import { releaseLease } from "./owner.js";
|
|
5
|
+
import { pathExists, recoveryPath, waitForOwner } from "./waiting.js";
|
|
6
|
+
/** True grants update ownership; false means no update lease acquired. */
|
|
7
|
+
export async function acquireUpdateLease({ adapter, leasePath, owner, completionMarkerPath, pollMs, staleMs, waitUntilMs, claim, }) {
|
|
8
|
+
const { ownerGeneration: observedGeneration, priorCompletionGeneration, ownerAlreadyCompleted, } = await completionSnapshot(leasePath, completionMarkerPath);
|
|
9
|
+
const observedGenerations = new Set(observedGeneration === undefined ? [] : [observedGeneration]);
|
|
10
|
+
let observedActive = observedGeneration !== undefined ||
|
|
11
|
+
(await pathExists(leasePath)) ||
|
|
12
|
+
(await pathExists(recoveryPath(leasePath)));
|
|
13
|
+
let recoveredStale = false;
|
|
14
|
+
while (!(await claim())) {
|
|
15
|
+
// Losing the claim to an existing lease IS an observation of an active owner; a claim
|
|
16
|
+
// that failed on its own staging finds no lease below and returns as released. Sampling
|
|
17
|
+
// only before the loop misses a peer that claimed in the interim, and that contender
|
|
18
|
+
// would then treat its own later claim as the first attempt and run a duplicate
|
|
19
|
+
// update (PRD §9.2: a contender skips its duplicate attempt).
|
|
20
|
+
observedActive = true;
|
|
21
|
+
const waited = recoveredWait(adapter, await waitForOwner(leasePath, pollMs, staleMs, waitUntilMs));
|
|
22
|
+
if (waited === false)
|
|
23
|
+
return false;
|
|
24
|
+
if (waited.generation !== undefined)
|
|
25
|
+
observedGenerations.add(waited.generation);
|
|
26
|
+
recoveredStale = true;
|
|
27
|
+
}
|
|
28
|
+
let currentCompletionGeneration;
|
|
29
|
+
try {
|
|
30
|
+
currentCompletionGeneration = await readCompletionGeneration(completionMarkerPath);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
await releaseLease(leasePath, owner);
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
const observedOwnerCompleted = ownerAlreadyCompleted ||
|
|
37
|
+
(currentCompletionGeneration !== undefined &&
|
|
38
|
+
observedGenerations.has(currentCompletionGeneration));
|
|
39
|
+
const completionAdvanced = currentCompletionGeneration !== priorCompletionGeneration;
|
|
40
|
+
const unrecoveredContention = !recoveredStale && observedActive;
|
|
41
|
+
if (observedOwnerCompleted || completionAdvanced || unrecoveredContention) {
|
|
42
|
+
await releaseLease(leasePath, owner);
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
/** A nonoptional return and no default make future wait variants a compile-time error. */
|
|
48
|
+
function recoveredWait(adapter, result) {
|
|
49
|
+
switch (result.status) {
|
|
50
|
+
case "released":
|
|
51
|
+
return false;
|
|
52
|
+
case "wait_expired":
|
|
53
|
+
throw elwoodError(`${adapter}_update_failed`, "Another updater has not finished.", {
|
|
54
|
+
updateReason: "active_owner",
|
|
55
|
+
});
|
|
56
|
+
case "cleanup_pending":
|
|
57
|
+
throw elwoodError(`${adapter}_update_failed`, "Another updater's process group has not exited.", { updateReason: "cleanup_pending", cleanupErrorCode: "ETIMEDOUT" });
|
|
58
|
+
case "stale_removed":
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=acquire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acquire.js","sourceRoot":"","sources":["../../../src/runtime/update/acquire.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type LeaseOwner } from "./owner.ts";
|
|
2
|
+
/** An unreadable marker is not proof that an update never completed. */
|
|
3
|
+
export declare function readCompletionGeneration(markerPath: string): Promise<string | undefined>;
|
|
4
|
+
/** Opening first pins the baseline inode while subsequent owner and pathname reads interleave. */
|
|
5
|
+
export declare function completionSnapshot(leasePath: string, markerPath: string): Promise<{
|
|
6
|
+
readonly ownerGeneration: string | undefined;
|
|
7
|
+
readonly priorCompletionGeneration: string | undefined;
|
|
8
|
+
readonly ownerAlreadyCompleted: boolean;
|
|
9
|
+
}>;
|
|
10
|
+
/** Never overwrite a pinned marker inode; interrupted staging is owned by the existing lease. */
|
|
11
|
+
export declare function publishCompletionGeneration(leasePath: string, markerPath: string, owner: LeaseOwner): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=completion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../../src/runtime/update/completion.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAiC,MAAM,YAAY,CAAC;AAE5E,wEAAwE;AACxE,wBAAsB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAO9F;AAED,kGAAkG;AAClG,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;;;;GAmB7E;AAED,iGAAiG;AACjG,wBAAsB,2BAA2B,CAC/C,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,IAAI,CAAC,CAQf"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** Pin completion snapshots and atomically publish generations (PRD §9.2, C-PERF-04). */
|
|
2
|
+
import { open, readFile, rename, unlink, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { errnoCode } from "../../core/errors.js";
|
|
5
|
+
import { pendingOwnerPrefix, readOwner } from "./owner.js";
|
|
6
|
+
/** An unreadable marker is not proof that an update never completed. */
|
|
7
|
+
export async function readCompletionGeneration(markerPath) {
|
|
8
|
+
try {
|
|
9
|
+
return await readFile(markerPath, "utf8");
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
if (errnoCode(error) === "ENOENT")
|
|
13
|
+
return undefined;
|
|
14
|
+
throw error;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/** Opening first pins the baseline inode while subsequent owner and pathname reads interleave. */
|
|
18
|
+
export async function completionSnapshot(leasePath, markerPath) {
|
|
19
|
+
const baseline = await open(markerPath, "r").catch((error) => {
|
|
20
|
+
if (errnoCode(error) === "ENOENT")
|
|
21
|
+
return undefined;
|
|
22
|
+
throw error;
|
|
23
|
+
});
|
|
24
|
+
try {
|
|
25
|
+
const ownerGeneration = (await readOwner(leasePath))?.token;
|
|
26
|
+
const priorCompletionGeneration = await baseline?.readFile("utf8");
|
|
27
|
+
// Keep this pathname observation before claiming: an observed owner may retire meanwhile.
|
|
28
|
+
const visibleCompletionGeneration = await readCompletionGeneration(markerPath);
|
|
29
|
+
return {
|
|
30
|
+
ownerGeneration,
|
|
31
|
+
priorCompletionGeneration,
|
|
32
|
+
ownerAlreadyCompleted: ownerGeneration !== undefined && visibleCompletionGeneration === ownerGeneration,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
await baseline?.close();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** Never overwrite a pinned marker inode; interrupted staging is owned by the existing lease. */
|
|
40
|
+
export async function publishCompletionGeneration(leasePath, markerPath, owner) {
|
|
41
|
+
const staging = join(leasePath, `${pendingOwnerPrefix}${owner.token}.completed`);
|
|
42
|
+
try {
|
|
43
|
+
await writeFile(staging, owner.token, { flag: "wx", mode: 0o600 });
|
|
44
|
+
await rename(staging, markerPath);
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
await unlink(staging).catch(() => undefined);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../../src/runtime/update/completion.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAmB,kBAAkB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5E,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,UAAkB;IAC/D,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACpD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,kGAAkG;AAClG,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAiB,EAAE,UAAkB;IAC5E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACpE,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACpD,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,CAAC,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC;QAC5D,MAAM,yBAAyB,GAAG,MAAM,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnE,0FAA0F;QAC1F,MAAM,2BAA2B,GAAG,MAAM,wBAAwB,CAAC,UAAU,CAAC,CAAC;QAC/E,OAAO;YACL,eAAe;YACf,yBAAyB;YACzB,qBAAqB,EACnB,eAAe,KAAK,SAAS,IAAI,2BAA2B,KAAK,eAAe;SAC1E,CAAC;IACb,CAAC;YAAS,CAAC;QACT,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,SAAiB,EACjB,UAAkB,EAClB,KAAiB;IAEjB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,kBAAkB,GAAG,KAAK,CAAC,KAAK,YAAY,CAAC,CAAC;IACjF,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACnE,MAAM,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACpC,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC"}
|
|
@@ -16,7 +16,7 @@ export declare function updateLockPath(adapter: UpdateAdapter, root?: string): s
|
|
|
16
16
|
* Runs `update` only for the lease owner. A contender waits until that owner
|
|
17
17
|
* settles and then returns without a duplicate update; callers re-read version
|
|
18
18
|
* state after this resolves. Waiting uses timers, never a blocking filesystem loop.
|
|
19
|
-
* After
|
|
19
|
+
* After 165 seconds by default, a still-active owner rejects with the adapter's
|
|
20
20
|
* update_failed error and updateReason active_owner; preflight warns and continues.
|
|
21
21
|
* A lease held by a surviving updater group skips that wait and rejects immediately with
|
|
22
22
|
* updateReason cleanup_pending, since those groups may outlive any bound worth setting.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../../src/runtime/update/lock.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE/C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../../src/runtime/update/lock.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE/C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAaF,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,SAAqB,GAAG,MAAM,CAExF;AAED;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAC3B,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAoDf"}
|
|
@@ -7,16 +7,16 @@ import { randomUUID } from "node:crypto";
|
|
|
7
7
|
import { chmod, mkdir, opendir, rename, rm, writeFile } from "node:fs/promises";
|
|
8
8
|
import { userInfo } from "node:os";
|
|
9
9
|
import { basename, dirname, join } from "node:path";
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
10
|
+
import { waitForProbeGroups } from "../probe/cleanup.js";
|
|
11
|
+
import { acquireUpdateLease } from "./acquire.js";
|
|
12
|
+
import { publishCompletionGeneration } from "./completion.js";
|
|
13
|
+
import { ownerFile, releaseLease, retiredLeaseInfix, serializeOwner, unresolvedProbeGroup, } from "./owner.js";
|
|
13
14
|
import { retainLease } from "./retained-lease.js";
|
|
14
|
-
import { pathExists, recoveryPath
|
|
15
|
+
import { defaultWaitMs, pathExists, recoveryPath } from "./waiting.js";
|
|
15
16
|
const defaultPollMs = 50;
|
|
16
17
|
const defaultStaleMs = 30_000;
|
|
17
18
|
const maxSweptLeftovers = 8;
|
|
18
19
|
const maxInspectedEntries = 64;
|
|
19
|
-
const defaultWaitMs = 60_000;
|
|
20
20
|
const defaultRetainRetryMs = 1_000;
|
|
21
21
|
function defaultLeaseRoot() {
|
|
22
22
|
const user = userInfo();
|
|
@@ -29,7 +29,7 @@ export function updateLockPath(adapter, root = defaultLeaseRoot()) {
|
|
|
29
29
|
* Runs `update` only for the lease owner. A contender waits until that owner
|
|
30
30
|
* settles and then returns without a duplicate update; callers re-read version
|
|
31
31
|
* state after this resolves. Waiting uses timers, never a blocking filesystem loop.
|
|
32
|
-
* After
|
|
32
|
+
* After 165 seconds by default, a still-active owner rejects with the adapter's
|
|
33
33
|
* update_failed error and updateReason active_owner; preflight warns and continues.
|
|
34
34
|
* A lease held by a surviving updater group skips that wait and rejects immediately with
|
|
35
35
|
* updateReason cleanup_pending, since those groups may outlive any bound worth setting.
|
|
@@ -37,7 +37,7 @@ export function updateLockPath(adapter, root = defaultLeaseRoot()) {
|
|
|
37
37
|
*/
|
|
38
38
|
export async function coordinatedAutoupdate(adapter, update, options = {}) {
|
|
39
39
|
const root = options.root ?? defaultLeaseRoot();
|
|
40
|
-
const
|
|
40
|
+
const leasePath = updateLockPath(adapter, root);
|
|
41
41
|
const pollMs = options.pollMs ?? defaultPollMs;
|
|
42
42
|
const staleMs = options.staleMs ?? defaultStaleMs;
|
|
43
43
|
// Monotonic: the wait is a promised bound, so a backward system-clock adjustment must
|
|
@@ -46,35 +46,18 @@ export async function coordinatedAutoupdate(adapter, update, options = {}) {
|
|
|
46
46
|
await mkdir(root, { recursive: true, mode: 0o700 });
|
|
47
47
|
await chmod(root, 0o700);
|
|
48
48
|
const owner = { pid: process.pid, token: randomUUID() };
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const waited = await waitForOwner(path, pollMs, staleMs, waitUntilMs);
|
|
61
|
-
if (waited === "released")
|
|
62
|
-
return;
|
|
63
|
-
if (waited === "wait_expired") {
|
|
64
|
-
throw elwoodError(`${adapter}_update_failed`, "Another updater has not finished.", {
|
|
65
|
-
updateReason: "active_owner",
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
if (waited === "cleanup_pending") {
|
|
69
|
-
throw elwoodError(`${adapter}_update_failed`, "Another updater's process group has not exited.", { updateReason: "cleanup_pending", cleanupErrorCode: "ETIMEDOUT" });
|
|
70
|
-
}
|
|
71
|
-
recoveredStale = true;
|
|
72
|
-
}
|
|
73
|
-
if (!recoveredStale &&
|
|
74
|
-
(observedActive || (await readOptionalText(completion)) !== priorCompletion)) {
|
|
75
|
-
await releaseLease(path, owner);
|
|
49
|
+
const completionMarkerPath = join(root, `${adapter}.completed`);
|
|
50
|
+
if (!(await acquireUpdateLease({
|
|
51
|
+
adapter,
|
|
52
|
+
leasePath,
|
|
53
|
+
owner,
|
|
54
|
+
completionMarkerPath,
|
|
55
|
+
pollMs,
|
|
56
|
+
staleMs,
|
|
57
|
+
waitUntilMs,
|
|
58
|
+
claim: () => claimLease(leasePath, owner),
|
|
59
|
+
})))
|
|
76
60
|
return;
|
|
77
|
-
}
|
|
78
61
|
// Started through `Promise.resolve().then` so an updater that throws SYNCHRONOUSLY is a
|
|
79
62
|
// rejection like any other. Calling `update()` bare would let such a throw escape past
|
|
80
63
|
// the release below with the lease still held, which is the one failure the lease cannot
|
|
@@ -87,11 +70,11 @@ export async function coordinatedAutoupdate(adapter, update, options = {}) {
|
|
|
87
70
|
const abortedGroupId = unresolvedProbeGroup(outcome?.error);
|
|
88
71
|
const unfinishedGroupIds = abortedGroupId === undefined ? [] : await waitForProbeGroups([abortedGroupId]);
|
|
89
72
|
if (unfinishedGroupIds.length === 0) {
|
|
90
|
-
await Promise.allSettled([
|
|
91
|
-
await releaseLease(
|
|
73
|
+
await Promise.allSettled([publishCompletionGeneration(leasePath, completionMarkerPath, owner)]);
|
|
74
|
+
await releaseLease(leasePath, owner);
|
|
92
75
|
}
|
|
93
76
|
else {
|
|
94
|
-
await retainLease(
|
|
77
|
+
await retainLease(leasePath, owner, unfinishedGroupIds, options.retainRetryMs ?? defaultRetainRetryMs);
|
|
95
78
|
}
|
|
96
79
|
if (outcome !== undefined)
|
|
97
80
|
throw outcome.error;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../../src/runtime/update/lock.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../../src/runtime/update/lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,25 +16,28 @@ export type AutoupdateOutcome = {
|
|
|
16
16
|
* Runs the adapter's update at most once per process; concurrent callers share the single
|
|
17
17
|
* in-flight attempt. NEVER rejects — a throwing `runUpdate` resolves to `{ok:false, error}` so the
|
|
18
18
|
* caller can contain it (warn + continue). The cross-process coordinator invalidates the local
|
|
19
|
-
* version cache whether this process owned the update or waited for a peer.
|
|
19
|
+
* version cache whether this process owned the update or waited for a peer. The one exception
|
|
20
|
+
* is test-only: after `resetAutoupdateForTests()`, until a test sets a coordinator, it throws
|
|
21
|
+
* at once instead of returning.
|
|
20
22
|
*/
|
|
21
23
|
export declare function cachedAutoupdate(adapter: UpdateAdapter, runUpdate: () => Promise<void>, afterAttempt?: () => void): Promise<AutoupdateOutcome>;
|
|
24
|
+
/** Settled directory results and retained version-text bounds (C-PERF-02). */
|
|
25
|
+
export declare const maxSettledPreflightDirectoryResults = 32;
|
|
26
|
+
export declare const maxKeptVersionStreamCodeUnits: number;
|
|
22
27
|
/**
|
|
23
|
-
* Reads the adapter's `--version`
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
28
|
+
* Reads the adapter's `--version` per observed directory. Concurrent callers share the
|
|
29
|
+
* in-flight read and its outcome. Retain up to 32 successful directory results whose stdout
|
|
30
|
+
* and stderr each contain at most 65,536 UTF-16 units. Oversized successes are returned
|
|
31
|
+
* without retention. Rejections and failed probes (nonzero exit, timeout, spawn error) are
|
|
32
|
+
* not retained, so the next caller after settlement reads again (C-LIFE-11). Every update
|
|
33
|
+
* attempt invalidates all directory results before callers validate their installed version.
|
|
27
34
|
*/
|
|
28
|
-
export declare function cachedVersionRead(adapter: UpdateAdapter, read: () => Promise<CommandResult
|
|
35
|
+
export declare function cachedVersionRead(adapter: UpdateAdapter, read: () => Promise<CommandResult>, cwd?: string): Promise<CommandResult>;
|
|
29
36
|
export declare function invalidateVersionRead(adapter: UpdateAdapter): void;
|
|
30
|
-
/**
|
|
31
|
-
* Share one in-flight promise per key, but EVICT the entry if it rejects, so a rejected result is
|
|
32
|
-
* never retained/replayed to a later caller (which would poison the process). A successful result
|
|
33
|
-
* stays cached for the process lifetime. This is the general guard against the "cached rejected
|
|
34
|
-
* promise poisons every later caller" class of bug (C-LIFE-11).
|
|
35
|
-
*/
|
|
36
|
-
export declare function dedupeInFlight<K, T>(cache: Map<K, Promise<T>>, key: K, run: () => Promise<T>): Promise<T>;
|
|
37
|
+
/** Clears the update attempts, and refuses any further update until a test sets a coordinator. */
|
|
37
38
|
export declare function resetAutoupdateForTests(): void;
|
|
39
|
+
/** Whether an update would be refused: true from a reset until a test sets a coordinator. */
|
|
40
|
+
export declare function updatesRefusedForTests(): boolean;
|
|
38
41
|
export declare function setUpdateCoordinatorForTests(coordinator: typeof coordinatedAutoupdate): void;
|
|
39
42
|
export declare function resetPreflightCacheForTests(): void;
|
|
40
43
|
//# sourceMappingURL=once.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"once.d.ts","sourceRoot":"","sources":["../../../src/runtime/update/once.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"once.d.ts","sourceRoot":"","sources":["../../../src/runtime/update/once.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAItE,wFAAwF;AACxF,MAAM,MAAM,iBAAiB,GACzB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GACrB;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAQpD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAC9B,YAAY,CAAC,EAAE,MAAM,IAAI,GACxB,OAAO,CAAC,iBAAiB,CAAC,CAS5B;AAkBD,8EAA8E;AAC9E,eAAO,MAAM,mCAAmC,KAAK,CAAC;AACtD,eAAO,MAAM,6BAA6B,QAAY,CAAC;AAgBvD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,EAClC,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,aAAa,CAAC,CAExB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAElE;AAYD,kGAAkG;AAClG,wBAAgB,uBAAuB,IAAI,IAAI,CAG9C;AAED,6FAA6F;AAC7F,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,OAAO,qBAAqB,GAAG,IAAI,CAK5F;AAED,wBAAgB,2BAA2B,IAAI,IAAI,CAElD"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Implements PRD §9.2 fleet-spawn dedupe, version caching, and the best-effort,
|
|
4
4
|
* never-poisoning update contract (C-LIFE-09, C-LIFE-11).
|
|
5
5
|
*/
|
|
6
|
+
import { createDirectoryProbeCache, readInDirectory, } from "../probe/directory-key.js";
|
|
6
7
|
import { coordinatedAutoupdate } from "./lock.js";
|
|
7
8
|
let coordinateUpdate = coordinatedAutoupdate;
|
|
8
9
|
// The settled autoupdate outcome per adapter. Every `autoupdate: true` caller awaits the SAME
|
|
@@ -14,7 +15,9 @@ const autoupdates = new Map();
|
|
|
14
15
|
* Runs the adapter's update at most once per process; concurrent callers share the single
|
|
15
16
|
* in-flight attempt. NEVER rejects — a throwing `runUpdate` resolves to `{ok:false, error}` so the
|
|
16
17
|
* caller can contain it (warn + continue). The cross-process coordinator invalidates the local
|
|
17
|
-
* version cache whether this process owned the update or waited for a peer.
|
|
18
|
+
* version cache whether this process owned the update or waited for a peer. The one exception
|
|
19
|
+
* is test-only: after `resetAutoupdateForTests()`, until a test sets a coordinator, it throws
|
|
20
|
+
* at once instead of returning.
|
|
18
21
|
*/
|
|
19
22
|
export function cachedAutoupdate(adapter, runUpdate, afterAttempt) {
|
|
20
23
|
const existing = autoupdates.get(adapter);
|
|
@@ -36,45 +39,51 @@ function finalizeAutoupdate(adapter, outcome, afterAttempt) {
|
|
|
36
39
|
return { ok: false, error };
|
|
37
40
|
}
|
|
38
41
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
const
|
|
42
|
+
/** Settled directory results and retained version-text bounds (C-PERF-02). */
|
|
43
|
+
export const maxSettledPreflightDirectoryResults = 32;
|
|
44
|
+
export const maxKeptVersionStreamCodeUnits = 64 * 1024;
|
|
45
|
+
/** Retain only successful version results with at most 65,536 UTF-16 units per stream. */
|
|
46
|
+
const isCacheableVersionResult = (result) => result.status === 0 &&
|
|
47
|
+
result.error === undefined &&
|
|
48
|
+
result.stdout.length <= maxKeptVersionStreamCodeUnits &&
|
|
49
|
+
result.stderr.length <= maxKeptVersionStreamCodeUnits;
|
|
50
|
+
// Matching directory reads share a run; retain at most 32 successful directory identities
|
|
51
|
+
// per adapter. Every update attempt invalidates all of that adapter's directory entries.
|
|
52
|
+
const versionReads = {
|
|
53
|
+
claude: createDirectoryProbeCache(maxSettledPreflightDirectoryResults, isCacheableVersionResult),
|
|
54
|
+
codex: createDirectoryProbeCache(maxSettledPreflightDirectoryResults, isCacheableVersionResult),
|
|
55
|
+
};
|
|
42
56
|
/**
|
|
43
|
-
* Reads the adapter's `--version`
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
57
|
+
* Reads the adapter's `--version` per observed directory. Concurrent callers share the
|
|
58
|
+
* in-flight read and its outcome. Retain up to 32 successful directory results whose stdout
|
|
59
|
+
* and stderr each contain at most 65,536 UTF-16 units. Oversized successes are returned
|
|
60
|
+
* without retention. Rejections and failed probes (nonzero exit, timeout, spawn error) are
|
|
61
|
+
* not retained, so the next caller after settlement reads again (C-LIFE-11). Every update
|
|
62
|
+
* attempt invalidates all directory results before callers validate their installed version.
|
|
47
63
|
*/
|
|
48
|
-
export function cachedVersionRead(adapter, read) {
|
|
49
|
-
return
|
|
64
|
+
export function cachedVersionRead(adapter, read, cwd = process.cwd()) {
|
|
65
|
+
return readInDirectory(versionReads[adapter], cwd, read);
|
|
50
66
|
}
|
|
51
67
|
export function invalidateVersionRead(adapter) {
|
|
52
|
-
versionReads.
|
|
68
|
+
versionReads[adapter].clear();
|
|
53
69
|
}
|
|
54
70
|
/**
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
71
|
+
* Stands in for the coordinator after a reset, until a test sets one. The production coordinator
|
|
72
|
+
* takes its default root from the passwd database, not `HOME`, so a test's private `HOME` would
|
|
73
|
+
* not keep it out of the developer's real lease root. It throws rather than rejects: a rejection
|
|
74
|
+
* would be contained as a best-effort update's warning, and the preflight would carry on.
|
|
59
75
|
*/
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
if (existing)
|
|
63
|
-
return existing;
|
|
64
|
-
const pending = run();
|
|
65
|
-
cache.set(key, pending);
|
|
66
|
-
// Evict on rejection so the next caller retries rather than inheriting the failure. Identity-
|
|
67
|
-
// guarded (only evict if THIS promise is still cached), so a later successful entry is never
|
|
68
|
-
// clobbered. The `.catch` also keeps the eviction chain from becoming an unhandled rejection.
|
|
69
|
-
pending.catch(() => {
|
|
70
|
-
if (cache.get(key) === pending)
|
|
71
|
-
cache.delete(key);
|
|
72
|
-
});
|
|
73
|
-
return pending;
|
|
76
|
+
function refuseRealUpdateRoot() {
|
|
77
|
+
throw new Error("set a private update root: call setUpdateCoordinatorForTests after the reset");
|
|
74
78
|
}
|
|
79
|
+
/** Clears the update attempts, and refuses any further update until a test sets a coordinator. */
|
|
75
80
|
export function resetAutoupdateForTests() {
|
|
76
81
|
autoupdates.clear();
|
|
77
|
-
coordinateUpdate =
|
|
82
|
+
coordinateUpdate = refuseRealUpdateRoot;
|
|
83
|
+
}
|
|
84
|
+
/** Whether an update would be refused: true from a reset until a test sets a coordinator. */
|
|
85
|
+
export function updatesRefusedForTests() {
|
|
86
|
+
return coordinateUpdate === refuseRealUpdateRoot;
|
|
78
87
|
}
|
|
79
88
|
export function setUpdateCoordinatorForTests(coordinator) {
|
|
80
89
|
// Unit tests provide in-memory command runners and must never contend with a
|
|
@@ -83,6 +92,7 @@ export function setUpdateCoordinatorForTests(coordinator) {
|
|
|
83
92
|
coordinateUpdate = coordinator;
|
|
84
93
|
}
|
|
85
94
|
export function resetPreflightCacheForTests() {
|
|
86
|
-
|
|
95
|
+
for (const cache of Object.values(versionReads))
|
|
96
|
+
cache.clear();
|
|
87
97
|
}
|
|
88
98
|
//# sourceMappingURL=once.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"once.js","sourceRoot":"","sources":["../../../src/runtime/update/once.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"once.js","sourceRoot":"","sources":["../../../src/runtime/update/once.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { randomUUID } from "node:crypto";
|
|
|
6
6
|
import { readFile, rename, rm, unlink, writeFile } from "node:fs/promises";
|
|
7
7
|
import { join } from "node:path";
|
|
8
8
|
import { ElwoodError, errnoCode } from "../../core/errors.js";
|
|
9
|
-
import { processGroupGone } from "../probe
|
|
9
|
+
import { processGroupGone } from "../probe/cleanup.js";
|
|
10
10
|
export const ownerFile = "owner";
|
|
11
11
|
/** Marks a lease directory already retired by its owner and awaiting deletion. */
|
|
12
12
|
export const retiredLeaseInfix = ".released.";
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* the lease for the owner host's lifetime.
|
|
5
5
|
*/
|
|
6
6
|
import { setTimeout as delay } from "node:timers/promises";
|
|
7
|
-
import { processGroupGone } from "../probe
|
|
7
|
+
import { processGroupGone } from "../probe/cleanup.js";
|
|
8
8
|
import { releaseLease, retainProbeOwner } from "./owner.js";
|
|
9
9
|
/**
|
|
10
10
|
* Records the surviving groups as the lease's only holders, so the lease outlives this
|
|
@@ -1,4 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* A contender's default wait: longer than an owner can hold the lease while its two probes,
|
|
3
|
+
* the `--version` read that confirms the CLI exists and then the update, each stay within
|
|
4
|
+
* their launch and command bounds (§9.2). The margin covers each probe's abort cleanup and
|
|
5
|
+
* the group observation after it, so a contender never re-reads a version mid-update.
|
|
6
|
+
*/
|
|
7
|
+
export declare const defaultWaitMs: number;
|
|
8
|
+
export type UpdateWaitResult = {
|
|
9
|
+
readonly status: "released" | "wait_expired" | "cleanup_pending";
|
|
10
|
+
} | {
|
|
11
|
+
readonly status: "stale_removed";
|
|
12
|
+
readonly generation: string | undefined;
|
|
13
|
+
};
|
|
14
|
+
export declare function waitForOwner(path: string, pollMs: number, staleMs: number, waitUntilMs: number): Promise<UpdateWaitResult>;
|
|
2
15
|
export declare function recoveryPath(path: string): string;
|
|
3
16
|
export declare function pathExists(path: string): Promise<boolean>;
|
|
4
17
|
//# sourceMappingURL=waiting.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"waiting.d.ts","sourceRoot":"","sources":["../../../src/runtime/update/waiting.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"waiting.d.ts","sourceRoot":"","sources":["../../../src/runtime/update/waiting.ts"],"names":[],"mappings":"AAUA;;;;;GAKG;AACH,eAAO,MAAM,aAAa,QAA8D,CAAC;AAEzF,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,cAAc,GAAG,iBAAiB,CAAA;CAAE,GACpE;IAAE,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAKlF,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC,CA4B3B;AAuCD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/D"}
|
|
@@ -5,11 +5,19 @@
|
|
|
5
5
|
import { opendir, rename, rmdir, stat, unlink } from "node:fs/promises";
|
|
6
6
|
import { join } from "node:path";
|
|
7
7
|
import { setTimeout as delay } from "node:timers/promises";
|
|
8
|
+
import { probeCommandTimeoutMs, probeLaunchTimeoutMs } from "../probe/index.js";
|
|
8
9
|
import { leaseIsAlive, ownerFile, pendingOwnerPrefix, readOwner } from "./owner.js";
|
|
10
|
+
/**
|
|
11
|
+
* A contender's default wait: longer than an owner can hold the lease while its two probes,
|
|
12
|
+
* the `--version` read that confirms the CLI exists and then the update, each stay within
|
|
13
|
+
* their launch and command bounds (§9.2). The margin covers each probe's abort cleanup and
|
|
14
|
+
* the group observation after it, so a contender never re-reads a version mid-update.
|
|
15
|
+
*/
|
|
16
|
+
export const defaultWaitMs = 2 * (probeLaunchTimeoutMs + probeCommandTimeoutMs) + 15_000;
|
|
9
17
|
export async function waitForOwner(path, pollMs, staleMs, waitUntilMs) {
|
|
10
18
|
for (;;) {
|
|
11
19
|
if (performance.now() >= waitUntilMs)
|
|
12
|
-
return "wait_expired";
|
|
20
|
+
return { status: "wait_expired" };
|
|
13
21
|
let lease;
|
|
14
22
|
try {
|
|
15
23
|
lease = await stat(path);
|
|
@@ -17,7 +25,7 @@ export async function waitForOwner(path, pollMs, staleMs, waitUntilMs) {
|
|
|
17
25
|
catch {
|
|
18
26
|
if (await restoreRecovery(path))
|
|
19
27
|
continue;
|
|
20
|
-
return "released";
|
|
28
|
+
return { status: "released" };
|
|
21
29
|
}
|
|
22
30
|
const current = await readOwner(path);
|
|
23
31
|
// Presence of the record only, not proof that any of those groups still runs; the
|
|
@@ -26,15 +34,15 @@ export async function waitForOwner(path, pollMs, staleMs, waitUntilMs) {
|
|
|
26
34
|
// A lease held by a surviving updater group is not worth waiting out: those groups may
|
|
27
35
|
// outlive any bound this contender could set, so it says so and moves on.
|
|
28
36
|
if (hasRecordedProcessGroups && current !== undefined && leaseIsAlive(current))
|
|
29
|
-
return "cleanup_pending";
|
|
37
|
+
return { status: "cleanup_pending" };
|
|
30
38
|
// Groups, unlike a parent process, are confirmed gone rather than merely quiet, so a
|
|
31
39
|
// lease whose every group has exited is dead whatever its age says.
|
|
32
40
|
if (hasRecordedProcessGroups || Date.now() - lease.mtimeMs >= staleMs) {
|
|
33
41
|
const recovered = await recoverStaleLease(path);
|
|
34
|
-
if (recovered === "removed")
|
|
35
|
-
return "stale_removed";
|
|
36
|
-
if (recovered === "unrecoverable")
|
|
37
|
-
return "released";
|
|
42
|
+
if (recovered.status === "removed")
|
|
43
|
+
return { status: "stale_removed", generation: recovered.generation };
|
|
44
|
+
if (recovered.status === "unrecoverable")
|
|
45
|
+
return { status: "released" };
|
|
38
46
|
}
|
|
39
47
|
await delay(pollMs);
|
|
40
48
|
}
|
|
@@ -42,17 +50,17 @@ export async function waitForOwner(path, pollMs, staleMs, waitUntilMs) {
|
|
|
42
50
|
async function recoverStaleLease(path) {
|
|
43
51
|
const expected = await readOwner(path);
|
|
44
52
|
if (expected !== undefined && leaseIsAlive(expected))
|
|
45
|
-
return "alive";
|
|
53
|
+
return { status: "alive" };
|
|
46
54
|
const recovery = recoveryPath(path);
|
|
47
55
|
try {
|
|
48
56
|
await rename(path, recovery);
|
|
49
57
|
}
|
|
50
58
|
catch {
|
|
51
|
-
return (await pathExists(recovery)) ? "alive" : "unrecoverable";
|
|
59
|
+
return { status: (await pathExists(recovery)) ? "alive" : "unrecoverable" };
|
|
52
60
|
}
|
|
53
61
|
const moved = await readOwner(recovery);
|
|
54
62
|
if (expected?.token !== moved?.token || (moved !== undefined && leaseIsAlive(moved))) {
|
|
55
|
-
return "unrecoverable";
|
|
63
|
+
return { status: "unrecoverable" };
|
|
56
64
|
}
|
|
57
65
|
try {
|
|
58
66
|
if (moved !== undefined)
|
|
@@ -65,10 +73,10 @@ async function recoverStaleLease(path) {
|
|
|
65
73
|
if (entry.name.startsWith(pendingOwnerPrefix))
|
|
66
74
|
await unlink(join(recovery, entry.name));
|
|
67
75
|
await rmdir(recovery);
|
|
68
|
-
return "removed";
|
|
76
|
+
return { status: "removed", generation: moved?.token };
|
|
69
77
|
}
|
|
70
78
|
catch {
|
|
71
|
-
return "unrecoverable";
|
|
79
|
+
return { status: "unrecoverable" };
|
|
72
80
|
}
|
|
73
81
|
}
|
|
74
82
|
async function restoreRecovery(path) {
|