@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
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stops and SIGKILLs every process group a LIVE PTY leader's linked descendants have
|
|
3
|
+
* moved into, before Elwood kills the leader, but Codex's shared daemon, its updater,
|
|
4
|
+
* and what they started (below). Implements PRD §5.3 and §9.4 (C-LIFE-10).
|
|
5
|
+
* Claude and Codex start each hook command with `setsid()`, so a hook in flight at
|
|
6
|
+
* teardown sits in its own session and process group: the leader-group SIGKILL misses
|
|
7
|
+
* it, and once the leader dies the hook is reparented to PID 1 and nothing links it to
|
|
8
|
+
* the session any more. The walk therefore has to happen first. It finds only what is
|
|
9
|
+
* still linked by parent pid (see `detachedDescendantGroups`).
|
|
10
|
+
*
|
|
11
|
+
* A group id read from the table is a snapshot, free for reuse once the group is gone,
|
|
12
|
+
* and a `kill()` that returns has only sent the SIGSTOP. So the sweep acts only on what
|
|
13
|
+
* two consecutive reads show (see `rounds.ts`): a group is sent SIGSTOP once a parent of
|
|
14
|
+
* one of its members is held, read stopped in this read and the one before inside a
|
|
15
|
+
* group the sweep signaled. The walk succeeds only on a read that converges: it shows
|
|
16
|
+
* the leader live, leaves no live group unreached, and holds every live member of every
|
|
17
|
+
* signaled group, the leader's included. A read that shows a signaled group's member
|
|
18
|
+
* running stops that group again. With no hook in flight that takes two reads; each
|
|
19
|
+
* level of nesting adds two more. Then the signaled groups are SIGKILLed deepest first
|
|
20
|
+
* (`kill.ts`). Codex's app-server daemon and its updater loop are shared by every Codex
|
|
21
|
+
* on the same `CODEX_HOME`, the user's own included, so the walk never descends into
|
|
22
|
+
* either: neither one nor anything it started is killed (`shared-daemon.ts`). A group it
|
|
23
|
+
* stopped as its process became one is resumed with SIGCONT, never SIGKILLed, even once
|
|
24
|
+
* the leader's exit left it under PID 1. (A parent that ignores SIGCHLD would have its
|
|
25
|
+
* exited children reaped while stopped; the CLIs and hook shells don't.)
|
|
26
|
+
*/
|
|
27
|
+
import { errnoCode } from "../../../core/errors.js";
|
|
28
|
+
import { detachedDescendantGroups } from "../process-table.js";
|
|
29
|
+
import { daemonScope } from "../shared-daemon.js";
|
|
30
|
+
import { SweepFailures } from "./failures.js";
|
|
31
|
+
import { confirmedGone, confirmLiveGroups, killOrResumeSignaledGroups, recordFailedRead, } from "./kill.js";
|
|
32
|
+
import { newSweepState, recordUnconfirmed, restopEscapedGroups, stopAnchoredGroups, sweepOutcome, unheldGroups, unreachedGroups, } from "./rounds.js";
|
|
33
|
+
/**
|
|
34
|
+
* The whole sweep's deadline. A hook that started a setsid child of its own takes six
|
|
35
|
+
* reads, and on a loaded host one read can take over half a second (docs/cli-behavior.md).
|
|
36
|
+
*/
|
|
37
|
+
export const DETACHED_SWEEP_BUDGET_MS = 10_000;
|
|
38
|
+
/**
|
|
39
|
+
* Sweeps `leaderPid`'s detached descendant groups and resolves to the unresolved
|
|
40
|
+
* failure, or `undefined` once a read converged and every group it signaled was killed,
|
|
41
|
+
* or resumed as holding Codex's daemon.
|
|
42
|
+
* The leader's own group is left to the group reap. A leader whose exit was observed
|
|
43
|
+
* before the sweep, or whose group refuses its SIGSTOP because it already exited (see
|
|
44
|
+
* `leaderStopFailure`), exited before Elwood signaled it: nothing more is sent and nothing
|
|
45
|
+
* fails. Otherwise `leaderExited` is read after each table read that does not converge;
|
|
46
|
+
* a read that converges ends the walk before that check. Once the leader has exited its
|
|
47
|
+
* pid may be reused, so the sweep stops no further group and never signals the leader's
|
|
48
|
+
* group again, though it still SIGKILLs the groups it already signaled (resuming any
|
|
49
|
+
* that hold Codex's daemon).
|
|
50
|
+
* `onLeaderGroupGone` publishes only whole-group ESRCH or fresh empty-group evidence,
|
|
51
|
+
* never merely a leader exit notification. These are
|
|
52
|
+
* failures: a leader's group that refuses its stop, so no descendant group is signaled;
|
|
53
|
+
* an unreadable table; the deadline passing, or the leader exiting, before a read
|
|
54
|
+
* converged; a live group that could not be stopped or killed; and a group spared for
|
|
55
|
+
* Codex's daemon that could not be resumed (a SIGCONT refused but for its being gone).
|
|
56
|
+
*/
|
|
57
|
+
export async function sweepDetachedGroups(leaderPid, ops, leaderExited, budgetMs = DETACHED_SWEEP_BUDGET_MS, onLeaderGroupGone = () => undefined) {
|
|
58
|
+
if (leaderExited())
|
|
59
|
+
return undefined;
|
|
60
|
+
const deadline = performance.now() + budgetMs;
|
|
61
|
+
const state = newSweepState(new SweepFailures());
|
|
62
|
+
try {
|
|
63
|
+
ops.stopGroup(leaderPid);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
return leaderStopFailure(error, leaderPid, ops, deadline, state, onLeaderGroupGone);
|
|
67
|
+
}
|
|
68
|
+
state.signaledGroupIds.add(leaderPid);
|
|
69
|
+
state.unheld = [leaderPid];
|
|
70
|
+
await stopDescendantGroups(leaderPid, ops, leaderExited, deadline, state);
|
|
71
|
+
await killOrResumeSignaledGroups(ops, state, deadline);
|
|
72
|
+
return sweepOutcome(state);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Reads the table round by round until `deadline`, recording into `state`: each read
|
|
76
|
+
* refreshes `live` and `unheld`, stops again each signaled group with a running member,
|
|
77
|
+
* then stops the unreached groups a held parent anchors. It returns without a failure
|
|
78
|
+
* only on a read that converges, so nothing the sweep signaled could have started a
|
|
79
|
+
* process that read missed. It records a failure against every group not yet confirmed
|
|
80
|
+
* stopped, and returns, when the table cannot be read, or when the deadline passes or
|
|
81
|
+
* the leader's exit is observed first.
|
|
82
|
+
*/
|
|
83
|
+
async function stopDescendantGroups(leaderPid, ops, leaderExited, deadline, state) {
|
|
84
|
+
// Each group the walk stops is a root too: its exit can leave one under PID 1.
|
|
85
|
+
const scope = daemonScope(state.signaledGroupIds);
|
|
86
|
+
try {
|
|
87
|
+
while (true) {
|
|
88
|
+
const remainingMs = Math.ceil(deadline - performance.now());
|
|
89
|
+
if (remainingMs <= 0)
|
|
90
|
+
return recordUnconfirmed(state, "process groups not confirmed stopped by the deadline");
|
|
91
|
+
const table = await ops.listProcesses(remainingMs, scope);
|
|
92
|
+
state.latest = table;
|
|
93
|
+
state.live = detachedDescendantGroups(table, { leaderPid, hostPid: process.pid });
|
|
94
|
+
state.unheld = unheldGroups(table, state, leaderPid);
|
|
95
|
+
if (unreachedGroups(state).length === 0 && state.unheld.length === 0)
|
|
96
|
+
return;
|
|
97
|
+
if (leaderExited())
|
|
98
|
+
return recordUnconfirmed(state, "the leader exited before every group was confirmed stopped");
|
|
99
|
+
restopEscapedGroups(table, ops, state);
|
|
100
|
+
stopAnchoredGroups(table, ops, state);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
recordUnconfirmed(state, "process table unreadable", error);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Judges a refused SIGSTOP of the leader's group. The leader had already exited, so the
|
|
109
|
+
* sweep has nothing to do, when the group is gone (`ESRCH`), or when macOS refused it
|
|
110
|
+
* with `EPERM` because only unreaped zombies remain, which a fresh read must then show.
|
|
111
|
+
* Otherwise the leader could not be stopped, so no descendant group is signaled.
|
|
112
|
+
*/
|
|
113
|
+
async function leaderStopFailure(error, leaderPid, ops, deadline, state, onLeaderGroupGone) {
|
|
114
|
+
const code = errnoCode(error);
|
|
115
|
+
if (code === "ESRCH") {
|
|
116
|
+
onLeaderGroupGone();
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
const confirmation = code === "EPERM" ? await confirmLiveGroups(ops, deadline) : undefined;
|
|
120
|
+
if (confirmation !== undefined && confirmedGone(confirmation, leaderPid)) {
|
|
121
|
+
onLeaderGroupGone();
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
state.failures.record("could not stop the leader's group", error, [leaderPid]);
|
|
125
|
+
if (confirmation !== undefined)
|
|
126
|
+
recordFailedRead(confirmation, state, [leaderPid]);
|
|
127
|
+
return state.failures.result();
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/runtime/shutdown/detached-sweep/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The detached sweep's kill pass (PRD §5.3 and §9.4, C-LIFE-10): SIGKILLs every group
|
|
3
|
+
* the sweep signaled, deepest first, so each group's stopped parent outlives it and
|
|
4
|
+
* keeps its id held through the signal, except the groups it resumes (below). A failed
|
|
5
|
+
* kill never skips the rest. macOS refuses a signal to a group whose members are all
|
|
6
|
+
* unreaped zombies with `EPERM`, and a group can become one between its stop and its
|
|
7
|
+
* kill. So an `EPERM` is ignored only when a fresh read, inside the sweep's deadline,
|
|
8
|
+
* succeeds and shows no live member of that group; a read that cannot be had in time,
|
|
9
|
+
* or fails, leaves it a failure, and a failed read is reported too, after the refusal
|
|
10
|
+
* (`confirmLiveGroups`).
|
|
11
|
+
*
|
|
12
|
+
* A path read can see a process the TUI forked before it `exec`s Codex's daemon, and the
|
|
13
|
+
* walk can stop its group after the `exec`. A stopped process cannot `exec`, so a group the
|
|
14
|
+
* latest read shows holding the daemon or its updater, or a process that could still
|
|
15
|
+
* become one because that read did not show it stopped, is resumed with SIGCONT and
|
|
16
|
+
* never SIGKILLed (`groupIdsToResume`).
|
|
17
|
+
*/
|
|
18
|
+
import type { SweepOps, SweepState } from "./rounds.ts";
|
|
19
|
+
export declare function killOrResumeSignaledGroups(ops: SweepOps, state: SweepState, deadline: number): Promise<void>;
|
|
20
|
+
/** A fresh read's groups with a live member, or why there is none: no time, or its error. */
|
|
21
|
+
type Confirmation = {
|
|
22
|
+
readonly kind: "read";
|
|
23
|
+
readonly live: ReadonlySet<number>;
|
|
24
|
+
} | {
|
|
25
|
+
readonly kind: "failed";
|
|
26
|
+
readonly error: unknown;
|
|
27
|
+
} | {
|
|
28
|
+
readonly kind: "no time";
|
|
29
|
+
};
|
|
30
|
+
/** Takes a fresh read inside `deadline`, to judge a signal refused with `EPERM`. */
|
|
31
|
+
export declare function confirmLiveGroups(ops: SweepOps, deadline: number): Promise<Confirmation>;
|
|
32
|
+
/** Whether `confirmation` is a read that shows no live member of `group`. */
|
|
33
|
+
export declare function confirmedGone(confirmation: Confirmation, group: number): boolean;
|
|
34
|
+
/** Records a confirming read that failed against `groups`, after the refusals it judged. */
|
|
35
|
+
export declare function recordFailedRead(confirmation: Confirmation, state: SweepState, groups: readonly number[]): void;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=kill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kill.d.ts","sourceRoot":"","sources":["../../../../src/runtime/shutdown/detached-sweep/kill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAExD,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAuBf;AAcD,6FAA6F;AAC7F,KAAK,YAAY,GACb;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,GAC7D;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAEjC,oFAAoF;AACpF,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAY9F;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEhF;AAED,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,SAAS,MAAM,EAAE,GACxB,IAAI,CAIN"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The detached sweep's kill pass (PRD §5.3 and §9.4, C-LIFE-10): SIGKILLs every group
|
|
3
|
+
* the sweep signaled, deepest first, so each group's stopped parent outlives it and
|
|
4
|
+
* keeps its id held through the signal, except the groups it resumes (below). A failed
|
|
5
|
+
* kill never skips the rest. macOS refuses a signal to a group whose members are all
|
|
6
|
+
* unreaped zombies with `EPERM`, and a group can become one between its stop and its
|
|
7
|
+
* kill. So an `EPERM` is ignored only when a fresh read, inside the sweep's deadline,
|
|
8
|
+
* succeeds and shows no live member of that group; a read that cannot be had in time,
|
|
9
|
+
* or fails, leaves it a failure, and a failed read is reported too, after the refusal
|
|
10
|
+
* (`confirmLiveGroups`).
|
|
11
|
+
*
|
|
12
|
+
* A path read can see a process the TUI forked before it `exec`s Codex's daemon, and the
|
|
13
|
+
* walk can stop its group after the `exec`. A stopped process cannot `exec`, so a group the
|
|
14
|
+
* latest read shows holding the daemon or its updater, or a process that could still
|
|
15
|
+
* become one because that read did not show it stopped, is resumed with SIGCONT and
|
|
16
|
+
* never SIGKILLed (`groupIdsToResume`).
|
|
17
|
+
*/
|
|
18
|
+
import { errnoCode } from "../../../core/errors.js";
|
|
19
|
+
import { groupIdsToResume } from "../shared-daemon.js";
|
|
20
|
+
export async function killOrResumeSignaledGroups(ops, state, deadline) {
|
|
21
|
+
const toResume = groupIdsToResume(state.latest);
|
|
22
|
+
const refused = new Map();
|
|
23
|
+
for (const group of [...state.signaledDescendantGroupIds].reverse()) {
|
|
24
|
+
if (toResume.has(group)) {
|
|
25
|
+
resume(group, ops, state);
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
ops.killGroup(group);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (errnoCode(error) === "EPERM")
|
|
33
|
+
refused.set(group, error);
|
|
34
|
+
else
|
|
35
|
+
state.failures.record("could not kill a signaled descendant group", error, [group]);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (refused.size === 0)
|
|
39
|
+
return;
|
|
40
|
+
const confirmation = await confirmLiveGroups(ops, deadline);
|
|
41
|
+
for (const [group, error] of refused) {
|
|
42
|
+
if (!confirmedGone(confirmation, group)) {
|
|
43
|
+
state.failures.record("could not kill a signaled descendant group", error, [group]);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
recordFailedRead(confirmation, state, [...refused.keys()]);
|
|
47
|
+
}
|
|
48
|
+
/** SIGCONTs a group to resume; one already gone (`ESRCH`) needs nothing. */
|
|
49
|
+
function resume(group, ops, state) {
|
|
50
|
+
try {
|
|
51
|
+
ops.continueGroup(group);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (errnoCode(error) === "ESRCH")
|
|
55
|
+
return;
|
|
56
|
+
state.failures.record("could not resume a group spared for Codex's shared daemon", error, [
|
|
57
|
+
group,
|
|
58
|
+
]);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** Takes a fresh read inside `deadline`, to judge a signal refused with `EPERM`. */
|
|
62
|
+
export async function confirmLiveGroups(ops, deadline) {
|
|
63
|
+
const remainingMs = Math.ceil(deadline - performance.now());
|
|
64
|
+
if (remainingMs <= 0)
|
|
65
|
+
return { kind: "no time" };
|
|
66
|
+
try {
|
|
67
|
+
const table = await ops.listProcesses(remainingMs);
|
|
68
|
+
return {
|
|
69
|
+
kind: "read",
|
|
70
|
+
live: new Set(table.filter((row) => !row.zombie).map((row) => row.pgid)),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
return { kind: "failed", error };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/** Whether `confirmation` is a read that shows no live member of `group`. */
|
|
78
|
+
export function confirmedGone(confirmation, group) {
|
|
79
|
+
return confirmation.kind === "read" && !confirmation.live.has(group);
|
|
80
|
+
}
|
|
81
|
+
/** Records a confirming read that failed against `groups`, after the refusals it judged. */
|
|
82
|
+
export function recordFailedRead(confirmation, state, groups) {
|
|
83
|
+
if (confirmation.kind === "failed") {
|
|
84
|
+
state.failures.record("process table unreadable", confirmation.error, groups);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=kill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kill.js","sourceRoot":"","sources":["../../../../src/runtime/shutdown/detached-sweep/kill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Records a PTY leader's detached descendants while a graceful `stop()` waits for it to
|
|
3
|
+
* exit (PRD §5.3 and §9.4, C-LIFE-10). A CLI that exits on SIGTERM does not end every
|
|
4
|
+
* process it started in a group of its own: Codex leaves the shell it runs to snapshot
|
|
5
|
+
* the user's environment, and whatever the user's profile started from it
|
|
6
|
+
* (docs/cli-behavior.md). Once the leader exits, those processes are reparented to PID 1
|
|
7
|
+
* and nothing links them to the session, so the links are read while it lives: the first
|
|
8
|
+
* read finishes before the SIGTERM is sent, and reads repeat until the leader's exit is
|
|
9
|
+
* observed. A process is recorded by its pid and start time, which together name one
|
|
10
|
+
* process (see `ProcessEntry.startedAt`), so a pid reused after the exit is never taken
|
|
11
|
+
* for it. The leader is held to the same identity: a read that does not show the
|
|
12
|
+
* leader the first such read showed records nothing, because its pid may already belong
|
|
13
|
+
* to another process. A leader the read before the SIGTERM does not show had exited
|
|
14
|
+
* before the stop, leaving nothing linked; one that no read showed after a failed first
|
|
15
|
+
* read leaves its tree unknown. A process that starts and loses its link between two
|
|
16
|
+
* reads is not recorded, and a failed read records nothing, so that gap runs to the next
|
|
17
|
+
* read that succeeds (PRD §5.3).
|
|
18
|
+
*/
|
|
19
|
+
import { type ProcessEntry } from "../process-table.ts";
|
|
20
|
+
import type { SweepOps } from "./rounds.ts";
|
|
21
|
+
/**
|
|
22
|
+
* Each read's bound, the one before the SIGTERM included: the walk's own deadline. A read
|
|
23
|
+
* cut short records nothing, and on a loaded host one read, with Codex's daemon path
|
|
24
|
+
* reads, can take over a second (docs/cli-behavior.md), so a one-second bound there
|
|
25
|
+
* recorded nothing at all and left the leader's tree unknown. Only a `ps` that never
|
|
26
|
+
* answers holds the SIGTERM back for the whole bound.
|
|
27
|
+
*/
|
|
28
|
+
export declare const RECORD_READ_MS = 10000;
|
|
29
|
+
/** The detached descendants seen so far, by pid and start time. */
|
|
30
|
+
export declare class DescendantRecord {
|
|
31
|
+
private readonly identities;
|
|
32
|
+
/** The leader's identity, from the first read that showed it. */
|
|
33
|
+
private leader;
|
|
34
|
+
/**
|
|
35
|
+
* Whether the leader's tree is known: a read showed the leader live, or the read before
|
|
36
|
+
* the SIGTERM showed it already gone, with nothing left linked to it. A later read that
|
|
37
|
+
* does not show the leader says nothing of what it left.
|
|
38
|
+
*/
|
|
39
|
+
known: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Records every live member of each group, other than the leader's, that holds a
|
|
42
|
+
* descendant, if `table` shows the leader live as the first such read did. `beforeSignal`
|
|
43
|
+
* marks the read before the SIGTERM, whose not showing the leader is knowledge too.
|
|
44
|
+
*/
|
|
45
|
+
observe(table: readonly ProcessEntry[], leaderPid: number, beforeSignal?: boolean): void;
|
|
46
|
+
/** The pid of each process recorded, whatever it runs now. */
|
|
47
|
+
get pids(): readonly number[];
|
|
48
|
+
/**
|
|
49
|
+
* The rows of `table` that are recorded processes still alive: same pid, same start.
|
|
50
|
+
* Never Codex's shared daemon, which one may have become by `exec` since it was recorded.
|
|
51
|
+
*/
|
|
52
|
+
survivors(table: readonly ProcessEntry[]): readonly ProcessEntry[];
|
|
53
|
+
}
|
|
54
|
+
/** A recording in progress. */
|
|
55
|
+
export type DescendantWatch = {
|
|
56
|
+
/** Settles once the first read has finished, whether or not it succeeded. */
|
|
57
|
+
readonly firstRead: Promise<void>;
|
|
58
|
+
/** Stops reading once the read in flight settles, and resolves to the record. */
|
|
59
|
+
readonly finish: () => Promise<DescendantRecord>;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Reads the table again and again, with Codex's daemon marked under `leaderPid`, recording
|
|
63
|
+
* the leader's detached descendants until `finish` is called or `leaderExited` reports the
|
|
64
|
+
* exit. A failed read records nothing and the next one follows.
|
|
65
|
+
*/
|
|
66
|
+
export declare function watchDescendants(leaderPid: number, ops: Pick<SweepOps, "listProcesses">, leaderExited: () => boolean): DescendantWatch;
|
|
67
|
+
//# sourceMappingURL=record.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../../../src/runtime/shutdown/detached-sweep/record.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,QAA2B,CAAC;AAEvD,mEAAmE;AACnE,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,iEAAiE;IACjE,OAAO,CAAC,MAAM,CAAqB;IACnC;;;;OAIG;IACH,KAAK,UAAS;IAEd;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,IAAI;IAmBtF,8DAA8D;IAC9D,IAAI,IAAI,IAAI,SAAS,MAAM,EAAE,CAE5B;IAED;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,SAAS,YAAY,EAAE;CAInE;AAED,+BAA+B;AAC/B,MAAM,MAAM,eAAe,GAAG;IAC5B,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,iFAAiF;IACjF,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAClD,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,EACpC,YAAY,EAAE,MAAM,OAAO,GAC1B,eAAe,CA6BjB"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Records a PTY leader's detached descendants while a graceful `stop()` waits for it to
|
|
3
|
+
* exit (PRD §5.3 and §9.4, C-LIFE-10). A CLI that exits on SIGTERM does not end every
|
|
4
|
+
* process it started in a group of its own: Codex leaves the shell it runs to snapshot
|
|
5
|
+
* the user's environment, and whatever the user's profile started from it
|
|
6
|
+
* (docs/cli-behavior.md). Once the leader exits, those processes are reparented to PID 1
|
|
7
|
+
* and nothing links them to the session, so the links are read while it lives: the first
|
|
8
|
+
* read finishes before the SIGTERM is sent, and reads repeat until the leader's exit is
|
|
9
|
+
* observed. A process is recorded by its pid and start time, which together name one
|
|
10
|
+
* process (see `ProcessEntry.startedAt`), so a pid reused after the exit is never taken
|
|
11
|
+
* for it. The leader is held to the same identity: a read that does not show the
|
|
12
|
+
* leader the first such read showed records nothing, because its pid may already belong
|
|
13
|
+
* to another process. A leader the read before the SIGTERM does not show had exited
|
|
14
|
+
* before the stop, leaving nothing linked; one that no read showed after a failed first
|
|
15
|
+
* read leaves its tree unknown. A process that starts and loses its link between two
|
|
16
|
+
* reads is not recorded, and a failed read records nothing, so that gap runs to the next
|
|
17
|
+
* read that succeeds (PRD §5.3).
|
|
18
|
+
*/
|
|
19
|
+
import { detachedDescendantGroups, processIdentity as identity, } from "../process-table.js";
|
|
20
|
+
import { daemonScope } from "../shared-daemon.js";
|
|
21
|
+
import { DETACHED_SWEEP_BUDGET_MS } from "./index.js";
|
|
22
|
+
/**
|
|
23
|
+
* Each read's bound, the one before the SIGTERM included: the walk's own deadline. A read
|
|
24
|
+
* cut short records nothing, and on a loaded host one read, with Codex's daemon path
|
|
25
|
+
* reads, can take over a second (docs/cli-behavior.md), so a one-second bound there
|
|
26
|
+
* recorded nothing at all and left the leader's tree unknown. Only a `ps` that never
|
|
27
|
+
* answers holds the SIGTERM back for the whole bound.
|
|
28
|
+
*/
|
|
29
|
+
export const RECORD_READ_MS = DETACHED_SWEEP_BUDGET_MS;
|
|
30
|
+
/** The detached descendants seen so far, by pid and start time. */
|
|
31
|
+
export class DescendantRecord {
|
|
32
|
+
identities = new Set();
|
|
33
|
+
/** The leader's identity, from the first read that showed it. */
|
|
34
|
+
leader;
|
|
35
|
+
/**
|
|
36
|
+
* Whether the leader's tree is known: a read showed the leader live, or the read before
|
|
37
|
+
* the SIGTERM showed it already gone, with nothing left linked to it. A later read that
|
|
38
|
+
* does not show the leader says nothing of what it left.
|
|
39
|
+
*/
|
|
40
|
+
known = false;
|
|
41
|
+
/**
|
|
42
|
+
* Records every live member of each group, other than the leader's, that holds a
|
|
43
|
+
* descendant, if `table` shows the leader live as the first such read did. `beforeSignal`
|
|
44
|
+
* marks the read before the SIGTERM, whose not showing the leader is knowledge too.
|
|
45
|
+
*/
|
|
46
|
+
observe(table, leaderPid, beforeSignal = false) {
|
|
47
|
+
const leaderRow = table.find((row) => row.pid === leaderPid && !row.zombie);
|
|
48
|
+
if (leaderRow === undefined) {
|
|
49
|
+
// Gone before the SIGTERM: nothing is linked to it, and its pid is no one's to follow.
|
|
50
|
+
if (beforeSignal) {
|
|
51
|
+
this.known = true;
|
|
52
|
+
this.leader = "";
|
|
53
|
+
}
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
this.leader ??= identity(leaderRow);
|
|
57
|
+
if (identity(leaderRow) !== this.leader)
|
|
58
|
+
return;
|
|
59
|
+
this.known = true;
|
|
60
|
+
const groups = detachedDescendantGroups(table, { leaderPid, hostPid: process.pid });
|
|
61
|
+
for (const row of table) {
|
|
62
|
+
if (!row.zombie && groups.has(row.pgid))
|
|
63
|
+
this.identities.add(identity(row));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** The pid of each process recorded, whatever it runs now. */
|
|
67
|
+
get pids() {
|
|
68
|
+
return [...this.identities].map((id) => Number.parseInt(id, 10));
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* The rows of `table` that are recorded processes still alive: same pid, same start.
|
|
72
|
+
* Never Codex's shared daemon, which one may have become by `exec` since it was recorded.
|
|
73
|
+
*/
|
|
74
|
+
survivors(table) {
|
|
75
|
+
const recorded = (row) => this.identities.has(identity(row));
|
|
76
|
+
return table.filter((row) => !row.zombie && recorded(row) && !row.shared);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Reads the table again and again, with Codex's daemon marked under `leaderPid`, recording
|
|
81
|
+
* the leader's detached descendants until `finish` is called or `leaderExited` reports the
|
|
82
|
+
* exit. A failed read records nothing and the next one follows.
|
|
83
|
+
*/
|
|
84
|
+
export function watchDescendants(leaderPid, ops, leaderExited) {
|
|
85
|
+
const record = new DescendantRecord();
|
|
86
|
+
let watching = true;
|
|
87
|
+
const scope = daemonScope(new Set([leaderPid]));
|
|
88
|
+
const readOnce = (beforeSignal = false) => ops.listProcesses(RECORD_READ_MS, scope).then((table) => record.observe(table, leaderPid, beforeSignal), () => undefined);
|
|
89
|
+
const firstRead = readOnce(true);
|
|
90
|
+
const finishing = Promise.withResolvers();
|
|
91
|
+
const reading = (async () => {
|
|
92
|
+
await firstRead;
|
|
93
|
+
while (!leaderExited()) {
|
|
94
|
+
// Lets the exit be observed between reads; a `finish` ends the wait at once.
|
|
95
|
+
await Promise.race([new Promise((resolve) => setImmediate(resolve)), finishing.promise]);
|
|
96
|
+
if (!watching || leaderExited())
|
|
97
|
+
return;
|
|
98
|
+
await readOnce();
|
|
99
|
+
}
|
|
100
|
+
})();
|
|
101
|
+
return {
|
|
102
|
+
firstRead,
|
|
103
|
+
finish: async () => {
|
|
104
|
+
watching = false;
|
|
105
|
+
finishing.resolve();
|
|
106
|
+
await reading;
|
|
107
|
+
return record;
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../../../src/runtime/shutdown/detached-sweep/record.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One round of the detached sweep (PRD §5.3 and §9.4, C-LIFE-10): what the latest table
|
|
3
|
+
* read shows about the groups the sweep has signaled, and which new groups it may stop.
|
|
4
|
+
* A group is "signaled" once a SIGSTOP to it returned, which says nothing about its
|
|
5
|
+
* members yet: `kill()` has only sent the signal, and `ps` reads each row at its own
|
|
6
|
+
* moment, so a process counts as held only when this read AND the one before it showed
|
|
7
|
+
* it stopped inside a signaled group. A held parent can neither reap an exited child,
|
|
8
|
+
* which keeps that child's group id from being reused, nor start a process the next
|
|
9
|
+
* read could miss. A signaled group can still hold a running member: `killpg` signals
|
|
10
|
+
* the members it finds, so a child forked while it runs can miss the SIGSTOP.
|
|
11
|
+
*/
|
|
12
|
+
import type { ProcessEntry } from "../process-table.ts";
|
|
13
|
+
import type { DaemonScope } from "../shared-daemon.ts";
|
|
14
|
+
import type { FailureReason, SweepFailure, SweepFailures } from "./failures.ts";
|
|
15
|
+
/**
|
|
16
|
+
* The process operations the sweep drives. Scripted tests inject fakes that signal
|
|
17
|
+
* nothing; the real-process tests pass OS-backed operations that do.
|
|
18
|
+
*/
|
|
19
|
+
export type SweepOps = {
|
|
20
|
+
/** SIGSTOPs the process group `pgid`. */
|
|
21
|
+
readonly stopGroup: (pgid: number) => void;
|
|
22
|
+
/** SIGKILLs the process group `pgid`; tolerates an already-empty group. */
|
|
23
|
+
readonly killGroup: (pgid: number) => void;
|
|
24
|
+
/** SIGCONTs the process group `pgid`: one the sweep stopped but must not kill. */
|
|
25
|
+
readonly continueGroup: (pgid: number) => void;
|
|
26
|
+
/** Lists the host process table within `timeoutMs`, marking `shared` rows in `scope`. */
|
|
27
|
+
readonly listProcesses: (timeoutMs: number, scope?: DaemonScope) => Promise<readonly ProcessEntry[]>;
|
|
28
|
+
};
|
|
29
|
+
export type SweepState = {
|
|
30
|
+
/** Groups a SIGSTOP returned for, the leader's included: signaled, not yet held. */
|
|
31
|
+
readonly signaledGroupIds: Set<number>;
|
|
32
|
+
/**
|
|
33
|
+
* The descendant groups among them, in the order signaled: SIGKILLed in reverse, but
|
|
34
|
+
* those the latest read shows holding Codex's daemon, which are resumed (`kill.ts`).
|
|
35
|
+
*/
|
|
36
|
+
readonly signaledDescendantGroupIds: number[];
|
|
37
|
+
/** Pids the previous read showed stopped inside a signaled group. */
|
|
38
|
+
stoppedPidsLastRead: ReadonlySet<number>;
|
|
39
|
+
/** Groups whose SIGSTOP failed for a reason other than the group being gone. */
|
|
40
|
+
readonly unstoppable: Map<number, unknown>;
|
|
41
|
+
/** The live descendant groups in the latest read, each with its parents' rows. */
|
|
42
|
+
live: ReadonlyMap<number, ReadonlySet<ProcessEntry>>;
|
|
43
|
+
/** Signaled groups not yet held: see `unheldGroups`, plus any signaled since that read. */
|
|
44
|
+
unheld: readonly number[];
|
|
45
|
+
/** The latest table a read returned, by which the kill pass picks the groups to resume. */
|
|
46
|
+
latest: readonly ProcessEntry[];
|
|
47
|
+
readonly failures: SweepFailures;
|
|
48
|
+
};
|
|
49
|
+
export declare function newSweepState(failures: SweepFailures): SweepState;
|
|
50
|
+
/** The live groups in the latest read that the sweep has not tried to stop. */
|
|
51
|
+
export declare function unreachedGroups(state: SweepState): number[];
|
|
52
|
+
/** Records `reason` against every group not yet confirmed stopped: unreached or unheld. */
|
|
53
|
+
export declare function recordUnconfirmed(state: SweepState, reason: FailureReason, error?: unknown): void;
|
|
54
|
+
/** The sweep's outcome, once each group a read showed live but no SIGSTOP reached fails. */
|
|
55
|
+
export declare function sweepOutcome(state: SweepState): SweepFailure | undefined;
|
|
56
|
+
/**
|
|
57
|
+
* The signaled groups this read does not hold: each with a live member that this read
|
|
58
|
+
* and the one before did not both show stopped, and any leader's own group while this
|
|
59
|
+
* read does not show the leader live, since its exit leaves descendants out of reach.
|
|
60
|
+
*/
|
|
61
|
+
export declare function unheldGroups(table: readonly ProcessEntry[], state: SweepState, leaderPid?: number): number[];
|
|
62
|
+
/**
|
|
63
|
+
* Stops each unreached group that a held parent anchors, after noting which rows this
|
|
64
|
+
* read shows stopped for the NEXT read to rely on.
|
|
65
|
+
*/
|
|
66
|
+
export declare function stopAnchoredGroups(table: readonly ProcessEntry[], ops: SweepOps, state: SweepState): void;
|
|
67
|
+
/**
|
|
68
|
+
* Sends SIGSTOP again to each signaled group this read shows with a live member that is
|
|
69
|
+
* not stopped, such as a child forked while the group's first stop went out (it keeps
|
|
70
|
+
* running until signaled; macOS showed one in 150 stops of a shell forking pipelines,
|
|
71
|
+
* and a real Claude teardown's login shell had one still running three seconds later).
|
|
72
|
+
* Each id still names its group: the caller has just seen the leader alive, and a
|
|
73
|
+
* descendant group stays anchored by the held parent the kill pass relies on too.
|
|
74
|
+
*/
|
|
75
|
+
export declare function restopEscapedGroups(table: readonly ProcessEntry[], ops: SweepOps, state: SweepState): void;
|
|
76
|
+
/** A group that vanished (`ESRCH`) needs nothing; any other refusal is judged at the end. */
|
|
77
|
+
export declare function stopGroup(group: number, ops: SweepOps, state: SweepState): void;
|
|
78
|
+
//# sourceMappingURL=rounds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rounds.d.ts","sourceRoot":"","sources":["../../../../src/runtime/shutdown/detached-sweep/rounds.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEhF;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,yCAAyC;IACzC,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,2EAA2E;IAC3E,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,kFAAkF;IAClF,QAAQ,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,yFAAyF;IACzF,QAAQ,CAAC,aAAa,EAAE,CACtB,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,KAChB,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,oFAAoF;IACpF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC;;;OAGG;IACH,QAAQ,CAAC,0BAA0B,EAAE,MAAM,EAAE,CAAC;IAC9C,qEAAqE;IACrE,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,gFAAgF;IAChF,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,kFAAkF;IAClF,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;IACrD,2FAA2F;IAC3F,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,2FAA2F;IAC3F,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;CAClC,CAAC;AAEF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,aAAa,GAAG,UAAU,CAWjE;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,EAAE,CAI3D;AAED,2FAA2F;AAC3F,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAEjG;AAED,4FAA4F;AAC5F,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,GAAG,SAAS,CAMxE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,KAAK,EAAE,UAAU,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,EAAE,CAUV;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,UAAU,GAChB,IAAI,CAWN;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,UAAU,GAChB,IAAI,CAgBN;AAWD,6FAA6F;AAC7F,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAS/E"}
|