@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
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
## 4. Product Architecture
|
|
2
|
+
|
|
3
|
+
### 4.1 Layers
|
|
4
|
+
|
|
5
|
+
Elwood has three conceptual layers:
|
|
6
|
+
|
|
7
|
+
1. **PTY layer.** Starts and owns the shell/agent process, terminal input,
|
|
8
|
+
terminal output, resize, graceful stop, force kill, and process status.
|
|
9
|
+
2. **Agent adapter layer.** Adds tool-specific startup, generated config,
|
|
10
|
+
hook bridge, session metadata, and resume behavior. MVP adapters: Claude Code
|
|
11
|
+
and Codex CLI.
|
|
12
|
+
3. **Public library layer.** Exposes TypeScript APIs and typed events to parent
|
|
13
|
+
applications.
|
|
14
|
+
|
|
15
|
+
The PTY layer and a headless xterm.js terminal model are required. Elwood MUST
|
|
16
|
+
write PTY output through the headless terminal before inspecting visible TUI
|
|
17
|
+
state, warnings, or startup prompts. Elwood MUST send `sendPrompt` and
|
|
18
|
+
`sendKeys` input through the headless terminal input path so parent app input,
|
|
19
|
+
programmatic prompts, and low-level keys share one terminal control mechanism.
|
|
20
|
+
|
|
21
|
+
### 4.2 macOS shell behavior
|
|
22
|
+
|
|
23
|
+
On macOS, Elwood MUST start the PTY in the user's configured shell in a way that
|
|
24
|
+
matches the effective environment of opening Terminal.app and running the agent.
|
|
25
|
+
The implementation should use the user's login shell and interactive/login flags
|
|
26
|
+
appropriate for that shell. For the common zsh case, this is expected to behave
|
|
27
|
+
like an interactive login shell and load the user's normal startup files.
|
|
28
|
+
|
|
29
|
+
This interactive login form (`-l -i` for zsh) applies to both the **agent PTY**
|
|
30
|
+
and one-shot, non-PTY preflight probes (`--version`, `update`, `--help`). The
|
|
31
|
+
same shell startup files MUST resolve the CLI for every lifecycle operation so
|
|
32
|
+
preflight, update, launch, and resume cannot operate on different installations.
|
|
33
|
+
|
|
34
|
+
Elwood MUST provide diagnostics or tests proving that environment variables from
|
|
35
|
+
the user's shell startup are visible to the launched agent process.
|
|
36
|
+
|
|
37
|
+
### 4.3 Claude settings behavior
|
|
38
|
+
|
|
39
|
+
Elwood MUST NOT mutate `.claude/settings.local.json` by default.
|
|
40
|
+
|
|
41
|
+
For each Claude session, Elwood generates a session-scoped settings file or JSON
|
|
42
|
+
object containing only Elwood's necessary overrides:
|
|
43
|
+
|
|
44
|
+
- hook bridge handlers for every Claude hook event;
|
|
45
|
+
- any session-specific environment/settings required for routing.
|
|
46
|
+
|
|
47
|
+
Elwood launches Claude with Claude Code's `--settings <file-or-json>` mechanism
|
|
48
|
+
and relies on Claude Code's native settings merge precedence. Omitted keys in
|
|
49
|
+
Elwood's generated settings must leave user, project, and local settings intact.
|
|
50
|
+
Requested permission mode and allowed/disallowed tool policy may be supplied as
|
|
51
|
+
Claude CLI flags instead of generated settings when Claude exposes a stable flag
|
|
52
|
+
for that policy.
|
|
53
|
+
|
|
54
|
+
Decision note: Claude currently advertises both camelCase and kebab-case aliases
|
|
55
|
+
for tool-policy flags, but Claude's bundled docs and older CLI references name
|
|
56
|
+
`--allowedTools` and `--disallowedTools`. Elwood uses those documented camelCase
|
|
57
|
+
flags to maximize compatibility. The tool rule list is encoded as one
|
|
58
|
+
comma-separated flag value because current `claude --help` explicitly accepts
|
|
59
|
+
comma-separated or space-separated tool lists.
|
|
60
|
+
|
|
61
|
+
Beyond the allow/deny rule pair, `tools` exposes Claude's `--tools` flag — a
|
|
62
|
+
true allowlist over the built-in tool set where only the named tools exist
|
|
63
|
+
and newly added CLI tools default to absent. An empty `tools` array encodes
|
|
64
|
+
`--tools ""`, which Claude documents as disabling all tools. `allowedTools`/
|
|
65
|
+
`disallowedTools` govern permission rules; `tools` governs existence.
|
|
66
|
+
|
|
67
|
+
### 4.4 Codex configuration behavior
|
|
68
|
+
|
|
69
|
+
Elwood MUST NOT mutate `.codex/config.toml`, `.codex/hooks.json`,
|
|
70
|
+
`~/.codex/config.toml`, or `~/.codex/hooks.json` by default.
|
|
71
|
+
|
|
72
|
+
For each Codex session, Elwood generates only Elwood-owned runtime files under
|
|
73
|
+
the Elwood session metadata directory, then launches Codex with session-scoped
|
|
74
|
+
`--config` overrides that install hook bridge handlers for every supported Codex
|
|
75
|
+
hook event. Elwood reserves `features.hooks=true` and `hookTrust="trust-all"`
|
|
76
|
+
as session-scoped Codex overrides because Codex hooks must be enabled and trusted
|
|
77
|
+
for Elwood to function. User, project, managed, and system Codex config must
|
|
78
|
+
still merge through Codex's normal precedence rules.
|
|
79
|
+
|
|
80
|
+
Decision note: `features.hooks=true` is treated as Elwood-owned configuration,
|
|
81
|
+
not caller configuration. Without it, some Codex versions can parse hook config
|
|
82
|
+
without running hooks, which would make Elwood observe less than the parent app
|
|
83
|
+
expects. Elwood-owned hook command overrides may be emitted before caller
|
|
84
|
+
`configOverrides`, but reserved enablement/trust overrides MUST be emitted after
|
|
85
|
+
caller overrides so callers cannot accidentally disable the bridge.
|
|
86
|
+
|
|
87
|
+
Codex hook trust is a Codex security feature, but Elwood is not useful without
|
|
88
|
+
trusted hooks. Elwood MUST always allow Codex hooks to run. It should use
|
|
89
|
+
`hookTrust="trust-all"` in its session-scoped Codex config and should also use
|
|
90
|
+
Codex's invocation-scoped hook-trust bypass flag when the installed CLI
|
|
91
|
+
advertises it. If Codex still shows an interactive `Hooks need review` prompt,
|
|
92
|
+
Elwood MUST select the numbered option whose label is `Trust all and continue`
|
|
93
|
+
through PTY input; it must not assume that option always has the same number.
|
|
94
|
+
Prompt detection MUST operate on raw PTY output, including ANSI-styled and
|
|
95
|
+
cursor-addressed full-screen output where menu text may arrive as `2.Skip`
|
|
96
|
+
rather than as line-oriented `2. Skip` text.
|
|
97
|
+
|
|
98
|
+
### 4.5 Environment fidelity
|
|
99
|
+
|
|
100
|
+
An Elwood session MUST behave like the same agent launched from the user's own
|
|
101
|
+
terminal in the same working directory, plus Elwood's additive instrumentation.
|
|
102
|
+
Concretely:
|
|
103
|
+
|
|
104
|
+
- Sessions launch through the user's login+interactive shell in the caller's
|
|
105
|
+
`cwd`, inheriting the parent process environment plus Elwood's own session
|
|
106
|
+
variables (such as `ELWOOD_SESSION_ID`).
|
|
107
|
+
- Elwood MUST NOT modify, move, or shadow user-owned configuration: user and
|
|
108
|
+
project Claude settings, `CLAUDE.md`/`AGENTS.md`, skills, MCP configuration,
|
|
109
|
+
and Codex `config.toml` all load exactly as they would without Elwood.
|
|
110
|
+
- Elwood's hook wiring MUST be additive. User-configured hooks for the same
|
|
111
|
+
events continue to run alongside Elwood's bridge hooks. For Claude this holds
|
|
112
|
+
because `--settings` is a merged settings source; for Codex this holds
|
|
113
|
+
because CLI `-c hooks.*` overrides combine with `config.toml` hook groups
|
|
114
|
+
(verified against codex-cli 0.142).
|
|
115
|
+
- Known deviations MUST be documented rather than silent. Current deviations:
|
|
116
|
+
Codex hook trust is bypassed inside Elwood sessions because Elwood's reserved
|
|
117
|
+
`hookTrust="trust-all"` and trust-bypass flag apply to the whole session, so
|
|
118
|
+
a user hook that Codex would normally prompt about runs without a prompt; and
|
|
119
|
+
caller-provided `settingsOverrides` (§5.1) may intentionally shadow
|
|
120
|
+
project-level Claude settings keys because the generated `--settings` file is
|
|
121
|
+
a high-precedence source.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
## 5.1 Starting Claude
|
|
2
|
+
|
|
3
|
+
```ts
|
|
4
|
+
type StartClaudeOptions = {
|
|
5
|
+
readonly cwd: string;
|
|
6
|
+
readonly stateDir?: string;
|
|
7
|
+
readonly name?: string;
|
|
8
|
+
readonly initialSize?: TerminalSize;
|
|
9
|
+
readonly hooks?: ClaudeHookHandlers;
|
|
10
|
+
readonly persona?: string;
|
|
11
|
+
readonly model?: string;
|
|
12
|
+
readonly reasoningEffort?: ClaudeReasoningEffort;
|
|
13
|
+
readonly permissionMode?: ClaudePermissionMode;
|
|
14
|
+
readonly allowedTools?: readonly ClaudeToolRule[];
|
|
15
|
+
readonly disallowedTools?: readonly ClaudeToolRule[];
|
|
16
|
+
readonly tools?: readonly ClaudeToolRule[];
|
|
17
|
+
readonly settingsOverrides?: ClaudeSettingsOverrides;
|
|
18
|
+
readonly highTrust?: boolean;
|
|
19
|
+
readonly autoupdate?: boolean;
|
|
20
|
+
readonly autotrust?: boolean;
|
|
21
|
+
readonly hookTimeoutMs?: number;
|
|
22
|
+
readonly strictVersionCheck?: boolean;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
type ClaudeReasoningEffort = "low" | "medium" | "high" | "xhigh" | "max";
|
|
26
|
+
|
|
27
|
+
declare function startClaude(options: StartClaudeOptions): Promise<ClaudeSessionApi>;
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
`cwd` is the working directory where Claude should start. `stateDir` overrides
|
|
31
|
+
the default Elwood state directory. `name` is a launch-time convenience forwarded
|
|
32
|
+
to Claude's documented `--name` flag; it is not persisted in Elwood state (§8.2).
|
|
33
|
+
`hooks` registers
|
|
34
|
+
launch-time handlers before Claude starts. When `autoupdate` is true, Elwood
|
|
35
|
+
runs `claude update` from the user's login shell before spawning Claude and
|
|
36
|
+
rechecks the version after the update. The update command runs at most once
|
|
37
|
+
per parent process per adapter, so a parent spawning a roster of sessions at
|
|
38
|
+
launch does not run N concurrent same-binary updates (C-LIFE-09); later
|
|
39
|
+
sessions in the same process reuse the already-updated binary. Separate Elwood
|
|
40
|
+
parent processes for the same macOS user also coordinate through an atomic,
|
|
41
|
+
per-adapter lease in a stable account cache independent of each process's temporary
|
|
42
|
+
directory: one process runs the global updater while contenders wait asynchronously
|
|
43
|
+
for it to finish, then skip their duplicate attempt and re-read the installed
|
|
44
|
+
version. The lease records its owner and generation; an old owner cannot remove a
|
|
45
|
+
successor's lease, a live owner is never evicted solely because of elapsed time,
|
|
46
|
+
and a crashed owner's stale lease is recoverable after a fixed bound longer than
|
|
47
|
+
the update probe's own timeout. `strictVersionCheck` makes unparseable Claude
|
|
48
|
+
versions fatal instead of warning-and-continuing. `permissionMode`
|
|
49
|
+
accepts Claude's documented launch values: `default`, `acceptEdits`, `plan`,
|
|
50
|
+
`auto`, `dontAsk`, and `bypassPermissions`.
|
|
51
|
+
|
|
52
|
+
`highTrust` is the agent-neutral "never ask for permissions" switch. On Claude,
|
|
53
|
+
`highTrust: true` expands to `permissionMode: "bypassPermissions"` before the
|
|
54
|
+
posture is persisted or the process is spawned, so the record, `config
|
|
55
|
+
effective`, and the launched CLI all agree. It is an expansion, not a second
|
|
56
|
+
axis: supplying an explicit `permissionMode` together with `highTrust: true` is a
|
|
57
|
+
configuration error rejected before spawn with the typed
|
|
58
|
+
`claude_high_trust_conflict` error. When Claude starts in bypass-permissions
|
|
59
|
+
mode it may render a one-time acceptance dialog (header `WARNING: Claude Code
|
|
60
|
+
running in Bypass Permissions mode`, affirmative `Yes, I accept`, decline `No,
|
|
61
|
+
exit`); that dialog is an allowlisted trust prompt answered under `autotrust`
|
|
62
|
+
with `startup_prompt` label `bypass_permissions`, and with `autotrust` off it is
|
|
63
|
+
a blocking prompt like any other trust gate. Whether the installed CLI shows the
|
|
64
|
+
dialog at all is version- and machine-dependent (the CLI may persist the
|
|
65
|
+
acceptance), so Elwood answers it when present and otherwise proceeds. When the
|
|
66
|
+
CLI itself refuses bypass mode (for example when running as root), Elwood does
|
|
67
|
+
not special-case it: the refusal surfaces as the ordinary start failure carrying
|
|
68
|
+
the CLI's own message.
|
|
69
|
+
|
|
70
|
+
`model` is forwarded to Claude's documented `--model` launch flag so the
|
|
71
|
+
session starts on the requested model. Elwood does not validate the value;
|
|
72
|
+
Claude owns model-name resolution and its own failure behavior.
|
|
73
|
+
|
|
74
|
+
`reasoningEffort`, when set, is forwarded to Claude's documented `--effort`
|
|
75
|
+
launch flag so the session starts at the requested reasoning effort. Unlike
|
|
76
|
+
`model`, the value is a fixed per-CLI enum, so Elwood validates it against the
|
|
77
|
+
`ClaudeReasoningEffort` set BEFORE spawning and rejects an out-of-enum value with
|
|
78
|
+
the typed `claude_invalid_reasoning_effort` error (listing the valid values), so a
|
|
79
|
+
typo fails fast at start rather than deferring to the CLI. The effort applies to
|
|
80
|
+
the current session only and is NOT persisted by Elwood; a resumed session must
|
|
81
|
+
re-supply it (§5.2), consistent with `model`. Reasoning effort and model are
|
|
82
|
+
independent axes on Claude (the flag is separate from `--model`).
|
|
83
|
+
|
|
84
|
+
`autotrust` is an opt-in convenience for embedded/headless parent apps.
|
|
85
|
+
When true, Elwood detects Claude's first-party workspace trust prompt in the
|
|
86
|
+
rendered terminal and chooses the trust/continue option through PTY input. The
|
|
87
|
+
default is false because trusting a workspace is a security-sensitive decision.
|
|
88
|
+
When Elwood answers the prompt, the session emits adapter-neutral
|
|
89
|
+
`startup_prompt` activity with label `workspace_trust`.
|
|
90
|
+
|
|
91
|
+
Separately from `autotrust`, Elwood MUST dismiss Claude's non-security
|
|
92
|
+
first-party onboarding prompts that would otherwise block readiness in an
|
|
93
|
+
embedded session, always choosing the option that declines or defers the
|
|
94
|
+
offered capability. The currently known prompt of this kind is the browser
|
|
95
|
+
tools onboarding prompt, declined through PTY input (Escape) with
|
|
96
|
+
`startup_prompt` activity emitted under the label `browser_tools`. This
|
|
97
|
+
automation is unconditional because declining grants nothing and an unanswered
|
|
98
|
+
onboarding prompt permanently wedges a headless session.
|
|
99
|
+
|
|
100
|
+
`persona` is an optional instruction message for the agent. When set, Elwood
|
|
101
|
+
enqueues it before control returns to the caller, so it is guaranteed to be the
|
|
102
|
+
session's first submitted user message: it is delivered through the standard
|
|
103
|
+
message queue as soon as the session first becomes ready, ahead of any
|
|
104
|
+
caller-queued messages. Persona delivery is observable through the normal hook
|
|
105
|
+
and activity events, exactly like a caller-submitted message. The persona is
|
|
106
|
+
not persisted in Elwood state (§8.3 applies) and is not re-sent on resume. If
|
|
107
|
+
the session terminates before ever becoming ready, the undelivered persona is
|
|
108
|
+
discarded silently.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
## 5.2 Resuming Claude
|
|
2
|
+
|
|
3
|
+
```ts
|
|
4
|
+
type ResumeClaudeOptions = {
|
|
5
|
+
readonly elwoodSessionId: string;
|
|
6
|
+
readonly cwd?: string;
|
|
7
|
+
readonly stateDir?: string;
|
|
8
|
+
readonly hooks?: ClaudeHookHandlers;
|
|
9
|
+
readonly initialSize?: TerminalSize;
|
|
10
|
+
readonly reasoningEffort?: ClaudeReasoningEffort;
|
|
11
|
+
readonly permissionMode?: ClaudePermissionMode;
|
|
12
|
+
readonly allowedTools?: readonly ClaudeToolRule[];
|
|
13
|
+
readonly disallowedTools?: readonly ClaudeToolRule[];
|
|
14
|
+
readonly tools?: readonly ClaudeToolRule[];
|
|
15
|
+
readonly highTrust?: boolean;
|
|
16
|
+
readonly autoupdate?: boolean;
|
|
17
|
+
readonly autotrust?: boolean;
|
|
18
|
+
readonly hookTimeoutMs?: number;
|
|
19
|
+
readonly strictVersionCheck?: boolean;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
declare function resumeClaude(options: ResumeClaudeOptions): Promise<ClaudeSessionApi>;
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Resume uses Elwood's minimal persisted session record (§8.2) to relaunch or
|
|
26
|
+
reattach the wrapped Claude session through Claude Code's own resume mechanism. Callers should
|
|
27
|
+
not need Claude's session ID. Because the default state store is project-local,
|
|
28
|
+
callers that resume from a different process working directory must pass the
|
|
29
|
+
original `cwd` or the explicit `stateDir` used at start time. Calling
|
|
30
|
+
`resumeClaude({ elwoodSessionId })` without `cwd` or `stateDir` uses the current
|
|
31
|
+
process working directory to discover the project-local state store.
|
|
32
|
+
|
|
33
|
+
`resumeClaude` must verify that the persisted Elwood session record belongs to
|
|
34
|
+
the Claude adapter before launching. Passing a Codex session ID to `resumeClaude`
|
|
35
|
+
must fail with a typed error instead of launching a Claude process.
|
|
36
|
+
If Elwood has not observed and persisted Claude Code's internal session id from
|
|
37
|
+
`SessionStart`, `resumeClaude` must fail explicitly with `resume_unavailable`.
|
|
38
|
+
It must not silently launch a fresh Claude conversation under the same Elwood
|
|
39
|
+
session ID.
|
|
40
|
+
|
|
41
|
+
Decision note: MVP resume re-establishes the Elwood wrapper, hook routing, and the
|
|
42
|
+
agent's internal conversation resume id. It does NOT restore a persisted terminal
|
|
43
|
+
size — that is not persisted (§8.2); the caller passes
|
|
44
|
+
`initialSize` on resume (it otherwise falls back to the default). The launch
|
|
45
|
+
posture (privilege and tool policy) is persisted in the session record at
|
|
46
|
+
start, and resume defaults to it: a bare `resumeClaude` relaunches with the
|
|
47
|
+
same `permissionMode`, `allowedTools`, `disallowedTools`, and `tools` the
|
|
48
|
+
session started with, so tool restrictions cannot silently loosen across a
|
|
49
|
+
resume. Explicit resume options override the persisted posture field by
|
|
50
|
+
field, and the effective posture is re-persisted. Other adapter launch policy
|
|
51
|
+
such as model, reasoning effort, and caller config overrides remains
|
|
52
|
+
caller-supplied-per-call and is intentionally not persisted yet — a resumed
|
|
53
|
+
session that wants a non-default reasoning effort must re-supply `reasoningEffort`,
|
|
54
|
+
exactly as it must re-supply `model`. `highTrust: true` on resume expands to the
|
|
55
|
+
same explicit `permissionMode: "bypassPermissions"` override as on start (and
|
|
56
|
+
conflicts with an explicit `permissionMode` the same way); a bare resume keeps
|
|
57
|
+
the persisted posture, including one that a high-trust start persisted.
|
|
58
|
+
|
|
59
|
+
Because every persisting parent writes the same try-resume-else-start dance,
|
|
60
|
+
Elwood provides it directly:
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
type StartOrResumeClaudeOptions = StartClaudeOptions & {
|
|
64
|
+
readonly elwoodSessionId?: string;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
declare function startOrResumeClaude(
|
|
68
|
+
options: StartOrResumeClaudeOptions,
|
|
69
|
+
): Promise<{ readonly session: ClaudeSessionApi; readonly resumed: boolean }>;
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
When `elwoodSessionId` is set, `startOrResumeClaude` attempts a resume,
|
|
73
|
+
forwarding every start option the resume entry point accepts: `cwd`,
|
|
74
|
+
`stateDir`, `hooks`, `initialSize`, `reasoningEffort`, `permissionMode`,
|
|
75
|
+
`allowedTools`, `disallowedTools`, `tools`, `autoupdate`, `autotrust`,
|
|
76
|
+
`highTrust`, `hookTimeoutMs`, and `strictVersionCheck` (for Codex: the same shared options
|
|
77
|
+
plus `sandbox` and `approvalPolicy`). Non-persisted per-call policy such as
|
|
78
|
+
`reasoningEffort` therefore reaches a resumed session exactly as it reaches a
|
|
79
|
+
fresh one. It falls back to a fresh `startClaude` only for the
|
|
80
|
+
error names that mean "no resumable session": `state_not_found`,
|
|
81
|
+
`resume_unavailable`, and `adapter_mismatch`. Every other error — including
|
|
82
|
+
`state_corrupt` — is a real failure and is rethrown, so data problems are
|
|
83
|
+
never silently papered over by a fresh session. The result reports which path
|
|
84
|
+
ran so callers can re-persist a new `elwoodSessionId` after a fallback.
|
|
85
|
+
`startOrResumeCodex` behaves identically for Codex. `persona` follows its
|
|
86
|
+
normal rules: delivered on a fresh start, never re-sent on resume.
|