@with-logic/elwood 0.1.0 → 0.1.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 +182 -3
- package/CONTRIBUTING.md +104 -0
- package/LICENSE +1 -1
- package/README.md +295 -26
- package/SECURITY.md +42 -0
- package/dist/claude/command.d.ts +9 -2
- package/dist/claude/command.d.ts.map +1 -1
- package/dist/claude/command.js +23 -16
- package/dist/claude/command.js.map +1 -1
- package/dist/claude/model-picker.d.ts.map +1 -1
- package/dist/claude/model-picker.js +4 -3
- package/dist/claude/model-picker.js.map +1 -1
- package/dist/claude/model-switch-confirmation.js +9 -1
- package/dist/claude/model-switch-confirmation.js.map +1 -1
- package/dist/claude/screen-table.js +1 -1
- package/dist/claude/screen-table.js.map +1 -1
- package/dist/claude/session/build.d.ts.map +1 -1
- package/dist/claude/session/build.js +3 -0
- package/dist/claude/session/build.js.map +1 -1
- package/dist/claude/session/index.d.ts.map +1 -1
- package/dist/claude/session/index.js +5 -2
- package/dist/claude/session/index.js.map +1 -1
- package/dist/claude/session/resume.d.ts +1 -1
- package/dist/claude/session/resume.d.ts.map +1 -1
- package/dist/claude/session/resume.js +5 -1
- package/dist/claude/session/resume.js.map +1 -1
- package/dist/claude/session/start-or-resume.js +1 -0
- package/dist/claude/session/start-or-resume.js.map +1 -1
- package/dist/claude/simple.d.ts.map +1 -1
- package/dist/claude/simple.js +4 -0
- package/dist/claude/simple.js.map +1 -1
- package/dist/cli/args/index.d.ts +3 -1
- package/dist/cli/args/index.d.ts.map +1 -1
- package/dist/cli/args/index.js +10 -2
- package/dist/cli/args/index.js.map +1 -1
- package/dist/cli/args/options.d.ts.map +1 -1
- package/dist/cli/args/options.js +2 -0
- package/dist/cli/args/options.js.map +1 -1
- package/dist/cli/args-commands.d.ts +10 -0
- package/dist/cli/args-commands.d.ts.map +1 -0
- package/dist/cli/args-commands.js +113 -0
- package/dist/cli/args-commands.js.map +1 -0
- package/dist/cli/command-types.d.ts +26 -0
- package/dist/cli/command-types.d.ts.map +1 -0
- package/dist/cli/command-types.js +9 -0
- package/dist/cli/command-types.js.map +1 -0
- package/dist/cli/config/codec-primitives.d.ts +20 -0
- package/dist/cli/config/codec-primitives.d.ts.map +1 -0
- package/dist/cli/config/codec-primitives.js +51 -0
- package/dist/cli/config/codec-primitives.js.map +1 -0
- package/dist/cli/config/codec.d.ts.map +1 -1
- package/dist/cli/config/codec.js +4 -46
- package/dist/cli/config/codec.js.map +1 -1
- package/dist/cli/config/effective.d.ts.map +1 -1
- package/dist/cli/config/effective.js +1 -0
- package/dist/cli/config/effective.js.map +1 -1
- package/dist/cli/config/keys.d.ts +1 -1
- package/dist/cli/config/keys.d.ts.map +1 -1
- package/dist/cli/config/keys.js +1 -0
- package/dist/cli/config/keys.js.map +1 -1
- package/dist/cli/entry.d.ts +4 -2
- package/dist/cli/entry.d.ts.map +1 -1
- package/dist/cli/entry.js +2 -1
- package/dist/cli/entry.js.map +1 -1
- package/dist/cli/help.d.ts +2 -2
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +40 -1
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/interactive/index.d.ts +26 -0
- package/dist/cli/interactive/index.d.ts.map +1 -0
- package/dist/cli/interactive/index.js +33 -0
- package/dist/cli/interactive/index.js.map +1 -0
- package/dist/cli/interactive/launch.d.ts +14 -0
- package/dist/cli/interactive/launch.d.ts.map +1 -0
- package/dist/cli/interactive/launch.js +66 -0
- package/dist/cli/interactive/launch.js.map +1 -0
- package/dist/cli/interactive/spawn.d.ts +18 -0
- package/dist/cli/interactive/spawn.d.ts.map +1 -0
- package/dist/cli/interactive/spawn.js +53 -0
- package/dist/cli/interactive/spawn.js.map +1 -0
- package/dist/cli/main-failure.d.ts +28 -0
- package/dist/cli/main-failure.d.ts.map +1 -0
- package/dist/cli/main-failure.js +78 -0
- package/dist/cli/main-failure.js.map +1 -0
- package/dist/cli/main.d.ts +12 -4
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +27 -73
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/models/index.d.ts +20 -0
- package/dist/cli/models/index.d.ts.map +1 -0
- package/dist/cli/models/index.js +63 -0
- package/dist/cli/models/index.js.map +1 -0
- package/dist/cli/models/render.d.ts +9 -0
- package/dist/cli/models/render.d.ts.map +1 -0
- package/dist/cli/models/render.js +33 -0
- package/dist/cli/models/render.js.map +1 -0
- package/dist/cli/request/index.d.ts.map +1 -1
- package/dist/cli/request/index.js +8 -2
- package/dist/cli/request/index.js.map +1 -1
- package/dist/cli/request/layers.d.ts +2 -0
- package/dist/cli/request/layers.d.ts.map +1 -1
- package/dist/cli/request/layers.js +9 -5
- package/dist/cli/request/layers.js.map +1 -1
- package/dist/cli/request/posture.d.ts +28 -0
- package/dist/cli/request/posture.d.ts.map +1 -0
- package/dist/cli/request/posture.js +70 -0
- package/dist/cli/request/posture.js.map +1 -0
- package/dist/cli/request/resolution-types.d.ts +1 -0
- package/dist/cli/request/resolution-types.d.ts.map +1 -1
- package/dist/cli/request/settings.d.ts +2 -12
- package/dist/cli/request/settings.d.ts.map +1 -1
- package/dist/cli/request/settings.js +2 -25
- package/dist/cli/request/settings.js.map +1 -1
- package/dist/cli/request/validation.d.ts +12 -0
- package/dist/cli/request/validation.d.ts.map +1 -1
- package/dist/cli/request/validation.js +30 -10
- package/dist/cli/request/validation.js.map +1 -1
- package/dist/cli/request/values.d.ts +1 -0
- package/dist/cli/request/values.d.ts.map +1 -1
- package/dist/cli/request/values.js +1 -0
- package/dist/cli/request/values.js.map +1 -1
- package/dist/cli/run/index.d.ts.map +1 -1
- package/dist/cli/run/index.js +5 -41
- package/dist/cli/run/index.js.map +1 -1
- package/dist/cli/run/subscribe.d.ts +19 -0
- package/dist/cli/run/subscribe.d.ts.map +1 -0
- package/dist/cli/run/subscribe.js +47 -0
- package/dist/cli/run/subscribe.js.map +1 -0
- package/dist/cli/session/launch.d.ts +3 -0
- package/dist/cli/session/launch.d.ts.map +1 -1
- package/dist/cli/session/launch.js +11 -0
- package/dist/cli/session/launch.js.map +1 -1
- package/dist/cli/sessions/index.d.ts +30 -0
- package/dist/cli/sessions/index.d.ts.map +1 -0
- package/dist/cli/sessions/index.js +61 -0
- package/dist/cli/sessions/index.js.map +1 -0
- package/dist/cli/sessions/list.d.ts +28 -0
- package/dist/cli/sessions/list.d.ts.map +1 -0
- package/dist/cli/sessions/list.js +63 -0
- package/dist/cli/sessions/list.js.map +1 -0
- package/dist/cli/sessions/settings.d.ts +11 -0
- package/dist/cli/sessions/settings.d.ts.map +1 -0
- package/dist/cli/sessions/settings.js +26 -0
- package/dist/cli/sessions/settings.js.map +1 -0
- package/dist/cli/table.d.ts +7 -0
- package/dist/cli/table.d.ts.map +1 -0
- package/dist/cli/table.js +14 -0
- package/dist/cli/table.js.map +1 -0
- package/dist/cli/types.d.ts +5 -1
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/types.js.map +1 -1
- package/dist/codex/command.d.ts +18 -2
- package/dist/codex/command.d.ts.map +1 -1
- package/dist/codex/command.js +39 -24
- package/dist/codex/command.js.map +1 -1
- package/dist/codex/model-picker.d.ts.map +1 -1
- package/dist/codex/model-picker.js +3 -2
- package/dist/codex/model-picker.js.map +1 -1
- package/dist/codex/session/build.d.ts.map +1 -1
- package/dist/codex/session/build.js +5 -7
- package/dist/codex/session/build.js.map +1 -1
- package/dist/codex/session/index.d.ts.map +1 -1
- package/dist/codex/session/index.js +5 -2
- package/dist/codex/session/index.js.map +1 -1
- package/dist/codex/session/resume.d.ts +1 -1
- package/dist/codex/session/resume.d.ts.map +1 -1
- package/dist/codex/session/resume.js +5 -1
- package/dist/codex/session/resume.js.map +1 -1
- package/dist/codex/session/start-or-resume.js +1 -0
- package/dist/codex/session/start-or-resume.js.map +1 -1
- package/dist/codex/session/types.d.ts +3 -0
- package/dist/codex/session/types.d.ts.map +1 -1
- package/dist/codex/simple.d.ts.map +1 -1
- package/dist/codex/simple.js +4 -0
- package/dist/codex/simple.js.map +1 -1
- package/dist/core/errors.d.ts +1 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js.map +1 -1
- package/dist/core/high-trust.d.ts +41 -0
- package/dist/core/high-trust.d.ts.map +1 -0
- package/dist/core/high-trust.js +50 -0
- package/dist/core/high-trust.js.map +1 -0
- package/dist/core/input/index.d.ts.map +1 -1
- package/dist/core/input/index.js +15 -3
- package/dist/core/input/index.js.map +1 -1
- package/dist/core/models/input.d.ts +3 -0
- package/dist/core/models/input.d.ts.map +1 -0
- package/dist/core/models/input.js +9 -0
- package/dist/core/models/input.js.map +1 -0
- package/dist/core/models/picker.d.ts +2 -1
- package/dist/core/models/picker.d.ts.map +1 -1
- package/dist/core/models/picker.js +6 -5
- package/dist/core/models/picker.js.map +1 -1
- package/dist/core/models/tui-screen.d.ts +1 -1
- package/dist/core/models/tui-screen.d.ts.map +1 -1
- package/dist/core/models/tui-screen.js +26 -3
- package/dist/core/models/tui-screen.js.map +1 -1
- package/dist/core/trust/allowlist.d.ts +56 -0
- package/dist/core/trust/allowlist.d.ts.map +1 -0
- package/dist/core/{trust-prompts.js → trust/allowlist.js} +21 -38
- package/dist/core/trust/allowlist.js.map +1 -0
- package/dist/core/trust/prompts.d.ts +4 -46
- package/dist/core/trust/prompts.d.ts.map +1 -1
- package/dist/core/trust/prompts.js +2 -73
- package/dist/core/trust/prompts.js.map +1 -1
- package/dist/core/trust/responder.d.ts +2 -0
- package/dist/core/trust/responder.d.ts.map +1 -1
- package/dist/core/trust/responder.js +4 -0
- package/dist/core/trust/responder.js.map +1 -1
- package/dist/core/types.d.ts +3 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/runtime/launch-arguments.d.ts +12 -0
- package/dist/runtime/launch-arguments.d.ts.map +1 -0
- package/dist/runtime/launch-arguments.js +15 -0
- package/dist/runtime/launch-arguments.js.map +1 -0
- package/dist/runtime/session/base.d.ts.map +1 -1
- package/dist/runtime/session/base.js +4 -1
- package/dist/runtime/session/base.js.map +1 -1
- package/dist/runtime/session/commands.d.ts +2 -1
- package/dist/runtime/session/commands.d.ts.map +1 -1
- package/dist/runtime/session/commands.js +10 -4
- package/dist/runtime/session/commands.js.map +1 -1
- package/dist/runtime/session/lifecycle.d.ts +3 -4
- package/dist/runtime/session/lifecycle.d.ts.map +1 -1
- package/dist/runtime/session/lifecycle.js +6 -5
- package/dist/runtime/session/lifecycle.js.map +1 -1
- package/dist/state/directories.d.ts +4 -0
- package/dist/state/directories.d.ts.map +1 -0
- package/dist/state/directories.js +41 -0
- package/dist/state/directories.js.map +1 -0
- package/dist/state/files.d.ts.map +1 -1
- package/dist/state/files.js +25 -11
- package/dist/state/files.js.map +1 -1
- package/dist/state/private-session.d.ts.map +1 -1
- package/dist/state/private-session.js +2 -0
- package/dist/state/private-session.js.map +1 -1
- package/dist/state/store.d.ts.map +1 -1
- package/dist/state/store.js +7 -1
- package/dist/state/store.js.map +1 -1
- package/docs/cli-behavior.md +89 -1
- package/docs/cli-output.md +60 -0
- package/docs/cli.md +10 -2
- package/docs/codex/cli.md +57 -0
- package/docs/codex/config.md +47 -0
- package/docs/codex/hooks.md +70 -0
- package/examples/README.md +56 -0
- package/examples/full.ts +113 -0
- package/examples/minimal.ts +15 -0
- package/examples/stream.ts +39 -0
- package/examples/support.ts +71 -0
- package/package.json +17 -10
- package/prd/01-overview.md +21 -0
- package/prd/02-goals.md +47 -0
- package/prd/03-terminology.md +32 -0
- package/prd/04-architecture.md +121 -0
- package/prd/05-api/5.1-starting-claude.md +108 -0
- package/prd/05-api/5.2-resuming-claude.md +86 -0
- package/prd/05-api/5.3-claude-session-api.md +658 -0
- package/prd/05-api/5.4-events.md +145 -0
- package/prd/05-api/5.5-starting-codex.md +106 -0
- package/prd/05-api/5.6-resuming-codex.md +48 -0
- package/prd/05-api/5.7-codex-session-api.md +425 -0
- package/prd/05-api/5.8-session-api.md +122 -0
- package/prd/05-api/5.9-loops.md +170 -0
- package/prd/05-api/README.md +19 -0
- package/prd/06-claude-hook-bridge.md +164 -0
- package/prd/07-claude-policy.md +15 -0
- package/prd/07a-codex-hook-bridge.md +76 -0
- package/prd/08-state.md +127 -0
- package/prd/09-lifecycle.md +222 -0
- package/prd/10-errors.md +55 -0
- package/prd/11-test-app.md +53 -0
- package/prd/12-e2e.md +23 -0
- package/prd/12a-cli.md +375 -0
- package/prd/13-latitude.md +12 -0
- package/prd/14-conformance.md +333 -0
- package/prd/15-open-notes.md +8 -0
- package/prd/README.md +45 -0
- package/dist/claude/hook-dispatch.d.ts +0 -9
- package/dist/claude/hook-dispatch.d.ts.map +0 -1
- package/dist/claude/hook-dispatch.js +0 -12
- package/dist/claude/hook-dispatch.js.map +0 -1
- package/dist/claude/hook-events-extra.d.ts +0 -81
- package/dist/claude/hook-events-extra.d.ts.map +0 -1
- package/dist/claude/hook-events-extra.js +0 -6
- package/dist/claude/hook-events-extra.js.map +0 -1
- package/dist/claude/hook-events.d.ts +0 -101
- package/dist/claude/hook-events.d.ts.map +0 -1
- package/dist/claude/hook-events.js +0 -6
- package/dist/claude/hook-events.js.map +0 -1
- package/dist/claude/hook-names.d.ts +0 -24
- package/dist/claude/hook-names.d.ts.map +0 -1
- package/dist/claude/hook-names.js +0 -45
- package/dist/claude/hook-names.js.map +0 -1
- package/dist/claude/hooks.d.ts +0 -78
- package/dist/claude/hooks.d.ts.map +0 -1
- package/dist/claude/hooks.js +0 -6
- package/dist/claude/hooks.js.map +0 -1
- package/dist/claude/session-bridge.d.ts +0 -11
- package/dist/claude/session-bridge.d.ts.map +0 -1
- package/dist/claude/session-bridge.js +0 -18
- package/dist/claude/session-bridge.js.map +0 -1
- package/dist/claude/session-build.d.ts +0 -15
- package/dist/claude/session-build.d.ts.map +0 -1
- package/dist/claude/session-build.js +0 -147
- package/dist/claude/session-build.js.map +0 -1
- package/dist/claude/session-hook-handler.d.ts +0 -34
- package/dist/claude/session-hook-handler.d.ts.map +0 -1
- package/dist/claude/session-hook-handler.js +0 -42
- package/dist/claude/session-hook-handler.js.map +0 -1
- package/dist/claude/session-instance.d.ts +0 -42
- package/dist/claude/session-instance.d.ts.map +0 -1
- package/dist/claude/session-instance.js +0 -146
- package/dist/claude/session-instance.js.map +0 -1
- package/dist/claude/session-interface.d.ts +0 -49
- package/dist/claude/session-interface.d.ts.map +0 -1
- package/dist/claude/session-interface.js +0 -10
- package/dist/claude/session-interface.js.map +0 -1
- package/dist/claude/session-resume.d.ts +0 -8
- package/dist/claude/session-resume.d.ts.map +0 -1
- package/dist/claude/session-resume.js +0 -47
- package/dist/claude/session-resume.js.map +0 -1
- package/dist/claude/session-runtime.d.ts +0 -43
- package/dist/claude/session-runtime.d.ts.map +0 -1
- package/dist/claude/session-runtime.js +0 -105
- package/dist/claude/session-runtime.js.map +0 -1
- package/dist/claude/session-transcript.d.ts +0 -62
- package/dist/claude/session-transcript.d.ts.map +0 -1
- package/dist/claude/session-transcript.js +0 -88
- package/dist/claude/session-transcript.js.map +0 -1
- package/dist/claude/session.d.ts +0 -18
- package/dist/claude/session.d.ts.map +0 -1
- package/dist/claude/session.js +0 -58
- package/dist/claude/session.js.map +0 -1
- package/dist/claude/start-or-resume.d.ts +0 -12
- package/dist/claude/start-or-resume.d.ts.map +0 -1
- package/dist/claude/start-or-resume.js +0 -32
- package/dist/claude/start-or-resume.js.map +0 -1
- package/dist/claude/tool-hook-events.d.ts +0 -10
- package/dist/claude/tool-hook-events.d.ts.map +0 -1
- package/dist/claude/tool-hook-events.js +0 -18
- package/dist/claude/tool-hook-events.js.map +0 -1
- package/dist/claude/tool-types.d.ts +0 -158
- package/dist/claude/tool-types.d.ts.map +0 -1
- package/dist/claude/tool-types.js +0 -6
- package/dist/claude/tool-types.js.map +0 -1
- package/dist/claude/validate-input.d.ts +0 -8
- package/dist/claude/validate-input.d.ts.map +0 -1
- package/dist/claude/validate-input.js +0 -137
- package/dist/claude/validate-input.js.map +0 -1
- package/dist/claude/validate-permission-update.d.ts +0 -10
- package/dist/claude/validate-permission-update.d.ts.map +0 -1
- package/dist/claude/validate-permission-update.js +0 -72
- package/dist/claude/validate-permission-update.js.map +0 -1
- package/dist/claude/validate-result.d.ts +0 -7
- package/dist/claude/validate-result.d.ts.map +0 -1
- package/dist/claude/validate-result.js +0 -118
- package/dist/claude/validate-result.js.map +0 -1
- package/dist/claude/validate-shapes.d.ts +0 -22
- package/dist/claude/validate-shapes.d.ts.map +0 -1
- package/dist/claude/validate-shapes.js +0 -15
- package/dist/claude/validate-shapes.js.map +0 -1
- package/dist/claude/validate-tool-update.d.ts +0 -15
- package/dist/claude/validate-tool-update.d.ts.map +0 -1
- package/dist/claude/validate-tool-update.js +0 -122
- package/dist/claude/validate-tool-update.js.map +0 -1
- package/dist/cli/agent-detect.d.ts +0 -44
- package/dist/cli/agent-detect.d.ts.map +0 -1
- package/dist/cli/agent-detect.js +0 -66
- package/dist/cli/agent-detect.js.map +0 -1
- package/dist/cli/arg-errors.d.ts +0 -6
- package/dist/cli/arg-errors.d.ts.map +0 -1
- package/dist/cli/arg-errors.js +0 -44
- package/dist/cli/arg-errors.js.map +0 -1
- package/dist/cli/arg-options.d.ts +0 -26
- package/dist/cli/arg-options.d.ts.map +0 -1
- package/dist/cli/arg-options.js +0 -50
- package/dist/cli/arg-options.js.map +0 -1
- package/dist/cli/args.d.ts +0 -7
- package/dist/cli/args.d.ts.map +0 -1
- package/dist/cli/args.js +0 -70
- package/dist/cli/args.js.map +0 -1
- package/dist/cli/lifecycle-outcome.d.ts +0 -13
- package/dist/cli/lifecycle-outcome.d.ts.map +0 -1
- package/dist/cli/lifecycle-outcome.js +0 -20
- package/dist/cli/lifecycle-outcome.js.map +0 -1
- package/dist/cli/lifecycle.d.ts +0 -61
- package/dist/cli/lifecycle.d.ts.map +0 -1
- package/dist/cli/lifecycle.js +0 -152
- package/dist/cli/lifecycle.js.map +0 -1
- package/dist/cli/request-finalize.d.ts +0 -10
- package/dist/cli/request-finalize.d.ts.map +0 -1
- package/dist/cli/request-finalize.js +0 -135
- package/dist/cli/request-finalize.js.map +0 -1
- package/dist/cli/request-layers.d.ts +0 -30
- package/dist/cli/request-layers.d.ts.map +0 -1
- package/dist/cli/request-layers.js +0 -44
- package/dist/cli/request-layers.js.map +0 -1
- package/dist/cli/request-settings.d.ts +0 -34
- package/dist/cli/request-settings.d.ts.map +0 -1
- package/dist/cli/request-settings.js +0 -66
- package/dist/cli/request-settings.js.map +0 -1
- package/dist/cli/request-sources.d.ts +0 -13
- package/dist/cli/request-sources.d.ts.map +0 -1
- package/dist/cli/request-sources.js +0 -23
- package/dist/cli/request-sources.js.map +0 -1
- package/dist/cli/request-validation.d.ts +0 -18
- package/dist/cli/request-validation.d.ts.map +0 -1
- package/dist/cli/request-validation.js +0 -84
- package/dist/cli/request-validation.js.map +0 -1
- package/dist/cli/request-values.d.ts +0 -33
- package/dist/cli/request-values.d.ts.map +0 -1
- package/dist/cli/request-values.js +0 -73
- package/dist/cli/request-values.js.map +0 -1
- package/dist/cli/request.d.ts +0 -12
- package/dist/cli/request.d.ts.map +0 -1
- package/dist/cli/request.js +0 -103
- package/dist/cli/request.js.map +0 -1
- package/dist/cli/resolution-types.d.ts +0 -35
- package/dist/cli/resolution-types.d.ts.map +0 -1
- package/dist/cli/resolution-types.js +0 -6
- package/dist/cli/resolution-types.js.map +0 -1
- package/dist/cli/run-output-lines.d.ts +0 -14
- package/dist/cli/run-output-lines.d.ts.map +0 -1
- package/dist/cli/run-output-lines.js +0 -42
- package/dist/cli/run-output-lines.js.map +0 -1
- package/dist/cli/run-output.d.ts +0 -48
- package/dist/cli/run-output.d.ts.map +0 -1
- package/dist/cli/run-output.js +0 -150
- package/dist/cli/run-output.js.map +0 -1
- package/dist/cli/run.d.ts +0 -20
- package/dist/cli/run.d.ts.map +0 -1
- package/dist/cli/run.js +0 -126
- package/dist/cli/run.js.map +0 -1
- package/dist/cli/session-launch.d.ts +0 -23
- package/dist/cli/session-launch.d.ts.map +0 -1
- package/dist/cli/session-launch.js +0 -57
- package/dist/cli/session-launch.js.map +0 -1
- package/dist/cli/session.d.ts +0 -68
- package/dist/cli/session.d.ts.map +0 -1
- package/dist/cli/session.js +0 -124
- package/dist/cli/session.js.map +0 -1
- package/dist/codex/attach-images.d.ts +0 -20
- package/dist/codex/attach-images.d.ts.map +0 -1
- package/dist/codex/attach-images.js +0 -66
- package/dist/codex/attach-images.js.map +0 -1
- package/dist/codex/clipboard-lock.d.ts +0 -15
- package/dist/codex/clipboard-lock.d.ts.map +0 -1
- package/dist/codex/clipboard-lock.js +0 -16
- package/dist/codex/clipboard-lock.js.map +0 -1
- package/dist/codex/clipboard.d.ts +0 -32
- package/dist/codex/clipboard.d.ts.map +0 -1
- package/dist/codex/clipboard.js +0 -92
- package/dist/codex/clipboard.js.map +0 -1
- package/dist/codex/config-lock.d.ts +0 -21
- package/dist/codex/config-lock.d.ts.map +0 -1
- package/dist/codex/config-lock.js +0 -22
- package/dist/codex/config-lock.js.map +0 -1
- package/dist/codex/config-restore.d.ts +0 -33
- package/dist/codex/config-restore.d.ts.map +0 -1
- package/dist/codex/config-restore.js +0 -90
- package/dist/codex/config-restore.js.map +0 -1
- package/dist/codex/config-transaction.d.ts +0 -26
- package/dist/codex/config-transaction.d.ts.map +0 -1
- package/dist/codex/config-transaction.js +0 -47
- package/dist/codex/config-transaction.js.map +0 -1
- package/dist/codex/hook-dispatch.d.ts +0 -9
- package/dist/codex/hook-dispatch.d.ts.map +0 -1
- package/dist/codex/hook-dispatch.js +0 -14
- package/dist/codex/hook-dispatch.js.map +0 -1
- package/dist/codex/hook-names.d.ts +0 -19
- package/dist/codex/hook-names.d.ts.map +0 -1
- package/dist/codex/hook-names.js +0 -17
- package/dist/codex/hook-names.js.map +0 -1
- package/dist/codex/hooks.d.ts +0 -99
- package/dist/codex/hooks.d.ts.map +0 -1
- package/dist/codex/hooks.js +0 -6
- package/dist/codex/hooks.js.map +0 -1
- package/dist/codex/initial-ready.d.ts +0 -19
- package/dist/codex/initial-ready.d.ts.map +0 -1
- package/dist/codex/initial-ready.js +0 -19
- package/dist/codex/initial-ready.js.map +0 -1
- package/dist/codex/serialize.d.ts +0 -8
- package/dist/codex/serialize.d.ts.map +0 -1
- package/dist/codex/serialize.js +0 -48
- package/dist/codex/serialize.js.map +0 -1
- package/dist/codex/session-bridge.d.ts +0 -14
- package/dist/codex/session-bridge.d.ts.map +0 -1
- package/dist/codex/session-bridge.js +0 -20
- package/dist/codex/session-bridge.js.map +0 -1
- package/dist/codex/session-build.d.ts +0 -15
- package/dist/codex/session-build.d.ts.map +0 -1
- package/dist/codex/session-build.js +0 -144
- package/dist/codex/session-build.js.map +0 -1
- package/dist/codex/session-cleanup.d.ts +0 -12
- package/dist/codex/session-cleanup.d.ts.map +0 -1
- package/dist/codex/session-cleanup.js +0 -15
- package/dist/codex/session-cleanup.js.map +0 -1
- package/dist/codex/session-hooks.d.ts +0 -13
- package/dist/codex/session-hooks.d.ts.map +0 -1
- package/dist/codex/session-hooks.js +0 -54
- package/dist/codex/session-hooks.js.map +0 -1
- package/dist/codex/session-instance.d.ts +0 -50
- package/dist/codex/session-instance.d.ts.map +0 -1
- package/dist/codex/session-instance.js +0 -117
- package/dist/codex/session-instance.js.map +0 -1
- package/dist/codex/session-resume.d.ts +0 -7
- package/dist/codex/session-resume.d.ts.map +0 -1
- package/dist/codex/session-resume.js +0 -44
- package/dist/codex/session-resume.js.map +0 -1
- package/dist/codex/session-runtime.d.ts +0 -7
- package/dist/codex/session-runtime.d.ts.map +0 -1
- package/dist/codex/session-runtime.js +0 -10
- package/dist/codex/session-runtime.js.map +0 -1
- package/dist/codex/session-transcript.d.ts +0 -30
- package/dist/codex/session-transcript.d.ts.map +0 -1
- package/dist/codex/session-transcript.js +0 -53
- package/dist/codex/session-transcript.js.map +0 -1
- package/dist/codex/session-types.d.ts +0 -87
- package/dist/codex/session-types.d.ts.map +0 -1
- package/dist/codex/session-types.js +0 -6
- package/dist/codex/session-types.js.map +0 -1
- package/dist/codex/session-warnings.d.ts +0 -27
- package/dist/codex/session-warnings.d.ts.map +0 -1
- package/dist/codex/session-warnings.js +0 -54
- package/dist/codex/session-warnings.js.map +0 -1
- package/dist/codex/session.d.ts +0 -16
- package/dist/codex/session.d.ts.map +0 -1
- package/dist/codex/session.js +0 -61
- package/dist/codex/session.js.map +0 -1
- package/dist/codex/start-or-resume.d.ts +0 -12
- package/dist/codex/start-or-resume.d.ts.map +0 -1
- package/dist/codex/start-or-resume.js +0 -31
- package/dist/codex/start-or-resume.js.map +0 -1
- package/dist/codex/transcript/cursor-io.d.ts +0 -7
- package/dist/codex/transcript/cursor-io.d.ts.map +0 -1
- package/dist/codex/transcript/cursor-io.js +0 -7
- package/dist/codex/transcript/cursor-io.js.map +0 -1
- package/dist/codex/transcript/cursor.d.ts +0 -8
- package/dist/codex/transcript/cursor.d.ts.map +0 -1
- package/dist/codex/transcript/cursor.js +0 -8
- package/dist/codex/transcript/cursor.js.map +0 -1
- package/dist/codex/transcript/drops.d.ts +0 -9
- package/dist/codex/transcript/drops.d.ts.map +0 -1
- package/dist/codex/transcript/drops.js +0 -9
- package/dist/codex/transcript/drops.js.map +0 -1
- package/dist/codex/transcript.d.ts +0 -12
- package/dist/codex/transcript.d.ts.map +0 -1
- package/dist/codex/transcript.js +0 -10
- package/dist/codex/transcript.js.map +0 -1
- package/dist/codex/validate-result.d.ts +0 -7
- package/dist/codex/validate-result.d.ts.map +0 -1
- package/dist/codex/validate-result.js +0 -84
- package/dist/codex/validate-result.js.map +0 -1
- package/dist/codex/validate.d.ts +0 -11
- package/dist/codex/validate.d.ts.map +0 -1
- package/dist/codex/validate.js +0 -88
- package/dist/codex/validate.js.map +0 -1
- package/dist/core/activity-lifecycle.d.ts +0 -21
- package/dist/core/activity-lifecycle.d.ts.map +0 -1
- package/dist/core/activity-lifecycle.js +0 -45
- package/dist/core/activity-lifecycle.js.map +0 -1
- package/dist/core/activity-meta.d.ts +0 -13
- package/dist/core/activity-meta.d.ts.map +0 -1
- package/dist/core/activity-meta.js +0 -67
- package/dist/core/activity-meta.js.map +0 -1
- package/dist/core/activity-transcript.d.ts +0 -19
- package/dist/core/activity-transcript.d.ts.map +0 -1
- package/dist/core/activity-transcript.js +0 -60
- package/dist/core/activity-transcript.js.map +0 -1
- package/dist/core/activity.d.ts +0 -51
- package/dist/core/activity.d.ts.map +0 -1
- package/dist/core/activity.js +0 -81
- package/dist/core/activity.js.map +0 -1
- package/dist/core/control-queue-state.d.ts +0 -29
- package/dist/core/control-queue-state.d.ts.map +0 -1
- package/dist/core/control-queue-state.js +0 -95
- package/dist/core/control-queue-state.js.map +0 -1
- package/dist/core/control-queue-traits.d.ts +0 -54
- package/dist/core/control-queue-traits.d.ts.map +0 -1
- package/dist/core/control-queue-traits.js +0 -118
- package/dist/core/control-queue-traits.js.map +0 -1
- package/dist/core/control-queue-types.d.ts +0 -45
- package/dist/core/control-queue-types.d.ts.map +0 -1
- package/dist/core/control-queue-types.js +0 -7
- package/dist/core/control-queue-types.js.map +0 -1
- package/dist/core/control-queue.d.ts +0 -21
- package/dist/core/control-queue.d.ts.map +0 -1
- package/dist/core/control-queue.js +0 -98
- package/dist/core/control-queue.js.map +0 -1
- package/dist/core/list-models.d.ts +0 -44
- package/dist/core/list-models.d.ts.map +0 -1
- package/dist/core/list-models.js +0 -73
- package/dist/core/list-models.js.map +0 -1
- package/dist/core/model-picker.d.ts +0 -22
- package/dist/core/model-picker.d.ts.map +0 -1
- package/dist/core/model-picker.js +0 -58
- package/dist/core/model-picker.js.map +0 -1
- package/dist/core/model-rows.d.ts +0 -21
- package/dist/core/model-rows.d.ts.map +0 -1
- package/dist/core/model-rows.js +0 -57
- package/dist/core/model-rows.js.map +0 -1
- package/dist/core/probe-state.d.ts +0 -21
- package/dist/core/probe-state.d.ts.map +0 -1
- package/dist/core/probe-state.js +0 -39
- package/dist/core/probe-state.js.map +0 -1
- package/dist/core/session-input-abort.d.ts +0 -10
- package/dist/core/session-input-abort.d.ts.map +0 -1
- package/dist/core/session-input-abort.js +0 -44
- package/dist/core/session-input-abort.js.map +0 -1
- package/dist/core/session-input.d.ts +0 -37
- package/dist/core/session-input.d.ts.map +0 -1
- package/dist/core/session-input.js +0 -154
- package/dist/core/session-input.js.map +0 -1
- package/dist/core/session-warnings.d.ts +0 -20
- package/dist/core/session-warnings.d.ts.map +0 -1
- package/dist/core/session-warnings.js +0 -32
- package/dist/core/session-warnings.js.map +0 -1
- package/dist/core/simple/loop-controls.d.ts +0 -7
- package/dist/core/simple/loop-controls.d.ts.map +0 -1
- package/dist/core/simple/loop-controls.js +0 -7
- package/dist/core/simple/loop-controls.js.map +0 -1
- package/dist/core/startup-automation.d.ts +0 -54
- package/dist/core/startup-automation.d.ts.map +0 -1
- package/dist/core/startup-automation.js +0 -40
- package/dist/core/startup-automation.js.map +0 -1
- package/dist/core/startup-frame.d.ts +0 -39
- package/dist/core/startup-frame.d.ts.map +0 -1
- package/dist/core/startup-frame.js +0 -60
- package/dist/core/startup-frame.js.map +0 -1
- package/dist/core/startup-write.d.ts +0 -47
- package/dist/core/startup-write.d.ts.map +0 -1
- package/dist/core/startup-write.js +0 -73
- package/dist/core/startup-write.js.map +0 -1
- package/dist/core/trust-blocking.d.ts +0 -22
- package/dist/core/trust-blocking.d.ts.map +0 -1
- package/dist/core/trust-blocking.js +0 -38
- package/dist/core/trust-blocking.js.map +0 -1
- package/dist/core/trust-prompts.d.ts +0 -135
- package/dist/core/trust-prompts.d.ts.map +0 -1
- package/dist/core/trust-prompts.js.map +0 -1
- package/dist/core/trust-responder.d.ts +0 -48
- package/dist/core/trust-responder.d.ts.map +0 -1
- package/dist/core/trust-responder.js +0 -119
- package/dist/core/trust-responder.js.map +0 -1
- package/dist/core/tui-screen.d.ts +0 -21
- package/dist/core/tui-screen.d.ts.map +0 -1
- package/dist/core/tui-screen.js +0 -56
- package/dist/core/tui-screen.js.map +0 -1
- package/dist/core/update-warning.d.ts +0 -25
- package/dist/core/update-warning.d.ts.map +0 -1
- package/dist/core/update-warning.js +0 -33
- package/dist/core/update-warning.js.map +0 -1
- package/dist/core/warning-lifecycle.d.ts +0 -23
- package/dist/core/warning-lifecycle.d.ts.map +0 -1
- package/dist/core/warning-lifecycle.js +0 -6
- package/dist/core/warning-lifecycle.js.map +0 -1
- package/dist/core/warning-reasons.d.ts +0 -62
- package/dist/core/warning-reasons.d.ts.map +0 -1
- package/dist/core/warning-reasons.js +0 -121
- package/dist/core/warning-reasons.js.map +0 -1
- package/dist/core/warnings.d.ts +0 -145
- package/dist/core/warnings.d.ts.map +0 -1
- package/dist/core/warnings.js +0 -12
- package/dist/core/warnings.js.map +0 -1
- package/dist/runtime/cleanup-latch.d.ts +0 -27
- package/dist/runtime/cleanup-latch.d.ts.map +0 -1
- package/dist/runtime/cleanup-latch.js +0 -43
- package/dist/runtime/cleanup-latch.js.map +0 -1
- package/dist/runtime/initial-ready-advance.d.ts +0 -22
- package/dist/runtime/initial-ready-advance.d.ts.map +0 -1
- package/dist/runtime/initial-ready-advance.js +0 -39
- package/dist/runtime/initial-ready-advance.js.map +0 -1
- package/dist/runtime/initial-ready-fallback.d.ts +0 -12
- package/dist/runtime/initial-ready-fallback.d.ts.map +0 -1
- package/dist/runtime/initial-ready-fallback.js +0 -20
- package/dist/runtime/initial-ready-fallback.js.map +0 -1
- package/dist/runtime/initial-ready.d.ts +0 -49
- package/dist/runtime/initial-ready.d.ts.map +0 -1
- package/dist/runtime/initial-ready.js +0 -81
- package/dist/runtime/initial-ready.js.map +0 -1
- package/dist/runtime/reap-tree.d.ts +0 -62
- package/dist/runtime/reap-tree.d.ts.map +0 -1
- package/dist/runtime/reap-tree.js +0 -108
- package/dist/runtime/reap-tree.js.map +0 -1
- package/dist/runtime/session-base-types.d.ts +0 -36
- package/dist/runtime/session-base-types.d.ts.map +0 -1
- package/dist/runtime/session-base-types.js +0 -14
- package/dist/runtime/session-base-types.js.map +0 -1
- package/dist/runtime/session-base.d.ts +0 -48
- package/dist/runtime/session-base.d.ts.map +0 -1
- package/dist/runtime/session-base.js +0 -76
- package/dist/runtime/session-base.js.map +0 -1
- package/dist/runtime/session-commands.d.ts +0 -43
- package/dist/runtime/session-commands.d.ts.map +0 -1
- package/dist/runtime/session-commands.js +0 -52
- package/dist/runtime/session-commands.js.map +0 -1
- package/dist/runtime/session-exit.d.ts +0 -16
- package/dist/runtime/session-exit.d.ts.map +0 -1
- package/dist/runtime/session-exit.js +0 -32
- package/dist/runtime/session-exit.js.map +0 -1
- package/dist/runtime/session-image-attach.d.ts +0 -45
- package/dist/runtime/session-image-attach.d.ts.map +0 -1
- package/dist/runtime/session-image-attach.js +0 -82
- package/dist/runtime/session-image-attach.js.map +0 -1
- package/dist/runtime/session-lifecycle.d.ts +0 -61
- package/dist/runtime/session-lifecycle.d.ts.map +0 -1
- package/dist/runtime/session-lifecycle.js +0 -164
- package/dist/runtime/session-lifecycle.js.map +0 -1
- package/dist/runtime/session-loops.d.ts +0 -32
- package/dist/runtime/session-loops.d.ts.map +0 -1
- package/dist/runtime/session-loops.js +0 -62
- package/dist/runtime/session-loops.js.map +0 -1
- package/dist/runtime/session-readiness.d.ts +0 -18
- package/dist/runtime/session-readiness.d.ts.map +0 -1
- package/dist/runtime/session-readiness.js +0 -22
- package/dist/runtime/session-readiness.js.map +0 -1
- package/dist/runtime/session-reap.d.ts +0 -28
- package/dist/runtime/session-reap.d.ts.map +0 -1
- package/dist/runtime/session-reap.js +0 -51
- package/dist/runtime/session-reap.js.map +0 -1
- package/dist/runtime/session-resize.d.ts +0 -20
- package/dist/runtime/session-resize.d.ts.map +0 -1
- package/dist/runtime/session-resize.js +0 -26
- package/dist/runtime/session-resize.js.map +0 -1
- package/dist/runtime/session-shutdown-binding.d.ts +0 -30
- package/dist/runtime/session-shutdown-binding.d.ts.map +0 -1
- package/dist/runtime/session-shutdown-binding.js +0 -37
- package/dist/runtime/session-shutdown-binding.js.map +0 -1
- package/dist/runtime/session-shutdown.d.ts +0 -60
- package/dist/runtime/session-shutdown.d.ts.map +0 -1
- package/dist/runtime/session-shutdown.js +0 -140
- package/dist/runtime/session-shutdown.js.map +0 -1
- package/dist/runtime/session-status-wiring.d.ts +0 -38
- package/dist/runtime/session-status-wiring.d.ts.map +0 -1
- package/dist/runtime/session-status-wiring.js +0 -41
- package/dist/runtime/session-status-wiring.js.map +0 -1
- package/dist/runtime/session-status.d.ts +0 -7
- package/dist/runtime/session-status.d.ts.map +0 -1
- package/dist/runtime/session-status.js +0 -22
- package/dist/runtime/session-status.js.map +0 -1
- package/dist/runtime/shutdown-coordinator.d.ts +0 -57
- package/dist/runtime/shutdown-coordinator.d.ts.map +0 -1
- package/dist/runtime/shutdown-coordinator.js +0 -77
- package/dist/runtime/shutdown-coordinator.js.map +0 -1
- package/dist/runtime/startup-buffer.d.ts +0 -33
- package/dist/runtime/startup-buffer.d.ts.map +0 -1
- package/dist/runtime/startup-buffer.js +0 -53
- package/dist/runtime/startup-buffer.js.map +0 -1
- package/dist/runtime/startup-cleanup.d.ts +0 -43
- package/dist/runtime/startup-cleanup.d.ts.map +0 -1
- package/dist/runtime/startup-cleanup.js +0 -89
- package/dist/runtime/startup-cleanup.js.map +0 -1
- package/dist/runtime/startup.d.ts +0 -17
- package/dist/runtime/startup.d.ts.map +0 -1
- package/dist/runtime/startup.js +0 -47
- package/dist/runtime/startup.js.map +0 -1
- package/dist/runtime/status-emit.d.ts +0 -14
- package/dist/runtime/status-emit.d.ts.map +0 -1
- package/dist/runtime/status-emit.js +0 -15
- package/dist/runtime/status-emit.js.map +0 -1
- package/dist/runtime/teardown.d.ts +0 -15
- package/dist/runtime/teardown.d.ts.map +0 -1
- package/dist/runtime/teardown.js +0 -40
- package/dist/runtime/teardown.js.map +0 -1
- package/dist/runtime/terminate.d.ts +0 -22
- package/dist/runtime/terminate.d.ts.map +0 -1
- package/dist/runtime/terminate.js +0 -129
- package/dist/runtime/terminate.js.map +0 -1
- package/dist/runtime/update-lock.d.ts +0 -19
- package/dist/runtime/update-lock.d.ts.map +0 -1
- package/dist/runtime/update-lock.js +0 -183
- package/dist/runtime/update-lock.js.map +0 -1
- package/dist/runtime/update-once.d.ts +0 -40
- package/dist/runtime/update-once.d.ts.map +0 -1
- package/dist/runtime/update-once.js +0 -88
- package/dist/runtime/update-once.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,16 +1,54 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
<div align="center">
|
|
2
|
+
<picture>
|
|
3
|
+
<source media="(prefers-color-scheme: dark)" srcset="site/assets/landing/robot-mark-dark.webp" />
|
|
4
|
+
<img src="site/assets/landing/robot-mark-light.webp" alt="" width="96" height="96" />
|
|
5
|
+
</picture>
|
|
6
|
+
<h1>Elwood</h1>
|
|
7
|
+
<p><a href="https://elwood.bot">elwood.bot</a></p>
|
|
8
|
+
</div>
|
|
9
|
+
|
|
10
|
+
**Automate real Claude Code and Codex sessions in headless PTYs.**
|
|
11
|
+
|
|
12
|
+
Write scripts that control normal interactive Claude Code and Codex sessions,
|
|
13
|
+
which use your regular subscription rather than metered API billing. Elwood
|
|
14
|
+
starts the actual agent CLI in a hidden terminal and types into it the way you
|
|
15
|
+
would. The agent keeps its tools, hooks, configuration, and login.
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
npm install -g @with-logic/elwood
|
|
19
|
+
elwood "Explain this project's architecture."
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
import { ClaudeSession } from "@with-logic/elwood";
|
|
24
|
+
|
|
25
|
+
const session = new ClaudeSession({ cwd: "/path/to/project" });
|
|
26
|
+
console.log(await session.send("Explain this project."));
|
|
27
|
+
await session.close();
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Why Elwood
|
|
33
|
+
|
|
34
|
+
> **The agent should not know it is wrapped.**
|
|
35
|
+
|
|
36
|
+
Headless agent APIs give you a different product than the CLI your team
|
|
37
|
+
actually uses: different tools, different hooks, different billing. Elwood
|
|
38
|
+
drives the real interactive CLI instead. The process stays interactive, runs in
|
|
39
|
+
your normal shell environment, and is controlled through the hooks and
|
|
40
|
+
transcripts the CLI already provides.
|
|
41
|
+
|
|
42
|
+
- **Your subscription, not an API key.** It is the same interactive session you
|
|
43
|
+
run by hand, so it bills the way that session already bills.
|
|
44
|
+
- **A small API over a real terminal.** `send()` returns a string. `stream()`
|
|
45
|
+
yields typed events. The CLI keeps its own tools and history.
|
|
46
|
+
- **Typed activity, not screen scraping.** Assistant text, reasoning, tool
|
|
47
|
+
calls and results, hooks, warnings, and lifecycle arrive as one event stream.
|
|
48
|
+
- **Two ways in.** A TypeScript library for applications, and an `elwood`
|
|
49
|
+
command for shell scripts and pipelines.
|
|
50
|
+
|
|
51
|
+
[`prd/`](prd/README.md) is the source of truth for observable behavior. If this README, the
|
|
14
52
|
tests, or the implementation disagree with the PRD, the PRD wins.
|
|
15
53
|
|
|
16
54
|
## Requirements
|
|
@@ -30,8 +68,11 @@ continues. Pass `strictVersionCheck: true` to fail closed instead.
|
|
|
30
68
|
npm install @with-logic/elwood
|
|
31
69
|
```
|
|
32
70
|
|
|
33
|
-
The package installs an `elwood` executable for the headless CLI.
|
|
34
|
-
|
|
71
|
+
The package installs an `elwood` executable for the headless CLI. It ships a
|
|
72
|
+
prebuilt `dist/`, so a global install runs no build step and no install scripts
|
|
73
|
+
of its own. To work from a checkout instead, run
|
|
74
|
+
`npm install && npm run build && npm link`; the build is explicit because
|
|
75
|
+
`dist/` is not committed.
|
|
35
76
|
|
|
36
77
|
## Quickstart: library
|
|
37
78
|
|
|
@@ -54,9 +95,10 @@ for await (const event of session.stream("Run the test suite and report failures
|
|
|
54
95
|
await session.close();
|
|
55
96
|
```
|
|
56
97
|
|
|
57
|
-
`CodexSession` has the same shape. `autotrust: true` lets Elwood answer
|
|
58
|
-
|
|
59
|
-
|
|
98
|
+
`CodexSession` has the same shape. `autotrust: true` lets Elwood answer its
|
|
99
|
+
allowlisted workspace and extension trust prompts on your behalf; see
|
|
100
|
+
[Security and privacy](#security-and-privacy) for the full scope. Leave it off
|
|
101
|
+
when a human should make those decisions. There is no default turn timeout; pass
|
|
60
102
|
`send(prompt, { timeoutMs })` (a `TurnOptions` field) to bound one turn.
|
|
61
103
|
|
|
62
104
|
## Quickstart: CLI
|
|
@@ -105,6 +147,194 @@ and `blocked` (a dialog needs a human) and ends in `stopped`, `exited`,
|
|
|
105
147
|
`<cwd>/.elwood` by default, or under an explicit `stateDir`. It holds what
|
|
106
148
|
resume needs and nothing else.
|
|
107
149
|
|
|
150
|
+
## Headless CLI
|
|
151
|
+
|
|
152
|
+
### Live terminal view
|
|
153
|
+
|
|
154
|
+
Add `--head` when you want to watch the real agent interface while retaining a
|
|
155
|
+
pipeline-friendly final result:
|
|
156
|
+
|
|
157
|
+
```sh
|
|
158
|
+
elwood --head "Run the test suite and fix the failure"
|
|
159
|
+
elwood --head --output json "Review this repository" >result.json
|
|
160
|
+
elwood --head --agent claude "Explain the architecture"
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
The display stays in the current terminal and receives the raw PTY byte stream on
|
|
164
|
+
stderr. It is a real VT/ANSI mirror, so full-screen layouts, cursor-addressed
|
|
165
|
+
updates, alternate-screen buffers, colors, spinners, and title changes render as
|
|
166
|
+
they do in the underlying Claude or Codex client. Stdout remains only the final
|
|
167
|
+
text or JSON protocol and can be redirected independently. Pending display work
|
|
168
|
+
is capped at 4 MiB or 1,024 frames; a terminal that remains backpressured fails
|
|
169
|
+
the run cleanly after draining accepted bytes instead of growing memory without
|
|
170
|
+
bound.
|
|
171
|
+
|
|
172
|
+
Head mode is deliberately view-only: while attached, ordinary keyboard, mouse,
|
|
173
|
+
paste, and terminal-response bytes are discarded; Ctrl-C still interrupts using
|
|
174
|
+
Elwood's normal first-interrupt/repeated-force-kill lifecycle. Terminal resizes
|
|
175
|
+
propagate to the agent. Elwood restores raw/cooked input state, mouse and paste
|
|
176
|
+
modes, attributes, cursor visibility, and the main screen before printing the
|
|
177
|
+
final result. Both stdin and stderr must be terminals, and `--head` cannot be
|
|
178
|
+
combined with `--stream`, `--verbose`, `--debug`, or `--output jsonl`.
|
|
179
|
+
|
|
180
|
+
### Continuation and cleanup
|
|
181
|
+
|
|
182
|
+
New runs are ephemeral unless `--keep` is supplied. A kept text run reports its
|
|
183
|
+
session ID on stderr; JSON and JSONL include it in the terminal record:
|
|
184
|
+
|
|
185
|
+
```sh
|
|
186
|
+
first=$(elwood --keep --output json "Remember that the release color is teal")
|
|
187
|
+
id=$(printf '%s' "$first" | jq -r .sessionId)
|
|
188
|
+
elwood --resume "$id" "What is the release color?"
|
|
189
|
+
elwood --resume "$id" --ephemeral "Finish this conversation"
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Resume uses the exact stored agent and workspace; conflicting `--agent` and any
|
|
193
|
+
`--cwd` are rejected. Resumed sessions stay preserved after success or failure unless
|
|
194
|
+
`--ephemeral` requests teardown. Ephemeral teardown removes Elwood's session
|
|
195
|
+
record and loop definitions; it does not undo workspace changes or delete
|
|
196
|
+
conversation history owned by Claude or Codex. CLI state defaults to absolute
|
|
197
|
+
`$XDG_STATE_HOME/elwood` or `~/.local/state/elwood`; its private records contain
|
|
198
|
+
resume metadata, not ordinary prompts or output.
|
|
199
|
+
|
|
200
|
+
Before launching, `elwood config effective [run options]` prints the resolved
|
|
201
|
+
settings and where each came from. The JSON includes `head` and, for Claude,
|
|
202
|
+
the effective `permissionMode`, `allowedTools`, `disallowedTools`, and `tools`;
|
|
203
|
+
resume inspection reports persisted tool rules with stored-session provenance.
|
|
204
|
+
|
|
205
|
+
Exit status is `0` for success or a closed consumer, `1` for agent/runtime or
|
|
206
|
+
cleanup failure, `2` for usage/configuration failure, `124` for timeout, and
|
|
207
|
+
`130` for interruption. The first Ctrl-C requests a clean interrupt; a repeated
|
|
208
|
+
Ctrl-C force-kills before cleanup.
|
|
209
|
+
|
|
210
|
+
`--persona` runs an actual extra agent turn before the requested turn. Elwood
|
|
211
|
+
discards that setup turn's answer, but any tools it invokes or files it changes
|
|
212
|
+
remain. It is therefore supported only for new sessions, never `--resume`.
|
|
213
|
+
|
|
214
|
+
### Sessions, resume, and interactive mode
|
|
215
|
+
|
|
216
|
+
`elwood sessions` lists the Elwood-owned session records in the effective state
|
|
217
|
+
directory without starting an agent, and `elwood resume <id>` is the subcommand
|
|
218
|
+
form of `--resume <id>`:
|
|
219
|
+
|
|
220
|
+
```sh
|
|
221
|
+
elwood sessions
|
|
222
|
+
elwood sessions --state-dir ./state --output json | jq -r '.sessions[] | .id'
|
|
223
|
+
elwood resume "$id" "What is the release color?"
|
|
224
|
+
git diff | elwood resume "$id" --ephemeral "Does this diff match what we agreed?"
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
The table (or the `sessions` array in JSON) reports each session's id, agent,
|
|
228
|
+
workspace, `createdAt`/`lastUsedAt` timestamps, whether it is `resumable`
|
|
229
|
+
(the agent's own conversation id is stored), and `live` — whether a launch's
|
|
230
|
+
bridge socket file is currently present. `live` is a cheap file-presence
|
|
231
|
+
signal: a socket left behind by a force-killed owner reads as live until that
|
|
232
|
+
session is next started or torn down. Unreadable records are skipped with a
|
|
233
|
+
stderr warning, and an empty state directory is a normal empty result.
|
|
234
|
+
`resume <id>` follows every `--resume` rule: stored agent and workspace, no
|
|
235
|
+
`--cwd`, no `--keep`, no persona, and piped stdin composes the same way.
|
|
236
|
+
|
|
237
|
+
`elwood interactive [id]` opens the real `claude` or `codex` TUI in the current
|
|
238
|
+
terminal — no hidden PTY, no automation, no observation, no Elwood state — with
|
|
239
|
+
Elwood's resolved agent, model, reasoning effort, workspace, and posture passed
|
|
240
|
+
as the agent's own flags. It exits with the agent's exit status and needs a
|
|
241
|
+
terminal on stdin and stdout:
|
|
242
|
+
|
|
243
|
+
```sh
|
|
244
|
+
elwood interactive # the configured agent, its own defaults
|
|
245
|
+
elwood interactive --agent claude --model opus --claude-permission-mode plan
|
|
246
|
+
elwood interactive "$id" # the stored conversation, workspace, and posture
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
Built-in headless posture defaults (Claude `dontAsk`, Codex `workspace-write`
|
|
250
|
+
and `never`) are not applied unless a flag, environment variable, config key,
|
|
251
|
+
or stored record selected them, so an unconfigured launch is the agent's own
|
|
252
|
+
default experience. A session kept by a headless run does store its headless
|
|
253
|
+
posture; pass `--claude-permission-mode default` (or the Codex flags) to get the
|
|
254
|
+
agent's prompts back when resuming one interactively. Because the agent owns
|
|
255
|
+
the resumed conversation, a later `elwood resume <id>` sees what you said. The
|
|
256
|
+
command rejects `--output json|jsonl`, `--stream`, `--verbose`, `--debug`,
|
|
257
|
+
`--head`, `--timeout`, `--persona`, `--image`, `--keep`, `--ephemeral`, and
|
|
258
|
+
`--resume`.
|
|
259
|
+
|
|
260
|
+
### Listing models
|
|
261
|
+
|
|
262
|
+
`elwood models` starts the selected agent briefly, opens and cancels its own
|
|
263
|
+
model picker, tears the session down, and prints the rows. Text marks the
|
|
264
|
+
current model with `*` and the default with `(default)`; JSON is one
|
|
265
|
+
`{"schemaVersion":1,"type":"models",...}` document of `AgentModelOption` rows:
|
|
266
|
+
|
|
267
|
+
```sh
|
|
268
|
+
elwood models
|
|
269
|
+
elwood models --agent claude --output json | jq -r '.models[] | select(.isCurrent) | .id'
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Starting the agent is unavoidable because the picker is the only source of the
|
|
273
|
+
list. The command honors `--agent`, `--cwd`, `--model`, `--reasoning-effort`,
|
|
274
|
+
`--timeout`, `--state-dir`, trust, and posture flags, leaves no Elwood state
|
|
275
|
+
behind, and maps failures (timeout, interruption, blocked prompts) to the usual
|
|
276
|
+
statuses and error documents.
|
|
277
|
+
|
|
278
|
+
### Trust and security
|
|
279
|
+
|
|
280
|
+
Headless mode is non-interactive. With the default `--trust`, Elwood answers only
|
|
281
|
+
its allowlisted workspace-directory and extension trust dialogs. Codex hook
|
|
282
|
+
trust is bypassed session-wide, including hooks beyond Elwood’s own hooks. `--no-trust` disables the
|
|
283
|
+
workspace/extension approvals. Any other recognized dialog fails safely as
|
|
284
|
+
`blocked_prompt` instead of hanging or guessing.
|
|
285
|
+
|
|
286
|
+
Piped text and image paths are prompt input with the same authority as text typed
|
|
287
|
+
by the caller. Do not combine untrusted input with broad filesystem permissions.
|
|
288
|
+
Global config is never loaded from the repository being opened.
|
|
289
|
+
|
|
290
|
+
Head mode renders agent-controlled terminal escape sequences verbatim, just as
|
|
291
|
+
running the selected interactive CLI directly would. Use it only with agents and
|
|
292
|
+
workspaces you trust to control the current terminal display.
|
|
293
|
+
|
|
294
|
+
## Try It Locally
|
|
295
|
+
|
|
296
|
+
Elwood includes two local test apps.
|
|
297
|
+
|
|
298
|
+
```sh
|
|
299
|
+
# Terminal smoke app, Claude by default.
|
|
300
|
+
npm run dev:app -- --cwd /path/to/project
|
|
301
|
+
|
|
302
|
+
# Terminal smoke app with Codex.
|
|
303
|
+
npm run dev:app -- --agent codex --cwd /path/to/project
|
|
304
|
+
|
|
305
|
+
# Resume from Elwood metadata.
|
|
306
|
+
npm run dev:app -- --cwd /path/to/project --resume <elwoodSessionId>
|
|
307
|
+
|
|
308
|
+
# Browser debugger with xterm.js terminal mirror and structured event inspector.
|
|
309
|
+
npm run dev:web
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
`dev:web` serves `http://localhost:4317`. It shows the live terminal on the left
|
|
313
|
+
and a structured event timeline on the right. Use it to inspect hooks,
|
|
314
|
+
activities, warnings, startup automation, status changes, and raw event payloads.
|
|
315
|
+
|
|
316
|
+
The script is still invoked through npm, but the browser dev server process runs
|
|
317
|
+
under Node so `node-pty` can own a real interactive PTY reliably.
|
|
318
|
+
|
|
319
|
+
## Runnable Examples
|
|
320
|
+
|
|
321
|
+
For the smallest real usage sample, run the minimal example. It constructs a
|
|
322
|
+
`CodexSession`, which starts Codex lazily on the first `send`, then makes two
|
|
323
|
+
ergonomic `send` calls — an initial prompt and a follow-up that refers back to it —
|
|
324
|
+
printing each assistant response, and closes the session:
|
|
325
|
+
|
|
326
|
+
```sh
|
|
327
|
+
npm run example:minimal
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
For a fuller sample with Claude/Codex selection, custom prompts, richer logging,
|
|
331
|
+
timeouts, and cleanup options, run `examples/full.ts`:
|
|
332
|
+
|
|
333
|
+
```sh
|
|
334
|
+
npm run example:full
|
|
335
|
+
npm run example:full -- --agent codex --cwd . --prompt "Summarize this repo in one paragraph."
|
|
336
|
+
```
|
|
337
|
+
|
|
108
338
|
## Hooks and policy
|
|
109
339
|
|
|
110
340
|
Handlers return `undefined` for "no decision". Claude:
|
|
@@ -224,19 +454,29 @@ immediate; both are safe after the process has already exited.
|
|
|
224
454
|
|
|
225
455
|
## Security and privacy
|
|
226
456
|
|
|
227
|
-
- Elwood answers
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
457
|
+
- With `autotrust`, Elwood answers allowlisted workspace, skill/plugin/MCP,
|
|
458
|
+
and Claude bypass-permissions acceptance dialogs. The library defaults to
|
|
459
|
+
`autotrust: false`; the CLI defaults to `--trust`. Codex hook trust is bypassed
|
|
460
|
+
for the entire launched session even without autotrust. Codex update dialogs
|
|
461
|
+
are skipped, and Claude browser-tools onboarding is dismissed. Other recognized
|
|
462
|
+
dialogs leave the session `blocked` for a human; the CLI fails such runs as
|
|
463
|
+
`blocked_prompt`.
|
|
464
|
+
- `--high-trust` (library `highTrust: true`) is the agent-neutral "never ask"
|
|
465
|
+
switch: Claude `bypassPermissions`, or Codex `danger-full-access` with
|
|
466
|
+
approval policy `never`. It removes the agent's own guardrails, so point it
|
|
467
|
+
only at work you would let run unattended. Combining it with an explicit
|
|
468
|
+
per-agent posture is a usage error rather than a silent override.
|
|
231
469
|
- `autotrust` changes the security posture of the launched agent. Point it only
|
|
232
470
|
at directories you already trust. The standalone `listClaudeModels` /
|
|
233
471
|
`listCodexModels` probes always start with `autotrust: true`.
|
|
234
472
|
- The persisted session record holds schema version, `elwoodSessionId`,
|
|
235
473
|
adapter, `cwd`, and per-adapter resume state. Loop definitions are the only
|
|
236
474
|
persisted prompt text, in an owner-only `0600` sidecar.
|
|
237
|
-
-
|
|
238
|
-
|
|
239
|
-
|
|
475
|
+
- Elwood does not persist ordinary prompts, terminal output, hook payloads,
|
|
476
|
+
hook responses, transcripts, or warnings. Fresh bridge tokens and socket paths
|
|
477
|
+
are embedded in generated owner-only bridge scripts (`0600`), but excluded
|
|
478
|
+
from session records and never read back as credentials on resume. `teardown()`
|
|
479
|
+
removes these scripts; `stop()` preserves them with the session's runtime files.
|
|
240
480
|
- Hook bridge traffic stays on local IPC with a per-session token and an 8 MiB
|
|
241
481
|
request cap.
|
|
242
482
|
- Elwood does not modify the user's global agent configuration. Claude gets
|
|
@@ -290,8 +530,30 @@ immediate; both are safe after the process has already exited.
|
|
|
290
530
|
and hooks.
|
|
291
531
|
- [examples/README.md](examples/README.md): runnable minimal, streaming, and
|
|
292
532
|
low-level examples.
|
|
293
|
-
- [
|
|
533
|
+
- [prd/](prd/README.md): the behavior specification and conformance criteria.
|
|
294
534
|
- [CHANGELOG.md](CHANGELOG.md): consumer-facing changes.
|
|
535
|
+
- [site/](https://github.com/with-logic/elwood/tree/main/site): the landing page and the generated documentation site.
|
|
536
|
+
|
|
537
|
+
## The website
|
|
538
|
+
|
|
539
|
+
[`site/`](https://github.com/with-logic/elwood/tree/main/site) is the landing page and the generated documentation site,
|
|
540
|
+
deployed to Vercel from this repository and served at [elwood.bot](https://elwood.bot). It is a static site with no framework
|
|
541
|
+
and no build step: HTML, CSS, ES modules, and the robot's sprite sheets.
|
|
542
|
+
|
|
543
|
+
```sh
|
|
544
|
+
cd site && python3 -m http.server 8766 --bind 127.0.0.1
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
The documentation page is generated from Markdown sources in
|
|
548
|
+
[`site/docs/guide/`](https://github.com/with-logic/elwood/tree/main/site/docs/guide) and reads the CLI's help text out of
|
|
549
|
+
`src/cli/help.ts`, so the published flag reference cannot drift from the code:
|
|
550
|
+
|
|
551
|
+
```sh
|
|
552
|
+
cd site
|
|
553
|
+
uv run scripts/build_docs.py # regenerate guide/, llms.txt, llms-full.txt
|
|
554
|
+
python3 scripts/check_doc_examples.py # typecheck every documented example
|
|
555
|
+
node --test tests/*.test.mjs # the landing page's own tests
|
|
556
|
+
```
|
|
295
557
|
|
|
296
558
|
## License
|
|
297
559
|
|
|
@@ -302,3 +564,10 @@ MIT. See [LICENSE](LICENSE).
|
|
|
302
564
|
Setup, the merge gate, the e2e suite, the dev apps, and the repository map are
|
|
303
565
|
in [CONTRIBUTING.md](CONTRIBUTING.md). Report vulnerabilities privately as
|
|
304
566
|
described in [SECURITY.md](SECURITY.md).
|
|
567
|
+
|
|
568
|
+
---
|
|
569
|
+
|
|
570
|
+
<div align="center">
|
|
571
|
+
Prompted with ❤️ by <a href="https://logic.inc">Logic, Inc</a> in Seattle, WA
|
|
572
|
+
<img src="site/assets/landing/space-needle.svg" alt="" width="13" height="13" />
|
|
573
|
+
</div>
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
Elwood drives interactive agent CLIs (Claude Code and Codex) inside real
|
|
4
|
+
terminal sessions, answers a narrow allowlist of their trust prompts on behalf
|
|
5
|
+
of the embedding application, and can drive Claude's `/login` recovery flow.
|
|
6
|
+
Bugs in those paths can change the security posture of the wrapped agent, so we
|
|
7
|
+
treat them as security issues.
|
|
8
|
+
|
|
9
|
+
## Reporting a vulnerability
|
|
10
|
+
|
|
11
|
+
Please do not open a public issue for a suspected vulnerability. Use GitHub's
|
|
12
|
+
private vulnerability reporting for this repository ("Report a vulnerability"
|
|
13
|
+
under the Security tab). Include the Elwood version, the agent CLI and version,
|
|
14
|
+
the operating system, and a minimal reproduction.
|
|
15
|
+
|
|
16
|
+
We aim to acknowledge reports within five business days.
|
|
17
|
+
|
|
18
|
+
## Scope
|
|
19
|
+
|
|
20
|
+
In scope:
|
|
21
|
+
|
|
22
|
+
- Elwood answering a prompt it should not have answered, or submitting input
|
|
23
|
+
into a dialog it should have treated as blocking.
|
|
24
|
+
- Leakage of bridge tokens, hook payloads, terminal contents, or other secrets
|
|
25
|
+
into persisted state, warnings, structured CLI output, or logs.
|
|
26
|
+
- Escapes from the session-scoped settings and configuration Elwood generates
|
|
27
|
+
(for example, mutating a user's global agent configuration when the
|
|
28
|
+
documentation says it will not).
|
|
29
|
+
- Unsafe filesystem handling in Elwood-owned state: symlink following,
|
|
30
|
+
permission checks, or non-atomic writes.
|
|
31
|
+
- Command construction that could execute attacker-controlled input.
|
|
32
|
+
|
|
33
|
+
Out of scope:
|
|
34
|
+
|
|
35
|
+
- Behavior of the wrapped agents themselves. Report those to Anthropic or
|
|
36
|
+
OpenAI.
|
|
37
|
+
- Actions an agent takes inside a workspace you asked it to work in with the
|
|
38
|
+
permissions you granted it.
|
|
39
|
+
|
|
40
|
+
## Supported versions
|
|
41
|
+
|
|
42
|
+
Only the latest release receives security fixes.
|
package/dist/claude/command.d.ts
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Builds the shell command used to
|
|
3
|
-
*
|
|
2
|
+
* Builds the launch arguments and shell command used to start interactive Claude.
|
|
3
|
+
* The argument list is shared by the headless PTY launch and `elwood interactive`
|
|
4
|
+
* (§12A.9), so the Elwood-to-Claude flag mapping cannot drift between them.
|
|
5
|
+
* Implements PRD §4.2, §9.1, and §12A.9.
|
|
4
6
|
*/
|
|
5
7
|
import type { StartClaudeOptions } from "../core/types.ts";
|
|
8
|
+
import { type LaunchArgument } from "../runtime/launch-arguments.ts";
|
|
9
|
+
/** The subset of start options that become Claude's own command-line flags. */
|
|
10
|
+
export type ClaudeLaunchArgumentOptions = Pick<StartClaudeOptions, "model" | "reasoningEffort" | "permissionMode" | "allowedTools" | "disallowedTools" | "tools" | "name">;
|
|
11
|
+
/** Claude's native flags for a launch, in stable order (no `--settings`). */
|
|
12
|
+
export declare function claudeLaunchArguments(options: ClaudeLaunchArgumentOptions, resumeId?: string): readonly LaunchArgument[];
|
|
6
13
|
export declare function buildClaudeShellCommand(settingsPath: string, options: StartClaudeOptions, resumeId?: string): string;
|
|
7
14
|
export declare function shellLaunch(shell: string, command: string): {
|
|
8
15
|
readonly command: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/claude/command.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/claude/command.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,KAAK,cAAc,EAAoB,MAAM,gCAAgC,CAAC;AAGvF,+EAA+E;AAC/E,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAC5C,kBAAkB,EAChB,OAAO,GACP,iBAAiB,GACjB,gBAAgB,GAChB,cAAc,GACd,iBAAiB,GACjB,OAAO,GACP,MAAM,CACT,CAAC;AAEF,6EAA6E;AAC7E,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,2BAA2B,EACpC,QAAQ,CAAC,EAAE,MAAM,GAChB,SAAS,cAAc,EAAE,CAgB3B;AAED,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAIR;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAEhE"}
|
package/dist/claude/command.js
CHANGED
|
@@ -1,31 +1,38 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Builds the shell command used to
|
|
3
|
-
*
|
|
2
|
+
* Builds the launch arguments and shell command used to start interactive Claude.
|
|
3
|
+
* The argument list is shared by the headless PTY launch and `elwood interactive`
|
|
4
|
+
* (§12A.9), so the Elwood-to-Claude flag mapping cannot drift between them.
|
|
5
|
+
* Implements PRD §4.2, §9.1, and §12A.9.
|
|
4
6
|
*/
|
|
7
|
+
import { launchShellWords } from "../runtime/launch-arguments.js";
|
|
5
8
|
import { loginShellCommand, shellQuote } from "../runtime/shell.js";
|
|
6
|
-
|
|
7
|
-
|
|
9
|
+
/** Claude's native flags for a launch, in stable order (no `--settings`). */
|
|
10
|
+
export function claudeLaunchArguments(options, resumeId) {
|
|
11
|
+
const parts = [];
|
|
8
12
|
if (resumeId)
|
|
9
|
-
parts.push("--resume",
|
|
13
|
+
parts.push(["--resume", resumeId]);
|
|
10
14
|
if (options.model)
|
|
11
|
-
parts.push("--model",
|
|
15
|
+
parts.push(["--model", options.model]);
|
|
12
16
|
// Validated before spawn in the preflight (C-CLAUDE-20); forwarded verbatim here.
|
|
13
17
|
if (options.reasoningEffort)
|
|
14
|
-
parts.push("--effort",
|
|
15
|
-
if (options.permissionMode)
|
|
16
|
-
parts.push("--permission-mode",
|
|
17
|
-
}
|
|
18
|
+
parts.push(["--effort", options.reasoningEffort]);
|
|
19
|
+
if (options.permissionMode)
|
|
20
|
+
parts.push(["--permission-mode", options.permissionMode]);
|
|
18
21
|
if (options.allowedTools && options.allowedTools.length > 0) {
|
|
19
|
-
parts.push("--allowedTools",
|
|
22
|
+
parts.push(["--allowedTools", options.allowedTools.join(",")]);
|
|
20
23
|
}
|
|
21
24
|
if (options.disallowedTools && options.disallowedTools.length > 0)
|
|
22
|
-
parts.push("--disallowedTools",
|
|
25
|
+
parts.push(["--disallowedTools", options.disallowedTools.join(",")]);
|
|
23
26
|
// --tools is a true allowlist; an empty list ("") disables all tools.
|
|
24
27
|
if (options.tools !== undefined)
|
|
25
|
-
parts.push("--tools",
|
|
26
|
-
if (options.name)
|
|
27
|
-
parts.push("--name",
|
|
28
|
-
|
|
28
|
+
parts.push(["--tools", options.tools.join(",")]);
|
|
29
|
+
if (options.name)
|
|
30
|
+
parts.push(["--name", options.name]);
|
|
31
|
+
return parts;
|
|
32
|
+
}
|
|
33
|
+
export function buildClaudeShellCommand(settingsPath, options, resumeId) {
|
|
34
|
+
const parts = ["exec", "claude", "--settings", shellQuote(settingsPath)];
|
|
35
|
+
parts.push(...launchShellWords(claudeLaunchArguments(options, resumeId)));
|
|
29
36
|
return parts.join(" ");
|
|
30
37
|
}
|
|
31
38
|
export function shellLaunch(shell, command) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/claude/command.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/claude/command.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAuB,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAcpE,6EAA6E;AAC7E,MAAM,UAAU,qBAAqB,CACnC,OAAoC,EACpC,QAAiB;IAEjB,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,IAAI,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjD,IAAI,OAAO,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1D,kFAAkF;IAClF,IAAI,OAAO,CAAC,eAAe;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;IAC/E,IAAI,OAAO,CAAC,cAAc;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC,mBAAmB,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IACtF,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,CAAC,mBAAmB,EAAE,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvE,sEAAsE;IACtE,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClF,IAAI,OAAO,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,YAAoB,EACpB,OAA2B,EAC3B,QAAiB;IAEjB,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;IACzE,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,qBAAqB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1E,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,KAAa,EACb,OAAe;IAEf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;AAC9D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-picker.d.ts","sourceRoot":"","sources":["../../src/claude/model-picker.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"model-picker.d.ts","sourceRoot":"","sources":["../../src/claude/model-picker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAYhE,eAAO,MAAM,iBAAiB,EAAE,eAsC/B,CAAC"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Claude /model picker automation spec.
|
|
3
3
|
* Implements PRD §5.3, C-API-23, and C-API-24.
|
|
4
4
|
*/
|
|
5
|
+
import { sendPickerInput } from "../core/models/input.js";
|
|
5
6
|
import { claudeModelPickerHeader, parseClaudeModelPicker } from "../core/models/rows.js";
|
|
6
7
|
import { waitForScreen } from "../core/models/tui-screen.js";
|
|
7
8
|
import { isClaudeIdleComposer, parseClaudeSwitchConfirmation, } from "./model-switch-confirmation.js";
|
|
@@ -15,16 +16,16 @@ export const claudeModelPicker = {
|
|
|
15
16
|
// "s" applies for this session only. Enter or a number key would save the
|
|
16
17
|
// selection as the user's default for new sessions, which §4.5 forbids.
|
|
17
18
|
apply: async (io, timeoutMs) => {
|
|
18
|
-
await io
|
|
19
|
+
await sendPickerInput(io, "s", (text) => claudeModelPickerHeader.test(text));
|
|
19
20
|
const next = await waitForScreen(io.terminal, (text) => cacheConfirmationWithCursor(text) || isClaudeIdleComposer(text), timeoutMs, "claude model switch confirmation or idle composer");
|
|
20
21
|
const confirmation = parseClaudeSwitchConfirmation(next);
|
|
21
22
|
if (confirmation?.isCacheWarning === true) {
|
|
22
23
|
const delta = confirmation.affirmativeIndex - confirmation.selectedIndex;
|
|
23
24
|
const key = delta > 0 ? arrowDown : arrowUp;
|
|
24
25
|
for (let step = 0; step < Math.abs(delta); step += 1)
|
|
25
|
-
await io
|
|
26
|
+
await sendPickerInput(io, key, cacheConfirmationWithCursor, true);
|
|
26
27
|
await waitForScreen(io.terminal, affirmativeCacheConfirmation, timeoutMs, "active Claude cache confirmation before apply");
|
|
27
|
-
await io
|
|
28
|
+
await sendPickerInput(io, enterKey, affirmativeCacheConfirmation, true);
|
|
28
29
|
}
|
|
29
30
|
await waitForScreen(io.terminal, (text) => isClaudeIdleComposer(text) &&
|
|
30
31
|
parseClaudeSwitchConfirmation(text) === undefined &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-picker.js","sourceRoot":"","sources":["../../src/claude/model-picker.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"model-picker.js","sourceRoot":"","sources":["../../src/claude/model-picker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EACL,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,gCAAgC,CAAC;AAExC,MAAM,QAAQ,GAAG,IAAI,CAAC;AACtB,MAAM,SAAS,GAAG,UAAU,CAAC;AAC7B,MAAM,OAAO,GAAG,UAAU,CAAC;AAE3B,MAAM,CAAC,MAAM,iBAAiB,GAAoB;IAChD,KAAK,EAAE,QAAQ;IACf,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;IACpD,KAAK,EAAE,sBAAsB;IAC7B,0EAA0E;IAC1E,wEAAwE;IACxE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;QAC7B,MAAM,eAAe,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,MAAM,aAAa,CAC9B,EAAE,CAAC,QAAQ,EACX,CAAC,IAAI,EAAE,EAAE,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,EACzE,SAAS,EACT,mDAAmD,CACpD,CAAC;QACF,MAAM,YAAY,GAAG,6BAA6B,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,YAAY,EAAE,cAAc,KAAK,IAAI,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,YAAY,CAAC,gBAAgB,GAAG,YAAY,CAAC,aAAa,CAAC;YACzE,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5C,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC;gBAClD,MAAM,eAAe,CAAC,EAAE,EAAE,GAAG,EAAE,2BAA2B,EAAE,IAAI,CAAC,CAAC;YACpE,MAAM,aAAa,CACjB,EAAE,CAAC,QAAQ,EACX,4BAA4B,EAC5B,SAAS,EACT,+CAA+C,CAChD,CAAC;YACF,MAAM,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,4BAA4B,EAAE,IAAI,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,aAAa,CACjB,EAAE,CAAC,QAAQ,EACX,CAAC,IAAI,EAAE,EAAE,CACP,oBAAoB,CAAC,IAAI,CAAC;YAC1B,6BAA6B,CAAC,IAAI,CAAC,KAAK,SAAS;YACjD,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EACrC,SAAS,EACT,yCAAyC,CAC1C,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,SAAS,2BAA2B,CAAC,IAAY;IAC/C,MAAM,YAAY,GAAG,6BAA6B,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,YAAY,EAAE,cAAc,KAAK,IAAI,IAAI,YAAY,CAAC,aAAa,IAAI,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,4BAA4B,CAAC,IAAY;IAChD,MAAM,YAAY,GAAG,6BAA6B,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,CACL,YAAY,EAAE,cAAc,KAAK,IAAI;QACrC,YAAY,CAAC,aAAa,KAAK,YAAY,CAAC,gBAAgB,CAC7D,CAAC;AACJ,CAAC"}
|
|
@@ -42,7 +42,15 @@ function switchDialogRegion(text) {
|
|
|
42
42
|
}
|
|
43
43
|
if (latest === undefined)
|
|
44
44
|
return undefined;
|
|
45
|
-
|
|
45
|
+
const region = lines.slice(latest.index);
|
|
46
|
+
const lastOption = region.findLastIndex((line) => optionPattern.test(line));
|
|
47
|
+
// A later dialog can lack a switch title. Its question/options must not inherit
|
|
48
|
+
// the earlier cache warning's authority merely because they share a viewport.
|
|
49
|
+
const footer = /^\s*(?:Enter to confirm|Esc to cancel)(?:\s*[·•]\s*(?:Enter to confirm|Esc to cancel))*\s*$/i;
|
|
50
|
+
if (region.slice(lastOption + 1).some((line) => line.trim() !== "" && !footer.test(line))) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
return { subject: latest.subject, text: region.join("\n") };
|
|
46
54
|
}
|
|
47
55
|
function switchOptions(text) {
|
|
48
56
|
const options = text.split("\n").flatMap((line) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-switch-confirmation.js","sourceRoot":"","sources":["../../src/claude/model-switch-confirmation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH,MAAM,aAAa,GAAG,wEAAwE,CAAC;AAC/F,MAAM,SAAS,GAAG,uDAAuD,CAAC;AAC1E,MAAM,SAAS,GAAG,2DAA2D,CAAC;AAC9E,MAAM,QAAQ,GAAG,4CAA4C,CAAC;AAE9D,kFAAkF;AAClF,MAAM,UAAU,6BAA6B,CAAC,IAAY;IACxD,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,MAAM,KAAK,SAAS,IAAI,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAChF,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3E,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACxE,IAAI,gBAAgB,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/D,OAAO;QACL,gBAAgB;QAChB,aAAa,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC7D,cAAc,EAAE,eAAe,CAAC,MAAM,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACrD,OAAO,6BAA6B,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC;AAC3D,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,MAES,CAAC;IACd,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,IAAI,KAAK,KAAK,eAAe;YAAE,MAAM,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QACpE,IAAI,KAAK,KAAK,sBAAsB;YAAE,MAAM,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;IACpF,CAAC;IACD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,
|
|
1
|
+
{"version":3,"file":"model-switch-confirmation.js","sourceRoot":"","sources":["../../src/claude/model-switch-confirmation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH,MAAM,aAAa,GAAG,wEAAwE,CAAC;AAC/F,MAAM,SAAS,GAAG,uDAAuD,CAAC;AAC1E,MAAM,SAAS,GAAG,2DAA2D,CAAC;AAC9E,MAAM,QAAQ,GAAG,4CAA4C,CAAC;AAE9D,kFAAkF;AAClF,MAAM,UAAU,6BAA6B,CAAC,IAAY;IACxD,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,MAAM,KAAK,SAAS,IAAI,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAChF,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3E,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACxE,IAAI,gBAAgB,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/D,OAAO;QACL,gBAAgB;QAChB,aAAa,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC7D,cAAc,EAAE,eAAe,CAAC,MAAM,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACrD,OAAO,6BAA6B,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC;AAC3D,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,MAES,CAAC;IACd,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,IAAI,KAAK,KAAK,eAAe;YAAE,MAAM,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QACpE,IAAI,KAAK,KAAK,sBAAsB;YAAE,MAAM,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;IACpF,CAAC;IACD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5E,gFAAgF;IAChF,8EAA8E;IAC9E,MAAM,MAAM,GACV,8FAA8F,CAAC;IACjG,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC1F,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAChD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QAC9B,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAW,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,eAAe,CAAC,MAA0B;IACjD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpD,OAAO,CACL,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC9B,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC9B,UAAU,CAAC,QAAQ,CAAC,+CAA+C,MAAM,CAAC,OAAO,GAAG,CAAC;QACrF,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAC/B,CAAC;AACJ,CAAC"}
|
|
@@ -39,7 +39,7 @@ export const claudeScreenFactTable = {
|
|
|
39
39
|
{
|
|
40
40
|
id: "claude-permission-dialog",
|
|
41
41
|
fact: "blocking_prompt_visible",
|
|
42
|
-
all: [/Do you want to
|
|
42
|
+
all: [/Do you want to [^?]+\?/i, /^\s*(?:❯\s*)?1\.\s*Yes/im, /Esc to cancel/i],
|
|
43
43
|
},
|
|
44
44
|
{
|
|
45
45
|
id: "claude-model-switch-confirmation",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screen-table.js","sourceRoot":"","sources":["../../src/claude/screen-table.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAE5E;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAoB;IACpD,KAAK,EAAE,QAAQ;IACf,eAAe,EAAE,gBAAgB;IACjC,KAAK,EAAE;QACL,EAAE,EAAE,EAAE,wBAAwB,EAAE,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE;QAC3E,EAAE,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,EAAE;QACpF;YACE,EAAE,EAAE,sBAAsB;YAC1B,IAAI,EAAE,iBAAiB;YACvB,MAAM,EAAE,OAAO;YACf,GAAG,EAAE,CAAC,UAAU,CAAC;SAClB;QACD,EAAE,EAAE,EAAE,yBAAyB,EAAE,IAAI,EAAE,4BAA4B,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,EAAE;QAC/F;YACE,EAAE,EAAE,0BAA0B;YAC9B,IAAI,EAAE,yBAAyB;YAC/B,GAAG,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"screen-table.js","sourceRoot":"","sources":["../../src/claude/screen-table.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAE5E;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAoB;IACpD,KAAK,EAAE,QAAQ;IACf,eAAe,EAAE,gBAAgB;IACjC,KAAK,EAAE;QACL,EAAE,EAAE,EAAE,wBAAwB,EAAE,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE;QAC3E,EAAE,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,EAAE;QACpF;YACE,EAAE,EAAE,sBAAsB;YAC1B,IAAI,EAAE,iBAAiB;YACvB,MAAM,EAAE,OAAO;YACf,GAAG,EAAE,CAAC,UAAU,CAAC;SAClB;QACD,EAAE,EAAE,EAAE,yBAAyB,EAAE,IAAI,EAAE,4BAA4B,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,EAAE;QAC/F;YACE,EAAE,EAAE,0BAA0B;YAC9B,IAAI,EAAE,yBAAyB;YAC/B,GAAG,EAAE,CAAC,yBAAyB,EAAE,0BAA0B,EAAE,gBAAgB,CAAC;SAC/E;QACD;YACE,EAAE,EAAE,kCAAkC;YACtC,IAAI,EAAE,yBAAyB;YAC/B,KAAK,EAAE,0BAA0B;SAClC;KACF;CACF,CAAC;AAEF,+EAA+E;AAC/E,MAAM,UAAU,mCAAmC,CAAC,SAAkB;IACpE,OAAO,sBAAsB,CAAC,qBAAqB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAC5E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/claude/session/build.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAkB,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAQ9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,KAAK,aAAa,EAAsB,MAAM,sBAAsB,CAAC;AAE9E,OAAO,EAAE,KAAK,sBAAsB,EAAkB,MAAM,iBAAiB,CAAC;AAK9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAUlD,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,sBAAsB,GAAG,SAAS,CAAC;CAC/D,CAAC;AAEF,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/claude/session/build.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAkB,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAQ9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,KAAK,aAAa,EAAsB,MAAM,sBAAsB,CAAC;AAE9E,OAAO,EAAE,KAAK,sBAAsB,EAAkB,MAAM,iBAAiB,CAAC;AAK9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAUlD,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,sBAAsB,GAAG,SAAS,CAAC;CAC/D,CAAC;AAEF,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,CAoJ5B"}
|
|
@@ -111,6 +111,7 @@ export async function buildClaudeSession(input) {
|
|
|
111
111
|
// Hook-backed readiness + deadline fallback; on resume the first composer also marks ready (C-API-28).
|
|
112
112
|
ready.armDeadline();
|
|
113
113
|
const reading = observeRenderedFrame(observers, frame, session);
|
|
114
|
+
active.inputBlocking = reading.facts.blocking_prompt_visible;
|
|
114
115
|
observeReadinessFrame(reading.facts); // blocking gate + resume-composer mark
|
|
115
116
|
// Surface a mid-session login-expiry banner once (C-CLAUDE-18); no-op pre-readiness.
|
|
116
117
|
session?.noteLoginExpiry(frame.text);
|
|
@@ -135,6 +136,8 @@ export async function buildClaudeSession(input) {
|
|
|
135
136
|
// Release the startup buffer once the check settles (§9.4).
|
|
136
137
|
await assertStartupThenRelease("claude", startupOutput, () => startupExit);
|
|
137
138
|
active.submitEvidence("startup_usable");
|
|
139
|
+
if (active.inputBlocking)
|
|
140
|
+
active.submitEvidence("blocking_prompt_shown");
|
|
138
141
|
}, { before: beforeCleanup, pty, bridge, terminal, after: () => transcriptWatcher.stop() });
|
|
139
142
|
// Open buffered startup warnings after return so synchronous subscribers see them (C-API-14).
|
|
140
143
|
if (preflightWarning !== undefined) {
|