@with-logic/elwood 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +571 -1
- package/CONTRIBUTING.md +3 -0
- package/README.md +6 -2
- package/dist/bridge/socket-release.d.ts +15 -0
- package/dist/bridge/socket-release.d.ts.map +1 -0
- package/dist/bridge/socket-release.js +22 -0
- package/dist/bridge/socket-release.js.map +1 -0
- package/dist/claude/composer/border.d.ts +12 -0
- package/dist/claude/composer/border.d.ts.map +1 -0
- package/dist/claude/composer/border.js +12 -0
- package/dist/claude/composer/border.js.map +1 -0
- package/dist/claude/composer/empty-input.d.ts +15 -0
- package/dist/claude/composer/empty-input.d.ts.map +1 -1
- package/dist/claude/composer/empty-input.js +30 -11
- package/dist/claude/composer/empty-input.js.map +1 -1
- package/dist/claude/composer/footer.d.ts +26 -2
- package/dist/claude/composer/footer.d.ts.map +1 -1
- package/dist/claude/composer/footer.js +29 -2
- package/dist/claude/composer/footer.js.map +1 -1
- package/dist/claude/composer/idle.d.ts +14 -0
- package/dist/claude/composer/idle.d.ts.map +1 -0
- package/dist/claude/composer/idle.js +17 -0
- package/dist/claude/composer/idle.js.map +1 -0
- package/dist/claude/composer/last.d.ts +2 -0
- package/dist/claude/composer/last.d.ts.map +1 -0
- package/dist/claude/composer/last.js +15 -0
- package/dist/claude/composer/last.js.map +1 -0
- package/dist/claude/composer/staged-input.d.ts.map +1 -1
- package/dist/claude/composer/staged-input.js +2 -1
- package/dist/claude/composer/staged-input.js.map +1 -1
- package/dist/claude/hooks/stop-failure.d.ts +15 -2
- package/dist/claude/hooks/stop-failure.d.ts.map +1 -1
- package/dist/claude/hooks/stop-failure.js +32 -9
- package/dist/claude/hooks/stop-failure.js.map +1 -1
- package/dist/claude/login/stages.d.ts.map +1 -1
- package/dist/claude/login/stages.js +2 -2
- package/dist/claude/login/stages.js.map +1 -1
- package/dist/claude/model-picker.d.ts +1 -1
- package/dist/claude/model-picker.d.ts.map +1 -1
- package/dist/claude/model-picker.js +27 -10
- package/dist/claude/model-picker.js.map +1 -1
- package/dist/claude/preflight.d.ts +1 -1
- package/dist/claude/preflight.d.ts.map +1 -1
- package/dist/claude/preflight.js +18 -12
- package/dist/claude/preflight.js.map +1 -1
- package/dist/claude/questions/navigation.d.ts.map +1 -1
- package/dist/claude/questions/navigation.js +1 -2
- package/dist/claude/questions/navigation.js.map +1 -1
- package/dist/claude/questions/screen.d.ts.map +1 -1
- package/dist/claude/questions/screen.js +10 -2
- package/dist/claude/questions/screen.js.map +1 -1
- package/dist/claude/screen-table.d.ts +8 -5
- package/dist/claude/screen-table.d.ts.map +1 -1
- package/dist/claude/screen-table.js +20 -12
- package/dist/claude/screen-table.js.map +1 -1
- package/dist/claude/session/bridge.d.ts +2 -1
- package/dist/claude/session/bridge.d.ts.map +1 -1
- package/dist/claude/session/bridge.js +3 -1
- package/dist/claude/session/bridge.js.map +1 -1
- package/dist/claude/session/build.d.ts.map +1 -1
- package/dist/claude/session/build.js +13 -11
- package/dist/claude/session/build.js.map +1 -1
- package/dist/claude/session/cleanup.d.ts +18 -0
- package/dist/claude/session/cleanup.d.ts.map +1 -0
- package/dist/claude/session/cleanup.js +10 -0
- package/dist/claude/session/cleanup.js.map +1 -0
- package/dist/claude/session/index.d.ts.map +1 -1
- package/dist/claude/session/index.js +27 -13
- package/dist/claude/session/index.js.map +1 -1
- package/dist/claude/session/instance.d.ts +7 -8
- package/dist/claude/session/instance.d.ts.map +1 -1
- package/dist/claude/session/instance.js +9 -13
- package/dist/claude/session/instance.js.map +1 -1
- package/dist/claude/session/resume.d.ts.map +1 -1
- package/dist/claude/session/resume.js +14 -5
- package/dist/claude/session/resume.js.map +1 -1
- package/dist/claude/session/transcript.js +2 -2
- package/dist/claude/session/transcript.js.map +1 -1
- package/dist/claude/simple.d.ts +1 -1
- package/dist/claude/simple.d.ts.map +1 -1
- package/dist/claude/simple.js +3 -3
- package/dist/claude/simple.js.map +1 -1
- package/dist/claude/startup-prompts.d.ts +2 -0
- package/dist/claude/startup-prompts.d.ts.map +1 -1
- package/dist/claude/startup-prompts.js +5 -1
- package/dist/claude/startup-prompts.js.map +1 -1
- package/dist/claude/transcript/cursor-io.d.ts +1 -1
- package/dist/claude/transcript/cursor-io.d.ts.map +1 -1
- package/dist/claude/transcript/cursor-io.js +1 -1
- package/dist/claude/transcript/cursor-io.js.map +1 -1
- package/dist/claude/transcript/cursor.d.ts +5 -3
- package/dist/claude/transcript/cursor.d.ts.map +1 -1
- package/dist/claude/transcript/cursor.js +18 -8
- package/dist/claude/transcript/cursor.js.map +1 -1
- package/dist/claude/transcript/drain-context.d.ts +4 -3
- package/dist/claude/transcript/drain-context.d.ts.map +1 -1
- package/dist/claude/transcript/drain-context.js.map +1 -1
- package/dist/claude/transcript/emit.d.ts +2 -1
- package/dist/claude/transcript/emit.d.ts.map +1 -1
- package/dist/claude/transcript/emit.js +1 -0
- package/dist/claude/transcript/emit.js.map +1 -1
- package/dist/claude/transcript/index.d.ts.map +1 -1
- package/dist/claude/transcript/index.js +2 -2
- package/dist/claude/transcript/index.js.map +1 -1
- package/dist/claude/transcript/warnings.d.ts +2 -1
- package/dist/claude/transcript/warnings.d.ts.map +1 -1
- package/dist/claude/transcript/warnings.js +3 -2
- package/dist/claude/transcript/warnings.js.map +1 -1
- package/dist/cli/config/effective.d.ts +2 -2
- package/dist/cli/config/effective.d.ts.map +1 -1
- package/dist/cli/config/effective.js +0 -2
- package/dist/cli/config/effective.js.map +1 -1
- package/dist/cli/interactive/spawn.d.ts +0 -2
- package/dist/cli/interactive/spawn.d.ts.map +1 -1
- package/dist/cli/interactive/spawn.js +27 -24
- package/dist/cli/interactive/spawn.js.map +1 -1
- package/dist/cli/lifecycle/index.d.ts.map +1 -1
- package/dist/cli/lifecycle/index.js +5 -3
- package/dist/cli/lifecycle/index.js.map +1 -1
- package/dist/cli/main-failure.d.ts.map +1 -1
- package/dist/cli/main-failure.js +5 -2
- package/dist/cli/main-failure.js.map +1 -1
- package/dist/cli/models/combined.d.ts.map +1 -1
- package/dist/cli/models/combined.js +3 -2
- package/dist/cli/models/combined.js.map +1 -1
- package/dist/cli/models/render.d.ts.map +1 -1
- package/dist/cli/models/render.js +2 -1
- package/dist/cli/models/render.js.map +1 -1
- package/dist/cli/output/cleanup-error.d.ts +22 -0
- package/dist/cli/output/cleanup-error.d.ts.map +1 -0
- package/dist/cli/output/cleanup-error.js +67 -0
- package/dist/cli/output/cleanup-error.js.map +1 -0
- package/dist/cli/output/types.d.ts +6 -2
- package/dist/cli/output/types.d.ts.map +1 -1
- package/dist/cli/request/agent-detect.d.ts +6 -2
- package/dist/cli/request/agent-detect.d.ts.map +1 -1
- package/dist/cli/request/agent-detect.js +14 -6
- package/dist/cli/request/agent-detect.js.map +1 -1
- package/dist/cli/request/finalize.d.ts +1 -1
- package/dist/cli/request/finalize.d.ts.map +1 -1
- package/dist/cli/request/finalize.js +4 -25
- package/dist/cli/request/finalize.js.map +1 -1
- package/dist/cli/request/index.d.ts.map +1 -1
- package/dist/cli/request/index.js +11 -5
- package/dist/cli/request/index.js.map +1 -1
- package/dist/cli/request/path-replacement.d.ts +27 -0
- package/dist/cli/request/path-replacement.d.ts.map +1 -0
- package/dist/cli/request/path-replacement.js +79 -0
- package/dist/cli/request/path-replacement.js.map +1 -0
- package/dist/cli/request/workspace.d.ts +8 -0
- package/dist/cli/request/workspace.d.ts.map +1 -0
- package/dist/cli/request/workspace.js +50 -0
- package/dist/cli/request/workspace.js.map +1 -0
- package/dist/cli/run/output.d.ts.map +1 -1
- package/dist/cli/run/output.js +2 -1
- package/dist/cli/run/output.js.map +1 -1
- package/dist/cli/run/subscribe.d.ts.map +1 -1
- package/dist/cli/run/subscribe.js +1 -1
- package/dist/cli/run/subscribe.js.map +1 -1
- package/dist/cli/session/index.d.ts +4 -4
- package/dist/cli/session/index.d.ts.map +1 -1
- package/dist/cli/session/index.js +5 -5
- package/dist/cli/session/index.js.map +1 -1
- package/dist/cli/session/launch.d.ts +2 -2
- package/dist/cli/session/launch.d.ts.map +1 -1
- package/dist/cli/session/launch.js +12 -3
- package/dist/cli/session/launch.js.map +1 -1
- package/dist/cli/session/turn-readers.d.ts +14 -0
- package/dist/cli/session/turn-readers.d.ts.map +1 -0
- package/dist/cli/session/turn-readers.js +13 -0
- package/dist/cli/session/turn-readers.js.map +1 -0
- package/dist/codex/config/default-model.d.ts +24 -0
- package/dist/codex/config/default-model.d.ts.map +1 -0
- package/dist/codex/config/default-model.js +133 -0
- package/dist/codex/config/default-model.js.map +1 -0
- package/dist/codex/config/home.d.ts +35 -0
- package/dist/codex/config/home.d.ts.map +1 -0
- package/dist/codex/config/home.js +122 -0
- package/dist/codex/config/home.js.map +1 -0
- package/dist/codex/config/lock.d.ts +17 -11
- package/dist/codex/config/lock.d.ts.map +1 -1
- package/dist/codex/config/lock.js +102 -11
- package/dist/codex/config/lock.js.map +1 -1
- package/dist/codex/config/read.d.ts +16 -0
- package/dist/codex/config/read.d.ts.map +1 -0
- package/dist/codex/config/read.js +75 -0
- package/dist/codex/config/read.js.map +1 -0
- package/dist/codex/config/restore.d.ts +17 -7
- package/dist/codex/config/restore.d.ts.map +1 -1
- package/dist/codex/config/restore.js +33 -20
- package/dist/codex/config/restore.js.map +1 -1
- package/dist/codex/config/transaction.d.ts +6 -4
- package/dist/codex/config/transaction.d.ts.map +1 -1
- package/dist/codex/config/transaction.js +4 -3
- package/dist/codex/config/transaction.js.map +1 -1
- package/dist/codex/images/clipboard-copies.d.ts +39 -0
- package/dist/codex/images/clipboard-copies.d.ts.map +1 -0
- package/dist/codex/images/clipboard-copies.js +91 -0
- package/dist/codex/images/clipboard-copies.js.map +1 -0
- package/dist/codex/model-picker.d.ts +1 -1
- package/dist/codex/model-picker.d.ts.map +1 -1
- package/dist/codex/model-picker.js +16 -6
- package/dist/codex/model-picker.js.map +1 -1
- package/dist/codex/preflight.d.ts +2 -2
- package/dist/codex/preflight.d.ts.map +1 -1
- package/dist/codex/preflight.js +28 -21
- package/dist/codex/preflight.js.map +1 -1
- package/dist/codex/pty.d.ts +25 -3
- package/dist/codex/pty.d.ts.map +1 -1
- package/dist/codex/pty.js +53 -7
- package/dist/codex/pty.js.map +1 -1
- package/dist/codex/questions/candidates.d.ts.map +1 -1
- package/dist/codex/questions/candidates.js +4 -5
- package/dist/codex/questions/candidates.js.map +1 -1
- package/dist/codex/questions/driver.js +2 -2
- package/dist/codex/questions/driver.js.map +1 -1
- package/dist/codex/questions/records.d.ts +1 -1
- package/dist/codex/questions/records.d.ts.map +1 -1
- package/dist/codex/questions/records.js +1 -3
- package/dist/codex/questions/records.js.map +1 -1
- package/dist/codex/screen/clearance.d.ts +6 -0
- package/dist/codex/screen/clearance.d.ts.map +1 -1
- package/dist/codex/screen/clearance.js +10 -0
- package/dist/codex/screen/clearance.js.map +1 -1
- package/dist/codex/screen-table.d.ts.map +1 -1
- package/dist/codex/screen-table.js +6 -2
- package/dist/codex/screen-table.js.map +1 -1
- package/dist/codex/session/bridge.d.ts +1 -0
- package/dist/codex/session/bridge.d.ts.map +1 -1
- package/dist/codex/session/bridge.js +3 -1
- package/dist/codex/session/bridge.js.map +1 -1
- package/dist/codex/session/build.d.ts.map +1 -1
- package/dist/codex/session/build.js +14 -12
- package/dist/codex/session/build.js.map +1 -1
- package/dist/codex/session/cleanup.d.ts +2 -2
- package/dist/codex/session/cleanup.d.ts.map +1 -1
- package/dist/codex/session/cleanup.js +8 -11
- package/dist/codex/session/cleanup.js.map +1 -1
- package/dist/codex/session/config-switch.d.ts +20 -0
- package/dist/codex/session/config-switch.d.ts.map +1 -0
- package/dist/codex/session/config-switch.js +42 -0
- package/dist/codex/session/config-switch.js.map +1 -0
- package/dist/codex/session/hooks.d.ts.map +1 -1
- package/dist/codex/session/hooks.js +7 -0
- package/dist/codex/session/hooks.js.map +1 -1
- package/dist/codex/session/index.d.ts.map +1 -1
- package/dist/codex/session/index.js +34 -16
- package/dist/codex/session/index.js.map +1 -1
- package/dist/codex/session/instance.d.ts +10 -12
- package/dist/codex/session/instance.d.ts.map +1 -1
- package/dist/codex/session/instance.js +42 -37
- package/dist/codex/session/instance.js.map +1 -1
- package/dist/codex/session/readiness.d.ts +11 -0
- package/dist/codex/session/readiness.d.ts.map +1 -0
- package/dist/codex/session/readiness.js +22 -0
- package/dist/codex/session/readiness.js.map +1 -0
- package/dist/codex/session/resume.d.ts.map +1 -1
- package/dist/codex/session/resume.js +9 -4
- package/dist/codex/session/resume.js.map +1 -1
- package/dist/codex/session/transcript.d.ts.map +1 -1
- package/dist/codex/session/transcript.js +12 -1
- package/dist/codex/session/transcript.js.map +1 -1
- package/dist/codex/session/turn-commit.d.ts +58 -0
- package/dist/codex/session/turn-commit.d.ts.map +1 -0
- package/dist/codex/session/turn-commit.js +97 -0
- package/dist/codex/session/turn-commit.js.map +1 -0
- package/dist/codex/session/warnings.d.ts +13 -6
- package/dist/codex/session/warnings.d.ts.map +1 -1
- package/dist/codex/session/warnings.js +36 -9
- package/dist/codex/session/warnings.js.map +1 -1
- package/dist/codex/startup-prompts.d.ts +3 -0
- package/dist/codex/startup-prompts.d.ts.map +1 -1
- package/dist/codex/startup-prompts.js +20 -13
- package/dist/codex/startup-prompts.js.map +1 -1
- package/dist/codex/startup-warnings.d.ts +2 -0
- package/dist/codex/startup-warnings.d.ts.map +1 -1
- package/dist/codex/startup-warnings.js +6 -0
- package/dist/codex/startup-warnings.js.map +1 -1
- package/dist/codex/transcript/payload.d.ts +8 -0
- package/dist/codex/transcript/payload.d.ts.map +1 -0
- package/dist/codex/transcript/payload.js +11 -0
- package/dist/codex/transcript/payload.js.map +1 -0
- package/dist/codex/transcript/rejection.d.ts +15 -0
- package/dist/codex/transcript/rejection.d.ts.map +1 -0
- package/dist/codex/transcript/rejection.js +44 -0
- package/dist/codex/transcript/rejection.js.map +1 -0
- package/dist/codex/transcript/turn-end.d.ts +8 -0
- package/dist/codex/transcript/turn-end.d.ts.map +1 -0
- package/dist/codex/transcript/turn-end.js +17 -0
- package/dist/codex/transcript/turn-end.js.map +1 -0
- package/dist/codex/transcript/watcher.d.ts +5 -2
- package/dist/codex/transcript/watcher.d.ts.map +1 -1
- package/dist/codex/transcript/watcher.js +11 -6
- package/dist/codex/transcript/watcher.js.map +1 -1
- package/dist/codex/trust-retry.d.ts +12 -0
- package/dist/codex/trust-retry.d.ts.map +1 -0
- package/dist/codex/trust-retry.js +12 -0
- package/dist/codex/trust-retry.js.map +1 -0
- package/dist/codex/update/skip-attempt.d.ts +2 -0
- package/dist/codex/update/skip-attempt.d.ts.map +1 -1
- package/dist/codex/update/skip-attempt.js +4 -0
- package/dist/codex/update/skip-attempt.js.map +1 -1
- package/dist/codex/update/tracker.d.ts +2 -0
- package/dist/codex/update/tracker.d.ts.map +1 -1
- package/dist/codex/update/tracker.js +4 -0
- package/dist/codex/update/tracker.js.map +1 -1
- package/dist/core/delay.d.ts +3 -2
- package/dist/core/delay.d.ts.map +1 -1
- package/dist/core/delay.js +3 -2
- package/dist/core/delay.js.map +1 -1
- package/dist/core/errors.d.ts +33 -4
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +51 -7
- package/dist/core/errors.js.map +1 -1
- package/dist/core/images/materialize.d.ts +13 -4
- package/dist/core/images/materialize.d.ts.map +1 -1
- package/dist/core/images/materialize.js +48 -11
- package/dist/core/images/materialize.js.map +1 -1
- package/dist/core/input/abort.d.ts +15 -0
- package/dist/core/input/abort.d.ts.map +1 -1
- package/dist/core/input/abort.js +18 -2
- package/dist/core/input/abort.js.map +1 -1
- package/dist/core/input/constants.d.ts +4 -1
- package/dist/core/input/constants.d.ts.map +1 -1
- package/dist/core/input/constants.js +4 -1
- package/dist/core/input/constants.js.map +1 -1
- package/dist/core/input/index.d.ts +1 -1
- package/dist/core/input/index.d.ts.map +1 -1
- package/dist/core/input/index.js +1 -1
- package/dist/core/input/index.js.map +1 -1
- package/dist/core/models/clearance.d.ts +38 -0
- package/dist/core/models/clearance.d.ts.map +1 -0
- package/dist/core/models/clearance.js +38 -0
- package/dist/core/models/clearance.js.map +1 -0
- package/dist/core/models/close-wait.d.ts +17 -0
- package/dist/core/models/close-wait.d.ts.map +1 -0
- package/dist/core/models/close-wait.js +44 -0
- package/dist/core/models/close-wait.js.map +1 -0
- package/dist/core/models/dialog-region.d.ts +18 -3
- package/dist/core/models/dialog-region.d.ts.map +1 -1
- package/dist/core/models/dialog-region.js +29 -40
- package/dist/core/models/dialog-region.js.map +1 -1
- package/dist/core/models/input.d.ts +10 -1
- package/dist/core/models/input.d.ts.map +1 -1
- package/dist/core/models/input.js +15 -2
- package/dist/core/models/input.js.map +1 -1
- package/dist/core/models/intervention.d.ts +2 -2
- package/dist/core/models/intervention.d.ts.map +1 -1
- package/dist/core/models/intervention.js +6 -3
- package/dist/core/models/intervention.js.map +1 -1
- package/dist/core/models/own-picker.d.ts +21 -0
- package/dist/core/models/own-picker.d.ts.map +1 -0
- package/dist/core/models/own-picker.js +21 -0
- package/dist/core/models/own-picker.js.map +1 -0
- package/dist/core/models/picker.d.ts +34 -4
- package/dist/core/models/picker.d.ts.map +1 -1
- package/dist/core/models/picker.js +50 -44
- package/dist/core/models/picker.js.map +1 -1
- package/dist/core/models/row-block.d.ts +66 -0
- package/dist/core/models/row-block.d.ts.map +1 -0
- package/dist/core/models/row-block.js +87 -0
- package/dist/core/models/row-block.js.map +1 -0
- package/dist/core/models/rows.d.ts +32 -3
- package/dist/core/models/rows.d.ts.map +1 -1
- package/dist/core/models/rows.js +48 -20
- package/dist/core/models/rows.js.map +1 -1
- package/dist/core/models/tui-screen.d.ts +6 -1
- package/dist/core/models/tui-screen.d.ts.map +1 -1
- package/dist/core/models/tui-screen.js +25 -10
- package/dist/core/models/tui-screen.js.map +1 -1
- package/dist/core/models/window.d.ts +49 -0
- package/dist/core/models/window.d.ts.map +1 -0
- package/dist/core/models/window.js +105 -0
- package/dist/core/models/window.js.map +1 -0
- package/dist/core/path-trust.d.ts +11 -0
- package/dist/core/path-trust.d.ts.map +1 -0
- package/dist/core/path-trust.js +21 -0
- package/dist/core/path-trust.js.map +1 -0
- package/dist/core/screen-facts.d.ts +3 -1
- package/dist/core/screen-facts.d.ts.map +1 -1
- package/dist/core/screen-facts.js +1 -0
- package/dist/core/screen-facts.js.map +1 -1
- package/dist/core/simple/boundary-signal.d.ts +41 -6
- package/dist/core/simple/boundary-signal.d.ts.map +1 -1
- package/dist/core/simple/boundary-signal.js +43 -3
- package/dist/core/simple/boundary-signal.js.map +1 -1
- package/dist/core/simple/close.d.ts +2 -1
- package/dist/core/simple/close.d.ts.map +1 -1
- package/dist/core/simple/close.js +10 -2
- package/dist/core/simple/close.js.map +1 -1
- package/dist/core/simple/turn-boundary.d.ts +2 -0
- package/dist/core/simple/turn-boundary.d.ts.map +1 -1
- package/dist/core/simple/turn-boundary.js +1 -1
- package/dist/core/simple/turn-boundary.js.map +1 -1
- package/dist/core/simple/turn-types.d.ts +9 -3
- package/dist/core/simple/turn-types.d.ts.map +1 -1
- package/dist/core/simple/turn-types.js +10 -2
- package/dist/core/simple/turn-types.js.map +1 -1
- package/dist/core/simple/turn.d.ts +2 -0
- package/dist/core/simple/turn.d.ts.map +1 -1
- package/dist/core/simple/turn.js +11 -5
- package/dist/core/simple/turn.js.map +1 -1
- package/dist/core/terminal-options.d.ts +17 -1
- package/dist/core/terminal-options.d.ts.map +1 -1
- package/dist/core/terminal-options.js +20 -8
- package/dist/core/terminal-options.js.map +1 -1
- package/dist/core/transcript/cursor-io.d.ts +8 -0
- package/dist/core/transcript/cursor-io.d.ts.map +1 -1
- package/dist/core/transcript/cursor-io.js +11 -5
- package/dist/core/transcript/cursor-io.js.map +1 -1
- package/dist/core/transcript/cursor.d.ts +28 -4
- package/dist/core/transcript/cursor.d.ts.map +1 -1
- package/dist/core/transcript/cursor.js +53 -7
- package/dist/core/transcript/cursor.js.map +1 -1
- package/dist/core/transcript/drain.d.ts +43 -0
- package/dist/core/transcript/drain.d.ts.map +1 -0
- package/dist/core/transcript/drain.js +67 -0
- package/dist/core/transcript/drain.js.map +1 -0
- package/dist/core/trust/abortable.d.ts +12 -0
- package/dist/core/trust/abortable.d.ts.map +1 -0
- package/dist/core/trust/abortable.js +48 -0
- package/dist/core/trust/abortable.js.map +1 -0
- package/dist/core/trust/allowlist.d.ts +2 -0
- package/dist/core/trust/allowlist.d.ts.map +1 -1
- package/dist/core/trust/allowlist.js +4 -1
- package/dist/core/trust/allowlist.js.map +1 -1
- package/dist/core/trust/blocking.d.ts +11 -0
- package/dist/core/trust/blocking.d.ts.map +1 -1
- package/dist/core/trust/blocking.js +5 -4
- package/dist/core/trust/blocking.js.map +1 -1
- package/dist/core/trust/copy.d.ts.map +1 -1
- package/dist/core/trust/copy.js +7 -1
- package/dist/core/trust/copy.js.map +1 -1
- package/dist/core/trust/deadline.d.ts +24 -0
- package/dist/core/trust/deadline.d.ts.map +1 -0
- package/dist/core/trust/deadline.js +56 -0
- package/dist/core/trust/deadline.js.map +1 -0
- package/dist/core/trust/dialog.d.ts +11 -2
- package/dist/core/trust/dialog.d.ts.map +1 -1
- package/dist/core/trust/dialog.js +12 -3
- package/dist/core/trust/dialog.js.map +1 -1
- package/dist/core/trust/options.d.ts +5 -1
- package/dist/core/trust/options.d.ts.map +1 -1
- package/dist/core/trust/options.js +8 -2
- package/dist/core/trust/options.js.map +1 -1
- package/dist/core/trust/prompts.d.ts +3 -0
- package/dist/core/trust/prompts.d.ts.map +1 -1
- package/dist/core/trust/prompts.js +2 -1
- package/dist/core/trust/prompts.js.map +1 -1
- package/dist/core/trust/responder.d.ts +10 -5
- package/dist/core/trust/responder.d.ts.map +1 -1
- package/dist/core/trust/responder.js +37 -33
- package/dist/core/trust/responder.js.map +1 -1
- package/dist/core/trust/step.d.ts +67 -0
- package/dist/core/trust/step.d.ts.map +1 -0
- package/dist/core/trust/step.js +45 -0
- package/dist/core/trust/step.js.map +1 -0
- package/dist/core/trust/types.d.ts +21 -1
- package/dist/core/trust/types.d.ts.map +1 -1
- package/dist/core/trust/types.js +25 -1
- package/dist/core/trust/types.js.map +1 -1
- package/dist/core/trust/view.d.ts +2 -0
- package/dist/core/trust/view.d.ts.map +1 -1
- package/dist/core/trust/view.js +3 -0
- package/dist/core/trust/view.js.map +1 -1
- package/dist/core/trust/write.d.ts +31 -6
- package/dist/core/trust/write.d.ts.map +1 -1
- package/dist/core/trust/write.js +95 -80
- package/dist/core/trust/write.js.map +1 -1
- package/dist/core/turn-state.d.ts +18 -4
- package/dist/core/turn-state.d.ts.map +1 -1
- package/dist/core/turn-state.js +47 -25
- package/dist/core/turn-state.js.map +1 -1
- package/dist/core/warnings/images.d.ts +22 -0
- package/dist/core/warnings/images.d.ts.map +1 -0
- package/dist/core/warnings/images.js +3 -0
- package/dist/core/warnings/images.js.map +1 -0
- package/dist/core/warnings/index.d.ts +3 -2
- package/dist/core/warnings/index.d.ts.map +1 -1
- package/dist/core/warnings/lifecycle.d.ts +35 -4
- package/dist/core/warnings/lifecycle.d.ts.map +1 -1
- package/dist/core/warnings/lifecycle.js +1 -1
- package/dist/core/warnings/update.d.ts +8 -4
- package/dist/core/warnings/update.d.ts.map +1 -1
- package/dist/core/warnings/update.js +21 -6
- package/dist/core/warnings/update.js.map +1 -1
- package/dist/pty/exit-latch.d.ts +28 -0
- package/dist/pty/exit-latch.d.ts.map +1 -0
- package/dist/pty/exit-latch.js +50 -0
- package/dist/pty/exit-latch.js.map +1 -0
- package/dist/runtime/exit-status.d.ts +7 -0
- package/dist/runtime/exit-status.d.ts.map +1 -0
- package/dist/runtime/exit-status.js +13 -0
- package/dist/runtime/exit-status.js.map +1 -0
- package/dist/runtime/home-guard/index.d.ts +45 -0
- package/dist/runtime/home-guard/index.d.ts.map +1 -0
- package/dist/runtime/home-guard/index.js +69 -0
- package/dist/runtime/home-guard/index.js.map +1 -0
- package/dist/runtime/loop-restore.d.ts +9 -9
- package/dist/runtime/loop-restore.d.ts.map +1 -1
- package/dist/runtime/loop-restore.js +10 -10
- package/dist/runtime/loop-restore.js.map +1 -1
- package/dist/runtime/probe/capped-buffer.d.ts +16 -0
- package/dist/runtime/probe/capped-buffer.d.ts.map +1 -0
- package/dist/runtime/probe/capped-buffer.js +38 -0
- package/dist/runtime/probe/capped-buffer.js.map +1 -0
- package/dist/runtime/probe/capture.d.ts +55 -0
- package/dist/runtime/probe/capture.d.ts.map +1 -0
- package/dist/runtime/probe/capture.js +71 -0
- package/dist/runtime/probe/capture.js.map +1 -0
- package/dist/runtime/{probe-cleanup.d.ts → probe/cleanup.d.ts} +2 -2
- package/dist/runtime/probe/cleanup.d.ts.map +1 -0
- package/dist/runtime/{probe-cleanup.js → probe/cleanup.js} +3 -3
- package/dist/runtime/probe/cleanup.js.map +1 -0
- package/dist/runtime/probe/directory-key.d.ts +26 -0
- package/dist/runtime/probe/directory-key.d.ts.map +1 -0
- package/dist/runtime/probe/directory-key.js +46 -0
- package/dist/runtime/probe/directory-key.js.map +1 -0
- package/dist/runtime/probe/index.d.ts +25 -0
- package/dist/runtime/probe/index.d.ts.map +1 -0
- package/dist/runtime/probe/index.js +153 -0
- package/dist/runtime/probe/index.js.map +1 -0
- package/dist/runtime/probe/lookup.d.ts +12 -0
- package/dist/runtime/probe/lookup.d.ts.map +1 -0
- package/dist/runtime/probe/lookup.js +29 -0
- package/dist/runtime/probe/lookup.js.map +1 -0
- package/dist/runtime/probe/named-pipes.d.ts +35 -0
- package/dist/runtime/probe/named-pipes.d.ts.map +1 -0
- package/dist/runtime/probe/named-pipes.js +167 -0
- package/dist/runtime/probe/named-pipes.js.map +1 -0
- package/dist/runtime/probe/private-directory.d.ts +14 -0
- package/dist/runtime/probe/private-directory.d.ts.map +1 -0
- package/dist/runtime/probe/private-directory.js +50 -0
- package/dist/runtime/probe/private-directory.js.map +1 -0
- package/dist/runtime/probe/results.d.ts +14 -0
- package/dist/runtime/probe/results.d.ts.map +1 -0
- package/dist/runtime/probe/results.js +38 -0
- package/dist/runtime/probe/results.js.map +1 -0
- package/dist/runtime/probe/slots.d.ts +17 -0
- package/dist/runtime/probe/slots.d.ts.map +1 -0
- package/dist/runtime/probe/slots.js +35 -0
- package/dist/runtime/probe/slots.js.map +1 -0
- package/dist/runtime/probe/start.d.ts +64 -0
- package/dist/runtime/probe/start.d.ts.map +1 -0
- package/dist/runtime/probe/start.js +80 -0
- package/dist/runtime/probe/start.js.map +1 -0
- package/dist/runtime/probe-cache.d.ts +19 -0
- package/dist/runtime/probe-cache.d.ts.map +1 -0
- package/dist/runtime/probe-cache.js +56 -0
- package/dist/runtime/probe-cache.js.map +1 -0
- package/dist/runtime/readiness/initial-ready.d.ts +31 -5
- package/dist/runtime/readiness/initial-ready.d.ts.map +1 -1
- package/dist/runtime/readiness/initial-ready.js +64 -18
- package/dist/runtime/readiness/initial-ready.js.map +1 -1
- package/dist/runtime/seams.d.ts +14 -2
- package/dist/runtime/seams.d.ts.map +1 -1
- package/dist/runtime/seams.js +2 -2
- package/dist/runtime/seams.js.map +1 -1
- package/dist/runtime/session/base.d.ts.map +1 -1
- package/dist/runtime/session/base.js +9 -6
- package/dist/runtime/session/base.js.map +1 -1
- package/dist/runtime/session/commands.d.ts +6 -4
- package/dist/runtime/session/commands.d.ts.map +1 -1
- package/dist/runtime/session/commands.js +5 -2
- package/dist/runtime/session/commands.js.map +1 -1
- package/dist/runtime/session/frames.d.ts +12 -2
- package/dist/runtime/session/frames.d.ts.map +1 -1
- package/dist/runtime/session/frames.js +10 -3
- package/dist/runtime/session/frames.js.map +1 -1
- package/dist/runtime/session/image-attach.js +7 -2
- package/dist/runtime/session/image-attach.js.map +1 -1
- package/dist/runtime/session/launch-directory.d.ts +33 -0
- package/dist/runtime/session/launch-directory.d.ts.map +1 -0
- package/dist/runtime/session/launch-directory.js +84 -0
- package/dist/runtime/session/launch-directory.js.map +1 -0
- package/dist/runtime/session/lifecycle.d.ts +3 -3
- package/dist/runtime/session/lifecycle.d.ts.map +1 -1
- package/dist/runtime/session/lifecycle.js +1 -5
- package/dist/runtime/session/lifecycle.js.map +1 -1
- package/dist/runtime/session/loops.d.ts +1 -1
- package/dist/runtime/session/loops.d.ts.map +1 -1
- package/dist/runtime/session/loops.js +6 -3
- package/dist/runtime/session/loops.js.map +1 -1
- package/dist/runtime/session/picker-cleanup.d.ts +6 -21
- package/dist/runtime/session/picker-cleanup.d.ts.map +1 -1
- package/dist/runtime/session/picker-cleanup.js +19 -31
- package/dist/runtime/session/picker-cleanup.js.map +1 -1
- package/dist/runtime/session/picker-hold.d.ts +24 -0
- package/dist/runtime/session/picker-hold.d.ts.map +1 -0
- package/dist/runtime/session/picker-hold.js +42 -0
- package/dist/runtime/session/picker-hold.js.map +1 -0
- package/dist/runtime/session/picker.d.ts +15 -13
- package/dist/runtime/session/picker.d.ts.map +1 -1
- package/dist/runtime/session/picker.js +49 -27
- package/dist/runtime/session/picker.js.map +1 -1
- package/dist/runtime/session/prepare-state.d.ts +6 -0
- package/dist/runtime/session/prepare-state.d.ts.map +1 -0
- package/dist/runtime/session/prepare-state.js +14 -0
- package/dist/runtime/session/prepare-state.js.map +1 -0
- package/dist/runtime/session/questions.d.ts +2 -2
- package/dist/runtime/session/questions.d.ts.map +1 -1
- package/dist/runtime/session/questions.js.map +1 -1
- package/dist/runtime/session/readiness.d.ts +14 -5
- package/dist/runtime/session/readiness.d.ts.map +1 -1
- package/dist/runtime/session/readiness.js +22 -6
- package/dist/runtime/session/readiness.js.map +1 -1
- package/dist/runtime/session/reap.d.ts +11 -7
- package/dist/runtime/session/reap.d.ts.map +1 -1
- package/dist/runtime/session/reap.js +16 -10
- package/dist/runtime/session/reap.js.map +1 -1
- package/dist/runtime/session/runtime-cleanup.d.ts +18 -0
- package/dist/runtime/session/runtime-cleanup.d.ts.map +1 -0
- package/dist/runtime/session/runtime-cleanup.js +18 -0
- package/dist/runtime/session/runtime-cleanup.js.map +1 -0
- package/dist/runtime/session/session-input.d.ts +32 -0
- package/dist/runtime/session/session-input.d.ts.map +1 -0
- package/dist/runtime/session/{picker-input.js → session-input.js} +35 -7
- package/dist/runtime/session/session-input.js.map +1 -0
- package/dist/runtime/session/shutdown-binding.d.ts +12 -1
- package/dist/runtime/session/shutdown-binding.d.ts.map +1 -1
- package/dist/runtime/session/shutdown-binding.js +33 -1
- package/dist/runtime/session/shutdown-binding.js.map +1 -1
- package/dist/runtime/session/shutdown-cleanup.d.ts +17 -0
- package/dist/runtime/session/shutdown-cleanup.d.ts.map +1 -0
- package/dist/runtime/session/shutdown-cleanup.js +49 -0
- package/dist/runtime/session/shutdown-cleanup.js.map +1 -0
- package/dist/runtime/session/shutdown.d.ts +3 -2
- package/dist/runtime/session/shutdown.d.ts.map +1 -1
- package/dist/runtime/session/shutdown.js +13 -24
- package/dist/runtime/session/shutdown.js.map +1 -1
- package/dist/runtime/shell-quote.d.ts +8 -0
- package/dist/runtime/shell-quote.d.ts.map +1 -0
- package/dist/runtime/shell-quote.js +10 -0
- package/dist/runtime/shell-quote.js.map +1 -0
- package/dist/runtime/shell.d.ts +36 -12
- package/dist/runtime/shell.d.ts.map +1 -1
- package/dist/runtime/shell.js +90 -14
- package/dist/runtime/shell.js.map +1 -1
- package/dist/runtime/shutdown/coalesce.d.ts +15 -0
- package/dist/runtime/shutdown/coalesce.d.ts.map +1 -0
- package/dist/runtime/shutdown/coalesce.js +42 -0
- package/dist/runtime/shutdown/coalesce.js.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/failures.d.ts +24 -0
- package/dist/runtime/shutdown/detached-sweep/failures.d.ts.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/failures.js +32 -0
- package/dist/runtime/shutdown/detached-sweep/failures.js.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/index.d.ts +55 -0
- package/dist/runtime/shutdown/detached-sweep/index.d.ts.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/index.js +129 -0
- package/dist/runtime/shutdown/detached-sweep/index.js.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/kill.d.ts +37 -0
- package/dist/runtime/shutdown/detached-sweep/kill.d.ts.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/kill.js +87 -0
- package/dist/runtime/shutdown/detached-sweep/kill.js.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/record.d.ts +67 -0
- package/dist/runtime/shutdown/detached-sweep/record.d.ts.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/record.js +111 -0
- package/dist/runtime/shutdown/detached-sweep/record.js.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/rounds.d.ts +78 -0
- package/dist/runtime/shutdown/detached-sweep/rounds.d.ts.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/rounds.js +116 -0
- package/dist/runtime/shutdown/detached-sweep/rounds.js.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/survivors.d.ts +40 -0
- package/dist/runtime/shutdown/detached-sweep/survivors.d.ts.map +1 -0
- package/dist/runtime/shutdown/detached-sweep/survivors.js +112 -0
- package/dist/runtime/shutdown/detached-sweep/survivors.js.map +1 -0
- package/dist/runtime/shutdown/leader-group.d.ts +29 -0
- package/dist/runtime/shutdown/leader-group.d.ts.map +1 -0
- package/dist/runtime/shutdown/leader-group.js +35 -0
- package/dist/runtime/shutdown/leader-group.js.map +1 -0
- package/dist/runtime/shutdown/native-read-admission.d.ts +13 -0
- package/dist/runtime/shutdown/native-read-admission.d.ts.map +1 -0
- package/dist/runtime/shutdown/native-read-admission.js +64 -0
- package/dist/runtime/shutdown/native-read-admission.js.map +1 -0
- package/dist/runtime/shutdown/process-table.d.ts +80 -0
- package/dist/runtime/shutdown/process-table.d.ts.map +1 -0
- package/dist/runtime/shutdown/process-table.js +147 -0
- package/dist/runtime/shutdown/process-table.js.map +1 -0
- package/dist/runtime/shutdown/process-tree-ops.d.ts +39 -0
- package/dist/runtime/shutdown/process-tree-ops.d.ts.map +1 -0
- package/dist/runtime/shutdown/process-tree-ops.js +73 -0
- package/dist/runtime/shutdown/process-tree-ops.js.map +1 -0
- package/dist/runtime/shutdown/read-timeout.d.ts +4 -0
- package/dist/runtime/shutdown/read-timeout.d.ts.map +1 -0
- package/dist/runtime/shutdown/read-timeout.js +6 -0
- package/dist/runtime/shutdown/read-timeout.js.map +1 -0
- package/dist/runtime/shutdown/reap-queue.d.ts +10 -0
- package/dist/runtime/shutdown/reap-queue.d.ts.map +1 -0
- package/dist/runtime/shutdown/reap-queue.js +29 -0
- package/dist/runtime/shutdown/reap-queue.js.map +1 -0
- package/dist/runtime/shutdown/reap-tree.d.ts +42 -32
- package/dist/runtime/shutdown/reap-tree.d.ts.map +1 -1
- package/dist/runtime/shutdown/reap-tree.js +78 -71
- package/dist/runtime/shutdown/reap-tree.js.map +1 -1
- package/dist/runtime/shutdown/shared-daemon.d.ts +59 -0
- package/dist/runtime/shutdown/shared-daemon.d.ts.map +1 -0
- package/dist/runtime/shutdown/shared-daemon.js +139 -0
- package/dist/runtime/shutdown/shared-daemon.js.map +1 -0
- package/dist/runtime/shutdown/teardown.d.ts +15 -0
- package/dist/runtime/shutdown/teardown.d.ts.map +1 -1
- package/dist/runtime/shutdown/teardown.js +19 -6
- package/dist/runtime/shutdown/teardown.js.map +1 -1
- package/dist/runtime/shutdown/terminate.d.ts +21 -1
- package/dist/runtime/shutdown/terminate.d.ts.map +1 -1
- package/dist/runtime/shutdown/terminate.js +83 -56
- package/dist/runtime/shutdown/terminate.js.map +1 -1
- package/dist/runtime/startup/buffer.d.ts +26 -7
- package/dist/runtime/startup/buffer.d.ts.map +1 -1
- package/dist/runtime/startup/buffer.js +42 -19
- package/dist/runtime/startup/buffer.js.map +1 -1
- package/dist/runtime/startup/cleanup.d.ts +37 -11
- package/dist/runtime/startup/cleanup.d.ts.map +1 -1
- package/dist/runtime/startup/cleanup.js +55 -25
- package/dist/runtime/startup/cleanup.js.map +1 -1
- package/dist/runtime/startup/index.d.ts +13 -1
- package/dist/runtime/startup/index.d.ts.map +1 -1
- package/dist/runtime/startup/index.js +38 -6
- package/dist/runtime/startup/index.js.map +1 -1
- package/dist/runtime/stream-marker.d.ts +17 -0
- package/dist/runtime/stream-marker.d.ts.map +1 -0
- package/dist/runtime/stream-marker.js +35 -0
- package/dist/runtime/stream-marker.js.map +1 -0
- package/dist/runtime/update/acquire.d.ts +16 -0
- package/dist/runtime/update/acquire.d.ts.map +1 -0
- package/dist/runtime/update/acquire.js +62 -0
- package/dist/runtime/update/acquire.js.map +1 -0
- package/dist/runtime/update/completion.d.ts +12 -0
- package/dist/runtime/update/completion.d.ts.map +1 -0
- package/dist/runtime/update/completion.js +50 -0
- package/dist/runtime/update/completion.js.map +1 -0
- package/dist/runtime/update/lock.d.ts +1 -1
- package/dist/runtime/update/lock.d.ts.map +1 -1
- package/dist/runtime/update/lock.js +21 -38
- package/dist/runtime/update/lock.js.map +1 -1
- package/dist/runtime/update/once.d.ts +16 -13
- package/dist/runtime/update/once.d.ts.map +1 -1
- package/dist/runtime/update/once.js +41 -31
- package/dist/runtime/update/once.js.map +1 -1
- package/dist/runtime/update/owner.js +1 -1
- package/dist/runtime/update/retained-lease.js +1 -1
- package/dist/runtime/update/waiting.d.ts +14 -1
- package/dist/runtime/update/waiting.d.ts.map +1 -1
- package/dist/runtime/update/waiting.js +20 -12
- package/dist/runtime/update/waiting.js.map +1 -1
- package/dist/state/canonical-path.d.ts +5 -0
- package/dist/state/canonical-path.d.ts.map +1 -1
- package/dist/state/canonical-path.js +11 -5
- package/dist/state/canonical-path.js.map +1 -1
- package/dist/state/directories.d.ts +31 -1
- package/dist/state/directories.d.ts.map +1 -1
- package/dist/state/directories.js +75 -13
- package/dist/state/directories.js.map +1 -1
- package/dist/state/files.d.ts +3 -3
- package/dist/state/files.d.ts.map +1 -1
- package/dist/state/files.js +4 -10
- package/dist/state/files.js.map +1 -1
- package/dist/state/launch-ownership.d.ts +4 -2
- package/dist/state/launch-ownership.d.ts.map +1 -1
- package/dist/state/launch-ownership.js +18 -10
- package/dist/state/launch-ownership.js.map +1 -1
- package/dist/state/launch-publication.d.ts +7 -1
- package/dist/state/launch-publication.d.ts.map +1 -1
- package/dist/state/launch-publication.js +14 -2
- package/dist/state/launch-publication.js.map +1 -1
- package/dist/state/loop-store.d.ts +15 -4
- package/dist/state/loop-store.d.ts.map +1 -1
- package/dist/state/loop-store.js +13 -7
- package/dist/state/loop-store.js.map +1 -1
- package/dist/state/preparation/created-directories.d.ts +13 -0
- package/dist/state/preparation/created-directories.d.ts.map +1 -0
- package/dist/state/preparation/created-directories.js +45 -0
- package/dist/state/preparation/created-directories.js.map +1 -0
- package/dist/state/preparation/ignore-sync.d.ts +9 -0
- package/dist/state/preparation/ignore-sync.d.ts.map +1 -0
- package/dist/state/preparation/ignore-sync.js +47 -0
- package/dist/state/preparation/ignore-sync.js.map +1 -0
- package/dist/state/preparation/index.d.ts +25 -0
- package/dist/state/preparation/index.d.ts.map +1 -0
- package/dist/state/preparation/index.js +31 -0
- package/dist/state/preparation/index.js.map +1 -0
- package/dist/state/preparation/install-ignore.d.ts +6 -0
- package/dist/state/preparation/install-ignore.d.ts.map +1 -0
- package/dist/state/preparation/install-ignore.js +87 -0
- package/dist/state/preparation/install-ignore.js.map +1 -0
- package/dist/state/preparation/rollback-parent.d.ts +3 -0
- package/dist/state/preparation/rollback-parent.d.ts.map +1 -0
- package/dist/state/preparation/rollback-parent.js +18 -0
- package/dist/state/preparation/rollback-parent.js.map +1 -0
- package/dist/state/preparation/root-trust.d.ts +3 -0
- package/dist/state/preparation/root-trust.d.ts.map +1 -0
- package/dist/state/preparation/root-trust.js +70 -0
- package/dist/state/preparation/root-trust.js.map +1 -0
- package/dist/state/private-session.d.ts +5 -2
- package/dist/state/private-session.d.ts.map +1 -1
- package/dist/state/private-session.js +21 -9
- package/dist/state/private-session.js.map +1 -1
- package/dist/state/root.d.ts +25 -0
- package/dist/state/root.d.ts.map +1 -0
- package/dist/state/root.js +84 -0
- package/dist/state/root.js.map +1 -0
- package/dist/state/runtime-paths.d.ts +5 -4
- package/dist/state/runtime-paths.d.ts.map +1 -1
- package/dist/state/runtime-paths.js +5 -4
- package/dist/state/runtime-paths.js.map +1 -1
- package/dist/state/setup-failure.d.ts +3 -0
- package/dist/state/setup-failure.d.ts.map +1 -0
- package/dist/state/setup-failure.js +13 -0
- package/dist/state/setup-failure.js.map +1 -0
- package/dist/state/socket-home.d.ts +17 -12
- package/dist/state/socket-home.d.ts.map +1 -1
- package/dist/state/socket-home.js +31 -14
- package/dist/state/socket-home.js.map +1 -1
- package/dist/state/store.d.ts +1 -3
- package/dist/state/store.d.ts.map +1 -1
- package/dist/state/store.js +3 -18
- package/dist/state/store.js.map +1 -1
- package/dist/terminal/cursor.d.ts +1 -1
- package/dist/terminal/cursor.d.ts.map +1 -1
- package/dist/terminal/cursor.js +36 -1
- package/dist/terminal/cursor.js.map +1 -1
- package/dist/terminal/headless.d.ts +1 -1
- package/dist/terminal/headless.d.ts.map +1 -1
- package/dist/terminal/headless.js +1 -3
- package/dist/terminal/headless.js.map +1 -1
- package/docs/cli-behavior.md +1218 -28
- package/docs/cli.md +2 -0
- package/docs/codex/cli.md +4 -2
- package/docs/embedding.md +7 -0
- package/docs/performance/terminal-engines.md +88 -0
- package/docs/performance.md +120 -0
- package/package.json +4 -4
- package/prd/04-architecture.md +32 -0
- package/prd/05-api/5.1-starting-claude.md +17 -1
- package/prd/05-api/5.2-resuming-claude.md +5 -0
- package/prd/05-api/5.3-claude-session-api.md +267 -40
- package/prd/05-api/5.4-events.md +77 -10
- package/prd/05-api/5.5-starting-codex.md +3 -1
- package/prd/05-api/5.6-resuming-codex.md +4 -1
- package/prd/05-api/5.7-codex-session-api.md +87 -5
- package/prd/05-api/5.8-session-api.md +32 -1
- package/prd/06-claude-hook-bridge.md +2 -0
- package/prd/07a-codex-hook-bridge.md +5 -0
- package/prd/08-state.md +63 -7
- package/prd/09-lifecycle.md +126 -35
- package/prd/10-errors.md +11 -4
- package/prd/12-e2e.md +81 -0
- package/prd/12a-cli.md +63 -9
- package/prd/14-conformance.md +52 -35
- package/prd/16-maintainer-review.md +11 -0
- package/dist/claude/model-composer.d.ts +0 -2
- package/dist/claude/model-composer.d.ts.map +0 -1
- package/dist/claude/model-composer.js +0 -12
- package/dist/claude/model-composer.js.map +0 -1
- package/dist/claude/transcript/drain.d.ts +0 -33
- package/dist/claude/transcript/drain.d.ts.map +0 -1
- package/dist/claude/transcript/drain.js +0 -56
- package/dist/claude/transcript/drain.js.map +0 -1
- package/dist/codex/session/cli-exit.d.ts +0 -24
- package/dist/codex/session/cli-exit.d.ts.map +0 -1
- package/dist/codex/session/cli-exit.js +0 -43
- package/dist/codex/session/cli-exit.js.map +0 -1
- package/dist/codex/transcript/drain.d.ts +0 -30
- package/dist/codex/transcript/drain.d.ts.map +0 -1
- package/dist/codex/transcript/drain.js +0 -48
- package/dist/codex/transcript/drain.js.map +0 -1
- package/dist/runtime/probe-cleanup.d.ts.map +0 -1
- package/dist/runtime/probe-cleanup.js.map +0 -1
- package/dist/runtime/probe.d.ts +0 -11
- package/dist/runtime/probe.d.ts.map +0 -1
- package/dist/runtime/probe.js +0 -113
- package/dist/runtime/probe.js.map +0 -1
- package/dist/runtime/session/foreign-picker.d.ts +0 -8
- package/dist/runtime/session/foreign-picker.d.ts.map +0 -1
- package/dist/runtime/session/foreign-picker.js +0 -18
- package/dist/runtime/session/foreign-picker.js.map +0 -1
- package/dist/runtime/session/picker-input.d.ts +0 -17
- package/dist/runtime/session/picker-input.d.ts.map +0 -1
- package/dist/runtime/session/picker-input.js.map +0 -1
|
@@ -0,0 +1,116 @@
|
|
|
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 { errnoCode } from "../../../core/errors.js";
|
|
13
|
+
export function newSweepState(failures) {
|
|
14
|
+
return {
|
|
15
|
+
signaledGroupIds: new Set(),
|
|
16
|
+
signaledDescendantGroupIds: [],
|
|
17
|
+
stoppedPidsLastRead: new Set(),
|
|
18
|
+
unstoppable: new Map(),
|
|
19
|
+
live: new Map(),
|
|
20
|
+
unheld: [],
|
|
21
|
+
latest: [],
|
|
22
|
+
failures,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/** The live groups in the latest read that the sweep has not tried to stop. */
|
|
26
|
+
export function unreachedGroups(state) {
|
|
27
|
+
return [...state.live.keys()].filter((group) => !(state.signaledGroupIds.has(group) || state.unstoppable.has(group)));
|
|
28
|
+
}
|
|
29
|
+
/** Records `reason` against every group not yet confirmed stopped: unreached or unheld. */
|
|
30
|
+
export function recordUnconfirmed(state, reason, error) {
|
|
31
|
+
state.failures.record(reason, error, [...unreachedGroups(state), ...state.unheld]);
|
|
32
|
+
}
|
|
33
|
+
/** The sweep's outcome, once each group a read showed live but no SIGSTOP reached fails. */
|
|
34
|
+
export function sweepOutcome(state) {
|
|
35
|
+
for (const [group, error] of state.unstoppable) {
|
|
36
|
+
if (state.live.has(group))
|
|
37
|
+
state.failures.record("could not stop a live descendant group", error, [group]);
|
|
38
|
+
}
|
|
39
|
+
return state.failures.result();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The signaled groups this read does not hold: each with a live member that this read
|
|
43
|
+
* and the one before did not both show stopped, and any leader's own group while this
|
|
44
|
+
* read does not show the leader live, since its exit leaves descendants out of reach.
|
|
45
|
+
*/
|
|
46
|
+
export function unheldGroups(table, state, leaderPid) {
|
|
47
|
+
const unheld = new Set();
|
|
48
|
+
if (leaderPid !== undefined && !table.some((row) => row.pid === leaderPid && !row.zombie)) {
|
|
49
|
+
unheld.add(leaderPid);
|
|
50
|
+
}
|
|
51
|
+
for (const row of table) {
|
|
52
|
+
if (row.zombie || !state.signaledGroupIds.has(row.pgid))
|
|
53
|
+
continue;
|
|
54
|
+
if (!(row.stopped && state.stoppedPidsLastRead.has(row.pid)))
|
|
55
|
+
unheld.add(row.pgid);
|
|
56
|
+
}
|
|
57
|
+
return [...unheld];
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Stops each unreached group that a held parent anchors, after noting which rows this
|
|
61
|
+
* read shows stopped for the NEXT read to rely on.
|
|
62
|
+
*/
|
|
63
|
+
export function stopAnchoredGroups(table, ops, state) {
|
|
64
|
+
const unreached = new Set(unreachedGroups(state));
|
|
65
|
+
const anchored = [...state.live].filter(([group, parents]) => unreached.has(group) && [...parents].some((p) => isAnchor(p, state)));
|
|
66
|
+
state.stoppedPidsLastRead = new Set(table
|
|
67
|
+
.filter((row) => row.stopped && state.signaledGroupIds.has(row.pgid))
|
|
68
|
+
.map((row) => row.pid));
|
|
69
|
+
for (const [group] of anchored)
|
|
70
|
+
stopGroup(group, ops, state);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Sends SIGSTOP again to each signaled group this read shows with a live member that is
|
|
74
|
+
* not stopped, such as a child forked while the group's first stop went out (it keeps
|
|
75
|
+
* running until signaled; macOS showed one in 150 stops of a shell forking pipelines,
|
|
76
|
+
* and a real Claude teardown's login shell had one still running three seconds later).
|
|
77
|
+
* Each id still names its group: the caller has just seen the leader alive, and a
|
|
78
|
+
* descendant group stays anchored by the held parent the kill pass relies on too.
|
|
79
|
+
*/
|
|
80
|
+
export function restopEscapedGroups(table, ops, state) {
|
|
81
|
+
const escaped = table.filter((row) => !(row.zombie || row.stopped) && state.signaledGroupIds.has(row.pgid));
|
|
82
|
+
for (const group of new Set(escaped.map((row) => row.pgid))) {
|
|
83
|
+
try {
|
|
84
|
+
ops.stopGroup(group);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
if (errnoCode(error) === "ESRCH")
|
|
88
|
+
continue;
|
|
89
|
+
const descendant = state.signaledDescendantGroupIds.includes(group);
|
|
90
|
+
const reason = descendant
|
|
91
|
+
? "could not stop a live descendant group"
|
|
92
|
+
: "could not stop the leader's group";
|
|
93
|
+
state.failures.record(reason, error, [group]);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** A parent this read and the one before both showed stopped inside a signaled group. */
|
|
98
|
+
function isAnchor(parent, state) {
|
|
99
|
+
return (parent.stopped &&
|
|
100
|
+
state.signaledGroupIds.has(parent.pgid) &&
|
|
101
|
+
state.stoppedPidsLastRead.has(parent.pid));
|
|
102
|
+
}
|
|
103
|
+
/** A group that vanished (`ESRCH`) needs nothing; any other refusal is judged at the end. */
|
|
104
|
+
export function stopGroup(group, ops, state) {
|
|
105
|
+
try {
|
|
106
|
+
ops.stopGroup(group);
|
|
107
|
+
state.signaledDescendantGroupIds.push(group);
|
|
108
|
+
state.signaledGroupIds.add(group);
|
|
109
|
+
state.unheld = [...state.unheld, group];
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
if (errnoCode(error) !== "ESRCH")
|
|
113
|
+
state.unstoppable.set(group, error);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=rounds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rounds.js","sourceRoot":"","sources":["../../../../src/runtime/shutdown/detached-sweep/rounds.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reaps the recorded detached descendants that outlived a PTY leader's graceful exit
|
|
3
|
+
* (PRD §5.3 and §9.4, C-LIFE-10), with the detached sweep's rounds and kill pass. With
|
|
4
|
+
* the leader gone no parent pid links them to the session, so a group is first stopped
|
|
5
|
+
* because a read shows a recorded process in it: same pid, same start time (`record.ts`).
|
|
6
|
+
* From there the sweep's rules hold (`index.ts`), less the live leader: a held process
|
|
7
|
+
* anchors the groups it started, a group read with a member running is stopped again,
|
|
8
|
+
* and once a read converges the signaled groups are SIGKILLed deepest first, but one
|
|
9
|
+
* holding Codex's daemon, which is resumed (`kill.ts`). A group stops counting as a
|
|
10
|
+
* survivor once no recorded process is alive in it. The one exposure the identity leaves
|
|
11
|
+
* is a recorded process that exits between the read that shows it and the SIGSTOP, its
|
|
12
|
+
* group id reused within that moment; anchors rule that out only for a live leader.
|
|
13
|
+
*/
|
|
14
|
+
import { type SweepFailure } from "./failures.ts";
|
|
15
|
+
import { type DescendantRecord } from "./record.ts";
|
|
16
|
+
import { type SweepOps } from "./rounds.ts";
|
|
17
|
+
/** A graceful stop's watch for survivors, from the first recording read to the reap. */
|
|
18
|
+
export type SurvivorWatch = {
|
|
19
|
+
/** Settles once the read before the SIGTERM has finished, whether or not it succeeded. */
|
|
20
|
+
readonly firstRead: Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Stops recording, then, if `leaderExited` reports the exit, reaps the recorded
|
|
23
|
+
* processes still alive and hands the outcome, a failure or `undefined`, to `keep`.
|
|
24
|
+
*/
|
|
25
|
+
readonly finish: () => Promise<void>;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Records `leaderPid`'s detached descendants (`watchDescendants`) until `finish`. Records
|
|
29
|
+
* nothing for an `undefined` leader, one whose id the group reap refuses.
|
|
30
|
+
*/
|
|
31
|
+
export declare function watchSurvivors(leaderPid: number | undefined, ops: SweepOps, leaderExited: () => boolean, keep: (failure: SweepFailure | undefined) => void): SurvivorWatch;
|
|
32
|
+
/**
|
|
33
|
+
* Stops and SIGKILLs the groups holding `record`'s processes that are still alive, and
|
|
34
|
+
* any group they anchor, within the sweep's budget. Resolves to the unresolved failure,
|
|
35
|
+
* or `undefined` once a read converged and every signaled group was killed, or resumed as
|
|
36
|
+
* holding Codex's daemon. A record that does not know the leader's tree fails, and one
|
|
37
|
+
* that knows it empty reads nothing.
|
|
38
|
+
*/
|
|
39
|
+
export declare function reapRecordedSurvivors(record: DescendantRecord, ops: SweepOps, budgetMs?: number): Promise<SweepFailure | undefined>;
|
|
40
|
+
//# sourceMappingURL=survivors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"survivors.d.ts","sourceRoot":"","sources":["../../../../src/runtime/shutdown/detached-sweep/survivors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,KAAK,YAAY,EAAiB,MAAM,eAAe,CAAC;AAGjE,OAAO,EAAE,KAAK,gBAAgB,EAAoB,MAAM,aAAa,CAAC;AACtE,OAAO,EAIL,KAAK,QAAQ,EAOd,MAAM,aAAa,CAAC;AAErB,wFAAwF;AACxF,MAAM,MAAM,aAAa,GAAG;IAC1B,0FAA0F;IAC1F,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,GAAG,EAAE,QAAQ,EACb,YAAY,EAAE,MAAM,OAAO,EAC3B,IAAI,EAAE,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,KAAK,IAAI,GAChD,aAAa,CAWf;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,gBAAgB,EACxB,GAAG,EAAE,QAAQ,EACb,QAAQ,GAAE,MAAiC,GAC1C,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAWnC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reaps the recorded detached descendants that outlived a PTY leader's graceful exit
|
|
3
|
+
* (PRD §5.3 and §9.4, C-LIFE-10), with the detached sweep's rounds and kill pass. With
|
|
4
|
+
* the leader gone no parent pid links them to the session, so a group is first stopped
|
|
5
|
+
* because a read shows a recorded process in it: same pid, same start time (`record.ts`).
|
|
6
|
+
* From there the sweep's rules hold (`index.ts`), less the live leader: a held process
|
|
7
|
+
* anchors the groups it started, a group read with a member running is stopped again,
|
|
8
|
+
* and once a read converges the signaled groups are SIGKILLed deepest first, but one
|
|
9
|
+
* holding Codex's daemon, which is resumed (`kill.ts`). A group stops counting as a
|
|
10
|
+
* survivor once no recorded process is alive in it. The one exposure the identity leaves
|
|
11
|
+
* is a recorded process that exits between the read that shows it and the SIGSTOP, its
|
|
12
|
+
* group id reused within that moment; anchors rule that out only for a live leader.
|
|
13
|
+
*/
|
|
14
|
+
import { detachedDescendantGroups } from "../process-table.js";
|
|
15
|
+
import { daemonScope } from "../shared-daemon.js";
|
|
16
|
+
import { SweepFailures } from "./failures.js";
|
|
17
|
+
import { DETACHED_SWEEP_BUDGET_MS } from "./index.js";
|
|
18
|
+
import { killOrResumeSignaledGroups } from "./kill.js";
|
|
19
|
+
import { watchDescendants } from "./record.js";
|
|
20
|
+
import { newSweepState, recordUnconfirmed, restopEscapedGroups, stopAnchoredGroups, stopGroup, sweepOutcome, unheldGroups, unreachedGroups, } from "./rounds.js";
|
|
21
|
+
/**
|
|
22
|
+
* Records `leaderPid`'s detached descendants (`watchDescendants`) until `finish`. Records
|
|
23
|
+
* nothing for an `undefined` leader, one whose id the group reap refuses.
|
|
24
|
+
*/
|
|
25
|
+
export function watchSurvivors(leaderPid, ops, leaderExited, keep) {
|
|
26
|
+
if (leaderPid === undefined)
|
|
27
|
+
return { firstRead: Promise.resolve(), finish: () => Promise.resolve() };
|
|
28
|
+
const watch = watchDescendants(leaderPid, ops, leaderExited);
|
|
29
|
+
return {
|
|
30
|
+
firstRead: watch.firstRead,
|
|
31
|
+
finish: async () => {
|
|
32
|
+
const record = await watch.finish();
|
|
33
|
+
if (leaderExited())
|
|
34
|
+
keep(await reapRecordedSurvivors(record, ops));
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Stops and SIGKILLs the groups holding `record`'s processes that are still alive, and
|
|
40
|
+
* any group they anchor, within the sweep's budget. Resolves to the unresolved failure,
|
|
41
|
+
* or `undefined` once a read converged and every signaled group was killed, or resumed as
|
|
42
|
+
* holding Codex's daemon. A record that does not know the leader's tree fails, and one
|
|
43
|
+
* that knows it empty reads nothing.
|
|
44
|
+
*/
|
|
45
|
+
export async function reapRecordedSurvivors(record, ops, budgetMs = DETACHED_SWEEP_BUDGET_MS) {
|
|
46
|
+
const state = newSweepState(new SweepFailures());
|
|
47
|
+
if (!record.known) {
|
|
48
|
+
state.failures.record("no read showed the leader's tree", undefined, []);
|
|
49
|
+
return state.failures.result();
|
|
50
|
+
}
|
|
51
|
+
if (record.pids.length === 0)
|
|
52
|
+
return undefined;
|
|
53
|
+
const deadline = performance.now() + budgetMs;
|
|
54
|
+
await stopSurvivorGroups(record, ops, deadline, state);
|
|
55
|
+
await killOrResumeSignaledGroups(ops, state, deadline);
|
|
56
|
+
return sweepOutcome(state);
|
|
57
|
+
}
|
|
58
|
+
/** Reads round by round until a read converges, as `stopDescendantGroups` does. */
|
|
59
|
+
async function stopSurvivorGroups(record, ops, deadline, state) {
|
|
60
|
+
// Codex's daemon is marked under two kinds of root. A recorded pid: a recorded process
|
|
61
|
+
// may have `exec`'d the daemon since it was recorded. A stopped group: its parent's exit
|
|
62
|
+
// can leave the daemon in it under PID 1, under no recorded pid.
|
|
63
|
+
const scopeRoots = new Set(record.pids);
|
|
64
|
+
const scope = daemonScope(scopeRoots);
|
|
65
|
+
try {
|
|
66
|
+
while (true) {
|
|
67
|
+
for (const group of state.signaledGroupIds)
|
|
68
|
+
scopeRoots.add(group);
|
|
69
|
+
const remainingMs = Math.ceil(deadline - performance.now());
|
|
70
|
+
if (remainingMs <= 0)
|
|
71
|
+
return recordUnconfirmed(state, "process groups not confirmed stopped by the deadline");
|
|
72
|
+
const table = await ops.listProcesses(remainingMs, scope);
|
|
73
|
+
state.latest = table;
|
|
74
|
+
const roots = survivorGroups(record.survivors(table), table);
|
|
75
|
+
state.live = liveGroups(table, roots);
|
|
76
|
+
state.unheld = unheldGroups(table, state);
|
|
77
|
+
if (unreachedGroups(state).length === 0 && state.unheld.length === 0)
|
|
78
|
+
return;
|
|
79
|
+
restopEscapedGroups(table, ops, state);
|
|
80
|
+
stopAnchoredGroups(table, ops, state);
|
|
81
|
+
for (const group of unreachedGroups(state)) {
|
|
82
|
+
if (roots.has(group))
|
|
83
|
+
stopGroup(group, ops, state);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
recordUnconfirmed(state, "process table unreadable", error);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** The groups of `survivors`, never the host's or an id `kill(-pgid)` would misroute. */
|
|
92
|
+
function survivorGroups(survivors, table) {
|
|
93
|
+
const host = table.find((row) => row.pid === process.pid)?.pgid;
|
|
94
|
+
return new Set(survivors.map((row) => row.pgid).filter((pgid) => pgid > 1 && pgid !== host));
|
|
95
|
+
}
|
|
96
|
+
/** The survivor groups, then every group a member of one anchors, with the parents' rows. */
|
|
97
|
+
function liveGroups(table, roots) {
|
|
98
|
+
const live = new Map([...roots].map((group) => [group, new Set()]));
|
|
99
|
+
for (const member of table) {
|
|
100
|
+
if (member.zombie || !roots.has(member.pgid))
|
|
101
|
+
continue;
|
|
102
|
+
const found = detachedDescendantGroups(table, { leaderPid: member.pid, hostPid: process.pid });
|
|
103
|
+
for (const [group, parents] of found) {
|
|
104
|
+
const known = live.get(group) ?? new Set();
|
|
105
|
+
for (const parent of parents)
|
|
106
|
+
known.add(parent);
|
|
107
|
+
live.set(group, known);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return live;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=survivors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"survivors.js","sourceRoot":"","sources":["../../../../src/runtime/shutdown/detached-sweep/survivors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Numeric group guards for owned PTY reaping (PRD §5.3, C-LIFE-10). */
|
|
2
|
+
import { type GroupReapOps } from "./process-tree-ops.ts";
|
|
3
|
+
/**
|
|
4
|
+
* A pgid is reapable when it identifies the KNOWN-OWNED node-pty leader's group
|
|
5
|
+
* rather than a system group or the host itself. Ownership is NOT inferred from a
|
|
6
|
+
* numeric floor — that is an allocation detail, and after PID-space wrap or inside
|
|
7
|
+
* a constrained namespace a legitimate leader can be low (a prior arbitrary `< 100`
|
|
8
|
+
* floor silently no-op'd such leaders and leaked their descendants). We instead
|
|
9
|
+
* accept every valid child pid while refusing the two ids a group SIGKILL must
|
|
10
|
+
* never touch:
|
|
11
|
+
* - `pgid <= 1` — pid 0 means "our own group" to `kill(2)`, and pid 1 is
|
|
12
|
+
* `init`/`launchd`; a fake pid 1 in tests once reaped a developer's real apps.
|
|
13
|
+
* - the host's OWN pid — node-pty gives the leader a fresh session via `setsid()`
|
|
14
|
+
* so its pgid can never legitimately equal ours, but if a bad pgid ever did we
|
|
15
|
+
* must not signal `-process.pid` and kill ourselves.
|
|
16
|
+
*/
|
|
17
|
+
export declare function isReapableGroupId(pgid: number): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* SIGKILLs the process group led by `leaderPid`, reaping every descendant still
|
|
20
|
+
* in the group — including one already reparented to PID 1. node-pty starts the
|
|
21
|
+
* leader via `setsid()`, so it heads its own session and its pgid equals its pid;
|
|
22
|
+
* that group is always distinct from the host's own group, so this cannot signal
|
|
23
|
+
* the host process. Refuses only pids the kernel would misroute (see
|
|
24
|
+
* `isReapableGroupId`), never an arbitrary numeric floor. An already-dead group
|
|
25
|
+
* (leader and children exited together) is the normal case and its `ESRCH` is
|
|
26
|
+
* swallowed; a real kill failure such as `EPERM` propagates.
|
|
27
|
+
*/
|
|
28
|
+
export declare function reapProcessGroup(leaderPid: number, ops?: GroupReapOps): void;
|
|
29
|
+
//# sourceMappingURL=leader-group.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leader-group.d.ts","sourceRoot":"","sources":["../../../src/runtime/shutdown/leader-group.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,OAAO,EAAwB,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAEhF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,YAAqC,GACzC,IAAI,CAGN"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** Numeric group guards for owned PTY reaping (PRD §5.3, C-LIFE-10). */
|
|
2
|
+
import { activeProcessTreeOps } from "./process-tree-ops.js";
|
|
3
|
+
/**
|
|
4
|
+
* A pgid is reapable when it identifies the KNOWN-OWNED node-pty leader's group
|
|
5
|
+
* rather than a system group or the host itself. Ownership is NOT inferred from a
|
|
6
|
+
* numeric floor — that is an allocation detail, and after PID-space wrap or inside
|
|
7
|
+
* a constrained namespace a legitimate leader can be low (a prior arbitrary `< 100`
|
|
8
|
+
* floor silently no-op'd such leaders and leaked their descendants). We instead
|
|
9
|
+
* accept every valid child pid while refusing the two ids a group SIGKILL must
|
|
10
|
+
* never touch:
|
|
11
|
+
* - `pgid <= 1` — pid 0 means "our own group" to `kill(2)`, and pid 1 is
|
|
12
|
+
* `init`/`launchd`; a fake pid 1 in tests once reaped a developer's real apps.
|
|
13
|
+
* - the host's OWN pid — node-pty gives the leader a fresh session via `setsid()`
|
|
14
|
+
* so its pgid can never legitimately equal ours, but if a bad pgid ever did we
|
|
15
|
+
* must not signal `-process.pid` and kill ourselves.
|
|
16
|
+
*/
|
|
17
|
+
export function isReapableGroupId(pgid) {
|
|
18
|
+
return Number.isInteger(pgid) && pgid > 1 && pgid !== process.pid;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* SIGKILLs the process group led by `leaderPid`, reaping every descendant still
|
|
22
|
+
* in the group — including one already reparented to PID 1. node-pty starts the
|
|
23
|
+
* leader via `setsid()`, so it heads its own session and its pgid equals its pid;
|
|
24
|
+
* that group is always distinct from the host's own group, so this cannot signal
|
|
25
|
+
* the host process. Refuses only pids the kernel would misroute (see
|
|
26
|
+
* `isReapableGroupId`), never an arbitrary numeric floor. An already-dead group
|
|
27
|
+
* (leader and children exited together) is the normal case and its `ESRCH` is
|
|
28
|
+
* swallowed; a real kill failure such as `EPERM` propagates.
|
|
29
|
+
*/
|
|
30
|
+
export function reapProcessGroup(leaderPid, ops = activeProcessTreeOps()) {
|
|
31
|
+
if (!isReapableGroupId(leaderPid))
|
|
32
|
+
return;
|
|
33
|
+
ops.killGroup(leaderPid);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=leader-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leader-group.js","sourceRoot":"","sources":["../../../src/runtime/shutdown/leader-group.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,OAAO,EAAE,oBAAoB,EAAqB,MAAM,uBAAuB,CAAC;AAEhF;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,OAAO,CAAC,GAAG,CAAC;AACpE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,MAAoB,oBAAoB,EAAE;IAE1C,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAAE,OAAO;IAC1C,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Shared native scan/probe admission within each read's existing deadline (C-LIFE-10). */
|
|
2
|
+
import type { PsRunner } from "./process-table.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Two lets native reads overlap while bounding subprocess load across sessions.
|
|
5
|
+
* PATH_READS_AT_ONCE separately batches one walk's logical requests; those requests
|
|
6
|
+
* compete for these shared slots, so the independent bounds need not match.
|
|
7
|
+
*/
|
|
8
|
+
export declare const MAX_NATIVE_PROCESS_READS = 2;
|
|
9
|
+
/** Every adapter shares the same admission owner and forwards only its remaining native budget. */
|
|
10
|
+
export declare function createAdmittedPsRunner(run: PsRunner): PsRunner;
|
|
11
|
+
/** Queue only the native launch, after coalescing; never release before its runner settles. */
|
|
12
|
+
export declare function admitNativeProcessRead<T>(timeoutMs: number, launch: (remainingMs: number) => Promise<T>): Promise<T>;
|
|
13
|
+
//# sourceMappingURL=native-read-admission.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-read-admission.d.ts","sourceRoot":"","sources":["../../../src/runtime/shutdown/native-read-admission.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAE3F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAGnD;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAI1C,mGAAmG;AACnG,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,QAAQ,GAAG,QAAQ,CAK9D;AAED,+FAA+F;AAC/F,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAC1C,OAAO,CAAC,CAAC,CAAC,CAoCZ"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/** Shared native scan/probe admission within each read's existing deadline (C-LIFE-10). */
|
|
2
|
+
import { processReadTimeout } from "./read-timeout.js";
|
|
3
|
+
/**
|
|
4
|
+
* Two lets native reads overlap while bounding subprocess load across sessions.
|
|
5
|
+
* PATH_READS_AT_ONCE separately batches one walk's logical requests; those requests
|
|
6
|
+
* compete for these shared slots, so the independent bounds need not match.
|
|
7
|
+
*/
|
|
8
|
+
export const MAX_NATIVE_PROCESS_READS = 2;
|
|
9
|
+
const waiting = new Map();
|
|
10
|
+
let active = 0;
|
|
11
|
+
/** Every adapter shares the same admission owner and forwards only its remaining native budget. */
|
|
12
|
+
export function createAdmittedPsRunner(run) {
|
|
13
|
+
return (file, args, options) => admitNativeProcessRead(options.timeout, (remainingMs) => run(file, args, { ...options, timeout: remainingMs }));
|
|
14
|
+
}
|
|
15
|
+
/** Queue only the native launch, after coalescing; never release before its runner settles. */
|
|
16
|
+
export function admitNativeProcessRead(timeoutMs, launch) {
|
|
17
|
+
const deadline = performance.now() + timeoutMs;
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
const key = Symbol();
|
|
20
|
+
const timer = setTimeout(() => {
|
|
21
|
+
waiting.delete(key);
|
|
22
|
+
reject(timedOut());
|
|
23
|
+
}, timeoutMs);
|
|
24
|
+
waiting.set(key, () => {
|
|
25
|
+
clearTimeout(timer);
|
|
26
|
+
const remainingMs = Math.ceil(deadline - performance.now());
|
|
27
|
+
if (remainingMs <= 0) {
|
|
28
|
+
reject(timedOut());
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
active += 1;
|
|
32
|
+
try {
|
|
33
|
+
void launch(remainingMs).then((value) => {
|
|
34
|
+
active -= 1;
|
|
35
|
+
resolve(value);
|
|
36
|
+
drain();
|
|
37
|
+
}, (error) => {
|
|
38
|
+
active -= 1;
|
|
39
|
+
reject(error);
|
|
40
|
+
drain();
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
active -= 1;
|
|
45
|
+
reject(error);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
drain();
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/** FIFO admission; expired entries remove themselves without reserving capacity. */
|
|
52
|
+
function drain() {
|
|
53
|
+
while (active < MAX_NATIVE_PROCESS_READS) {
|
|
54
|
+
const next = waiting.entries().next().value;
|
|
55
|
+
if (next === undefined)
|
|
56
|
+
return;
|
|
57
|
+
waiting.delete(next[0]);
|
|
58
|
+
next[1]();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function timedOut() {
|
|
62
|
+
return processReadTimeout("process read admission timed out");
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=native-read-admission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-read-admission.js","sourceRoot":"","sources":["../../../src/runtime/shutdown/native-read-admission.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAG3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAC1C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;AAC9C,IAAI,MAAM,GAAG,CAAC,CAAC;AAEf,mGAAmG;AACnG,MAAM,UAAU,sBAAsB,CAAC,GAAa;IAClD,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAC7B,sBAAsB,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CACtD,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CACtD,CAAC;AACN,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,sBAAsB,CACpC,SAAiB,EACjB,MAA2C;IAE3C,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAC/C,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACpB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrB,CAAC,EAAE,SAAS,CAAC,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;YACpB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;YAC5D,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;gBACrB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACnB,OAAO;YACT,CAAC;YACD,MAAM,IAAI,CAAC,CAAC;YACZ,IAAI,CAAC;gBACH,KAAK,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAC3B,CAAC,KAAK,EAAE,EAAE;oBACR,MAAM,IAAI,CAAC,CAAC;oBACZ,OAAO,CAAC,KAAK,CAAC,CAAC;oBACf,KAAK,EAAE,CAAC;gBACV,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;oBACjB,MAAM,IAAI,CAAC,CAAC;oBACZ,MAAM,CAAC,KAAK,CAAC,CAAC;oBACd,KAAK,EAAE,CAAC;gBACV,CAAC,CACF,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,CAAC,CAAC;gBACZ,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,KAAK,EAAE,CAAC;IACV,CAAC,CAAC,CAAC;AACL,CAAC;AAED,oFAAoF;AACpF,SAAS,KAAK;IACZ,OAAO,MAAM,GAAG,wBAAwB,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC5C,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO;QAC/B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,QAAQ;IACf,OAAO,kBAAkB,CAAC,kCAAkC,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads the host process table and finds the process groups a PTY leader's
|
|
3
|
+
* descendants have moved into. Implements PRD §5.3 and §9.4 (C-LIFE-10): Claude and
|
|
4
|
+
* Codex start every hook command with `setsid()`, so a hook runs in its OWN session and
|
|
5
|
+
* process group and a SIGKILL of the leader's group cannot reach it. The parent-pid
|
|
6
|
+
* chain is the only thing tying such a descendant to the leader, and it holds only
|
|
7
|
+
* while every process between them is alive: when any of them exits, the processes
|
|
8
|
+
* below it are reparented to PID 1 and are out of reach. So this walk runs before
|
|
9
|
+
* Elwood kills the leader, and it finds only descendants still linked at that point.
|
|
10
|
+
*/
|
|
11
|
+
/** One row of the host process table. */
|
|
12
|
+
export type ProcessEntry = {
|
|
13
|
+
readonly pid: number;
|
|
14
|
+
readonly ppid: number;
|
|
15
|
+
readonly pgid: number;
|
|
16
|
+
/** An exited process its parent has not reaped yet: nothing left to kill. */
|
|
17
|
+
readonly zombie: boolean;
|
|
18
|
+
/** Stopped (state `T`) when its row was read, as a delivered SIGSTOP leaves it. */
|
|
19
|
+
readonly stopped: boolean;
|
|
20
|
+
/** When it started, to the second (`lstart`): with the pid, it names one process. */
|
|
21
|
+
readonly startedAt: string;
|
|
22
|
+
/** Its executable's short name (`ps`'s `ucomm`), at most 16 characters on macOS. */
|
|
23
|
+
readonly name: string;
|
|
24
|
+
/** Codex's shared daemon or its updater, never followed or killed (`shared-daemon.ts`). */
|
|
25
|
+
readonly shared: boolean;
|
|
26
|
+
};
|
|
27
|
+
export declare const PS_PATH = "/bin/ps";
|
|
28
|
+
/** One process's identity: its pid and start time, which no later process with its pid shares. */
|
|
29
|
+
export declare function processIdentity(row: Pick<ProcessEntry, "pid" | "startedAt">): string;
|
|
30
|
+
/** A row's fields where no read showed them: a live process not stopped, of no known start. */
|
|
31
|
+
export declare const UNREAD: Omit<ProcessEntry, "pid" | "pgid">;
|
|
32
|
+
/** The bounds a `ps` run gets: its timeout, its output cap, and the signal that ends it. */
|
|
33
|
+
export type PsRunOptions = {
|
|
34
|
+
readonly timeout: number;
|
|
35
|
+
readonly maxBuffer: number;
|
|
36
|
+
readonly killSignal: "SIGKILL";
|
|
37
|
+
readonly env: Readonly<Record<string, string>>;
|
|
38
|
+
};
|
|
39
|
+
/** Runs a file to completion and resolves its stdout; `execFile`, promisified. */
|
|
40
|
+
export type PsRunner = (file: string, args: readonly string[], options: PsRunOptions) => Promise<{
|
|
41
|
+
readonly stdout: string;
|
|
42
|
+
}>;
|
|
43
|
+
/** Full scans and daemon probes share admission without changing request coalescing. */
|
|
44
|
+
export declare const runFile: PsRunner;
|
|
45
|
+
/** The bounds every `ps` run gets: `timeoutMs`, the output cap, SIGKILL, and `PS_ENV`. */
|
|
46
|
+
export declare function psRunOptions(timeoutMs: number): PsRunOptions;
|
|
47
|
+
/** Lists every process on the host, rejecting when `ps` fails or exceeds `timeoutMs`. */
|
|
48
|
+
export declare function listProcessTable(timeoutMs: number, run?: PsRunner): Promise<readonly ProcessEntry[]>;
|
|
49
|
+
/** The production listing: concurrent shutdowns share one `ps` per event-loop turn. */
|
|
50
|
+
export declare const listProcessTableShared: (timeoutMs: number) => Promise<readonly ProcessEntry[]>;
|
|
51
|
+
/**
|
|
52
|
+
* Parses a `PS_ARGS` read (C locale). Throws on a line that is not one whole row: one cut
|
|
53
|
+
* short, or one whose trailing pid is not its first, as a line a newline in a name
|
|
54
|
+
* started is (`ROW`). Throws, too, on a pid listed twice.
|
|
55
|
+
*/
|
|
56
|
+
export declare function parseProcessTable(stdout: string): readonly ProcessEntry[];
|
|
57
|
+
/**
|
|
58
|
+
* The process groups, other than the leader's own, that hold at least one LIVE
|
|
59
|
+
* descendant of `leaderPid`, each mapped to the rows of its members' parents that sit
|
|
60
|
+
* in OTHER groups (a parent in the same group adds nothing). Descent follows parent
|
|
61
|
+
* pids transitively, so only descendants still linked to the leader when the table was
|
|
62
|
+
* read are found. A returned group holds only descendants: a group lives inside one
|
|
63
|
+
* session, and every member of the leader's session or of a session a descendant
|
|
64
|
+
* created is itself a descendant. Its id is only a snapshot, and is free for reuse
|
|
65
|
+
* once the group is gone, so the parent rows let a caller signal it only once a parent
|
|
66
|
+
* is known to be stopped: a stopped parent cannot reap its exited child, so that child
|
|
67
|
+
* keeps its pid and the group keeps its id. A leader missing from the table is given
|
|
68
|
+
* as a row that is not stopped. The host's group (`hostPid`'s) and the ids `kill(-pgid)`
|
|
69
|
+
* would misroute (`<= 1`) are never returned. Nor is a `shared` process (Codex's daemon
|
|
70
|
+
* or its updater) or anything it started: the walk never descends into one.
|
|
71
|
+
*/
|
|
72
|
+
export declare function detachedDescendantGroups(table: readonly ProcessEntry[], { leaderPid, hostPid }: {
|
|
73
|
+
readonly leaderPid: number;
|
|
74
|
+
readonly hostPid: number;
|
|
75
|
+
}): ReadonlyMap<number, ReadonlySet<ProcessEntry>>;
|
|
76
|
+
/** The table's rows grouped by their parent's pid, built once per table. */
|
|
77
|
+
export declare function childrenByParent(table: readonly ProcessEntry[]): ChildIndex;
|
|
78
|
+
type ChildIndex = ReadonlyMap<number, readonly ProcessEntry[]>;
|
|
79
|
+
export {};
|
|
80
|
+
//# sourceMappingURL=process-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-table.d.ts","sourceRoot":"","sources":["../../../src/runtime/shutdown/process-table.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,yCAAyC;AACzC,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,mFAAmF;IACnF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,qFAAqF;IACrF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,oFAAoF;IACpF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2FAA2F;IAC3F,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B,CAAC;AAIF,eAAO,MAAM,OAAO,YAAY,CAAC;AAWjC,kGAAkG;AAClG,wBAAgB,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,WAAW,CAAC,GAAG,MAAM,CAEpF;AAED,+FAA+F;AAC/F,eAAO,MAAM,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,MAAM,CAOrD,CAAC;AAEF,4FAA4F;AAC5F,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAChD,CAAC;AAEF,kFAAkF;AAClF,MAAM,MAAM,QAAQ,GAAG,CACrB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,YAAY,KAClB,OAAO,CAAC;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE1C,wFAAwF;AACxF,eAAO,MAAM,OAAO,EAAE,QAAsD,CAAC;AAE7E,0FAA0F;AAC1F,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAE5D;AAED,yFAAyF;AACzF,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,QAAkB,GACtB,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAGlC;AAED,uFAAuF;AACvF,eAAO,MAAM,sBAAsB,yDAAsC,CAAC;AAE1E;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,YAAY,EAAE,CAwBzE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC/E,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC,CAwBhD;AAED,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,UAAU,CAW3E;AAED,KAAK,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC,CAAC"}
|