@with-logic/elwood 0.2.1 → 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 +565 -1
- package/CONTRIBUTING.md +3 -0
- package/README.md +4 -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 +6 -5
- package/dist/runtime/session/base.js.map +1 -1
- package/dist/runtime/session/commands.d.ts +5 -3
- 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 +13 -11
- package/dist/runtime/session/picker.d.ts.map +1 -1
- package/dist/runtime/session/picker.js +46 -24
- 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/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/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
package/docs/cli.md
CHANGED
|
@@ -33,6 +33,8 @@ Pick an agent with `--agent`, `ELWOOD_AGENT`, or the config `agent` key. When
|
|
|
33
33
|
nothing selects one, a new run auto-detects: Elwood tries `claude` first, then
|
|
34
34
|
`codex`, and uses the first whose command resolves in your login shell. It only
|
|
35
35
|
asks the shell `command -v`, so neither agent starts during detection.
|
|
36
|
+
Detection runs from the effective workspace, so `-C`/`--cwd` changes the command
|
|
37
|
+
lookup directory, including for `config effective`.
|
|
36
38
|
`config effective` reports that choice with source `auto-detected`. If neither
|
|
37
39
|
resolves, the run fails before launch with `no_agent_found` (status 2) and a
|
|
38
40
|
message naming both agents and how to install or select one. Once an agent is
|
package/docs/codex/cli.md
CHANGED
|
@@ -28,8 +28,10 @@ Useful CLI capabilities for Elwood:
|
|
|
28
28
|
- Some Codex versions expose `--dangerously-bypass-hook-trust`, which lets
|
|
29
29
|
generated Elwood hooks run for one invocation without requiring a persisted
|
|
30
30
|
trust prompt. Elwood must detect support before passing it because other Codex
|
|
31
|
-
versions reject unknown flags. Detection
|
|
32
|
-
|
|
31
|
+
versions reject unknown flags. Detection retains the derived boolean for up to
|
|
32
|
+
32 successful directory identities per process and is invalidated after an
|
|
33
|
+
update attempt. Version results use the same directory bound, and are retained
|
|
34
|
+
only when stdout and stderr each contain at most 65,536 UTF-16 units.
|
|
33
35
|
- Codex can also render interactive trust and update prompts before the session
|
|
34
36
|
is usable. Elwood should select `Trust all and continue` for hook prompts, and
|
|
35
37
|
skip TUI update prompts because API-level `autoupdate` runs `codex update`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@with-logic/elwood",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Control interactive agentic coding CLIs (Claude Code, Codex) through real terminal sessions: typed hooks, a unified activity stream, resumable sessions, and a headless CLI.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Logic App, Inc.",
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"check:lines": "node --no-warnings scripts/check-lines.ts",
|
|
66
66
|
"check": "npm run build && npm run typecheck && npm run lint && npm run check:lines && npm test",
|
|
67
67
|
"check:all": "npm run check && npm run test:e2e",
|
|
68
|
-
"test:e2e": "exec node --no-warnings --experimental-test-coverage --test-coverage-include='src/**/*.ts' --test-coverage-exclude='tests/**' --test-timeout=240000 --test-concurrency=1 --test tests/e2e/*.e2e.ts",
|
|
68
|
+
"test:e2e": "exec node --no-warnings --experimental-test-coverage --test-coverage-include='src/**/*.ts' --test-coverage-exclude='tests/**' --test-timeout=240000 --test-concurrency=1 --import ./tests/e2e/codex-home.ts --import ./tests/e2e/claude-home.ts --import ./tests/e2e/run-dir.ts --test tests/e2e/*.e2e.ts",
|
|
69
69
|
"dev:app": "exec node --no-warnings dev/dev.ts",
|
|
70
70
|
"dev:web": "exec node --no-warnings scripts/supervise.ts dev/web/dev.ts",
|
|
71
71
|
"example:minimal": "exec node --no-warnings scripts/supervise.ts examples/minimal.ts",
|
|
@@ -76,11 +76,11 @@
|
|
|
76
76
|
"@biomejs/biome": "2.4.15",
|
|
77
77
|
"@types/node": "^25.9.1",
|
|
78
78
|
"@types/ws": "^8.18.1",
|
|
79
|
-
"@vitest/coverage-istanbul": "^4.1.
|
|
79
|
+
"@vitest/coverage-istanbul": "^4.1.12",
|
|
80
80
|
"@xterm/addon-fit": "^0.11.0",
|
|
81
81
|
"@xterm/xterm": "^6.0.0",
|
|
82
82
|
"typescript": "^6.0.3",
|
|
83
|
-
"vitest": "^4.1.
|
|
83
|
+
"vitest": "^4.1.12",
|
|
84
84
|
"ws": "^8.21.0"
|
|
85
85
|
},
|
|
86
86
|
"dependencies": {
|
package/prd/04-architecture.md
CHANGED
|
@@ -45,10 +45,42 @@ This interactive login form (`-l -i` for zsh) applies to both the **agent PTY**
|
|
|
45
45
|
and one-shot, non-PTY preflight probes (`--version`, `update`, `--help`). The
|
|
46
46
|
same shell startup files MUST resolve the CLI for every lifecycle operation so
|
|
47
47
|
preflight, update, launch, and resume cannot operate on different installations.
|
|
48
|
+
A probe's shell startup and its command are bounded separately (§9.2), so a slow
|
|
49
|
+
profile is not reported as a failing CLI.
|
|
48
50
|
|
|
49
51
|
Elwood MUST provide diagnostics or tests proving that environment variables from
|
|
50
52
|
the user's shell startup are visible to the launched agent process.
|
|
51
53
|
|
|
54
|
+
Shell startup files can also export `CODEX_HOME`, which moves Codex's
|
|
55
|
+
`config.toml`, and can derive it from anything the launch has: the directory the
|
|
56
|
+
shell starts in (`$PWD`), whether it has a terminal, or the session's environment
|
|
57
|
+
(`ELWOOD_SESSION_ID`). Elwood therefore never reads Codex's home from its own
|
|
58
|
+
process environment, and does not ask a second shell, which would have neither
|
|
59
|
+
the terminal nor the session's environment. The Codex launch script itself, after
|
|
60
|
+
the startup files load and immediately before `exec codex`, writes the
|
|
61
|
+
`CODEX_HOME` and `HOME` that a child process receives (only exported values,
|
|
62
|
+
exactly what Codex inherits), and the directory it starts Codex in (`$PWD`), to a
|
|
63
|
+
per-launch report in the session's private socket home (§8.1). If that write
|
|
64
|
+
fails, the script exits with status 73 and never starts Codex, and a start that
|
|
65
|
+
fails this way rejects with `codex_start_failed` whose `details.phase` is
|
|
66
|
+
`"codex_home_report"` and whose `details.path` names the report. The session reads
|
|
67
|
+
the report when a model operation first needs it. An operation can start before
|
|
68
|
+
Codex does, so a report the launch shell has not finished is waited for within
|
|
69
|
+
that operation's deadline, and a deadline that ends the wait rejects with
|
|
70
|
+
`details.path` naming the report. The session applies Codex's own rule: a non-empty
|
|
71
|
+
`CODEX_HOME`, canonicalized as Codex canonicalizes it (a relative value from the
|
|
72
|
+
reported directory, following each symlink before a later `..`, as the kernel
|
|
73
|
+
does), else `$HOME/.codex` (an empty `HOME` falls back to the account's home
|
|
74
|
+
directory, and a relative one names a path from the reported directory, as Codex
|
|
75
|
+
uses `HOME` as given). The session keeps the resulting `config.toml` path, and its configured
|
|
76
|
+
default (§5.3 `isDefault`) and `setModel` snapshot and restore (C-CODEX-14) use
|
|
77
|
+
only that file. A report that cannot be read, or a `CODEX_HOME` that does not
|
|
78
|
+
exist, fails `listModels` and `setModel` with `model_automation_failed`, whose
|
|
79
|
+
`details.path` names the report; `setModel` fails before it opens the picker, so
|
|
80
|
+
Codex never persists a selection that Elwood could not restore. Elwood does not
|
|
81
|
+
fall back to its own environment: guessing would read and restore a file that
|
|
82
|
+
Codex might not use. C-CODEX-24.
|
|
83
|
+
|
|
52
84
|
### 4.3 Claude settings behavior
|
|
53
85
|
|
|
54
86
|
Elwood MUST NOT mutate `.claude/settings.local.json` by default.
|
|
@@ -27,7 +27,23 @@ type ClaudeReasoningEffort = "low" | "medium" | "high" | "xhigh" | "max";
|
|
|
27
27
|
declare function startClaude(options: StartClaudeOptions): Promise<ClaudeSessionApi>;
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
-
`cwd` is the working directory where Claude should start.
|
|
30
|
+
`cwd` is the working directory where Claude should start. It MUST already be a
|
|
31
|
+
directory: otherwise `startClaude` rejects with `claude_start_failed`, whose
|
|
32
|
+
`details` carry `cwd` and the failed check's `errno` (`ENOENT`, `ENOTDIR`, or,
|
|
33
|
+
when the check itself fails, its own code such as `EACCES`), before it runs any
|
|
34
|
+
probe, writes any state, or spawns Claude. A relative `cwd` is resolved against
|
|
35
|
+
the process working directory when `startClaude` is called; one that can't be,
|
|
36
|
+
because that directory was deleted, rejects the same way, with `cwd` as given.
|
|
37
|
+
Because `cwd` can be removed while the probes run, it is checked again after
|
|
38
|
+
preflight, before any state is written, and a launch that fails while `cwd` is
|
|
39
|
+
gone, no longer a directory, can't be checked, or is no longer the directory
|
|
40
|
+
that check found (it was deleted and made again) rejects the same way, keeping
|
|
41
|
+
the failed launch's `cause` and any cleanup details (§9.1, §10). Elwood never
|
|
42
|
+
creates it: a state directory is made only while `cwd` exists, one at or under
|
|
43
|
+
`cwd`, the default `<cwd>/.elwood` or a caller's own, only below it, and no
|
|
44
|
+
state write makes a missing parent (§8.1, C-STATE-14), so a deleted worktree is
|
|
45
|
+
not silently recreated empty (C-API-61).
|
|
46
|
+
`stateDir` overrides
|
|
31
47
|
the default Elwood state directory. `name` is a launch-time convenience forwarded
|
|
32
48
|
to Claude's documented `--name` flag; it is not persisted in Elwood state (§8.2).
|
|
33
49
|
`hooks` registers
|
|
@@ -29,6 +29,11 @@ callers that resume from a different process working directory must pass the
|
|
|
29
29
|
original `cwd` or the explicit `stateDir` used at start time. Calling
|
|
30
30
|
`resumeClaude({ elwoodSessionId })` without `cwd` or `stateDir` uses the current
|
|
31
31
|
process working directory to discover the project-local state store.
|
|
32
|
+
Claude relaunches in the given `cwd`, resolved against the process working
|
|
33
|
+
directory when `resumeClaude` is called (one that can't be resolved rejects as on
|
|
34
|
+
start), else in the record's `cwd`. That
|
|
35
|
+
directory must still be a directory, checked before and after preflight as on
|
|
36
|
+
start, and `details.cwd` names it (§5.1, C-API-61).
|
|
32
37
|
|
|
33
38
|
`resumeClaude` must verify that the persisted Elwood session record belongs to
|
|
34
39
|
the Claude adapter before launching. Passing a Codex session ID to `resumeClaude`
|
|
@@ -53,7 +53,7 @@ interface SendOptions {
|
|
|
53
53
|
// with an explicit format (never both — the alternatives are mutually exclusive).
|
|
54
54
|
// Bytes are written to a short-lived temp file so the adapter attach paths (which
|
|
55
55
|
// are file- or clipboard-based) have something to read; the temp file is removed
|
|
56
|
-
// (best-effort) after the submission is attached.
|
|
56
|
+
// (best-effort) after the submission is attached, or at once when the attach is aborted.
|
|
57
57
|
type ImageInput =
|
|
58
58
|
| { readonly path: string }
|
|
59
59
|
| { readonly data: Uint8Array; readonly format: "png" | "jpeg" | "gif" | "webp" };
|
|
@@ -144,6 +144,24 @@ failing MCP server's retry spinner) or a session whose readiness hook never
|
|
|
144
144
|
arrives (a missing or failed hook bridge) must not starve readiness forever, so
|
|
145
145
|
initial readiness fires no later than a fixed deadline after the first rendered
|
|
146
146
|
frame even when neither a hook nor (on cold start) any composer signal arrives.
|
|
147
|
+
Codex's deadline releases readiness only onto a frame showing a configured
|
|
148
|
+
session's composer outside any blocking dialog. Codex 0.164 paints a boot
|
|
149
|
+
composer before its session is configured and adds the model footer beneath the
|
|
150
|
+
composer once it is; under load its directory-trust gate followed 11 to 31
|
|
151
|
+
seconds after its first frame, so a deadline releasing the boot composer reported
|
|
152
|
+
`ready` before trust was answered and drained the queue toward that gate. A Codex
|
|
153
|
+
deadline that expires before the configured composer paints fires on the first
|
|
154
|
+
frame that shows it (after any blocking dialog clears, as below); work on screen
|
|
155
|
+
does not delay it. A backstop 60 seconds after the first rendered frame, twice
|
|
156
|
+
the longest gate delay measured, releases readiness without that composer, so a
|
|
157
|
+
footer Elwood does not recognize delays readiness but never starves it. Codex's
|
|
158
|
+
deadline is therefore two-stage, and 10 seconds is not its maximum: a gate that
|
|
159
|
+
paints after the backstop can still follow `ready`. When the backstop releases
|
|
160
|
+
readiness while the latest frame shows no configured composer, Codex emits one
|
|
161
|
+
live-only, content-free `initial_ready_backstop` warning (§5.7), so a host can
|
|
162
|
+
tell that readiness from readiness on configured-composer evidence. A backstop
|
|
163
|
+
mark that a blocking dialog deferred until the configured composer painted does
|
|
164
|
+
not warn.
|
|
147
165
|
Subsequent turn readiness comes from
|
|
148
166
|
completion signals such as an unblocked `Stop` hook. A Stop captures the current
|
|
149
167
|
queue-backed caller submission before notifying observers or invoking handlers. If a newer
|
|
@@ -352,7 +370,10 @@ submits the text, BEFORE the text's submitting Enter, so a single call produces
|
|
|
352
370
|
a single agent turn carrying both. An image given as bytes is written to a
|
|
353
371
|
short-lived temp file (the adapter attach paths are file- or clipboard-based);
|
|
354
372
|
Elwood attempts to remove every such temp file after the submission is attached,
|
|
355
|
-
on success or failure (best-effort — see the residual limitations below).
|
|
373
|
+
on success or failure (best-effort — see the residual limitations below). When the
|
|
374
|
+
attach is aborted, as when its session closes, Elwood removes the temp files at once,
|
|
375
|
+
so `stop`, `kill`, and `teardown` resolve with an in-flight attach's temp files gone
|
|
376
|
+
unless that removal fails; the attach then retries it once it unwinds.
|
|
356
377
|
|
|
357
378
|
Inputs are validated and bounded BEFORE any temp file is written or any input
|
|
358
379
|
reaches the composer, and a validation failure rejects the whole call so nothing
|
|
@@ -405,21 +426,38 @@ CLIs (Claude 2.1.215, codex-cli 0.144.6):
|
|
|
405
426
|
is the clipboard contents is accepted by design. When the restore itself fails,
|
|
406
427
|
the attach result is unchanged (still success) but Elwood surfaces a content-free
|
|
407
428
|
`clipboard_restore_failed` warning (no clipboard contents) so the possible loss
|
|
408
|
-
of the user's prior clipboard is diagnosable rather than silent.
|
|
429
|
+
of the user's prior clipboard is diagnosable rather than silent. Codex saves
|
|
430
|
+
each pasted image as a `codex-clipboard-*.png` file directly in its temp
|
|
431
|
+
directory and never removes it. Once a Codex session's CLI has exited, by
|
|
432
|
+
`stop`, `kill`, `teardown`, or on its own, Elwood removes (best-effort) every
|
|
433
|
+
such file the session's transcript recorded as a `local_image` of a user
|
|
434
|
+
message while Elwood watched it, one file at a time, before the session emits
|
|
435
|
+
`terminal:exit` and before that `stop`, `kill`, or `teardown` resolves. It
|
|
436
|
+
removes no other file: not an image the caller named by its own path, not a
|
|
437
|
+
copy the transcript never named, and not a path with a `..` segment, which a
|
|
438
|
+
link could lead out of the temp directory. A copy already gone is not a
|
|
439
|
+
failure. A removal that fails leaves that copy for the OS to reap and does not
|
|
440
|
+
stop the removals after it; when any fails, the session emits one content-free
|
|
441
|
+
`image_copy_removal_failed` warning (§5.7), before `terminal:exit`, carrying the
|
|
442
|
+
first failure's errno token, or `UnknownError` when it has none. When every copy
|
|
443
|
+
was removed or was already gone, there is no warning.
|
|
409
444
|
|
|
410
445
|
Image attachment carries several accepted residual limitations. First, temp-file
|
|
411
|
-
removal
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
446
|
+
removal is best-effort: the primary attach/materialize error is always preserved
|
|
447
|
+
(a cleanup failure never masks it), and a failed removal surfaces no distinct error.
|
|
448
|
+
A removal that fails when the attach is aborted is retried once, when the attach
|
|
449
|
+
unwinds, which `stop`, `kill`, and `teardown` do not wait for; a removal that fails
|
|
450
|
+
as the attach unwinds is not retried. Either leaves the file in the OS temp directory
|
|
451
|
+
for the OS to reap. Second, the
|
|
415
452
|
Codex clipboard lock serializes attachments within a SINGLE Elwood process only;
|
|
416
453
|
two Elwood processes sharing one OS clipboard are not coordinated, so a
|
|
417
454
|
cross-process cross-attach remains possible (callers running concurrent
|
|
418
455
|
Elwood processes that attach Codex images should serialize that themselves).
|
|
419
|
-
Third, session close during an in-flight attach rejects the operation
|
|
420
|
-
the text write,
|
|
421
|
-
|
|
422
|
-
|
|
456
|
+
Third, session close during an in-flight attach rejects the operation, blocks
|
|
457
|
+
the text write, and removes the attach's temp files at once (best-effort, per the
|
|
458
|
+
first limitation), but does not join the attach's clipboard-restore finalizer or its
|
|
459
|
+
retry of a failed removal; on an abrupt teardown those may not complete before
|
|
460
|
+
process exit (clipboard restore is already best-effort).
|
|
423
461
|
Fourth, failed-attach cleanup follows the owned, deferred cleanup rule above.
|
|
424
462
|
The clear uses kill-to-line-start plus kill-to-line-end, but does not run an
|
|
425
463
|
adapter-specific transactional confirm-and-restore
|
|
@@ -431,6 +469,11 @@ metadata: this defeats stray transcript/assistant `[Image #N]` text on
|
|
|
431
469
|
non-composer lines, but a running-turn render that puts a prompt-glyph line
|
|
432
470
|
on-screen at the confirmation moment, or a chip on a wrapped composer
|
|
433
471
|
continuation row, is a known edge the glyph heuristic does not perfectly resolve.
|
|
472
|
+
Sixth, Codex's copy of a pasted image is removed only once a transcript names it,
|
|
473
|
+
which happens when the message is submitted: an image whose attach fails or is
|
|
474
|
+
aborted after its Ctrl+V leaves its copy for the OS to reap. Copies are also
|
|
475
|
+
removed only from Elwood's own temp directory, so a login shell that points Codex
|
|
476
|
+
at another `TMPDIR` leaves them.
|
|
434
477
|
|
|
435
478
|
Turn boundaries MUST be observable even when no completion hook fires. Claude
|
|
436
479
|
does not fire a `Stop` hook when a running turn is interrupted (Escape), so
|
|
@@ -452,8 +495,10 @@ fires the turn-end transition even when the working token was never visible.
|
|
|
452
495
|
Together the sources cover every width. Turn start is a rendered-state signal:
|
|
453
496
|
the on-screen working token where it fits, plus the OSC window-title working
|
|
454
497
|
spinner (C-TURN-05): the braille range on both adapters and Claude's observed
|
|
455
|
-
`◐ `
|
|
456
|
-
|
|
498
|
+
half-circle prefixes, `◐ ` and `◑ `, which Claude 2.1.310 alternates between for the
|
|
499
|
+
whole turn. Every frame of that animation reads as working. This signal is
|
|
500
|
+
width-independent and reveals a running turn even when the footer token is elided; a
|
|
501
|
+
caller `sendMessage`/`sendPrompt` also moves
|
|
457
502
|
the session to `running`. Normal completion comes from the `Stop` hook, and
|
|
458
503
|
interrupts from the working-token edge on wide screens or the end banner
|
|
459
504
|
anywhere. Hook-driven readiness (`Stop`) remains a redundant turn-end source;
|
|
@@ -466,8 +511,13 @@ are suppressed until the composer has stayed quiet and non-blocking (composer
|
|
|
466
511
|
visible, no working token, no blocking dialog) for a SUSTAINED run of consecutive
|
|
467
512
|
frames, not merely one. The replay repaints those footers in bursts separated by
|
|
468
513
|
brief quiet gaps, so a single quiet frame does not prove the replay finished; any
|
|
469
|
-
working or blocking frame during suppression resets the run.
|
|
470
|
-
|
|
514
|
+
working or blocking frame during suppression resets the run. A frame showing the
|
|
515
|
+
CLI's own resume-loading placeholder is not quiet either: Codex 0.164 paints
|
|
516
|
+
`Resuming session…` above a live composer, repaints it, and only then loads the
|
|
517
|
+
conversation under a working title. Once that placeholder has painted and the load's
|
|
518
|
+
working indicator has been seen, the first quiet composer ends suppression, because
|
|
519
|
+
an idle CLI may not repaint again. Once the quiet run is reached, detection behaves
|
|
520
|
+
exactly as it does post-readiness on a cold start.
|
|
471
521
|
Explicit running evidence (a caller submission,
|
|
472
522
|
a hook) releases that suppression IMMEDIATELY — a real turn has begun, so the replay
|
|
473
523
|
is over by definition — and synchronizes the watcher into the running state without
|
|
@@ -547,11 +597,43 @@ type AgentModelOption = {
|
|
|
547
597
|
|
|
548
598
|
`id` is a stable lowercase selector (the Claude option label, such as `haiku`,
|
|
549
599
|
or the Codex model slug, such as `gpt-5.4`). `isCurrent` reflects the model the
|
|
550
|
-
session is using now; `isDefault` reflects the CLI's configured default.
|
|
551
|
-
|
|
600
|
+
session is using now; `isDefault` reflects the CLI's configured default. Codex
|
|
601
|
+
draws a `(default)` marker only on some versions (0.164 marks just the
|
|
602
|
+
`(current)` row), so when none renders, its default is the model a plain `codex`
|
|
603
|
+
launch would run with the `CODEX_HOME` the session's own Codex process runs
|
|
604
|
+
with, as its launch script reports it (§4.2, C-CODEX-24): the `model` of the
|
|
605
|
+
profile that `config.toml`'s root `profile` key selects, else its root `model`
|
|
606
|
+
key. Elwood reads it once per listing, after the picker closes, under the lock
|
|
607
|
+
for that `config.toml` that `setModel` holds through its restore, so an
|
|
608
|
+
in-flight switch on the same file by another session in the same process is
|
|
609
|
+
never reported as the default (the lock is process-local, like the restore it
|
|
610
|
+
guards). A `config.toml` that exists but cannot be read rejects the listing
|
|
611
|
+
with `model_automation_failed`, with `details.path` and `details.code`. Elwood
|
|
612
|
+
reads `config.toml` only as a regular file of at most 1 MiB (1,048,576 bytes), opened without waiting for a writer
|
|
613
|
+
(C-CODEX-25): the file may sit where the agent can replace it, and a FIFO in its
|
|
614
|
+
place would otherwise block the whole process until something wrote to it. A
|
|
615
|
+
directory (`EISDIR`), a FIFO, socket, or device (`EFTYPE`, including a socket
|
|
616
|
+
macOS refuses to open), or a larger file (`EFBIG`) cannot be read. The
|
|
617
|
+
session's own `model`, `profile`, and `configOverrides` launch options are not
|
|
618
|
+
the default. When the config names no model (Codex then runs a built-in default
|
|
619
|
+
it does not identify) or names one the picker does not list, no Codex row is the
|
|
620
|
+
default.
|
|
552
621
|
|
|
553
622
|
Model operations hold an exclusive session-input queue slot for the entire
|
|
554
623
|
open/navigate/apply-or-cancel flow, including waiting for the dialog to clear.
|
|
624
|
+
A dialog has cleared only once no stage of it, complete or partly painted, has
|
|
625
|
+
been the bottom-most region across five readings at least 40 ms apart; any
|
|
626
|
+
reading that shows one restarts the count. Dialog text above a conversation or
|
|
627
|
+
composer row, such as a transcript quoting the picker's title, is not the dialog.
|
|
628
|
+
One frame without the picker is not enough: a blank or half-painted repaint lacks
|
|
629
|
+
it too, and the picker can paint again after it, where a released Enter would
|
|
630
|
+
apply the highlighted model. Absence is counted rather than positive composer
|
|
631
|
+
clearance because model operations also run during a turn, when the composer is
|
|
632
|
+
never clear. A dialog that does not stay gone by the deadline fails the operation
|
|
633
|
+
with `model_automation_failed`. Each reading first renders everything the terminal
|
|
634
|
+
has received, as before a picker key, so a repaint still queued for rendering is
|
|
635
|
+
counted; a reading whose received output cannot be rendered fails the operation
|
|
636
|
+
the same way, since the last frame proves nothing.
|
|
555
637
|
Concurrent model operations and normal submissions cannot interleave writes:
|
|
556
638
|
they are dispatched only after the operation settles. The queue wait and picker
|
|
557
639
|
operation share the supplied `timeoutMs` budget, so an operation still queued at
|
|
@@ -583,9 +665,17 @@ change that may never happen.
|
|
|
583
665
|
Every picker wait and write MUST be gated on the operation's own dialog, not on a
|
|
584
666
|
bare header match: a header alone is untrusted candidate evidence that transcript
|
|
585
667
|
or agent output can satisfy, so navigating or cancelling on it could send keys into
|
|
586
|
-
a running turn, the real composer, or another prompt.
|
|
587
|
-
|
|
588
|
-
|
|
668
|
+
a running turn, the real composer, or another prompt. Every picker key — a
|
|
669
|
+
navigation arrow, the selecting key, a follow-up's answer, listing's Escape, and
|
|
670
|
+
cleanup's Escape — is decided on everything RECEIVED, not the last rendered
|
|
671
|
+
frame: Elwood renders and observes all received PTY output, re-checks the
|
|
672
|
+
operation's own dialog on that frame, and writes before further output is
|
|
673
|
+
delivered, so a prompt already in the PTY buffer never receives a key aimed at
|
|
674
|
+
the picker (C-API-56). When the screen cannot be vouched for, an operation's key
|
|
675
|
+
is withheld and the operation rejects with `model_automation_failed`, and
|
|
676
|
+
cleanup's Escape is withheld; an operation cancelled meanwhile (its deadline, the
|
|
677
|
+
session closing, or caller input) rejects with that cancellation's own error, as
|
|
678
|
+
it does at any other step. A single clear frame does not end cleanup once a
|
|
589
679
|
dialog has been seen, because a repainting picker is briefly unrecognizable.
|
|
590
680
|
When session termination races a Codex `setModel`, the call rejects at once rather
|
|
591
681
|
than waiting out the exit bound, and the exit barrier is consulted on every outcome,
|
|
@@ -605,11 +695,15 @@ the active picker operation: it rejects with `model_automation_failed` and sends
|
|
|
605
695
|
no further navigation or cleanup keys into the human-owned generation. A foreign
|
|
606
696
|
picker hold survives partial repaints and clears only after five consecutive
|
|
607
697
|
positive native-composer observations, never from an empty or unrecognized frame.
|
|
698
|
+
A dialog that survived Elwood's own cleanup clears the same way. Observations
|
|
699
|
+
count at least 40 ms apart, so readings bunched into one instant, or a burst of
|
|
700
|
+
repaints, count once. An idle CLI does not repaint, so the evidence is the same
|
|
701
|
+
completed frame read over time, not a run of new frames.
|
|
608
702
|
Only the bottom-most region of the viewport is a model dialog: dialog text with a
|
|
609
703
|
conversation or composer row below it is transcript content (a reply quoting a
|
|
610
704
|
picker), which Elwood neither cancels nor holds on. Unrelated dialogs, including a
|
|
611
705
|
`PreModelSwitch` hook confirmation, are left for the caller.
|
|
612
|
-
Codex retains its
|
|
706
|
+
Codex retains its configuration transaction lock, but acquires it INSIDE
|
|
613
707
|
the session queue slot: claiming the lock first would let a following submission
|
|
614
708
|
dispatch while the switch waited on another session's transaction, sending under the
|
|
615
709
|
old model. When the
|
|
@@ -629,8 +723,29 @@ configuration lock when its session closes MUST reject promptly with
|
|
|
629
723
|
NOT then apply its switch when the lock frees.
|
|
630
724
|
|
|
631
725
|
`listModels` opens the picker, parses the rendered rows, cancels the picker
|
|
632
|
-
with Escape, and MUST leave the session's model unchanged.
|
|
633
|
-
the
|
|
726
|
+
with Escape, and MUST leave the session's model unchanged. It returns EVERY row
|
|
727
|
+
the picker lists, in picker order, including rows outside a scrolling window:
|
|
728
|
+
Claude shows at most ten rows of a longer list, numbering rows by their absolute
|
|
729
|
+
position, marking a window that starts past row 1 with `↑` and one that ends
|
|
730
|
+
before the last row with `↓`, and counting the rows below it with `… +K models`.
|
|
731
|
+
Elwood reveals the hidden rows by moving the cursor one row at a time with the
|
|
732
|
+
arrow keys, never past either end of the list, each key gated on the operation's
|
|
733
|
+
own live picker and each move confirmed on screen, and merges the windows by row
|
|
734
|
+
number. Arrow keys only move the highlight; the Escape that follows keeps both
|
|
735
|
+
the model and its effort level. A list that fits its window is read without any
|
|
736
|
+
arrow key. While a walk still needs rows (a listing, or `setModel` before its
|
|
737
|
+
target is rendered), the rendered count and row numbers are validated rather
|
|
738
|
+
than trusted: the walk never acts on a frame that marks rows hidden below
|
|
739
|
+
without a positive count, has a row number or list length that is not an exact
|
|
740
|
+
integer, or states a list length other than the first one it read. Claude
|
|
741
|
+
repaints a scrolled window across more than one render, so such a frame is
|
|
742
|
+
waited out; if no frame that adds up renders, or the cursor does not move, the
|
|
743
|
+
walk rejects with `model_automation_failed`, because one timeout bounds the
|
|
744
|
+
whole walk however many rows the picker claims.
|
|
745
|
+
`setModel` selects the requested row through cursor navigation, walking the
|
|
746
|
+
window the same way only until the requested row is rendered, so every id
|
|
747
|
+
`listModels` returns is selectable; an unknown id walks the whole list and the
|
|
748
|
+
rejection lists every row. Elwood itself MUST NOT persist a
|
|
634
749
|
new default model into the user's configuration (§4.5): for Claude it applies
|
|
635
750
|
with the session-only key rather than Enter, and it never selects rows via
|
|
636
751
|
number keys because Claude's number shortcut immediately saves the choice as
|
|
@@ -648,8 +763,14 @@ MUST leave that decision to the human and keep it classified as a blocking
|
|
|
648
763
|
prompt. For Codex, the Codex CLI itself persists the confirmed
|
|
649
764
|
picker selection (model and reasoning effort) into the user's `config.toml` —
|
|
650
765
|
there is no session-only affordance — so Elwood compensates: it snapshots
|
|
651
|
-
`config.toml`
|
|
652
|
-
|
|
766
|
+
the session's `config.toml` (the one in the `CODEX_HOME` its Codex process runs
|
|
767
|
+
with, §4.2) before opening the picker (a `config.toml` that cannot be read, by
|
|
768
|
+
the rule above, fails `setModel` with `model_automation_failed` before the picker
|
|
769
|
+
opens, because Codex would persist its selection into a file Elwood could not
|
|
770
|
+
restore) and, after the switch is confirmed, rereads it the same way (one that
|
|
771
|
+
cannot be read then rejects the call with `model_automation_failed`,
|
|
772
|
+
`details.path`, and `details.code`, or, once the call has settled, puts that
|
|
773
|
+
code in the warning's `raw`) and restores the prior contents if and only if the file differs solely in the
|
|
653
774
|
root-level `model` and `model_reasoning_effort` keys the picker writes
|
|
654
775
|
(compare-and-swap on the untouched remainder). The restore never affects the
|
|
655
776
|
live session, which keeps the switched model because Codex reads its config
|
|
@@ -661,9 +782,19 @@ revokes restoration authority: Elwood leaves any resulting config change in plac
|
|
|
661
782
|
and emits that same warning with a content-free takeover explanation. It must
|
|
662
783
|
not restore its snapshot over a model choice the human may have just made. Elwood confirms the CLI's own default
|
|
663
784
|
reasoning level for the chosen Codex model. The whole snapshot/apply/restore
|
|
664
|
-
transaction holds a
|
|
665
|
-
the SAME Elwood process cannot interleave and leave the
|
|
666
|
-
|
|
785
|
+
transaction holds a lock for that `config.toml` so two concurrent `setModel`
|
|
786
|
+
switches on one file in the SAME Elwood process cannot interleave and leave the
|
|
787
|
+
wrong default. The lock is per file, the one the session's launch reported
|
|
788
|
+
(C-CODEX-24): every path that names the same file (a symlinked home or config,
|
|
789
|
+
another letter case, or another Unicode form) shares one lock, even before Codex
|
|
790
|
+
creates the file: a dangling symlink shares its target's lock. Lock keys ignore
|
|
791
|
+
Unicode normalization and fold letter case fully, as APFS does (`ß` and `ss` are
|
|
792
|
+
one name), for every path, existing or not, so a key never changes when its file
|
|
793
|
+
appears. Sessions whose config paths have different keys never wait on each
|
|
794
|
+
other; paths that differ only in case share a key on every volume, so on a
|
|
795
|
+
case-sensitive volume two such files share a lock, which only serializes them. A config
|
|
796
|
+
path that cannot be resolved (a symlink loop, say) rejects the operation with
|
|
797
|
+
`model_automation_failed`, `details.path`, and `details.errno`. This lock is process-local: two SEPARATE Elwood processes sharing one `config.toml` can
|
|
667
798
|
still interleave their transactions. That cross-process race is an accepted
|
|
668
799
|
current limitation (the compare-and-swap still refuses to clobber an unrelated
|
|
669
800
|
edit; the residual risk is a transiently-persisted picker model surviving as the
|
|
@@ -880,7 +1011,8 @@ terminal object between Node and the browser.
|
|
|
880
1011
|
`stop` attempts graceful process termination while preserving Elwood metadata and
|
|
881
1012
|
loop definitions for resume. It should wait for process exit for a bounded grace period, then escalate
|
|
882
1013
|
to force termination so callers do not get a terminal status while the process is
|
|
883
|
-
still indefinitely alive. `
|
|
1014
|
+
still indefinitely alive. A Codex `stop` or `teardown` called during or right after a
|
|
1015
|
+
`Stop` hook first gives Codex up to 2 seconds to record that turn (§5.7). `kill` force-terminates the process and permanently
|
|
884
1016
|
clears its loop definitions. `teardown` removes
|
|
885
1017
|
Elwood-owned state for the session and must not remove Claude-owned transcripts,
|
|
886
1018
|
auth, or project/user settings that Elwood did not create.
|
|
@@ -894,19 +1026,114 @@ signaling the exited PTY or waiting for another exit notification. Terminal exit
|
|
|
894
1026
|
terminal status, and natural-exit reaping occur once even if PTY callbacks reenter.
|
|
895
1027
|
|
|
896
1028
|
`stop`, `kill`, and `teardown` MUST reap the full PTY process tree, not only the
|
|
897
|
-
PTY leader
|
|
1029
|
+
PTY leader, except Codex's shared app-server daemon, its updater, and what they
|
|
1030
|
+
started, which every Codex on the same `CODEX_HOME` shares (the walk below spares them). The adapter CLI spawns helper subprocesses that are descendants of
|
|
898
1031
|
the PTY leader — notably the per-session hook bridge (`node hook-bridge.mjs`) the
|
|
899
1032
|
CLI runs on each hook — and signaling only the leader can orphan them, leaking a
|
|
900
|
-
process tree that accumulates across launch/quit cycles. Elwood
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
leader's exit — which a parent-pid walk cannot.
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
still
|
|
909
|
-
|
|
1033
|
+
process tree that accumulates across launch/quit cycles. Elwood reaps them in two
|
|
1034
|
+
parts. A descendant that stays in the leader's process group MUST be reaped by
|
|
1035
|
+
SIGKILLing that group: node-pty starts the leader as its own session leader, so such
|
|
1036
|
+
a descendant is reached by a group SIGKILL even after it has been reparented to PID 1
|
|
1037
|
+
by the leader's exit — which a parent-pid walk cannot. A descendant that moved into
|
|
1038
|
+
a process group of its own, as each hook command does, is outside that kill and is
|
|
1039
|
+
reaped by the detached-descendant walk below. The group reap MUST run for `stop()`,
|
|
1040
|
+
`kill()`, and `teardown()`, including when the leader has already exited on its own
|
|
1041
|
+
(an already-terminal session still reaps the group). A dead or empty group is a
|
|
1042
|
+
no-op. If the detached sweep confirms the entire leader group gone (SIGSTOP
|
|
1043
|
+
returns ESRCH, or a bounded fresh read after EPERM shows no live group member),
|
|
1044
|
+
that fact is terminal for this session: no later PTY or group signal may reuse its
|
|
1045
|
+
numeric id, including the final reap and subsequent shutdown attempts. This never
|
|
1046
|
+
clears an earlier unresolved descendant-sweep failure. An exit callback arriving
|
|
1047
|
+
during a detached sweep leaves the group reap to that sweep’s shutdown owner,
|
|
1048
|
+
after its pending confirmation settles. A live or failed confirming read still
|
|
1049
|
+
permits the normal final reap and preserves any unresolved sweep failure. A `teardown()` that rejects in-flight control-queue operations MUST still
|
|
1050
|
+
complete: rejecting a pending `sendMessage`/`compact`/model operation does not
|
|
1051
|
+
skip the group reap or the rest of teardown.
|
|
1052
|
+
|
|
1053
|
+
Native process-table scans and daemon-path probes share a process-wide limit of
|
|
1054
|
+
two in-flight subprocesses. Admission is FIFO and its wait consumes the read’s
|
|
1055
|
+
existing timeout; an expired queued read starts no subprocess and reports ETIMEDOUT.
|
|
1056
|
+
A native slot is retained until that subprocess runner settles, including failure.
|
|
1057
|
+
Per-session observation requests still coalesce before admission; a short consumer’s
|
|
1058
|
+
timeout cannot cancel the shared read needed by another consumer.
|
|
1059
|
+
|
|
1060
|
+
Not every descendant stays in that group. Both CLIs start each hook command with
|
|
1061
|
+
`setsid()`, in its own session and process group, and Codex starts MCP servers in
|
|
1062
|
+
their own process group. While the leader is alive its parent-pid link is the only
|
|
1063
|
+
thing that ties such a descendant to the session. So whenever Elwood SIGKILLs a
|
|
1064
|
+
live leader — `kill()`, `teardown()`, and the escalation after a `stop()` or
|
|
1065
|
+
startup-cleanup SIGTERM the leader did not exit on — it MUST first reap the
|
|
1066
|
+
leader's detached descendants: SIGSTOP the leader's process group so it cannot
|
|
1067
|
+
start another hook, walk the host process table by parent pid from the leader,
|
|
1068
|
+
SIGSTOP each process group outside the leader's that holds a live descendant,
|
|
1069
|
+
repeat the walk until a read converges (below), then SIGKILL each group it
|
|
1070
|
+
stopped, deepest first, but one it resumes as holding Codex's daemon (below).
|
|
1071
|
+
|
|
1072
|
+
Only descendants of the leader are signaled: every member of such a group descends
|
|
1073
|
+
from the leader, and the host's own group is never signaled. One descendant is never
|
|
1074
|
+
killed: Codex's managed app-server daemon. The walk may stop its group, but then resumes
|
|
1075
|
+
it. Codex 0.158 and later can start, for its
|
|
1076
|
+
`CODEX_HOME`, an app-server daemon and its updater loop from the copy of the CLI it
|
|
1077
|
+
installs under `$CODEX_HOME/packages/app-server-daemon/`, each in a session of its own
|
|
1078
|
+
and a child of the TUI that started it until that TUI exits. The daemon belongs to the
|
|
1079
|
+
`CODEX_HOME`, shared by every Codex using it, the user's own included, so the walk MUST
|
|
1080
|
+
NOT descend into such a process: one whose binary is named `codex`, that leads its own
|
|
1081
|
+
process group, whose parent is a process named `codex` or PID 1, and whose path as `ps`
|
|
1082
|
+
shows it (`comm`, its `argv[0]`, which Codex sets to the full path) has a
|
|
1083
|
+
`/packages/app-server-daemon/` directory in it. Neither it nor anything it started is
|
|
1084
|
+
killed: the TUI forks the daemon as a `codex` group leader and then `exec`s it, so a group
|
|
1085
|
+
the walk stopped is resumed (SIGCONT), not killed, when the latest read shows it holding
|
|
1086
|
+
the daemon, or a process not shown stopped that could still become it; a SIGCONT
|
|
1087
|
+
refused for any reason but the group being gone fails the walk. These tests read what
|
|
1088
|
+
`ps` reports, which a process can set for itself, so a descendant that imitates the
|
|
1089
|
+
daemon is spared like it: the walk reaps a tree that stays in reach, as a descendant
|
|
1090
|
+
whose own parent exits before the walk already does not (below). Each read also lists
|
|
1091
|
+
every process's short name, which `ps` prints raw, so a name with a newline in it could
|
|
1092
|
+
forge a row: a read with any line that is not one whole row, or one process twice, is
|
|
1093
|
+
not used. A group id read from the table can be reused once that group is gone, a
|
|
1094
|
+
SIGSTOP takes effect only once it is delivered, and a table read sees each process at
|
|
1095
|
+
its own moment, so Elwood
|
|
1096
|
+
relies only on processes it holds: ones that read stopped, inside a group Elwood
|
|
1097
|
+
stopped, in a read and in the read before it. A group is stopped only once a held
|
|
1098
|
+
process is a parent of one of its members: a stopped parent cannot reap its exited
|
|
1099
|
+
child, so the group keeps its id until the signal. The walk succeeds only on a
|
|
1100
|
+
read that converges: it shows the leader itself live, leaves no live group
|
|
1101
|
+
unreached, and shows every live process in every group Elwood stopped, the
|
|
1102
|
+
leader's included, as held, so none of them can have started a process the read
|
|
1103
|
+
missed.
|
|
1104
|
+
A process forked while a group's SIGSTOP is being sent can miss it, so whenever a
|
|
1105
|
+
read shows a live process in a group Elwood stopped that is not stopped, Elwood
|
|
1106
|
+
MUST send that group SIGSTOP again. With no hook in flight that takes two reads,
|
|
1107
|
+
and each level of nesting, or a process that missed its group's SIGSTOP, adds two
|
|
1108
|
+
more. If the leader's group cannot be stopped, no other group is signaled and the
|
|
1109
|
+
walk fails, unless the leader had already exited: its group is gone, or holds only
|
|
1110
|
+
unreaped zombies, which a fresh read must show. The walk
|
|
1111
|
+
reaches only descendants still linked to the leader by parent pid: a process whose
|
|
1112
|
+
own parent exited earlier has been reparented to PID 1 and is not traced. The
|
|
1113
|
+
walk's process-table reads share one ten-second deadline, and the walk runs
|
|
1114
|
+
before the leader's existing SIGKILL wait, which keeps its own bound. Once the
|
|
1115
|
+
leader's exit has been observed, its pid may belong to another process: Elwood
|
|
1116
|
+
then sends the leader no further SIGSTOP or SIGKILL and stops no further group. A
|
|
1117
|
+
group it has already stopped is still killed, or resumed as holding the daemon,
|
|
1118
|
+
because a stopped process cannot exit and so keeps its id. (The process-group reap above still runs.) If the walk
|
|
1119
|
+
cannot complete — the table cannot be read, no read converges by the deadline,
|
|
1120
|
+
the leader's group cannot be stopped, a live group cannot be stopped or killed, a
|
|
1121
|
+
group held as the daemon's cannot be resumed, or the leader's exit is observed before
|
|
1122
|
+
a read converges —
|
|
1123
|
+
Elwood still SIGKILLs the leader (unless it has exited) and reaps its group, then
|
|
1124
|
+
rejects because the tree could not be confirmed reaped: `stop()` and `kill()` with
|
|
1125
|
+
`termination_failed`, `teardown()` with `teardown_failed`, either naming the
|
|
1126
|
+
reason. Once the leader is gone that cannot be retried, so every later `stop()`,
|
|
1127
|
+
`kill()`, or `teardown()` of the session rejects the same way instead of reporting
|
|
1128
|
+
success. A leader that exits on SIGTERM within the graceful window is not walked,
|
|
1129
|
+
so the `stop()` leaves running any detached descendant the CLI's own shutdown does
|
|
1130
|
+
not end. Claude ends an in-flight hook itself. Codex 0.164 does not end the shell it
|
|
1131
|
+
starts in a session of its own a few seconds after launch to snapshot the user's
|
|
1132
|
+
shell environment: a `stop()` while that shell sources a slow profile leaves the
|
|
1133
|
+
shell, and whatever the profile started, running under PID 1. (A human's `/quit`
|
|
1134
|
+
then leaves the profile's processes running too.) Nor is a leader that exits on its
|
|
1135
|
+
own before Elwood signals it walked: nothing links its detached descendants to the
|
|
1136
|
+
session any more.
|
|
910
1137
|
|
|
911
1138
|
### Automated input and pending decisions
|
|
912
1139
|
|